如何绘制以相同均值为中心的二项式 PDF 分布
How to plot binomial PDF distributions centered on same mean
我正在尝试绘制一些二项式分布,并表明随着 N 的增加,曲线看起来越来越像正态分布。我试过使用 dbinom,但这是我得到的:
这是我用来生成此发行版的代码:
x <- -5:250
y10 <- dbinom(x, 10, 0.5)
y30 <- dbinom(x, 30, 0.5)
y60 <- dbinom(x, 60, 0.5)
y100 <- dbinom(x, 100, 0.5)
ynorm <- dnorm(x, mean=-1, sd=1)
y10 <- y10 * sqrt(y10) / 0.8
y30 <- y30 * sqrt(y30) / 0.8
y60 <- y60 * sqrt(y60) / 0.8
y100 <- y100 * sqrt(y100) / 0.8
y10 <- y10[7:17]
y30 <- y30[17:27]
y60 <- y60[32:42]
y100 <- y100[52:62]
plot(range(0, 10), range(0, 0.5), type = "n")]
lines(ynorm, col = "red", type = "l")
lines(y10, col = "blue", type = "l")
lines(y30, col = "orange", type = "l")
lines(y60, col = "green", type = "l")
lines(y100, col = "yellow", type = "l")
有谁知道如何在 R 中正确调整二项分布?
理论上 1000 的 N 应该使它看起来像正态分布,但我不知道如何到达那里,我已经 tried/failed 使用 ggplot2 :(
您可以重新缩放 x 值,以便 x==0
始终出现在每个二项式密度的峰值密度处。您可以通过找到每个密度的密度最大时的 x 值来完成此操作。例如:
library(ggplot2)
theme_set(theme_classic())
library(dplyr)
x <- -5:250
n = c(6,10,30,60,100)
p = 0.5
binom = data.frame(x=rep(x, length(n)),
y=dbinom(x, rep(n, each=length(x)), p),
n=rep(n, each=length(x)))
ggplot(binom %>% filter(y > 1e-5) %>%
group_by(n) %>%
mutate(x = x - x[which.max(y)]),
aes(x, y, colour=factor(n))) +
geom_line() + geom_point(size=0.6) +
labs(colour="n")
参考您的评论,这是一种在二项式密度之外添加正态密度的方法:二项式分布的均值是 n*p
,其中 n
是试验次数p
是成功的概率。方差为 n*p*(1-p)
。因此,对于上面的每个二项式密度,我们需要具有相同均值和方差的正态密度。我们在下面创建了一个数据框,然后将二项式和正态密度绘制在一起。
首先,创建一个新的包含更高密度点的 x 值向量,以反映正态分布是连续的,而不是离散的:
x = seq(-5,250,length.out=2000)
现在我们创建一个正态密度的数据框,其均值和方差与上面的二项式密度相同:
normal=data.frame(x=rep(x, length(n)),
y=dnorm(x, rep(n,each=length(x))*p, (rep(n, each=length(x))*p*(1-p))^0.5),
n=rep(n, each=length(x)))
# Cut off y-values below ymin
ymin = 1e-3
所以现在我们有两个数据框要绘制。我们仍然在 ggplot
的主调用中添加 binom
数据框。但在这里我们还添加了对 geom_line
的调用以绘制正态密度。我们给 geom_line
normal
数据框。此外,对于此图,我们使用 geom_segment
来强调二项式密度的离散点(您也可以为此使用 geom_bar
)。
ggplot(binom %>% filter(y > ymin), aes(x, y)) +
geom_point(size=1.2, colour="blue") +
geom_line(data=normal %>% filter(y > ymin), lwd=0.7, colour="red") +
geom_segment(aes(x=x, xend=x, y=0, yend=y), lwd=0.8, alpha=0.5, colour="blue") +
facet_grid(. ~ n, scales="free", space="free")
这是新情节的样子。您可以通过多种方式更改缩放比例,并且可能还有许多其他方法可以对其进行调整,具体取决于您想要强调的内容。
我正在尝试绘制一些二项式分布,并表明随着 N 的增加,曲线看起来越来越像正态分布。我试过使用 dbinom,但这是我得到的:
这是我用来生成此发行版的代码:
x <- -5:250
y10 <- dbinom(x, 10, 0.5)
y30 <- dbinom(x, 30, 0.5)
y60 <- dbinom(x, 60, 0.5)
y100 <- dbinom(x, 100, 0.5)
ynorm <- dnorm(x, mean=-1, sd=1)
y10 <- y10 * sqrt(y10) / 0.8
y30 <- y30 * sqrt(y30) / 0.8
y60 <- y60 * sqrt(y60) / 0.8
y100 <- y100 * sqrt(y100) / 0.8
y10 <- y10[7:17]
y30 <- y30[17:27]
y60 <- y60[32:42]
y100 <- y100[52:62]
plot(range(0, 10), range(0, 0.5), type = "n")]
lines(ynorm, col = "red", type = "l")
lines(y10, col = "blue", type = "l")
lines(y30, col = "orange", type = "l")
lines(y60, col = "green", type = "l")
lines(y100, col = "yellow", type = "l")
有谁知道如何在 R 中正确调整二项分布?
理论上 1000 的 N 应该使它看起来像正态分布,但我不知道如何到达那里,我已经 tried/failed 使用 ggplot2 :(
您可以重新缩放 x 值,以便 x==0
始终出现在每个二项式密度的峰值密度处。您可以通过找到每个密度的密度最大时的 x 值来完成此操作。例如:
library(ggplot2)
theme_set(theme_classic())
library(dplyr)
x <- -5:250
n = c(6,10,30,60,100)
p = 0.5
binom = data.frame(x=rep(x, length(n)),
y=dbinom(x, rep(n, each=length(x)), p),
n=rep(n, each=length(x)))
ggplot(binom %>% filter(y > 1e-5) %>%
group_by(n) %>%
mutate(x = x - x[which.max(y)]),
aes(x, y, colour=factor(n))) +
geom_line() + geom_point(size=0.6) +
labs(colour="n")
参考您的评论,这是一种在二项式密度之外添加正态密度的方法:二项式分布的均值是 n*p
,其中 n
是试验次数p
是成功的概率。方差为 n*p*(1-p)
。因此,对于上面的每个二项式密度,我们需要具有相同均值和方差的正态密度。我们在下面创建了一个数据框,然后将二项式和正态密度绘制在一起。
首先,创建一个新的包含更高密度点的 x 值向量,以反映正态分布是连续的,而不是离散的:
x = seq(-5,250,length.out=2000)
现在我们创建一个正态密度的数据框,其均值和方差与上面的二项式密度相同:
normal=data.frame(x=rep(x, length(n)),
y=dnorm(x, rep(n,each=length(x))*p, (rep(n, each=length(x))*p*(1-p))^0.5),
n=rep(n, each=length(x)))
# Cut off y-values below ymin
ymin = 1e-3
所以现在我们有两个数据框要绘制。我们仍然在 ggplot
的主调用中添加 binom
数据框。但在这里我们还添加了对 geom_line
的调用以绘制正态密度。我们给 geom_line
normal
数据框。此外,对于此图,我们使用 geom_segment
来强调二项式密度的离散点(您也可以为此使用 geom_bar
)。
ggplot(binom %>% filter(y > ymin), aes(x, y)) +
geom_point(size=1.2, colour="blue") +
geom_line(data=normal %>% filter(y > ymin), lwd=0.7, colour="red") +
geom_segment(aes(x=x, xend=x, y=0, yend=y), lwd=0.8, alpha=0.5, colour="blue") +
facet_grid(. ~ n, scales="free", space="free")
这是新情节的样子。您可以通过多种方式更改缩放比例,并且可能还有许多其他方法可以对其进行调整,具体取决于您想要强调的内容。