SAS DS2 Languageで行列の積

はじめに

SASで行列演算といえばSAS/IMLがあるんですが、導入していない現場も多いんじゃないでしょうか。
SAS9.4から使えるようになったDS2 Languageを使ってもある程度の行列演算ができると知り、サンプルコードを元に行列の積を求めるマクロを作成しました。
参考にしたページはこちら

SAS(R) 9.4 DS2 Language Reference, Third Edition

マクロを作成するにあたって変更した点は以下の2点。

  • データセットを行列にする際に、変数名のprefixと配列名を合わせておく必要があるので、その対応
  • 行列サイズをデータセットから取得

コード

DS2 Languageで行列の積

使ってみる

下記のコードで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:もっといい書き方があれば修正していきます。