【问题标题】:Why I can't plot this dnorm properly?为什么我不能正确地绘制这个 dnorm?
【发布时间】:2020-11-16 10:00:59
【问题描述】:

我正在运行一个小型蒙特卡洛测试,其中 n 是 i.i.d 的数量。生成和 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,我不明白为什么会这样。

【问题讨论】:

    标签: r montecarlo


    【解决方案1】:

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

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

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

    1. 指定的标准偏差不正确。
    2. dnorm() 的第一个参数不正确。
    3. 垂直比例与直方图的垂直比例不兼容。

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

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

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

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

    也就是说,应该使用最后两行代码来实现您的目标,即在其直方图上使用参数 lambda 覆盖 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 次复制,您会得到更好的正常近似值:

    【讨论】:

      【解决方案2】:

      其实很简单。你的治疗在 -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)
      

      【讨论】:

        猜你喜欢
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 2013-05-15
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        相关资源
        最近更新 更多