医療統計学を学ぶ大学生のブログ

医療統計学、因果推論を専攻しています。R, SASユーザーです。

SASによる解析:IMLプロシジャを用いた行列の作成

最近SASで解析する機会は増えていたのですが、そういえばSASで行列計算をしたことがなかったなということで、今回は行列計算を行うIMLプロシジャの基本的な要素と簡単な例についてまとめようと思います。

この記事は行列の作成がメインで、行列計算についてはまた別記事としてまとめています。

 

IMLプロシジャについて

IMLプロシジャでは、Rといった他の言語と同様に行列計算が可能です。個人的にはシミュレーションの過程で使用している方が多いのかなと勝手に感じています。

標準的な演算子は組み込まれていますが、ただ2次元の行列しか対応していない点にはご注意ください。

 

行列の作成

imlプロシジャでは以下のように具体的に行列を作成することが可能です。

proc iml;
    X={1 2,
       3 4};
    print X;
run;

このコードを実行してみると以下の2*2行列Xが作成されています。

f:id:NorihiroSuzuki:20210929170948p:plain

この作成時における重要なポイントは、次の2点です。

  • 要素の区切りはスペース
  • 行の区切りは「,」(カンマ)

 

次に単位行列や体格行列をはじめとするいくつかの特殊な行列の作成を行う関数についてまとめます。

f:id:NorihiroSuzuki:20210929173058p:plain

 

それぞれを以下のコードで全部作成してみます。

proc iml;
    A=i(3);
    B=diag(3);
    C=j(2,3,4);
    D=do(5,25,5);
    print A B C D;
run;

作成された行列はこれ↓

f:id:NorihiroSuzuki:20210929174643p:plain

 

データセットと行列の変換

以下のデータセットを行列として読み込んで、行列計算(今回は引き算)したものを逆にデータセットとして出力してみます。

f:id:NorihiroSuzuki:20210929191350p:plain

f:id:NorihiroSuzuki:20210929191418p:plain

このデータセットの作成コードはこちら

data DATA1;
  input V1 V2;
  cards;
  1 2
  3 4
  5 6
  ;
run;

data DATA2;
  input V1 V2;
  cards;
  2 4
  6 8
  12 14
  ;
run;

 

次にこの二つのデータセットを行列として読み込んで、出力させます。

f:id:NorihiroSuzuki:20210929192252p:plain

コードはこれ

proc iml;
  use DATA1;
    read all into x[COLNAME=varname];
  use DATA2;
    read all into y;
  z = x - y;
  create DATA3 from z[COLNAME=varname];
  append from z;
quit;

 

今回ここではDATA1, DATA2のデータをすべて読み込み、それぞれx, yという行列に変換させ、mそれらを用いてzという行列を作成しています。そしてcreateステートメントでzという行列をDATA3というデータセットに変換しています。

ここでポイントなのは、read, createステートメントにある"[COLNAME=varname]"です。通常、データセットを行列に変換した場合には列名が失われ、再度データセットに変換しなおした際の列名は「COL数字」となります。ですが元のデータセットの変数名を用いたい際には上記のようにすることで、使用が可能です。

readステートメントで読み込みたいデータセットの後ろに[COLNAME=varname]とすることで、そのデータセットの列名をvarnameに入れ、createステートメントで行列をデータセットに変換する際にそのデータセットの列名をvarnameから読み込んでいるという認識でいいかと思います。

 

また次のようにも行列をデータセットに変換することが可能です。

proc iml;
    A={1 2,3 4};
    B={4 3 2 1};
    create C var{A,B};
    append;
    close A B;
quit;

 

このコードではまず、2*2の行列Aと、1*4の行列Bを作成しています。ここでCという行列をA, Bを変数として選択し作成します。この時A, Bは列ベクトルに変換されます。それぞれの行列、データセットの内容は以下の通り。

f:id:NorihiroSuzuki:20210929194635p:plain

f:id:NorihiroSuzuki:20210929194741p:plain

 

 

proc iml;
A={1 2,3 4};
B={4 3 2 1};
create C var{A,B};
append;
close A B;
quit;
proc iml;
A={1 2,3 4};
B={4 3 2 1};
create C var{A,B};
append;
close A B;
quit;