我试图绘制几个二项分布并显示随着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应该使它看起来像正态分布,但我不知道如何到达那里,我已经尝试/未能使用ggplot2 :(
答案 0 :(得分:1)
您可以重新缩放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
是试验次数{ {1}}是成功的概率。方差为p
。因此,对于上面的每个二项式密度,我们希望具有相同均值和方差的正常密度。我们在下面创建这些数据框,然后将二项式和正常密度一起绘制。
首先,创建一个包含更高密度点的x值的新向量,以反映正态分布是连续的而不是离散的事实:
n*p*(1-p)
现在我们创建一个正常密度的数据框,其方式和方差与上面的二项密度相同:
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
的主要调用中添加binom
数据框。但是在这里我们还添加了对ggplot
的调用以绘制正常密度。我们给geom_line
数据框geom_line
。此外,对于此图,我们使用normal
来强调二项密度的离散点(您也可以使用geom_segment
)。
geom_bar
这是新情节的样子。您可以通过各种方式更改缩放比例,并且可能还有许多其他方法可以对其进行调整,具体取决于您要强调的内容。