SAS中的R findInterval
(或cut
)是否有任何类似内容,特别是在IML中?
我正在将我的R程序转换为IML进行蒙特卡罗模拟,并使用findInterval
将数字从随机数生成器转换为输出状态。我可以用IML写一些东西来取代它,但它与原版相比非常慢。这是因为findInterval
利用了编译的C代码;我可以在SAS中使用类似的东西吗?
答案 0 :(得分:1)
你的休息时间是否均匀(等概率)? 对于均匀中断,您可以使用ceil(k * u),其中u是向量或随机统一数。 例如,如果您希望以相同的概率将10个观测值随机分配给数字1-4,则可以说
y = ceil(4*ranuni(j(10,1)));
或者,如果您想使用较新的随机数生成器,
u = j(10,1); /** allocate **/
call randgen(u, "uniform"); /** fill with U[0,1] **/
y = ceil(4*u);
对于不等概率,请使用“表格”分布。例如,
p = {0.1 0.5 0.2 0.2}; /** four categories with given probabilities **/
y = j(10, 1);
call randgen(y, "Table", p); /** fills with 1-4 with probability p **/
您可能有兴趣使用我的书第13章中的SampleWithReplace模块,使用SAS / IML软件进行统计编程。您可以下载代码并查看其使用示例 http://blogs.sas.com/iml/index.php?/archives/75-Hey!-Those-Two-People-Have-the-Same-Initials!.html
这两种技术都不需要findInterval,因为它们可以直接生成类别。如果你真的认为你需要对随机数进行分类,你可以使用我在这里描述的算法: http://blogs.sas.com/iml/index.php?/archives/80-Count-the-Number-of-Points-in-Bins-Efficiently.html