Panggilan SAS Randgen dengan distribusi Weibull

Saya mencoba menggunakan panggilan randgen dalam proc IML untuk membuat 10 nomor acak yang mengikuti distribusi Weibull dengan parameter tertentu. Berikut adalah kode yang saya gunakan (tentunya akan ada lebih dari satu loop tetapi saya baru mengujinya sekarang):

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;

Untuk contoh ini Ntimes = 10, alpha[i] = 4.5985111, dan beta[i] = 131.79508. Masalah saya adalah masing-masing dari 10 iterasi/angka acak muncul kembali sebagai 1. Saya menggunakan fungsi rweibull di R dengan parameter yang sama dan mendapatkan hasil yang masuk akal jadi saya pikir ini ada hubungannya dengan SAS atau kode saya daripada masalah dengan parameter. Apakah saya menggunakan panggilan Randgen dengan benar? Adakah yang tahu mengapa hasilnya keluar seperti ini?


person kelchenk    schedule 26.08.2014    source sumber


Jawaban (2)


Ini bekerja:

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;

Saya rasa Anda tidak bisa menggunakan Rands[1:Ntimes] seperti itu. Saya pikir Anda ingin menetapkannya ke matriks sementara dan kemudian menetapkan hasil matriks tersebut ke matriks yang lebih besar.

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
Untuk memperluas pernyataan Joe, jangan pernah meneruskan variabel sementara sebagai argumen ke rutinitas yang akan memberikan hasil dalam argumen tersebut. Lihat artikel blogs.sas.com/content/iml/ 30/01/2013/variabel sementara - person Rick; 27.08.2014

Sebenarnya, kecuali Anda menggunakan SAS/IML versi kuno, Anda tidak memerlukan loop apa pun. Sejak SAS/IML 12.3, Subrutin RANDGEN menerima vektor parameter. Dalam kasus Anda, tentukan vektor untuk parameter alfa dan beta. Katakanlah ada parameter 'Nparam'. Kemudian alokasikan matriks N x Nparam untuk menampung hasilnya. Dengan satu panggilan ke RANDGEN, Anda dapat mengisi matriks sehingga kolom ke-i adalah sampel berukuran N dari Weibull(alpha[i], beta[i]), seperti yang ditunjukkan dalam contoh berikut:

 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