从数据框中按组随机抽取 2 个独立的 100 个模拟

标签 r ggplot2 random simulation tidyverse

这个问题不是关于采样数据,我知道 sample_n 但这个问题是关于模拟数据帧中的数据以比较它们的模拟平均值与实际值(使用 group_by summarise)。

我计算了使用下面的平均值之间的实际差异

df %>% 
  group_by(allfour) %>% 
  summarise(hs_completion=mean(hsgrad),
            count=n())

但是,我正在努力从每个组中抽取 100 个模拟,然后将每个向量除以各自的组大小,将其转化为模拟毕业率并计算两组之间这些比率的差异。发布这篇文章后,我需要绘制这些模拟差异的直方图,并在观察数据中计算的均值差异值处向该直方图添加一条红色垂直线。

我知道 tidyverse 和 ggplot,所以绘图不是问题,问题是当记录有限时如何进行 100 次模拟。

Dataframe df 示例如下:

    structure(list(hsgrad = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 
1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 
1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 
1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L), allfour = structure(c(1L, 
2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 1L), .Label = c("0", "1"), class = "factor")), row.names = c(NA, 
100L), class = "data.frame")

最佳答案

重要信息在这一行:

enter image description here

所以你需要在每个组中用这个成功概率来模拟伯努利。我们计算总体成功(毕业)率:

rate = mean(df$hsgrad)

1 次模拟的基本代码是这样的,您给出模拟次数 (1000)、试验次数(即组的大小)和成功率(从上面):

sim_1 = rbinom(1000,sum(df$allfour==1),prob=rate)
hist(sim_1/sum(df$allfour==1),br=20)

enter image description here

这为您提供了在 allfour==1 组中模拟成功的概率,假设该比率是总体比率。现在我们只需要对两个组执行此操作:

grp0_size = sum(df$allfour==0)
grp1_size = sum(df$allfour==1)
nsim = 1000
observed = diff(tapply(df$hsgrad,df$allfour,mean))

data.frame(
grp0_success = rbinom(nsim,grp0_size,rate)/grp0_size,
grp1_success = rbinom(nsim,grp1_size,rate)/grp1_size) %>%
mutate(diff=grp1_success-grp0_success) %>%
ggplot(aes(x=diff)) + geom_histogram() +
geom_vline(xintercept=observed)

enter image description here

关于从数据框中按组随机抽取 2 个独立的 100 个模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61137865/

相关文章:

r - plotly 旭日着色

r - 在 mgcv::gam() 包装器中传递偏移量参数

r - 将不带引号的变量传递给 curly curly {{}} ggplot 函数

r - 使用填充美学两次,具有两种不同的比例

algorithm - 如何在一个范围内生成2个不相邻的随机数

Java 程序内存不足

r - Rpart包生成的测试规则

r - 如何在R中将一列拆分为两列

r - 在ggplot图例中手动定位标签

java - [-1,+1]中两种随机数选择方法比较