【问题标题】:Using sapply to sample with pre-defined probability使用 sapply 以预定义的概率进行采样
【发布时间】:2020-03-01 11:27:14
【问题描述】:

我正在使用具有预定义概率的sample 函数。

我编写了这段代码,它运行良好。但是,没有办法检查我是否正确地完成了我的工作。有人会检查我的工作并对其进行评估吗?

df <- structure(list(A=c("A","B","C","D","E","F","G"),
                     probs=c(0.2,0.4,0.6,0.8,0.3,0.7,0.9)),
                Names = c("name","probs"), class = "data.frame", row.names = c(1:7))

df$pred<-sapply(df$probs,function(x) sample(c("Yes","No"),1,prob=c(x,1-x),replace=TRUE))

df 中,probs 是说"yes" 的预定义概率。我将sapply 与每个probs 一起使用,并应用了sample 函数。

【问题讨论】:

  • 1) 使用set.seed(&lt;integer&gt;) 使其可重现; 2) 如果您一次只采样一个,则不需要replace

标签: r sample sapply


【解决方案1】:

检查这一点的一种方法是增加样本量并检查比例。

n <- 1e6
set.seed(123)
sapply(df$probs,function(x) 
          table(sample(c("Yes","No"),n,prob=c(x,1-x),replace=TRUE))/n)


#       [,1]     [,2]    [,3]     [,4]     [,5]     [,6]     [,7]
#No  0.80006 0.599886 0.40003 0.200072 0.699906 0.299314 0.100044
#Yes 0.19994 0.400114 0.59997 0.799928 0.300094 0.700686 0.899956

我们可以看到所有"Yes" 的值几乎与df$probs 相同,我们可以说我们所拥有的是正确的。

【讨论】:

  • 这是非常直观和清晰的解释。谢谢!
【解决方案2】:

另一个使用“purrr”的选项

library(purrr)
sample_fun <- function(probs){
  sample(c("Yes", "No"), size = 10^6, prob = c(probs, 1 - probs ), replace = T)
}

map(df$probs, ~ sample_fun(.x)) %>% 
  map_dbl( ~ mean(.x == "Yes")) %>% 
  purrr::set_names(df$A) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2013-12-28
    • 2021-06-16
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多