在SAS中,有没有一种不用存储循环值就可以计算百分位数的方法?

在SAS中,有没有一种不用存储循环值就可以计算百分位数的方法?,sas,mean,median,percentile,datastep,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 &it; number=rand('Uniform'); sum + number; if number<m

有没有一种方法可以计算第5个和第95个百分位,而不存储循环中的所有值

%let it=10000;
data test;
    length arrayStore$32767;
    arrayStore='';
    sum=0;
    min=99999;
    max=-99999;
    do i=1 to &it;
        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;
%让它=10000;
数据测试;
长度阵列存储$32767;
arrayStore='';
总和=0;
最小值=99999;
最大值=-99999;
i=1到&it;
数字=兰特(‘统一’);
和+数;
如果numbermax,则max=number;
arrayStore=catx(“”,arrayStore,圆形(数字,0.1));
结束;
平均值=总和/&it;
P5=0;*?;
p95=0;*?;
*计算arrayStore中的数字;
doj=1到countw(arrayStore,,'s');
结束;
跑
我认为这是不可能的,但那实现这一目标的最佳选择是什么呢

将值存储在字符串中,对其进行排序并查找第X个位置? 或者将它们存储在10k数值变量中

我已经尝试将数字存储在不同的记录(行)中,但这导致我使用了一个34Gb的数据集,它需要很长时间来排序,而我实际上只需要平均值以及P2_5和P97_5值。我试图存储更少的值,以加快计算速度


谢谢

我认为,如果您将随机数存储在临时数组中并使用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;

我认为,如果将随机数存储在临时数组中并使用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;

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

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

proc print data=want;
run;

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

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

proc print data=want;
run;

有没有什么原因让你试图在数据步骤中计算汇总统计数据,而不是使用proc均值或单变量?@Reeza是的,我想要2.5和97.5个百分位数(不是proc均值),而不需要排序(不是proc单变量)为什么不使用proc均值?最佳工具job@Reeza因为proc-means不允许使用2.5和97.5个百分位数,所以请使用proc-univariate,您可以在其中指定百分位数。您试图在数据步骤中计算汇总统计信息而不是使用proc-means或单变量,这有什么原因吗?@Reeza是的,我想要2.5和97.5个百分位数(不是proc-means)不需要排序(不是proc单变量)为什么不是proc的意思?最佳工具job@Reeza因为proc means不允许使用2.5和97.5%的百分比,所以使用proc单变量,您可以在其中指定百分比。