【问题标题】:Sample a number from 0 to 1 with uneven probabilities以不均匀的概率对 0 到 1 的数字进行采样
【发布时间】:2018-04-06 09:50:32
【问题描述】:

我想在 0 和 1 之间采样一个随机数,有 90% 的概率从 0-0.3 采样,10% 的概率在 0.3-1 之间采样。

我尝试了以下方法:

0.9*runif(1, 0, 0.3) + 0.1*runif(1, 0.3, 1)

但这还不够:例如,我永远不会得到数字 0.8。

在 Base R 中有简单的方法吗?

【问题讨论】:

  • 类似if(runif(1) <= 0.9) runif(1, 0, 0.3) else runif(1, 0.3, 1) ?
  • runif(2, c(0, 0.3), c(0.3, 1))[sample(c(1, 2), size = 1, prob = c(0.9, 0.1))]。不过,我需要考虑如何对其进行矢量化。

标签: r random


【解决方案1】:
sample(c(runif(1,0,0.3),runif(1,0.3,1)),1,prob=c(0.9,0.1))

【讨论】:

    【解决方案2】:

    通常在 R 中,您希望以矢量化的方式进行处理。所以不要在那个时候画一个数字,而是在一次调用中画出所有的数字(快得多)。这里可以使用sample画出更高的极值和平局。像这样:

    nsamples<-100000
    res<-runif(nsamples,0,sample(c(0.03,1),nsamples,TRUE,prob=c(10,90)))
    #just to check the result
    hist(res)
    #this should be around 0.127(=0.9*0.03+0.1*1) if correct
    mean(res<0.03)
    

    【讨论】:

      【解决方案3】:

      您可以在需要时编写一个小函数来完成这项工作。

      runif_probs <- function(n, p = 0.9, cutpoint = 0.3){
          ifelse(runif(n) <= p, runif(n, 0, cutpoint), runif(n, cutpoint, 1))
      }
      
      set.seed(8862)
      
      which(runif_probs(100) > 0.8)
      #[1] 38 62
      

      【讨论】:

        猜你喜欢
        • 2022-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 2019-09-16
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多