%macro su1( data = ,/* 入力データセット名 */ outside = ,/* 外的基準変数名(数値変数) */ item = ,/* アイテム変数名(空白区切) */ weight = ,/* ウエイト変数名(あれば) */ out = _null_ ,/* 残差,予測値,95%信頼限界 */ outitem = _null_ ,/* アイテム数量の出力データセット */ outcate = _cate_ ,/* カテゴリ数量の出力データセット */ pdiff = noprint ,/* pdiff, tdiff で水準差検定 */ modelop = ,/* model 文の任意オプション */ predict = predict ,/* 予測値の変数名 */ residual= residual,/* 残差の変数名 */ l95 = lower95p,/* 95%信頼下限の変数名 */ u95 = upper95p,/* 95%信頼上限の変数名 */ maxdec = ,/* 出力時の小数点以下桁数 */ vardef = n ,/* 分散計算時の除数 */ title = 2 ,/* %su1が使うtitle 行の番号 */ noprint = ,/* noprintで全ての印刷を抑止 */ workds = delete /* delete で一時データ削除 */ ) ; /*----------------------------------------------------------*/ /* SAS社提供「数量化1類マクロ」簡易版 */ /* */ /* %su1 [ Version 1.2 ] */ /*----------------------------------------------------------*/ /* <SAS社版からの主な修正点> */ /* su12doc.txt を参照. */ /* */ /* <制約> */ /* 1. 入力データセットで使えない変数名, col: */ /* */ /* <指定例> */ /* %su1( data=x, outside=year, item= a b c ) */ /* %su1( data=a, outside=y, item= x1-x8, pdiff = pdiff) */ /* %su1() この場合は簡単な指定方法の説明だけをLOGに表示する */ /* */ /* <動作確認> */ /* Windows 3.1, SAS 6.11 [ Base, STAT] */ /*----------------------------------------------------------*/ /* */ /* by 鈴木督久 */ /*----------------------------------------------------------*/ /*---------- 必須パラメータが無い場合は使用法を出力して終了 */ %if &data = %str() or &outside = %str() or %quote(&item) = %str() %then %do ; %put ; %put USAGE: %nrstr(%su1)( data=, outside=, item= [, out=, outitem=, outcate=,; %put %str( pdiff=, modelop=, workds=, maxdec=, title=, noprint=, ); %put %str( weight=, predict=, residual=, l95=, u95= ] )); %put ; %put %str( data = データセット名 ); %put %str( outside = 外的基準の変数名 ); %put %str( item = アイテムの変数名リスト); %put ; %goto macroend ; %end ; /*----------------------------- weight 関連のマクロ変数定義 */ %if &weight = %str() %then %do ; %let weistmt = %str() ; %let vardef = &vardef ; %let sumgt = n ; %end ; %else %do ; %if %upcase(&vardef) = N %then %let vardef = wgt ; %else %if %upcase(&vardef) = DF %then %let vardef = wdf ; %let weistmt = %str( weight &weight ; ) ; %let vardef = &vardef ; %let sumgt = sumwgt ; %end ; /*---------------------- 印刷出力時の小数点以下の桁数の指定 */ %if &maxdec = %str() %then %let fw = %str() ; %else %do ; %let f = %eval( &maxdec + 3 ) ; %let fw = &f..&maxdec ; %let maxdec = %str( maxdec = &maxdec ) ; %end; /*-------------------------------- アイテム用 format の生成 */ proc contents data = &data out = _fmt_( keep = name label ) noprint ; run ; data _fmt_ ; rename name = start ; fmtname = 'item_f' ; type = 'c' ; set _fmt_ ; if label = '' then label = name ; run ; proc format cntlin = _fmt_ ; run ; /*---------------------------------- 主効果の分散分析を実行 */ proc glm data = &data &noprint ; class &item ; model &outside = &item / ss2 &modelop ; lsmeans &item / out = _lsmean_ &pdiff ; %if %upcase(&out) ne _NULL_ & &out ne %str() %then %do ; output out = &out p = &predict r = &residual l95 = &l95 u95 = &u95 %end ; ; &weistmt run ; quit; /*------------------------ デザイン(ダミー変数)行列の作成 */ proc glmmod data = &data( keep = &outside &item &weight ) outdesign = _design_ /* デザイン行列 */ outparm = _colpar_ /* カラムと変数名の情報 */ noprint ; class &item ; model &outside = &item / noint ; &weistmt run ; /*------------------ アイテム・カテゴリ情報データセット作成 */ data _colpar_ ; length item $8 category $16 ; keep item category ; set _colpar_( drop = _colnum_ ) ; item = left( effname ) ; category = kstrcat( of &item ) ; run ; proc summary data = _design_ ; var col: ; output out = _freq_( drop = _type_ _freq_ ) sum = ; &weistmt run ; proc transpose data = _freq_ out = _freq_( keep = freq1 ) prefix = freq ; run ; data &outcate ; merge _colpar_ _freq_ _lsmean_( keep = lsmean ) ; run ; /*------------------------ 最小2乗平均をカテゴリ数量に変換 */ proc sort data = &outcate out = &outcate ; by item ; run ; proc summary data = &outcate ; by item ; var lsmean ; weight freq1 ; output out = _wmean_( keep = item wmean ) mean = wmean ; run ; data &outcate ; keep item category freq1 score lsmean ; merge &outcate _wmean_ ; by item ; score = lsmean - wmean ; format item $item_f. ; run ; /*---------------------------- アイテムのサンプル数量を出力 */ data _score_ ; _type_= 'SCORE' ; rename item = _name_ ; drop score i ; if 0 then set _design_( drop = &outside ) ; array col ( * ) _numeric_ ; set &outcate( keep = item score ) ; by item ; if first.item then do i = 1 to dim( col ) ; col( i ) = . ; end; col( _n_ ) = score ; if last.item then output; run; proc score data = _design_ score = _score_ out = &outitem( keep = &outside &item &weight ) ; var col: ; run ; %if %upcase(&noprint) ne NOPRINT %then %do ; /*---------------------- 外的基準の要約統計量を印刷 */ title&title "STATISTICS OF OUTSIDE VARIABLE ( VARDEF = &vardef )" ; proc means data = &data( keep = &outside &weight ) vardef = &vardef &sumgt mean std var stderr cv min max sum &maxdec ; var &outside ; &weistmt run ; /*------------------------------ カテゴリ数量を印刷 */ title&title 'CATEGORY SCORE' ; proc print data = &outcate ; by item ; id item ; var category freq1 score ; * format score &fw ; run ; proc chart data = &outcate ; hbar category / discrete nozeros type = mean sumvar = score group = item ; format score &fw ; run ; /*-------------------------- アイテム・レンジを印刷 */ title&title 'ITEM RANGE' ; proc summary data = &outcate nway ; class item ; var score; output out = _range_ ( drop = _type_ _freq_ ) range = range ; run ; proc chart data = _range_ ; hbar item / discrete nozeros descending type = mean sumvar = range ; format range &fw ; run; title&title ; %end ; /*---------------------------------- 一時データセットの削除 */ %if %upcase(&workds) = DELETE %then %do ; proc datasets library = work nolist ; delete _design_ /* デザイン行列 ( proc glmmod )*/ _colpar_ /* デザイン行列の変数情報 */ _fmt_ /* アイテムformatの制御データ */ _freq_ /* カテゴリの度数集計ファイル */ _score_ /* カテゴリスコアのファイル */ _lsmean_ /* 最小2乗平均のファイル */ _wmean_ /* 最小2乗平均の重み平均 */ _range_ /* アイテム・レンジの計算結果 */ / memtype = data ; run ; quit ; %end ; %macroend: %put ; %put NOTE: %nrstr(%su1) by T.Suzuki (1995) NIKKEI RESEARCH INC. ; %put ; /* 履歴: */ /* 1996.2.13/ 199 line コメント化 maxdec= オプション関連 */ %mend su1 ;