標準偏差や平均から一定以上離れた数値、またはあるパーセント点の外側にある数値をまとめる
[OS] ALL
[リリース] ALL
[キーワード] Outliers, Truncation, UNIVARIATE
[質問]
たとえば、平均から±2.5s(sは標準偏差)以上離れた数値を、平均±2.5sの点で置き換えるような処理はできるでしょうか。
[回答]
これらの処理に直接対応したプロシジャはありません。 /* サンプルデータ */ DATA test; DO i=1 TO 100; y=RANUNI(123)*10; OUTPUT; END; /* 大きく外れている点を作成 */ DO i=101 TO 102; y=(i-101.5)*100; OUTPUT; END; RUN; /* サンプルプログラム1。±2.5sについて。 */ /* UNIVARIATEプロシジャで平均と標準偏差を計算する */ PROC UNIVARIATE DATA=test NOPRINT; VAR y; OUTPUT OUT=stat_ds MEAN=mean STD=std; RUN; /* DATAステップによる処理 */ DATA mean_cut; SET test; IF _N_=1 THEN SET stat_ds; IF y>mean+2.5*std THEN y2=mean+2.5*std; ELSE IF y<mean-2.5*std THEN y2=mean-2.5*std; ELSE y2=y; RUN; /* 結果の確認 */ PROC PRINT DATA=mean_cut; VAR y y2; RUN; /* サンプルプログラム2。パーセント点について */ /* UNIVARIATEプロシジャで5パーセント点と95パーセント点を計算する */ PROC UNIVARIATE DATA=test NOPRINT; VAR y; OUTPUT OUT=stat_ds2 PCTLPRE=pctl_ PCTLPTS=5 95; RUN; /* DATAステップによる処理 */ DATA pct_cut; SET test; IF _N_=1 THEN SET stat_ds2; IF y>pctl_95 THEN y2=pctl_95; ELSE if y<pctl_5 THEN y2=pctl_5; ELSE y2=y; RUN; /* 結果の確認 */ PROC PRINT DATA=pct_cut; VAR y y2; RUN; |