2016-12-23 9 views
0

ループのすべての値を保存せずに5番目と95番目の百分位数を計算する方法はありますか?SASのループの値を格納せずにパーセンタイルを計算する方法はありますか?

%let it=10000; 
data test; 
    length arrayStore$32767; 
    arrayStore=''; 
    sum=0; 
    min=99999; 
    max=-99999; 
    do i=1 to ⁢ 
     number=rand('Uniform'); 
     sum + number; 
     if number<min then min=number; 
     if number>max then max=number; 
     arrayStore=catx(' ',arrayStore,round(number,0.1)); 
    end; 
    mean=sum/&it; 

    P5=0; *?; 
    p95=0; *?; 

    * count numbers in arrayStore; 
    do j=1 to countw(arrayStore, ' ', 's'); 
    end; 
run; 

私はそれが可能だとは思わないが、これを達成するための最良の選択肢は何でしょうか?

文字列に値を格納し、並べ替えて、x番目の位置を見つけますか? それを10kの数値変数に格納しますか?

私はすでに別のレコード(行)に数値を格納しようとしましたが、実際には平均値とP2_5とP97_5値が必要な間にソートに時間がかかる34Gbデータセットにつながります。私は計算をより速くするために、より少ない値を格納しようとしています。

ありがとうございます!

+0

proc手段または単変量を使用するのではなく、データステップで要約統計量を計算しようとする理由はありますか? – Reeza

+0

@Reezaはい、私は2.5と97.5パーセンタイル(proc単変量ではない)をソートする必要なしに –

+0

procを意味するのはなぜですか?仕事のための最良のツール – Reeza

答えて

2

一時的な配列に乱数を格納し、SAS記述統計関数を使用すると、より直接的なものを得ることができると思います。

%let it=10000; 
data test; 
    call streaminit(811486001); 
    array x[&it] _temporary_; 
    do i=1 to &it; 
     x[i] = round(rand('Uniform'),.01); 
     end; 
    mean = mean(of x[*]); 
    p05 = pctl(5,of x[*]); 
    p95 = pctl(95,of x[*]); 
    put 'NOTE: ' (p:)(=); 
    run; 
%put NOTE: &=sysrandom; 
0

Proc Univariateは、より良い方法です。

proc univariate data=sashelp.class noprint; 
var weight; 
output out=want pctlpts=2.5 97.5 PCTLPRE=P; 
run; 

proc print data=want; 
run; 
関連する問題