在 SAS 中,有没有一种方法可以在不存储循环值的情况下计算百分位数?
Is there a way to compute percentiles without storing values from a loop, in SAS?
有没有一种方法可以在不存储循环中的所有值的情况下计算第 5 个和第 95 个百分位数?
%let it=10000;
data test;
length arrayStore767;
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/⁢
P5=0; *?;
p95=0; *?;
* count numbers in arrayStore;
do j=1 to countw(arrayStore, ' ', 's');
end;
run;
我认为这是不可能的,但实现这一目标的最佳选择是什么?
将值存储在一个字符串中,对它们进行排序并找到第 x 个位置?
或者将它们存储在 10k 个数字变量中?
我已经尝试将数字存储在不同的记录(行)中,但这导致我得到一个 34Gb 的数据集,需要很长时间才能排序,而我实际上只需要平均值以及 P2_5 和 P97_5 值。我正在尝试存储更少的值以加快计算速度。
谢谢!
我认为如果将随机数存储在一个临时数组中并使用 SAS 描述性统计函数,您可以更直接地得到您想要的东西。
%let it=10000;
data test;
call streaminit(811486001);
array x[&it] _temporary_;
do i=1 to ⁢
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;
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;
有没有一种方法可以在不存储循环中的所有值的情况下计算第 5 个和第 95 个百分位数?
%let it=10000;
data test;
length arrayStore767;
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/⁢
P5=0; *?;
p95=0; *?;
* count numbers in arrayStore;
do j=1 to countw(arrayStore, ' ', 's');
end;
run;
我认为这是不可能的,但实现这一目标的最佳选择是什么?
将值存储在一个字符串中,对它们进行排序并找到第 x 个位置? 或者将它们存储在 10k 个数字变量中?
我已经尝试将数字存储在不同的记录(行)中,但这导致我得到一个 34Gb 的数据集,需要很长时间才能排序,而我实际上只需要平均值以及 P2_5 和 P97_5 值。我正在尝试存储更少的值以加快计算速度。
谢谢!
我认为如果将随机数存储在一个临时数组中并使用 SAS 描述性统计函数,您可以更直接地得到您想要的东西。
%let it=10000;
data test;
call streaminit(811486001);
array x[&it] _temporary_;
do i=1 to ⁢
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;
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;