/*-------------------------------- Step0:データの読み込みと確認 --------------------------------*/ data dat1; infile "C:\data\haebara\chap01\chap1.csv" dlm="," firstobs=2; input obs sex$ sho6 chu1 henka; run; proc print data=dat1; run; /*-------------------------------- Step1:中央値 p.19-20 proc imlで行列演算言語を開始することを指定する reset print→runする毎にoutputに表示させることを指定する --------------------------------*/ proc iml; reset print; title'中央値'; x = {4,9,14,16,15}; /* xという入れ物(オブジェクト)に5つの数字を入れる */ /* (a)代表値の候補が10の場合のT1 */ T1 = (x-10); /*それぞれの数字を10で引く*/ T1 = abs((x-10)); /*abs()関数で絶対値を取る*/ T1 = sum(abs(x-10)); /*sum()関数で,それぞれの数値を足し合わせる*/ /* (b)代表値の候補が14(中央値)の場合のT1 */ T1 = x-median(x); /*median()関数で中央値を求める*/ T1 = abs(x-median(x)); T1 = sum(abs(x-median(x))); /*-------------------------------- Step2:平均 p.19-20 --------------------------------*/ title'平均'; /* (a)代表値の候補が11.6(平均値)の場合のT2 */ T2 = 1/nrow(x) * sum(x); /*nrow()で行の長さを数える.sum()で要素の総和を算出する*/ T2 = x-1/nrow(x) * sum(x); T2 = (x-1/nrow(x) * sum(x))##2; /* ##2 でそれぞれの要素を2乗する*/ T2 = sum((x-1/nrow(x) * sum(x))##2); quit; /*-------------------------------- Step3:逸脱行動データの代表値 p.24 proc meansで平均値と中央値を算出できる maxdec→小数点以下の表示桁数 var→算出したい変数名 class→質的変数 --------------------------------*/ proc means data=dat1 mean median maxdec=2; var sho6 chu1 henka; title '逸脱行動データの代表値 全体'; run; proc means data=dat1 mean median maxdec=2; var sho6 chu1 henka; class sex; title '逸脱行動データの代表値 男女別'; run; /*-------------------------------- Step4:合成変数の平均 p.25 start 関数名(使用する変数名); return((式)); fihish 関数名; で関数を定義できる --------------------------------*/ proc iml; reset print; /* (a)男性だけのデータの読み込み,datと命名する */ title '合成変数の平均'; use dat1; read all var{sho6 chu1 henka} where(sex='男') into dat; print dat; /*-------------------------------- (b)計算式を書いて平均を計算. (変数の数だけ記載しなければならない) --------------------------------*/ x = 1/nrow(dat[,1]) * sum(dat[,1]); x = 1/nrow(dat[,2]) * sum(dat[,2]); x = 1/nrow(dat[,3]) * sum(dat[,3]); /*-------------------------------- (c)doループを使って平均を計算(少し長い) --------------------------------*/ x = do(1,3,1); do i=1 to ncol(dat); x[i] = 1/nrow(dat[,i]) * sum(dat[,i]); end; print x; /*-------------------------------- (d)実は,簡単に記載できる --------------------------------*/ x = dat[:,]; /*-------------------------------- (e)合成変数の平均 2.5式を定義した後に計算 --------------------------------*/ start compmean(x,y,c,d); return(c * x + d * y); finish compmean; z = compmean(dat[:,1],dat[:,2],-1,1); /*-------------------------------- Step5:合併した集団における平均 p.26 --------------------------------*/ title '合併した集団における平均'; /*(a) 2.7式を定義 */ start mixmean(x1,x2); return( (nrow(x1) * x1[:,] + nrow(x2) * x2[:,])/(nrow(x1)+nrow(x2)) ); finish mixmean; /*(b) 男性の変化量,女性の変化量を読み込み */ use dat1; read all var{henka} where(sex='男') into man; read all var{henka} where(sex='女') into woman; totalM = mixmean(man,woman); quit; /*-------------------------------- Step6:逸脱行動データの散布度 p.33 proc meansにて分析(平均偏差を求めれない) --------------------------------*/ proc means data=dat1 std variance vardef=N maxdec=2; title '標本分散と標準偏差'; var sho6 chu1 henka; run; proc means data=dat1 std variance vardef=N maxdec=2; var sho6 chu1 henka; class sex; run; proc means data=dat1 std variance maxdec=2; title '不偏分散と標準偏差'; var sho6 chu1 henka; run; proc means data=dat1 std variance maxdec=2; var sho6 chu1 henka; class sex; run; /*-------------------------------- Step7:逸脱行動データの散布度 p.33 proc imlにて分析 --------------------------------*/ proc iml; reset print; /* (a)男性だけのデータをman,女性だけのデータをwoman,全体のデータをtotalと命名*/ title '逸脱行動データの散布度'; use dat1; read all var{sho6 chu1 henka} where(sex='男') into man; read all var{sho6 chu1 henka} where(sex='女') into woman; read all var{sho6 chu1 henka} into total; print man woman total; /*(b)中央値からの平均偏差を定義*/ x = {4,9,14,16,15}; /* xという入れ物(オブジェクト)に5つの数字を入れる */ MD1 = 1/nrow(x) * sum(abs(x-median(x))); /*平均偏差2.9式 */ start md1(x); return(1/nrow(x) * sum(abs(x-median(x)))); finish md1; md1 = md1(x); /*テスト*/ /*(c)ループを使って,各変数の平均偏差を算出する*/ manmd1 = do(1,ncol(man),1); womanmd1 = do(1,ncol(woman),1); totalmd1 = do(1,ncol(total),1); do i= 1 to ncol(man); manmd1[,i] = md1(man[,i]); womanmd1[,i] = md1(woman[,i]); totalmd1[,i] =md1(total[,i]); end; print manmd1 womanmd1 totalmd1; /*(d)平均からの平均偏差を定義*/ start md2(x); return(1/nrow(x) * sum(abs(x-x[:,]))); finish md2; md2 = md2(x); /*テスト 2.10式*/ /*(e)ループを使って,各変数の平均偏差を算出する*/ manmd2 = do(1,ncol(man),1); womanmd2 = do(1,ncol(woman),1); totalmd2 = do(1,ncol(total),1); do i= 1 to ncol(man); manmd2[,i] = md2(man[,i]); womanmd2[,i] = md2(woman[,i]); totalmd2[,i] =md2(total[,i]); end; print manmd2 womanmd2 totalmd2; /*-------------------------------- Step8:合成変数の分散 p.35-6 --------------------------------*/ title '合成変数の分散'; /*標本分散 の関数を定義 2.12式*/ start var(x); return(1/nrow(x) * sum((x-x[:,])##2)); finish var; var2 = var(x); totalvar = var(total[,3]); /*全体での変化量の分散*/ sumvar = var(total[,1])+ var(total[,2]); /*小6と中2の分散の和*/ scov = (sumvar-totalvar)/2; /*共分散*/ /*-------------------------------- Step9:合併した集団における分散 p.36-7 --------------------------------*/ title '合併した集団における分散'; /*男子小6の 平均/分散/標本サイズ*/ m1 = man[:,1]; var1 = var(man[,1]); n1 = nrow(man); /*女子の小6の 平均/分散/標本サイズ*/ m2 = woman[:,1]; var2 = var(woman[,1]); n2 = nrow(woman); totalvar1 = (n1*var1 + n2*var2) / (n1 + n2) + (n1*n2)*(m1-m2)**2/(n1+n2)**2; totalvar2 = var(total[,1]); /*-------------------------------- Step10:標準偏差の解釈 p.40-1 --------------------------------*/ title '標準偏差の解釈'; /*全体の集団における逸脱行動得点の変化量の平均と標準偏差*/ totalsd = sqrt(var(total[,3])); totalmean = total[:,3]; Hi1 = totalmean+totalsd; Lo1 = totalmean-totalsd; Hi2 = totalmean+2*totalsd; Lo2 = totalmean-2*totalsd; read all var{henka} where(henka <= Hi1 & henka >= Lo1) into sd1; print sd1; nsd1 = nrow(sd1); sd1pct = nsd1/40*100; read all var{henka} where(henka <= Hi2 & henka >= Lo2) into sd2; print sd2; nsd2 = nrow(sd2); sd2pct = nsd2/40*100; quit;