R 从数据帧中按组随机抽取2个单独的100个模拟

R 从数据帧中按组随机抽取2个单独的100个模拟,r,ggplot2,random,simulation,tidyverse,R,Ggplot2,Random,Simulation,Tidyverse,这个问题不是关于采样数据,我知道样本,但这个问题是关于从数据帧模拟数据,比较模拟和实际数据的平均值(使用分组汇总) 我计算了以下两种方法的实际平均值差异 df %>% group_by(allfour) %>% summarise(hs_completion=mean(hsgrad), count=n()) 然而,我正在努力从每组中抽取100个模拟样本,然后将每个向量除以相应的组大小,将其转化为模拟毕业率,并计算两组之间的毕业率差异。在此之后,我

这个问题不是关于采样数据,我知道样本,但这个问题是关于从数据帧模拟数据,比较模拟和实际数据的平均值(使用分组汇总)

我计算了以下两种方法的实际平均值差异

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")

重要信息如下:

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

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

这为您提供了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)

你所说的绘制100个模拟图是什么意思?是次抽样,即从每组中选择20个,还是替换样本?替换样本通过100次模拟,我参考了每个样本的大小@StupidWolfso 1个替换样本?一旦你按(…)分组,你就只需采样n(),对不对,我知道采样n(),但它是从这个数据创建模拟的感谢@Stupidwolf,以不同的方式给出了它。这就是为什么如此才是最好的
sim_1 = rbinom(1000,sum(df$allfour==1),prob=rate)
hist(sim_1/sum(df$allfour==1),br=20)
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)