【问题标题】:Why does R plot the wrong distribution in this case?为什么在这种情况下 R 会绘制错误的分布?
【发布时间】:2021-02-21 20:08:33
【问题描述】:

我对 R 比较陌生,我一直在尝试使用 R 的内置函数 rnorm 和 dnorm 模拟正态分布,然后绘制它。

为什么当我的代码是这样的时候它会绘制这个错误的密度函数

x <- rnorm(1000, mean=5, sd=2)
hist(x, border='red',freq=F)
y <- curve(dnorm(x,mean(x), sd(x)), add=T)

但是当我的代码是这样的时候,它确实绘制了正确的密度函数

x <- rnorm(1000, mean=5, sd=2)
hist(x, border='red',freq=F)
meanx <- mean(x)
sdx <- sd(x)
y <- curve(dnorm(x,meanx,sdx), add=T)

【问题讨论】:

    标签: r statistics normal-distribution


    【解决方案1】:

    curve() 不将值向量作为第一个表达式。它需要一个表达式。当您编写 dnorm(x)x 是全局环境中的对象时,您创建的是值向量,而不是表达式。

    这很令人困惑,您很不走运,因为 x 恰好是 dnorm() 的第一个参数的名称,这就是为什么您的代码运行时没有错误,但没有产生预期的输出。

    如果您将对象 x 重命名为 xx,则排序会变得更加清晰。

    那么你的原始代码会抛出错误,因为dnorm(xx) 不是表达式:

    set.seed(1234)
    xx <- rnorm(1000, mean=5, sd=2)
    hist(xx, border='red',freq=F)
    curve(dnorm(xx ,mean(xx), sd(xx)), add=T)
    
    Error in curve(dnorm(xx, mean(xx), sd(xx)), add = T) : 
      'expr' must be a function, or a call or an expression containing 'x'
    

    但是使用 dnorm() 参数名称 x 以及您的数据 xx 创建表达式 (dnorm(x, mean(xx), sd(xx))) 可以按预期工作:

    set.seed(1234)
    xx <- rnorm(1000, mean=5, sd=2)
    hist(xx, border='red',freq=F)
    curve(dnorm(x, mean(xx), sd(xx)), add=T)
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2018-04-10
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多