【问题标题】:Draw random numbers from distribution within a certain range从一定范围内的分布中抽取随机数
【发布时间】:2015-09-29 21:48:18
【问题描述】:

我想从一系列分布中抽取一些随机变量。但是,返回的值必须不高于某个阈值。 假设我想使用 gamma 分布,阈值为 10,我需要 n=100 个随机数。我现在想要 0 到 10 之间的 100 个随机数。(比如比例和形状是 1。)

得到 100 个随机变量显然很容易......

rgamma(100, shape = 1, rate = 1)

但是我怎样才能实现这些值的范围从 0 到 100?

编辑 为了让我的问题更清楚。绘制的 100 个值应该在 0 和 10 之间缩放。因此绘制的最高值为 10,最低为 0。如果不清楚,请见谅...

编辑 No2 要为我需要的随机数添加一些上下文:我想绘制遵循某些分布的“系统修复时间”。然而,在系统模拟中,修复存在“简单”(即修复时间短)和“复杂”(即修复时间长)的二项式概率。我现在需要一个提供“短修复时间”的功能和一个提供“长修复时间”的功能。阈值将是短修复时间和长修复时间之间的区别。再次,我希望这能让我的问题更清楚一点。

【问题讨论】:

  • @Severin 的方法成功地在“0 到 100 之间”的参数内创建了随机伽马分布。如果您认为它不正确,则说明您没有准确地解释问题。
  • 我在问题中添加了一些解释,希望能更清楚。
  • 将观察到的样本的最小值和最大值从分布缩放到预先指定的最小值和最大值,在任何可能使用概率分布的情况下几乎肯定是错误的做法。也许您应该详细说明您尝试使用这些随机数做什么以及为什么需要它们具有预先指定的最小值和最大值,尽管它们是随机的。
  • 如果简单的维修并不总是短而复杂的维修并不总是长,而是简单的维修往往很短,而复杂的维修往往很长怎么办?因此,对于简单的修复,您可以从概率质量在 0 到 10 之间的分布中绘制修复时间,如果修复很复杂,您可以从“复杂修复长度”分布中提取其修复类型,该分布在其他地方具有概率质量。我假设您出于某种原因生成了一些虚假数据,因此您可以选择所需的模型。

标签: r random distribution


【解决方案1】:

这对于伽马分布是不可能的。 分布的支持决定了从中提取的样本数据的范围。 由于伽马分布的支持是(0,inf),这是不可能的。(请参阅https://en.wikipedia.org/wiki/Gamma_distribution)。

如果您真的想要一个 gamma 分布,请按照 Alex Reynolds 的建议采用拒绝抽样方法。

否则,请寻找具有有限/有限支持的分布(请参阅https://en.wikipedia.org/wiki/List_of_probability_distributions
例如统一或二项式

【讨论】:

  • 好的。 ;) 我可以以某种方式定义某个范围内的值以更高的概率绘制吗?
【解决方案2】:

好吧,用拒绝填充向量,未经测试的代码

v <- rep(-1.0, 100)
k <- 1
while (TRUE) {
    q <- rgamma(1, shape=1, rate=1)
    if (q > 0.0 && q < 100) {
        v[k] <- q
        k<-k+1
        if (k>100)
            break
    }
}

【讨论】:

  • 同时使用while(TRUE) 是浪费条件。条件是在流程中设置断点。试试while(k &lt;= 100),去掉最后两行。
  • @user3347232 This code returns no numbers higher than 1.5 这可能是真的,毕竟你不希望数字低于 100(或 10?),所以条件显然满足。如果您想要不同的东西,请说明您到底想要什么
【解决方案3】:

我不确定你是否可以保留原始分布的属性,施加额外的条件......但这样的事情会做的工作:

Filter(function(x) x < 10, rgamma(1000,1,1))[1:100]

对于缩放 - 注意,结果不会遵循原始分布(但没有办法做到这一点,正如其他答案所指出的那样):

# rescale numeric vector into (0, 1) interval
# clip everything outside the range 
rescale <- function(vec, lims=range(vec), clip=c(0, 1)) {
  # find the coeficients of transforming linear equation
  # that maps the lims range to (0, 1)
  slope <- (1 - 0) / (lims[2] - lims[1])
  intercept <- - slope * lims[1]

  xformed <- slope * vec + intercept

  # do the clipping
  xformed[xformed < 0] <- clip[1]
  xformed[xformed > 1] <- clip[2]

  xformed
}

# this is the requested data
10  * rescale(rgamma(100,1,1))

【讨论】:

  • 我无法画出高于 2.5 的数字
  • 啊 - 请改写问题,如果问题不是限制可能的值,而是扩大结果。也许如果你提供更广泛的努力背景(你为什么要做这一切)......
  • 我为这个问题添加了一些上下文。我希望这让它更清楚一点......感谢您的帮助!
【解决方案4】:

使用 truncdist 包。它截断上限和下限之间的任何分布。 希望对您有所帮助。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多