*eig0vec.sps******************************************************. preserve. set printback=off. *----------------------------------------------------------------- * 多重共線性チェック用マクロ eig0vec * by k.hori(hori@ec.kagawa-u.ac.jp) * 1996.8.7. * set mxloop=1000. を追加 2001.6.17. * 必要options : advanced statistic, professional statistics * チェックしたバージョン : 6.1.3 for windows, 7.0 * 相関行列の主成分分析 * (0と見なした固有値と対応する主成分の固有ベクトル) *example. /* eig0vec var= t1 to t6. */ /* eig0vec var= t1 to t100/zero=.01/nvar=100/workfil=c:\tmp\xx.sav. */ * 指定 * var= 変数リスト(必須). * zero=値(オプション)0と見なす値の上限(既定値0.0001). * nvar=値 (オプション) 変数の数(50以上のとき必要)(既定値50). * workfil=ファイル名 (オプション)(既定値 cc__temp1.sav)計算後消去. * wid=値 (オプション)出力の幅(既定値80). *----------------------------------------------------------------. define eig0vec(var=!charend('/') /zero=!default(.0001)!charedn('/') /* 0と見なす値 */ /nvar=!default(50)!charend('/') /* 変数の数上限 */ /workfil=!default('cc__tmp1.sav')!charend('/') /wid=!default(80)!charend('/') /* 一行の桁数 */ /wform=!default(10)!charend('/') /* 指定不可(F10.3) */ ). preserve. set printback=off mprint off. !let !workf=!unquote(!workfil). !let !workf=!quote(!workf). *----------------------------------------------------------------- * データ行列→相関行列 *-----------------------------------------------------------------. PROXIMITIES !var /VIEW=VARIABLE /MEASURE= CORRELATION /STANDARDIZE= NONE /print=none /matrix=out(!workf). *----------------------------------------------------------------- * 行列言語へ *-----------------------------------------------------------------. *save outfile=!workfil. set mxloop=10000. matrix . *----------------------------------------------------------------- * 変数名ベクトルと変数の数を取得 *-----------------------------------------------------------------. get cr /names=varname/variables=!var/file=!workf. compute p1=ncol(cr). compute nx1=varname(1:p1). *----------------------------------------------------------------. * 主成分番号出力用変数名準備 *----------------------------------------------------------------. !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. *----------------------------------------------------------------- * 相関行列の固有値(EIGENVAL) 固有ベクトル(EIGENVEC) → *-----------------------------------------------------------------. call eigen(CR,EIGENVEC,EIGENVAL). *----------------------------------------------------------------- * 固有値だけ出力 *-----------------------------------------------------------------. PRINT /TITLE ' ***** 多重共線性チェック(主成分分析) *****' /SPACE 2. PRINT T(EIGENVAL) /FORMAT "F10.8" /TITLE ' 相関行列の 固有値' /SPACE 3 /cnames=num. *----------------------------------------------------------------- * 0に該当する固有値 *-----------------------------------------------------------------. 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. compute num2=num(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. erase file=!workf. restore. !enddefine. *---------------------------------------------. restore.