標準偏差や平均から一定以上離れた数値、またはあるパーセント点の外側にある数値をまとめる

[OS] ALL
[リリース] ALL
[キーワード] Outliers, Truncation, UNIVARIATE

[質問]

たとえば、平均から±2.5s(sは標準偏差)以上離れた数値を、平均±2.5sの点で置き換えるような処理はできるでしょうか。
また、95パーセント点や5パーセント点の外側にある数値を、それぞれのパーセント点で置き換えることは可能でしょうか。

[回答]

これらの処理に直接対応したプロシジャはありません。
この場合、UNIVARIATEプロシジャなどで標準偏差や平均、またはパーセント点を計算し、 それらの統計量を使用してDATAステップで処理を行なうことが可能です。


                                                 /* サンプルデータ */
   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;