*任意のベクトルに対して任意の相関となるベクトルを生成するマクロ. define ranco2(var1=!charend('/') /var2= !default(NOVAR)!charend('/') /corr=!default(5)!charend('/') /varname= !default(CR000)!charend('/') ). set mxloop=1000000. set seed=random. *preserve. *set printback=off. CACHE. execute. matrix. !IF (!var2='NOVAR') !THEN. get d/variables=!var1. compute n=nrow(d). *乱数生成. compute x = sqrt(2 * (ln(uniform(n,1)) * -1) ) &* cos(6.283185 * uniform(n,1) ). compute d={d,x}. release x. !else. get d/variables=!var1,!var2. !ifend. compute n=nrow(d). *平均値. compute xbar=csum(d)/n. compute xbar2=xbar. loop i=2 to n. compute xbar2={xbar2;xbar}. end loop. *分散共分散行列. compute s=t(d-xbar2)*(d-xbar2). compute s=s/(n-1). *print s. compute s2=t(chol(s)). compute is2=inv(s2). *相関行列. compute sigma={1,!corr;!corr,1.0}. compute sigma2=t(chol(sigma)). *変換. compute trans=sigma2*is2. compute y=make(n,2,0). compute y2=make(n,1,0). *****************************. loop i=1 to n. compute y(i,:)=t(trans*t(d(i,:))). end loop. compute y2=y(1:n,2). save y2/outfile="corr_temp.sav"/variables=!varname. end matrix. match files file="corr_temp.sav"/file=*. exec. !end define. . *マクロ終了. ***********************. 以下実行例. ***********************. *乱数生成. input program. loop #i=1 to 100. + compute z=normal(1). + compute x=normal(1). + end case. end loop. end file. end input program. execute. ranco2 var1=z/var2=x/corr=0.0/varname=cv000. ranco2 var1=z/var2=x/corr=0.1/varname=cv100. ranco2 var1=z/var2=x/corr=0.2/varname=cv200. ranco2 var1=z/var2=x/corr=0.3/varname=cv300. ranco2 var1=z/var2=x/corr=0.4/varname=cv400. ranco2 var1=z/var2=x/corr=0.5/varname=cv500. ranco2 var1=z/var2=x/corr=0.6/varname=cv600. ranco2 var1=z/var2=x/corr=0.7/varname=cv700. ranco2 var1=z/var2=x/corr=0.8/varname=cv800. ranco2 var1=z/var2=x/corr=0.9/varname=cv900. ranco2 var1=z/corr=0.0/varname=cr000. ranco2 var1=z/corr=0.1/varname=cr100. ranco2 var1=z/corr=0.2/varname=cr200. ranco2 var1=z/corr=0.3/varname=cr300. ranco2 var1=z/corr=0.4/varname=cr400. ranco2 var1=z/corr=0.5/varname=cr500. ranco2 var1=z/corr=0.6/varname=cr600. ranco2 var1=z/corr=0.7/varname=cr700. ranco2 var1=z/corr=0.8/varname=cr800. ranco2 var1=z/corr=0.9/varname=cr900. CORRELATIONS /VARIABLES= cr000 cr100 cr200 cr300 cr400 cr500 cr600 cr700 cr800 cr900 with z x. CORRELATIONS /VARIABLES= cv000 cv100 cv200 cv300 cv400 cv500 cv600 cv700 cv800 cv900 with z x. GRAPH /SCATTERPLOT(MATRIX)=cr000 cr100 cr200 cr300 cr400 cr500 cr600 cr700 cr800 cr900 x z /MISSING=LISTWISE . GRAPH /SCATTERPLOT(MATRIX)=cv000 cv100 cv200 cv300 cv400 cv500 cv600 cv700 cv800 cv900 x z /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr900 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr800 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr700 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr600 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr500 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr400 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr300 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr200 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr100 /MISSING=LISTWISE . GRAPH /SCATTERPLOT(BIVAR)=z WITH cr000 /MISSING=LISTWISE .