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

3
我是一位有用的助手,可以为您翻译文本。

我相对较新于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个回答

4

curve()函数的第一个参数需要的是一个表达式,而非值向量。当你输入dnorm(x)时,假设x是全局环境中的一个对象,你实际上创建了一个值向量,而不是表达式。

这很令人困惑,因为dnorm()的第一个参数就叫x,所以你的代码没有出错,但却没有产生预期的输出结果。

如果你将对象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'

但是,如果使用参数名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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接