394 Views
March 31, 24
スライド概要
[第3回大阪sas勉強会]坂尻大樹
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
要約統計量マクロ 2018.06.22 坂尻大樹
--本日の内容-・自己紹介 ・要約統計量マクロの紹介 初めて業務で新規作成した帳票(頻度集計、要約統計量)
--自己紹介— ・氏名:坂尻 大樹 (サカジリ ヒロキ) ・出身:大阪府 (大東市) ・系歴:大阪桐蔭高校 大阪府立大学大学院 (生命環境科学研究科) ・プログラムはほぼ未経験、手探りでチャレンジ (学生時代は全角スペースのせいで、小一時間errorに悩む)
要約統計量を出したい 問題点:表示桁の指定、層別の出力、症例数の不足…
初回作成 現在 コードの長さは変わらないけど… ・原データから桁数を取得し、要約統計量の桁数を自動で決定 ・classデータによる集計で欠測の取り扱いを楽に
・原データから桁数を取得 %SUMMARY (DS=AAA,VAR=HEIGHT,CVAR=AGE,CSTR=11,CEND=14,RANGE1=4,RANGE2=12); DATA SUMMARY_KETA1; SET &DS.; IF &VAR.^=. THEN KETA=LENGTH( CATS( &VAR.-INT(&VAR.) ) ); RUN; PROC SUMMARY DATA=SUMMARY_KETA1 ; VAR KETA; OUTPUT OUT=SUMMARY_KETA2 MAX=MAXKETA; RUN; DATA SUMMARY_KETA3; SET SUMMARY_KETA2; IF MAXKETA=1 THEN KETA=0; *小数点第0桁=整数値; ELSE KETA=MAXKETA-2; *小数点第X桁を格納; %PUT &KETA.; CALL SYMPUTX ("KETA",KETA); RUN; 原データが少数第一位であることを確認
・クラスデータを作成 マクロの中で、実際のデータのフォーマットや ラベルに合わせるのが面倒… %SUMMARY (DS=AAA,VAR=HEIGHT,CVAR=AGE,CSTR=11,CEND=14,RANGE1=4,RANGE2=12); DATA SUMMARY_CLASS; IF _N_=0 THEN SET &DS. (KEEP=&CVAR.); DO &CVAR.=&CSTR. TO &CEND.; OUTPUT; END; STOP; RUN; OBSは読み込まずに、変数の必要な情報だけを 読み込む ENDの情報が無いので、STOPステート メントで処理を止める 実際のデータそのままのクラスデータが完成
・要約統計量を算出 %SUMMARY (DS=AAA,VAR=HEIGHT,CVAR=AGE,CSTR=11,CEND=14,RANGE1=4,RANGE2=12); *要約統計量; PROC SUMMARY DATA=&DS. CLASSDATA=SUMMARY_CLASS EXCLUSIVE NWAY; CLASS &CVAR.; VAR &VAR.; OUTPUT OUT=SUMMARY_1 N= MEAN= STD= MIN= MEDIAN= MAX= NMISS= Q1= Q3= /AUTONAME; RUN; DATA SUMMARY_2; LENGTH PREOUT1-PREOUT9 $12.; 原データから取得した桁数を使い、四捨五入& SET SUMMARY_1; 桁数を揃えて出力 *表示桁; PREOUT1=CATS(&VAR._N); IF &VAR._MEAN^=. THEN PREOUT2=CATS(PUT(ROUND(&VAR._MEAN ,%SYSEVALF(1/10**%EVAL(&KETA+1))),6.%EVAL(&KETA+1))); IF &VAR._STDDEV^=. THEN PREOUT3=CATS(PUT(ROUND(&VAR._STDDEV ,%SYSEVALF(1/10**%EVAL(&KETA+2))),6.%EVAL(&KETA+2))); IF &VAR._MIN^=. THEN PREOUT4=CATS(PUT(ROUND(&VAR._MIN ,%SYSEVALF(1/10**%EVAL(&KETA+0))),6.%EVAL(&KETA+0))); IF &VAR._Q1^=. THEN PREOUT5=CATS(PUT(ROUND(&VAR._Q1 ,%SYSEVALF(1/10**%EVAL(&KETA+1))),6.%EVAL(&KETA+1))); IF &VAR._MEDIAN^=. THEN PREOUT6=CATS(PUT(ROUND(&VAR._MEDIAN ,%SYSEVALF(1/10**%EVAL(&KETA+1))),6.%EVAL(&KETA+1))); IF &VAR._Q3^=. THEN PREOUT7=CATS(PUT(ROUND(&VAR._Q3 ,%SYSEVALF(1/10**%EVAL(&KETA+1))),6.%EVAL(&KETA+1))); IF &VAR._MAX^=. THEN PREOUT8=CATS(PUT(ROUND(&VAR._MAX ,%SYSEVALF(1/10**%EVAL(&KETA+0))),6.%EVAL(&KETA+0))); PREOUT9=CATS(&VAR._NMISS); *欠損の取り扱い; ARRAY AR _CHARACTER_; DO OVER AR; IF AR="" THEN AR="-"; END; *ID変数; ID+1; KEEP ID &CVAR. PREOUT1-PREOUT9; RUN; 注:一部です
・整形&出力
%SUMMARY (DS=AAA,VAR=HEIGHT,CVAR=AGE,CSTR=11,CEND=14,RANGE1=4,RANGE2=12);
*整形;
PROC TRANSPOSE DATA=SUMMARY_2 OUT=SUMMARY_3 (DROP=_NAME_)
PREFIX=OUT;
VAR PREOUT1-PREOUT9;
ID ID;
RUN;
*出力;
FILENAME XLS DDE "EXCEL
|\\[&BOOK.]&SHEET.!R&RANGE1.C3:R&RANGE2.C%EVAL(3+&CEND-&CSTR)";
DATA _NULL_;
FILE XLS NOTAB LRECL=10000 dsd dlm='09'x;
SET SUMMARY_3;
DMY = .;
PUT OUT1-OUT%EVAL(1+&CEND-&CSTR);
RUN;
完成です!!
ありがとうございました。