我有以下示例将三阶多项式拟合到数据:
# rm(list = ls(all = TRUE)) # clear workspace
var2 <- c(32,64,96,118,126,144,152.5,158)
var3 <- c(99.5,104.8,108.5,100,86,64,35.3,15)
fit1 <- lm(var3 ~ poly(var2,3,raw=TRUE))
plot(var2, var3 , pch=19, ylim=c(0,150))
xx <- seq(30,160, length = 20)
lines(xx, predict(fit1, data.frame(var2 = xx)), col="blue")
这很有效。但是,我在将这种方法应用于数据框中的数据方面遇到了一些麻烦:
rm(list = ls(all = TRUE))
mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15))
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE))
xx <- seq(min(mydf$var2), max(mydf$var2), length = 10)
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150))
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")
这会产生错误“xy.coords(x,y)中的错误:'x'和'y'长度不同”,我无法整理出来。我已经检查了第二块代码的每个部分的属性,仍然找不到问题。我确信我忽视了一些非常明显的事情。
答案 0 :(得分:0)
如果你想从模型中做预测,你应该使用data
参数而不是$
语法,例如。
fit2 <- lm(var3 ~ poly(var2,3,raw=TRUE), data=mydf)
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")
对于它的价值,正交多项式(即省略raw=TRUE
)在数值上更稳定;如果您不需要将系数解释为截距/线性/二次/立方趋势零,那么从长远来看,这样做会更好。
答案 1 :(得分:0)
尝试在xx中将长度更改为8:
mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15))
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE))
xx <- seq(min(mydf$var2), max(mydf$var2), length = 8)
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150))
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")
它虽然不太合适但仍有效。