使用 sapply 以预定义的概率进行采样

Using sapply to sample with pre-defined probability

我正在使用具有预定义概率的 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"的概率。我对每个 probs 使用了 sapply,并应用了 sample 函数。

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

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 相同,我们可以说我们所拥有的是正确的。

另一个选项使用 "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)