%macro covcorr ( data = _last_ , /* 入力データセット */ out = covcor , /* 出力データセット */ var = _numeric_, /* 変数リスト */ by = , /* by変数があれば指定 */ lower = cov, /* 下三角にcovかcorr */ upperchr = covcorr /* 上三角の表示方法 */ /* . なら欠損値表示 */ /* 空白にしたければ */ /* options missing=' '*/ /* を指定すればよい */ /* covcorrなら無動作 */ ) ; /*-------------------------------------------------------*/ /* 分散共分散・相関行列データセット作成 */ /* */ /* T.SUZUKI ( 1998.2. ) */ /*-------------------------------------------------------*/ %let bystmt = ; %if &by ne %str() %then %let bystmt = %str( by &by ; ) ; data _null_ ; length var w $8 ; set &data( keep = &var ) ; array vv ( * ) &var ; n = dim( vv ) ; call symput( 'nvar', left( put( n, 4. )) ) ; do i = 1 to dim( vv ) ; call vname( vv(i), var ) ; w = 'W' || left( put( i, 3. ) ) ; call symput( w, var ) ; end ; run ; proc corr data = &data out = _out_ cov noprint ; var &var ; &bystmt run ; data _std_ _cov_( drop = _type_ ) _cor_( drop = _type_ ) ; set _out_ ; if _type_ = 'CORR' then output _cor_ ; else if _type_ = 'COV' then output _cov_ ; else output _std_ ; run ; data _cor_ ; set _cor_ ; array vv ( &nvar ) &var ; array xx ( &nvar ) _1 - _&nvar ; do i = 1 to &nvar ; xx( i ) = vv( i ) ; end ; keep _1 - _&nvar ; run ; data _covcor_ ; merge _cor_ _cov_ ; run ; %if %upcase( &lower ) = CORR %then %let low = i < n ; %else %let low = i > n ; data _covcor_ ; keep &by _name_ _label_ %do i = 1 %to &nvar ; &&w&i %end ; ; length _label_ $40 ; set _covcor_ ; &bystmt %if &by ne %str() %then %do ; if first.&by then n = 0 ; %end ; n + 1 ; array rr ( &nvar ) _1 - _&nvar ; array vv ( &nvar ) %do i = 1 %to &nvar ; &&w&i %end ; ; do i = 1 to &nvar ; if &low then vv(i) = rr(i) ; end ; %if &upperchr = . %then %do ; do i = 1 to &nvar ; if i > n then vv(i) = . ; end ; %end ; call label( vv( n ) , _label_ ) ; run ; data &out ; set _std_ _covcor_ ; run ; %if &by ne %str() %then %do ; proc sort data = &out ; by &by ; run ; %end ; %mend covcorr ;