为什么我不能正确地绘制这个 dnorm?
Why I can't plot this dnorm properly?
我' 运行 一个小的 Monte Carlo 测试,其中 n 是 i.i.d 的数量。 generated 和 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,我不明白为什么会这样。
其实很简单。你的治疗在 -100 到 150 之间是非零的(我凭经验发现的,所以它不是很准确),你的直方图从 2850 到 3100。
这是你的曲线:
curve(dnorm(n*x, n*lambda, sd = n*lambda), from = -100, to = 150, col="Red")
这是您的直方图:
hist(v, breaks=30, main = "", freq = FALSE)
我会说这个问题比 É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
--c.f。[ 的文档=21=]).在这种情况下,这是直方图的 X 轴范围。
3)垂直刻度:为了使密度曲线在直方图上可见,直方图的垂直刻度应与垂直刻度“兼容”的密度。由于您的直方图在垂直刻度上绘制了 FREQUENCY,因此它的值远大于密度曲线的值(在千分之一刻度);所以 1/1000 的比例覆盖在 1 的比例上,因此曲线不可见。
就是说,最后两行代码应该用于实现您的目标,即用参数 [=15= 覆盖 n
独立泊松随机变量之和的极限正态分布的密度] 在它的直方图上是:
hist(v, breaks = 30, main = "", freq = FALSE)
curve(dnorm(x, mean = n*lambda, sd = sqrt(n*lambda)), col = "Red", add = TRUE)
其中有三个不同点w.r.t。到您的代码,并给出以下图片(对于向量 v
中一组特定的随机生成值):
如果您使用 R=500
次复制而不是 100 次复制,您将获得更好的正常近似值:
我' 运行 一个小的 Monte Carlo 测试,其中 n 是 i.i.d 的数量。 generated 和 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,我不明白为什么会这样。
其实很简单。你的治疗在 -100 到 150 之间是非零的(我凭经验发现的,所以它不是很准确),你的直方图从 2850 到 3100。
这是你的曲线:
curve(dnorm(n*x, n*lambda, sd = n*lambda), from = -100, to = 150, col="Red")
这是您的直方图:
hist(v, breaks=30, main = "", freq = FALSE)
我会说这个问题比 É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
--c.f。[ 的文档=21=]).在这种情况下,这是直方图的 X 轴范围。
3)垂直刻度:为了使密度曲线在直方图上可见,直方图的垂直刻度应与垂直刻度“兼容”的密度。由于您的直方图在垂直刻度上绘制了 FREQUENCY,因此它的值远大于密度曲线的值(在千分之一刻度);所以 1/1000 的比例覆盖在 1 的比例上,因此曲线不可见。
就是说,最后两行代码应该用于实现您的目标,即用参数 [=15= 覆盖 n
独立泊松随机变量之和的极限正态分布的密度] 在它的直方图上是:
hist(v, breaks = 30, main = "", freq = FALSE)
curve(dnorm(x, mean = n*lambda, sd = sqrt(n*lambda)), col = "Red", add = TRUE)
其中有三个不同点w.r.t。到您的代码,并给出以下图片(对于向量 v
中一组特定的随机生成值):
如果您使用 R=500
次复制而不是 100 次复制,您将获得更好的正常近似值: