Вызов SAS Randgen с распределением Weibull

Я пытаюсь использовать call randgen в proc IML для создания 10 случайных чисел, которые следуют распределению Вейбулла с определенными параметрами. Вот код, который я использую (очевидно, будет больше одного цикла, но я сейчас просто тестирую):

do i = 1 to 1;
    Call randgen(Rands[i,1:Ntimes], 'Weibull', alpha[i], beta[i]);
    print (rands[1,1:Ntimes]);
    print (alpha[i]) (beta[i]);
end;

Для этого примера Ntimes = 10, альфа[i] = 4,5985111 и бета[i] = 131,79508. Моя проблема в том, что каждая из 10 итераций/случайных чисел возвращается как 1. Я использовал функцию rweibull в R с теми же параметрами и получил результаты, которые имели смысл, поэтому я думаю, что это как-то связано с SAS или моим кодом, а не проблема с параметрами. Правильно ли я использую вызов Randgen? Кто-нибудь знает, почему результаты будут такими?


person kelchenk    schedule 26.08.2014    source источник


Ответы (2)


Это работает:

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] таким образом. Я думаю, вы хотели бы назначить его временной матрице, а затем назначить результаты этой матрицы большей матрице.

IE:

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);
person Joe    schedule 26.08.2014
comment
Чтобы расширить замечания Джо, никогда не передавайте временную переменную в качестве аргумента подпрограммам, которые будут возвращать результаты в этом аргументе. См. статью blogs.sas.com/content/iml/ 30 января 2013 г./временные переменные - person Rick; 27.08.2014

На самом деле, если вы не используете устаревшую версию SAS/IML, вам не нужны никакие циклы. Начиная с SAS/IML 12.3, Подпрограмма RANDGEN принимает вектор параметров. В вашем случае определите вектор для альфа- и бета-параметров. Допустим, есть параметры «Nparam». Затем выделите матрицу N x Nparam для хранения результатов. С помощью одного вызова RANDGEN вы можете заполнить матрицу так, чтобы столбец i_th был выборкой размера N из Вейбулла (альфа[i], бета[i]), как показано в следующем примере:

 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]);
person Rick    schedule 27.08.2014