为什么在这种情况下R绘制错误的分布?

时间:2020-11-09 21:31:37

标签: r statistics normal-distribution

我对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)

enter image description here

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

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)

enter image description here

1 个答案:

答案 0 :(得分:4)

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)