有一个自举数据对象,但希望每次试验的观察总和而不是 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()
我有以下数据对象:
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()