在SAS中,有没有办法计算百分位数而不存储循环中的值?

时间:2016-12-23 09:40:33

标签: sas mean median percentile datastep

有没有办法计算第5和第95百分位而不存储循环中的所有值?

%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数字变量中?

我已经尝试将数字存储在不同的记录(行)中,但这导致我需要一个34Gb的数据集,这需要很长时间才能排序,而我真的只需要平均值和P2_5和P97_5值。我正在尝试存储更少的值以使计算更快。

谢谢!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

Proc单变量是一种更好的方法,IMO。

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

proc print data=want;
run;