SAS DS2 Languageで行列の積
はじめに
SASで行列演算といえばSAS/IMLがあるんですが、導入していない現場も多いんじゃないでしょうか。
SAS9.4から使えるようになったDS2 Languageを使ってもある程度の行列演算ができると知り、サンプルコードを元に行列の積を求めるマクロを作成しました。
参考にしたページはこちら
SAS(R) 9.4 DS2 Language Reference, Third Edition
マクロを作成するにあたって変更した点は以下の2点。
コード
使ってみる
下記のコードで2つのデータセットを用意します
data temp1; a = 1; b = 2; c = 3; output; a = 4; b = 5; c = 6; output; run; data temp2; d = 1; e = 2; output; d = 3; e = 4; output; d = 5; e = 6; output; run;
temp1.sas7bdat
OBS | a | b | c |
---|---|---|---|
1 | 1 | 2 | 3 |
2 | 4 | 5 | 6 |
temp2.sas7bdat
OBS | d | e |
---|---|---|
1 | 1 | 2 |
2 | 3 | 4 |
3 | 5 | 6 |
マクロ実行
%mult_matrix(in1=temp1, in2=temp2, out1=temp3);
実行結果
temp3.sas7bdat
OBS | z1 | z2 |
---|---|---|
1 | 22 | 28 |
2 | 49 | 64 |
マクロ実行
%mult_matrix(in1=temp2, in2=temp1, out1=temp4);
実行結果
temp4.sas7bdat
OBS | z1 | z2 | z3 |
---|---|---|---|
1 | 9 | 12 | 15 |
2 | 19 | 26 | 33 |
3 | 29 | 40 | 51 |
さいごに
行列の積を求める際にmatrixパッケージのmultメソッドを使っていますが、他にも転置や逆行列を求めるメソッドもあるのでマクロを少し変更するだけでいろんな計算ができそうです。
それにしても行列の積をもとめるだけでこのコードの行数になるとは。。。*1
*1:もっといい書き方があれば修正していきます。