有一个自举数据对象,但希望每次试验的观察总和而不是 rstudio 中的整体聚合

Have a bootstrapped data object but want the sum of observations per trial not overall aggregate in rstudio

我有以下数据对象:

 require(tidyverse)
    sample(x = 0:1, size = 4, replace = TRUE) %>% sum() 

我已经使用复制函数创建了此代码的 bootstrap 模拟(我们正在模拟抛硬币,heads50 是最终数据对象):

heads50 <- replicate(50, sample(0:1, 4, TRUE)) %>% sum()

然而,当我 运行 求和函数时,它给出了该实验所有重复的正面总总数,而不是每次试验的输出(即抛硬币 4 次时正面朝上的次数)每次试验是我想知道的,而不仅仅是总数,所以我可以稍后绘制概率)

我还创建了一个数据对象来尝试按可能性分组(即计算在一次试验中抛出一个正面 v 2 个正面 v 3 个正面 v 4 个正面的概率),如下所示:

data50 <- tibble(heads = heads50) %>% 
group_by(heads) %>% 
summarise(n = n(), p=n/50)

问题是,当我尝试生成直方图时,它并没有这样做,而只是给我一个柱状图的总体概率总和:

    ggplot(data50, aes(x = heads, y = p)) +
  geom_bar(stat = "identity", fill = "green") +
  labs(x = "Number of Heads", y = "Probability of Heads in 4 flips(p)") +
  theme_minimal()

有人知道如何对每个试验求和并分离出可能性吗?我试图重新启动 rstudio 并重新加载 tidyverse 包,其中包括具有 6 个核心功能的 dplyr。

这里的根本问题是当您调用 sum() 函数时。当 sum()replicate() 之外时,replicate() 将生成一个 0 和 1 的 4x50 矩阵,然后 sum() 会将其展平并将其全部加起来.相反,您想要的是每次试验的总和;我们想在复制循环内做加法,而不是在它之外。尝试:

heads50 <- replicate(50, sample(0:1, size = 4, replace = T) %>% sum)

另一种选择是仅沿列对矩阵求和;也就是说,

heads50 <- replicate(50, sample(0:1, size = 4, replace = T)) %>% colSums

这次 colSums() 函数位于 replicate() 之外,就像在您的原始示例中一样。

@Aaron 指出的很正确。你真的不需要管道来总结你的计数。你可以写成下面这样,或者如果你熟悉二项分布,你所拥有的本质上就是rbinom(50,4,0.5)

所以下面我又写了一遍你的代码来模拟和绘制。希望它在某些方面有用:

library(dplyr)
set.seed(123)

data.frame(trial=1:50) %>% 
mutate(heads=rbinom(50,4,0.5)) %>%
count(heads) %>% 
mutate(p=n/sum(n)) %>% 
ggplot(aes(x=heads,y=p)) + 
geom_bar(stat="identity",fill="green") + 
labs(x="Number of heads",y="Probability of Heads in 4 flips(p)") + 
theme_minimal()