Sas 随机选取序列中的数字,并根据预定义的频率分布另存为观测值

Sas 随机选取序列中的数字,并根据预定义的频率分布另存为观测值,sas,Sas,我想从1:8的序列中随机选取数字,并将选取的数字保存为SAS数据集中新变量的观测值。1到8中的每个数字都有相同的机会被选中(0.125)。因此,一旦生成了新变量,我对该变量运行proc freq,我将得到序列中每个数字的接近频率分布,约为12.5% 使用sample()函数,R等价物如下所示: x <- sample(1:8, 1000, replace=T, prob=c(.125, .125, .125, .125, .125, .125

我想从1:8的序列中随机选取数字,并将选取的数字保存为SAS数据集中新变量的观测值。1到8中的每个数字都有相同的机会被选中(0.125)。因此,一旦生成了新变量,我对该变量运行proc freq,我将得到序列中每个数字的接近频率分布,约为12.5%

使用sample()函数,R等价物如下所示:

x <- sample(1:8, 1000, replace=T, 
                       prob=c(.125, .125, .125, .125, .125, .125, .125, .125)) 
xSAS具有该功能,可以生成多种分布中的任何一种。
uniform
发行版听起来就像你想要的。这将产生0:1,所以您只需将其修改为1:8

data want;
 call streaminit(7);  *initialize random stream, pick whatever positive seed you want;
 do _n_=1 to 1000; *do 1000 times;
   x = ceil(rand('Uniform')*8);
   output;
 end;
run;
另一种方法是“Table”方法,它更直接地类似于
r
函数

data want;
 call streaminit(7);
 do _n_ = 1 to 1000;
  x = rand('Table',.125,.125,.125,.125,.125,.125,.125,.125);
  output;
 end;
run;

proc freq data=want;
table x;
run;
但是,在这种情况下,
Uniform
也应该这样做

请注意,此方法(统一)对顶端的偏差非常小:因为它不能生成1,所以8的发生频率将比1到7的发生频率略低。(1是0