【问题标题】:Equivalent to R findInterval() function in SAS IML相当于 SAS IML 中的 R findInterval() 函数
【发布时间】:2011-02-09 07:42:42
【问题描述】:

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

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

【问题讨论】:

  • 我应该描述一下findInterval 的作用!给定一个值 x 和一个已排序的切点向量 vec,它会找到 x 位于之间的那些切点,即 x 落入哪个区间。更准确地说,如果vec[i] < x < vec[i+1],则findInterval 返回i。参数x 也可以是一个向量,在这种情况下它返回一个区间向量。

标签: r sas


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多