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

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

SASによる解析:IMLプロシジャでの行列計算

前回の記事の続きということで、今回はSASでの行列計算についてまとめていこうと思います。行列の作成、データセットからの変換についてはこちらからどうぞ

norihirosuzuki.hatenablog.com

またこの場をお借りして、毎度毎度Twitterで自分の疑問に様々な解決案をくださっている方々に深く感謝します。

 

IMLプロシジャでの基本的な操作について

前回同様、SASのIMLプロシジャについて取り扱いますが、基本的な関数名などはRといった別の言語と共通する部分も多いので、あまり混乱することもないかなと思います。

また全体に共通することとしては、行列Xがあったときに、X[行, 列]という指定になります。ここは行列の部分取得の項目で詳しく扱います。

 

行列の部分取得

ここでは行列が作成されているもとで、その行列の一部分を取得する操作についてまとめます。まずはXを行列とすると、

f:id:NorihiroSuzuki:20210930143115p:plain

というふうに行列Xの一部分を持ってくることができます。またこの[ ]内での行、列の指定は特定の数字だけでなく、「:」を使うことで、複数指定することが可能です。例えば行列Xの1から2行目の3から4列目を持ってきたいのであれば、X[1:2,3:4]とすればOKです。

また、行列Xを、行 / 列ベクトルである場合、その要素は次のようにすることで取得可能です。

f:id:NorihiroSuzuki:20210930143448p:plain

 

上記の例はもっとも単純な例でしたが以下のようなものもあります。

f:id:NorihiroSuzuki:20210930145957p:plain

実際のサンプルコードと、その出力される行列はこんな感じ。

f:id:NorihiroSuzuki:20210930150049p:plain

proc iml;
    X={1 2,3 4};
    X1=X[+];
    X2=X[+,];
    X3=X[#];
    X4=X[#,];
    X5=X[:];
    X6=X[:,];
    X7=X[<>];
    X8=X[><];
    X9=X[<>,];
    X10=X[><,];
    X11=X[##];
    X12=X[##,];
    print X X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12;
quit;

 

行列計算

次に四則演算や行列式の計算などについてまとめます。

まずは基本的な演算子から。

f:id:NorihiroSuzuki:20210930153611p:plain

 

次にいくつかの関数を使ったものについて。

f:id:NorihiroSuzuki:20210930152621p:plain

実際のサンプルコードと、その出力される行列はこんな感じ。

f:id:NorihiroSuzuki:20210930152551p:plainproc iml;
    X={1 2,3 4};
    X1=nrow(X);
    X2=ncol(X);
    X3=det(X);
    X4=diag(X);
    X5=vecdiag(X);
    X6=inv(X);
    X7=eigval(X);
    X8=eigvec(X);
    X9=t(X);
    print X X1 X2 X3 X4 X5 X6 X7 X8 X9;
quit;