*ran.sps----------------------------------------------------. title 任意の相関行列となる乱数生成. preserve. *必要オプション advanced 行列言語使用. *ターゲットとなる相関行列をデータ窓またはファイルに用意し、 /*rancorr nvar=3/nsmpl=100/fname=*/strict=yes.*/ * nvar = 変数数 nsmpl=サンプル数 fname=ファイル名(既定値データ窓). * strict=yes 相関行列そのものを再現させる。no 相関行列はアバウト。 * K.Hori(hori@ec.kagawa-u.ac.jp) 1996.08.16. *-------------------------------------------------------------. set printback=off. define rancorr (nvar=!charend('/')/ nsmpl=!charend('/')/ fname=!charend('/') !default(*)/ content=!charend('/') !default(corr)/ strict=!charend('/') !default(yes) ). *準備. !let !f='f'. !let !s='s'. !let !x='x'. !let !send=!concat(!s,!nvar). !let !xend=!concat(!x,!nvar). !let !fend=!concat(!f,!nvar). !let !col='col'. !let !colend=!concat(!col,!nvar) !let !strict2=!upcase(!strict). !let !err='no'. *new file. !if (!fname !ne '*') !then. *想定相関行列(下三角 SPSSファイルではない). matrix data variables=x1 to !xend/file=!fname /content=!content . !ifend. save /outfile='tempran_.sav'. *乱数生成. input program. vector f(!nvar). loop #i=1 to !nsmpl. + loop #j = 1 to !nvar. + compute f(#j)=normal(1). + end loop. + end case. end loop. end file. end input program. !if (!strict2 !eq YES) !then. *乱数を主成分分析をし、その主成分得点を使用する=乱数間を無相関にする. factor var=f1 to !fend /print=rotation /criteria=factors(!nvar) /rotation=norotate /save=reg(all s). !else. vector s(!nvar). !do !i=1 !to !nvar. compute s(!i)=f(!i). !doend. !ifend. matrix. get d /file=* /var=s1 to !send. get r /file='tempran_.sav'/var=x1 to !xend. compute detr=det(r). !if (detr !le 0.000001) !then. !let !err='yes'. !ifend. do if (det(r) > 0.000001). *相関行列のコレスキー分解(上三角). compute r1=chol(r). *相関行列に対応する乱数作成 変数名の col+番号. compute d=d*r1. save d /outfile=*. else. PRINT det(r) /format "F16.8" /TITLE '元の相関行列は特異singularです。処理を中断します。 ' . save r/outfile=*. end if. end matrix. erase file='tempran_.sav'. !enddefine. restore. *--------------------------------macro はここまで. * ここからサンプルプログラム。取り除くこと---------. matrix data variables=x1 to x3 . begin data 1 0.231 1 0.423 0.500 1 end data. rancorr nvar=3/nsmpl=100/fname=*/strict=yes.