【问题标题】:Randomly draw 2 separate 100 simulations by group from a dataframe从数据框中按组随机抽取 2 个单独的 100 个模拟
【发布时间】:2020-07-23 01:25:19
【问题描述】:

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

我计算了使用以下平均值的实际差异

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

【问题讨论】:

  • 绘制 100 次模拟是什么意思?是二次抽样,即从每组中选择 20 个,还是替换抽样?
  • 替换样本
  • 通过 100 次模拟,我参考了每个样本的大小@StupidWolf
  • 所以 1 次平局替换?一旦你做了 group_by(..) 你就可以 sample_n() 正确
  • 不,我知道 sample_n(),但它是根据这些数据创建模拟

标签: r ggplot2 random simulation tidyverse


【解决方案1】:

重要信息在这一行:

因此,您需要在每组中以这种成功概率来模拟伯努利。我们计算总体成功(毕业)率:

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)

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

【讨论】:

  • 感谢@Stupidwolf,以不同的方式提供了它。这就是为什么 SO 是最好的
猜你喜欢
  • 2018-09-23
  • 2021-01-24
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多