相当于SAS IML中的R findInterval()函数

时间:2011-02-09 07:42:42

标签: r sas

SAS中的R findInterval(或cut)是否有任何类似内容,特别是在IML中?

我正在将我的R程序转换为IML进行蒙特卡罗模拟,并使用findInterval将数字从随机数生成器转换为输出状态。我可以用IML写一些东西来取代它,但它与原版相比非常慢。这是因为findInterval利用了编译的C代码;我可以在SAS中使用类似的东西吗?

1 个答案:

答案 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