SAS Randgen โทรพร้อมการกระจาย Weibull

ฉันกำลังพยายามใช้ call randgen ภายใน proc IML เพื่อสร้างตัวเลขสุ่ม 10 ตัวที่ตามหลังการแจกแจงแบบ Weibull ด้วยพารามิเตอร์บางตัว นี่คือโค้ดที่ฉันใช้ (เห็นได้ชัดว่าจะมีมากกว่าหนึ่งลูป แต่ตอนนี้ฉันแค่ทดสอบ):

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, alpha[i] = 4.5985111 และ beta[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
หากต้องการขยายความคิดเห็นของ Joe อย่าส่งตัวแปรชั่วคราวเป็นอาร์กิวเมนต์ไปยังรูทีนที่จะส่งคืนผลลัพธ์ในอาร์กิวเมนต์นั้น ดูบทความ blogs.sas.com/content/iml/ 2013/01/30/ตัวแปรชั่วคราว - person Rick; 27.08.2014

จริงๆ แล้ว ยกเว้นกรณีที่คุณใช้ SAS/IML เวอร์ชันเก่า คุณไม่จำเป็นต้องมีการวนซ้ำใดๆ ตั้งแต่ SAS/IML 12.3 รูทีนย่อย RANDGEN ยอมรับเวกเตอร์ของพารามิเตอร์ ในกรณีของคุณ ให้กำหนดเวกเตอร์สำหรับพารามิเตอร์อัลฟ่าและเบต้า สมมติว่ามีพารามิเตอร์ 'Nparam' จากนั้นจัดสรรเมทริกซ์ N x Nparam เพื่อเก็บผลลัพธ์ ด้วยการเรียก RANDGEN เพียงครั้งเดียว คุณสามารถเติมเมทริกซ์เพื่อให้คอลัมน์ i_th เป็นตัวอย่างขนาด N จาก Weibull(alpha[i], beta[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