理科大(当時)の野村尚吾さんに以下のプログラムで計算できると教えてもらいました。
ありがとうございます。
よって method = 5, 8, 9 以外は以下のやり方で計算できます。
data data; do i=1 to 10000; y=rannor(4989); output;end; run; proc univariate data=data noprint pctldef=5; var y; output pctlpts=20 33.33 66.67 80 97.5 pctlpre=nquantile_ out=out; proc print ;run;
SAS では固定の標本分位点しか求められないという情報をもらったので、R の stat package の quantile() 関数を移植してみました。 R のライセンスに従い、GPLv2 で配布します。
squantile_v100.zip (download)
更新履歴
同一ディレクトリにマクロファイル [squnatile.sas] と、サンプル [example.sas] を展開して、[example.sas] を実行します。 以下、マクロ変数の解説。
data : 入力データセット名 var : [data] 内の標本分位点を計算したい変数名 prob : 分位点 [0, 1] で指定 (パーセントではないです) out : 出力データセット名 method : 1 から 9 の間の整数で指定します。 詳しくは R のドキュメントなどを参照してください。 このマクロのデフォルトは method = 8 です。 R のデフォルトは method = 7 です。 SAS のデフォルトは method = 3 らしいです。
それぞれの方法で 77.77% 点を求めます。
proc datasets lib = work kill; run; option linesize = 130 pagesize = 9999 mprint; dm 'log; clear; output; clear'; %let execpath = " "; %let Path = " "; %macro setexecpath; %let execpath = %sysfunc(getoption(sysin)); %if %length(&execpath) = 0 %then %let execpath = %sysget(sas_execfilepath); data _null_; do i = length("&execpath") to 1 by -1; if substr("&execpath", i, 1) = "\" then do; call symput("Path", substr("&execpath", 1, i)); stop; end; end; run; %mend setexecpath; %setexecpath; %include "&Path.squnatile.sas"; data d1; call streaminit(28372); do r = 1 to 19; y = rand("normal"); output; end; keep y; proc sort data = d1; by y; proc print data = d1; run; %let pr = 0.7777; %SQuantile(d1, y, &pr., out, method=1); title "method 1"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=2); title "method 2"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=3); title "method 3"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=4); title "method 4"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=5); title "method 5"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=6); title "method 6"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=7); title "method 7"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=8); title "method 8"; proc print data = out; run; %SQuantile(d1, y, &pr., out, method=9); title "method 9"; proc print data = out; run;
method quanitle %SQuantile 1 1.0612 1.06122 2 1.0612 1.06122 3 1.0612 1.06122 4 1.0435 1.04354 5 1.1161 1.11614 6 1.1713 1.17133 7 1.0611 1.06111 8 1.1345 1.13454 9 1.1299 1.12994