授業内容
proc iml;
j=j(1,2,1);
print j;
quit;
前回の課題1〜3解答例
createとappendのところのcolnameとrownameの使いところがポイント。
data cp00;
infile 'z:\base01FF.prn';
input samno hght wght ft atnd allw pname $ sex $ pc word xl mail;
run;
proc iml;
reset noprint;
/* 課題の(1) */
use cp00;
read all var {pname} into NAME;
close cp00;
/* 課題の(2) */
use cp00;
read all var {hght,wght,ft} into BODYS;
close cp00;
/* 課題の(3) */
names = {'hght' 'wght' 'ft'};
create BODYINFO from BODYS[colname = names rowname = NAME];
append from BODYS[rowname =
NAME];
close BODYINFO;
proc print data = BODYINFO;
quit;
前回の課題4解答例
J関数とncol、nrowの使い方がポイントです。
data cp00;
infile 'z:\base01FF.prn';
input samno hght wght ft atnd allw pname $ sex $ pc word xl mail;
run;
proc iml;
reset noprint;
use cp00;
read all var {hght,wght,ft} into BODYS;
close cp00;
nrow = nrow(BODYS);
ncol = ncol(BODYS);
mean = BODYS[:,];
min = BODYS[><,];
max = BODYS[<>,];
statn = {'件数' '平均' '最小' '最大'};
name = {'hght' 'wght' 'ft'};
stat = j(ncol,1,nrow)||t(mean//min//max);
print stat;
/***** ちょっとだけ格好をつけた表現 *****/
print stat[colname = statn rowname = name format = 10.2];
quit;
create、matrib、printのどれを使っても、outputに出てくる結果は同じようになるのですが、意味がちょっとずつ違います。データとして扱えるcreateと、一回切りのmatrib、printの違いをできれば理解しておいてください。
24 IMLプログラミング3
モジュール(サブルーチン)
いろんな場所で同じ計算をさせなければならない場合や、繰り返しの計算を行わなければならない場合、そのためのプログラムがあらかじめ用意されていて、どこからでも呼び出すことができるのならば、便利なのは言うまでもありません。使われる頻度の高い関数は、IML関数としてあらかじめ組み込まれています。でも、自分のオリジナルの表現方法や、関数を組み合わせて使う場合は、自分でそれを用意しなければなりません。それが「モジュール」です。
サブルーチンと言い換えた方が、分かりがいいかもしれません。
モジュールのいい点は、そのモジュールがどこに置いてあったとしても、RUN(またはCALL)によって実行された場所でそのプログラムが動いてくれる点です。
指定方法
モジュールの定義
START <モジュール名><(引数)><GLOBAL(引数)>;
IMLのステートメント;
FINISH <モジュール名>;
モジュールの実行
RUN モジュール名 <(引数)>;
相関行列を求めるプログラムをモジュール化してみましょう。
【新規プログラム】
data cp00;
infile 'z:\base01FF.prn';
input samno hght wght ft atnd allw pname $ sex $ pc word xl mail;
run;
proc iml;
reset noprint;
use cp00;
read all var {hght,wght,ft} into x;
close cp00;
name = {'hght' 'wght' 'ft'};
/** モジュール本体 **/
start corr(x,name);
n = nrow(x);
sum = x[+,];
xpx =t(x) * x - t(sum) * sum/n;
s = diag(1/sqrt(vecdiag(xpx)));
corr = s * xpx * s;
print '相関行列',,corr[rowname = name colname = name];
finish corr;
/** モジュール終了 **/
run corr(x,name);*モジュールの実行;
quit;
【プログラム末尾】
来週の課題w
前回の課題4で作った統計量の行列STATをモジュールの形で計算するモジュールMEANSを作ってみてください。