首页 > 解决方案 > 为什么我不能正确地绘制这个 dnorm?

问题描述

我正在运行一个小型蒙特卡洛测试,其中 n 是生成的 iid 的数量,R 是迭代次数。这是我的代码:

R=50
n=100
lambda=30
v<-c()
for (i in 1:R){
  u <- rpois(n, lambda)
  v[i] <- n*mean(u)
}

hist(v, breaks=30, main = "")
curve(dnorm(n*x, n*lambda, sd = n*lambda), col="Red", add = TRUE)

我们确实现在参数 lambda 的 n 个独立泊松之和是参数 n 乘以 lambda 的泊松。因此,通过中心限制,用等于 n*lambda 的均值和方差的正态近似它们的总和是有意义的。但是,每当我尝试绘制曲线(dnorm)时,R 都会将其绘制为始终为 0,我不明白为什么会这样。

标签: rmontecarlo

解决方案


我想说这个问题比 Érico Patto 的(正确)发现更根本,即代码行:

curve(dnorm(n*x, n*lambda, sd = n*lambda), col="Red", add = TRUE)

由于三个错误,不适合叠加在直方图上:

  1. 指定的标准偏差不正确。
  2. 的拳头论证不正确dnorm()
  3. 垂直比例与直方图的垂直比例不兼容。

我现在详细解释这些要点。

1)标准偏差:您的代码行说明法线的标准偏差是n*lambda,而该表达式给出了参数独立泊松之和的方差nlambda

2) 的第一个参数dnorm()第一个参数应该是x,而不是n*x因为第一个参数表示dnorm()应该评估函数的值。默认情况下,这些值是 101 个等距点,范围从添加曲线的绘图的最小 x 值到最大 x 值(因为您使用add=TRUE的是 --cf 文档curve)。在这种情况下,这是直方图的 X 轴范围。

3)垂直比例:为了使密度曲线在覆盖直方图时可见,直方图的垂直比例应该与密度的垂直比例“兼容”。由于您的直方图在垂直刻度上绘制 FREQUENCY,因此它的值远大于密度曲线的值(在千分之一范围内);因此 1/1000 的比例覆盖在 1 的比例上,因此曲线不可见。

也就是说,应该使用最后两行代码来实现您的目标,即在其直方图上n使用参数覆盖独立泊松随机变量之和的极限正态分布的密度:lambda

hist(v, breaks = 30, main = "", freq = FALSE)
curve(dnorm(x, mean = n*lambda, sd = sqrt(n*lambda)), col = "Red", add = TRUE)

它与您的代码有三个不同之处,并给出了以下图片(对于 vector 中一组特定的随机生成的值v):

100 次重复的近似值

如果你使用R=500复制而不是 100 次复制,你会得到一个更好的正常近似值:

500 次重复的近似值


推荐阅读