【问题标题】:Is there a way to compute percentiles without storing values from a loop, in SAS?有没有办法在 SAS 中计算百分位数而不存储循环中的值?
【发布时间】:2017-05-09 00:09:59
【问题描述】:

有没有办法在不存储循环中的所有值的情况下计算第 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 值。我正在尝试存储更少的值以加快计算速度。

谢谢!

【问题讨论】:

  • 您是否有理由尝试在数据步骤中计算汇总统计信息,而不是使用 proc 均值或单变量?
  • @Reeza 是的,我想要 2.5 和 97.5 个百分位数(不是 proc 的意思)而不需要排序(不是 proc 单变量)
  • 为什么不是proc的意思?工作的最佳工具
  • @Reeza 因为 proc 表示不允许 2.5 和 97.5 个百分位数
  • 然后使用 proc 单变量,您可以在其中指定百分位数。

标签: sas mean median percentile datastep


【解决方案1】:

Proc Univariate 是一种更好的方法,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;

【讨论】:

    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多