授業内容


第24回(第11回) IMLプログラミング3 12/22, 01/12
J関数の使い方例

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;
【プログラム末尾】


今週の課題
前回の課題4解答例の各ステートメントが何をやろうとしているかをレポートにして提出。

来週の課題w
前回の課題4で作った統計量の行列STATをモジュールの形で計算するモジュールMEANSを作ってみてください。


一つ前の週へ 先頭に戻る 一つ後の週へ


ホーム シラバス 授業計画 授業へのQ&A コンピューター初心者の皆さんへ