r - 为什么我不能正确地绘制这个 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,我不明白为什么会这样。
解决方案
我想说这个问题比 Érico Patto 的(正确)发现更根本,即代码行:
curve(dnorm(n*x, n*lambda, sd = n*lambda), col="Red", add = TRUE)
由于三个错误,不适合叠加在直方图上:
- 指定的标准偏差不正确。
- 的拳头论证不正确
dnorm()
。 - 垂直比例与直方图的垂直比例不兼容。
我现在详细解释这些要点。
1)标准偏差:您的代码行说明法线的标准偏差是n*lambda
,而该表达式给出了参数独立泊松之和的方差。n
lambda
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
):
如果你使用R=500
复制而不是 100 次复制,你会得到一个更好的正常近似值:
推荐阅读
- javascript - 如何在 WebGL 画布上渲染 2d 画布?
- arangodb - ArangoDB-我可以使用 foxx 进行审计服务来记录所有更改吗
- r - h2o.distance 和 dist 函数之间的差异
- spyder - Spyder 不处理相对进口
- python - 想要开始/暂停视频时,我应该如何正确使用 cv2.waitKey?
- sdl-2 - SDL2 - 结合前后缓冲区?
- python-3.x - 特金特
事件绑定在 python 脚本中不起作用 - python - Replace_Downloads.py 中的 Python 异常 IndexError
- javascript - 将文本添加到标记(功能)
- sql - Postgresql分组错误:用作表达式的子查询返回多行