从数据框中随机抽取两个分组的100个模拟。

3
这个问题并不是关于采样数据的,我知道`sample_n`函数,但这个问题是关于从数据框架中模拟数据,以便比较其在模拟和真实情况下的平均值(使用`group_by summarise`)。
我通过以下方式计算了实际平均差异:
df %>% 
  group_by(allfour) %>% 
  summarise(hs_completion=mean(hsgrad),
            count=n())

然而,我正在努力从每个组中绘制100个模拟,并将每个向量除以相应组的大小,以将其转换为模拟毕业率,并计算两个组之间这些率的差异。完成后,我需要绘制这些模拟差异的直方图,并在该直方图上添加一个红色垂直线,在观察数据中计算出的平均差异值处。

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

数据框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")

你所说的“绘制100个模拟”是什么意思?是子采样,即从每组中选择20个,还是有放回地进行抽样? - StupidWolf
通过100次模拟,我参考了每个样本的大小@StupidWolf - Vaibhav Singh
那么1是带替换进行抽样吗?当你使用group_by(..)之后,你只需要用sample_n()对其进行采样就可以了。 - StupidWolf
抱歉,我觉得我们在打转,你想要引导吗?https://en.wikipedia.org/wiki/Bootstrapping_(statistics)。如果你这样做,df%>% group_by(allfour)%>% sample_n(n()),这是一个引导,按组allfour分层。 - StupidWolf
让我们在聊天中继续这个讨论 - Vaibhav Singh
显示剩余2条评论
1个回答

2
这行中包含了重要信息:

enter image description here

所以您需要模拟伯努利试验,每组成功的概率为此。我们计算整体成功(毕业)率:
rate = mean(df$hsgrad)

一次模拟的基本代码如下,您需要提供模拟次数(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


谢谢@Stupidwolf,他以不同的方式给了我建议。这就是为什么SO是最好的。 - Vaibhav Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接