SAS Tips

571 Views

April 02, 24

スライド概要

[第4回大阪sas勉強会]章 立

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2018大阪SAS勉強会第4回 章 立 ショウ リツ(PINYIN:ZHANG LI) 株式会社アーバンシステム

2.

自己紹介 まだCRO業界の新米で、実務に入ってから3ヶ月の間に気 になるところを纏めさせて頂きたいと考えております。 学歴 • 2003年9月~2007年6月中国・華中科学技術大学・数理統計学 <Huazhong University of Science and Technology> SASの勉強 • 2017年3月SAS Certified Base Programmer for SAS 9 • 2017年7月SAS Certified Advanced Programmer for SAS 9 • 2018年8月~今までCRO業界のSAS統計解析実務

3.

出身地:湖北省襄陽市

4.

SAS勉強のネタ① ある集計の結果をGroup分け、横に持ってから、MOCKUPのよ うなExcelに出力する演習問題。 整形前 ※FREQプロシジャの結 果 最初SAS研修時に思い付いたの方法は対象 データセットを四つのデータセットに SUBSETした後、「set T1;set T2;set T3; set T4;」で結合することでした。 MOCKUP ※EXCEL表

5.

SAS勉強のネタ① 右のよなNOOB時期の コードで実現できまし た。今でもまだまだSAS 整形前 領域のNOOBerです が。。。 ※FREQプロシジャの結 果 proc sql; create table t1 as select x, count as out1 from tmp where w=1 and v=1; create table t2 as select x, count as out2 from tmp where w=1 and v=2; create table t3 as select x, count as out3 from tmp where w=2 and v=1; create table t4 as select x, count as out4 from tmp where w=2 and v=2; quit; data all; set t1; set t2; set t3; set t4; run;

6.

SAS勉強のネタ① 勉強を続いていたら、「行列転置/入れ替え」のキー度ワードと出会っ た。 整形前 ※FREQプロシジャの結 果 元のデータセットのソー ト順番をちょっと変える と、TRANSPOSEプロシ ジャで一発完成。 proc sort data=tmp1 out=tmp2; by x w v; run; proc transpose data=tmp2 out=fq1 prefix=OUT; by x; var count; run;

7.

SAS勉強のネタ①:行列の入れ替え(行列転置) • 統計解析に統計量を算出できた後、出力する時MOCKUPに合 わせる様にデータの整形時によく遇えること。 整形前 MOCKUP 目標/整形後 ※FREQプロシジャの結 果 ※EXCEL表 ※EXCELに出力用

8.

行列転置方法①:TRANSPOSEプロシジャ >「行列転置」をグッグルすると、目に入って来たのはTRANSPOSE プロシジャである。 転置対象データ セット:fq1 SASコード: Transposeプロシジャ proc transpose data=fq1 out=fq2 prefix=OUT; var count; run; SASで転置後データ セット:fq1 転置後の変数名はAuto的に番号が 付けられ、目標データセットには もうちょっと工夫が必要。。。

9.
[beta]
行列転置方法②:RETAIN機能を利用
>TRANSPOSEプロシジャを使わず、RETAINを利用
して行列の転置を再現。
転置対象デー
タセット:
FQ1

SASコード:
R E TA I N ス テ ー ト メ ン ト

data fq3(keep=sort: OUT:);
length OUT1-OUT3 $8.;
set fq1 end=endflg;
retain OUT1-OUT3;
sort1=1;sort2=1;OUT2="";
if _N_=1 then OUT1="N = " || compress(put(count,best.));
if _N_=2 then OUT3="N = " || compress(put(count,best.));
if endflg=1;
run;

S A S で 転置後デー
タ セ ッ ト : FQ 3
転置後の変数名は自由に指定でき
るため、そのままDDEステートメン
ト一回だけExcelに出力を済む。

10.
[beta]
行列転置方法②:RETAIN機能を利用
>RETAIN、ARRAYの併用でも再現。
転置対象デー
タセット:
FQ1

SASコード:
R E TA I N ス テ ー ト メ ン ト

data fq4(keep=sort: OUT:);
length OUT1-OUT3 $8.;
set fq1 end=endflg;
retain OUT1-OUT3;
array o[*] OUT1-OUT3;
sort1=1;sort2=1;o[2]="";
if _N_=1 then o[1]="N = " || compress(put(count,best.));
if _N_=2 then o[3]="N = " || compress(put(count,best.));

if endflg=1;
run;
S A S で 転置後デー
タ セ ッ ト : FQ 4
転置後の変数名は自由に指定でき
るため、そのままDDEステートメン
ト一回だけExcelに出力を済む。

11.

まとめ >メリット:行列転置後の変数名は自由に指定できる。 >ディメリット:カテゴリ変数存在の場合は、事前にソートしなけれ ばなりません。(下記例のように) 下記データセットTMP1 は既にソート済み。 data tmp2; set tmp1; by w v x; retain OUT1 OUT3 OUT5; if first.v then do; OUT1=""; OUT3=""; OUT5=""; end; select(x); when(1) OUT1=y; when(2) OUT3=y; when(3) OUT3=y; end; if last.v then output; drop x y; run; 転置後の変数名は自由に指定でき、 水準(ここへ変数x)が足りない ときにも対応できる。

12.

SAS勉強のネタ② OUTPUTに関する落とし穴。 例、カテゴリ変数X(2水準:0 if XFL=NULL, 1if XFL=1)、変数Y(4水準:1 if YFL1=1,…,4 if YFL4=1)に対するΧの2乗検定でP値の算出。 右の上のコードで実行すると、二番目の OUTPUTに条件合わない場合は欠損と想定します が、WK02のような可笑しい結果が出てしまいま す。 data wk02; set wk01; id=1; cat=(FLT0=1); output; id=2; if FLT1=1 then cat=1; if FLT2=1 then cat=2; if FLT3=1 then cat=3; if FLT4=1 then cat=4; output; run; data wk03; set wk01; id=1; cat=(FLT0=1); output; id=2; if FLT1=1 then cat=1; else if FLT2=1 then cat=2; else if FLT3=1 then cat=3; else if FLT4=1 then cat=4; else cat=0; output; run;

13.

SAS勉強のネタ② OUTPUTに関する落とし穴。 ・問題発生原因 1>データへ理解が不足。(FLG変数の欠損値の存在が思いませんでした。) 2>SAS/OUTPUTステートメントへ理解が不足、或いは油断。 ・結論 1>データセットを縦積み(複数OUTPUT)の場合、OUTPUTの前に条件IFを全て 指定しないと、一つ前のOUTPUTの結果がそのまま再度出力されるため、統計 検定(χの2乗検定など)をする時、実際のCOUNT数より上回る可能性があります。 2>SASLOGに出るエラーメッセージにグッグルすれば、大体答えが出てくれると思 いますが、上記のような見えないエラーの方がちょっと怖いですよね。 参考:暗黙のOUTPUTステートメント<http://sas-boubi.blogspot.com/2015/10/output.html>

14.

◆お終い ・いよいよ2018年の終わり、SASの勉強に非常に楽しんでおります。 2018年は私にとって非常重要な一年でした。有り難い気持ちを込めて、2019年も引き続きSASの勉強を頑 張ります。 ・2019年、皆さん、良いお年を! ・ご視聴、有難う御座いました。お疲れ様でした。