如何在使用R中的predict()函数绘制glm时确保我的x和y长度不会有差异?

3

我正在运行以下代码:

c.model<-glm(cars$speed~cars$dist, family=gaussian)
summary(c.model)
c.x<-seq(0,1,0.01)
c.x
c.y<-predict.glm(c.model,as.data.frame(c.x), type="response")
c.y
plot(cars$dist)
lines(c.x,c.y)

我遇到了一个错误,提示“xy.coords(x, y)中出错:'x'和'y'的长度不同”。我不太清楚是什么导致了这个错误。


1
你之所以会出现错误,是因为 c.x 的长度为101,而 c.y 的长度为50。 - Steven
1
"c.y <- predict.glm(...)" 应该给您以下有用的提示 - "警告信息:'newdata' 有101行,但找到的变量只有50行"。 - nrussell
那么,我想我的问题可以简化为:“如何让predict()函数生成与我提供的序列一样多的值?” - Atticus29
4
建议您在回归函数中开始使用“data”参数。 - IRTFM
1个回答

7

在模型中使用的变量名称和预测过程中使用的变量名称需要更加仔细地匹配。您遇到的错误是因为predict函数中数据框中的名称与模型中术语的名称不匹配,因此您实际上并未预测新值。问题在于predict实际上是从数据框中获取数据。

model.frame(~cars$dist, data.frame(dist=c.x))

因为您在公式中明确使用了cars$dist,所以没有任何“自由”符号会从您的新数据参数中提取。与此相比,与之前的结果进行对比:

model.frame(~dist, data.frame(dist=c.x))

这次,dist不再特定地绑定到cars变量上,而可以在新数据框的上下文中“解决”。
此外,您希望确保将dist值保持在相同的比例尺上。例如。
c.model <- glm(speed~dist, data=cars, family=gaussian)
summary(c.model)
c.x <- seq(min(cars$dist),max(cars$dist),length.out=101)
c.y <- predict.glm(c.model,data.frame(dist=c.x), type="response")
plot(speed~dist, cars)
lines(c.x,c.y)

enter image description here

我们预测的范围是观察值的范围,而不是0-1,因为没有距离值真正小于1。


你能否再解释一下你所说的“你得到的错误是因为预测函数中数据框中的名称与模型中术语的名称不匹配,因此你实际上没有预测新值”的意思?你的更改效果很好,但我不能说我完全理解为什么。顺便说一句,谢谢。 - Atticus29
@Atticus29 我已经更新了,试图包含更多细节。基本上,你不应该在使用~时与$结合使用(*可能存在一些例外情况,但通常是这样)。 - MrFlick

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