preserve. set printback=off. *--------------------------------------------------------------------------- * 相関行列の主成分分析(0と見なした固有値と対応する主成分の固有ベクトル) princ0.sps *--------------------------------------------------------------------------- /* princ0 var=v1 to v50. */ /* princ0 var=v1 to v150/nvar=150. 変数の数が100以上のときはその数を指定する */ *--------------------------------------------------------------------------- define princ0(var=!charend('/') /wform=!default(10)!charend('/') /* 指定不可(F10.3) */ /wid=!default(80)!charend('/') /* 一行の桁数 */ /nvar=!default(100)!charend('/') /*変数の数 100以上なら、変数の数指定 */ /zero=!default(.001)!charedn('/') /* 0と見なす値 */ ). preserve. set printback=off mprint off. *--------------------------------------------------------------------------- * データ行列=相関行列 *--------------------------------------------------------------------------- set results off. *corr variables=!var /missing=listwise/matrix out(*). set results listing printback off mprint off. *set results listing printback on mprint on. *---------------------------------------------------------------------------. * 行列言語へ *---------------------------------------------------------------------------. set mxloop=10000. matrix . *--------------------------------------------------------------------------- * 変数名ベクトルと変数の数を取得 *--------------------------------------------------------------------------- get r /names=varname/variables=!var/file=*. compute p1=ncol(r). release r. /*行列rを解放*/ !let !num='{"1"' . !let !comma=',' . !do !i = 2 !to !nvar. !let !qnum=!quote(!i). !let !num=!concat(!num,!comma,!qnum). !doend !let !num=!concat(!num,}). compute num=!num. compute nx1=varname(1:p1). compute numx=make(1,p1,0). loop i=1 to p1. compute numx(1,i)=i. end loop. *--------------------------------------------------------------------------- * 行列を得る。共分散正方行列 CV ;標準偏差行列 SD ; *--------------------------------------------------------------------------- mget file=*. *--------------------------------------------------------------------------- * 相関行列の固有値(EIGENVAL) 固有ベクトル(EIGENVEC) → *--------------------------------------------------------------------------- call eigen(CR,EIGENVEC,EIGENVAL). *--------------------------------------------------------------------------- * 固有値だけ出力 *--------------------------------------------------------------------------- PRINT /TITLE ' ***** 主成分分析(相関行列) *****' /SPACE 2. PRINT {T(EIGENVAL)} /FORMAT "F10.8" /TITLE ' 相関行列の 固有値' /SPACE 3 /cnames=num. *--------------------------------------------------------------------------- * 該当する固有値 *--------------------------------------------------------------------------- compute n=nrow(eigenval). compute neigen=n. compute seigen=0. loop j=1 to n. + do if (EIGENVAL(j) <= !zero). ++ compute SEIGEN=j. + end if. end loop if (SEIGEN > 0). COMPUTE nfac=n. *--------------------------------------------------------------------------- * 1行に出力する成分数決定 *--------------------------------------------------------------------------- compute nprint=trunc((!wid-12)/!wform)-1. *--------------------------------------------------------------------------- * 固有値、寄与率、累積寄与率の出力準備 & 固有ベクトル出力 *--------------------------------------------------------------------------- compute EIGENVEC={EIGENVEC;T(EIGENVAL)}. compute nx1={nx1,"固有値"}. compute sprin=seigen. LOOP if (sprin > 0). compute eprin=sprin+nprint. do if (eprin > nfac). compute eprin=nfac. end if. *print eigenvec. compute num2=num(sprin:eprin). *print {numx(1,sprin:eprin)}. *PRINT {EIGENVEC(:,sprin:eprin)}. *PRINT {numx(1,sprin:eprin);EIGENVEC(:,sprin:eprin)}. PRINT {EIGENVEC(:,sprin:eprin)} /format "F10.4" /TITLE ' 相関行列の固有ベクトル と 固有値' /SPACE 2 /rname=nx1/cnames=num2. compute sprin=eprin+1. END LOOP IF (nfac <= eprin). end matrix. restore. !enddefine. *-----------------------------------------------. restore.