具有威布尔分布的SAS Randgen呼叫
我试图在proc IML中使用call randgen创建10个随机数,这些随机数遵循具有特定参数的威布尔分布。下面是我正在使用的代码(显然不止一个循环,但我现在正在测试): 对于本例,Ntimes=10,alpha[i]=4.5985111,beta[i]=131.79508。我的问题是,10次迭代/随机数中的每一次都返回为1。我在R中使用了具有相同参数的rweibull函数,得到了有意义的结果,因此我认为它与SAS或我的代码有关,而不是与参数有关。我是否正确使用Randgen呼叫?有人知道为什么结果会这样吗?这是有效的:具有威布尔分布的SAS Randgen呼叫,sas,sas-iml,Sas,Sas Iml,我试图在proc IML中使用call randgen创建10个随机数,这些随机数遵循具有特定参数的威布尔分布。下面是我正在使用的代码(显然不止一个循环,但我现在正在测试): 对于本例,Ntimes=10,alpha[i]=4.5985111,beta[i]=131.79508。我的问题是,10次迭代/随机数中的每一次都返回为1。我在R中使用了具有相同参数的rweibull函数,得到了有意义的结果,因此我认为它与SAS或我的代码有关,而不是与参数有关。我是否正确使用Randgen呼叫?有人知道为
proc iml;
alpha=j(10);
beta=j(10);
alpha[1]=4.59;
beta[1] = 131.8;
Ntimes=10;
rands = j(1,10);
print (rands);
do i = 1 to 1;
Call randgen(Rands, 'WEIB', alpha[1],beta[1]);
print (rands);
end;
quit;
我认为你不能那样使用Rands[1:Ntimes]
。我想你应该把它分配给一个临时矩阵,然后把这个矩阵的结果分配给一个更大的矩阵
即:
实际上,除非您使用的是古老版本的SAS/IML,否则您不需要任何循环。自SAS/IML 12.3以来。在您的例子中,为alpha和beta参数定义一个向量。假设有“Nparam”参数。然后分配一个nx Nparam矩阵来保存结果。通过对RANDGEN的一次调用,您可以填充矩阵,以便第i列是来自Weibull(α[i],β[i])的大小为N的样本,如以下示例所示:
proc iml;
Nparam = 8; N = 1000;
alpha= 1:Nparam; /* assign parameter values */
beta = 10 + (Nparam:1);
rands = j(N,Nparam);
call randgen(rands, 'WEIB', alpha,beta); /* SAS/IML 12.1 */
/* DONE. The i_th column is a sample from Weibul(alpha[i], beta[i])
TEST IT: Compute the mean of each sample: */
mean = mean(rands); std = std(rands);
print (alpha//beta//mean//std)[r={"alpha" "beta" "mean" "std"}];
/* TEST IT: Plot the distribution of each sample (SAS/IML 12.3) */
title "First param"; call histogram(rands[,1]);
title "Last param"; call histogram(rands[,Nparam]);
要扩展Joe的评论,请不要将临时变量作为参数传递给将在该参数中返回结果的例程。见文章
allRands=j(10,10);
do i = 1 to 10;
Call randgen(Rands, 'WEIB', alpha[1],beta[1]);
print (rands);
allRands[i,1:10]=Rands;
end;
print(allRands);
proc iml;
Nparam = 8; N = 1000;
alpha= 1:Nparam; /* assign parameter values */
beta = 10 + (Nparam:1);
rands = j(N,Nparam);
call randgen(rands, 'WEIB', alpha,beta); /* SAS/IML 12.1 */
/* DONE. The i_th column is a sample from Weibul(alpha[i], beta[i])
TEST IT: Compute the mean of each sample: */
mean = mean(rands); std = std(rands);
print (alpha//beta//mean//std)[r={"alpha" "beta" "mean" "std"}];
/* TEST IT: Plot the distribution of each sample (SAS/IML 12.3) */
title "First param"; call histogram(rands[,1]);
title "Last param"; call histogram(rands[,Nparam]);