У меня есть следующий пример для подгонки полинома 3-го порядка к данным:

# 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
marcel 23 Сен 2014 в 16:12

2 ответа

Лучший ответ

Если вы хотите делать такие вещи, как прогнозирование на основе модели, вам следует использовать аргумент data, а не синтаксис $, например

fit2 <- lm(var3 ~ poly(var2,3,raw=TRUE), data=mydf)
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")

Как бы то ни было, ортогональные многочлены (то есть без raw=TRUE) более численно стабильны; если вам не нужно интерпретировать коэффициенты как тренды с пересечением / линейными / квадратичными / кубическими нулевыми , в долгосрочной перспективе вам будет лучше.

enter image description here

0
Ben Bolker 23 Сен 2014 в 12:25

Попробуйте изменить длину на 8 дюймов xx:

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")

enter image description here

Он работает, хотя и не очень хорошо подходит.

0
rnso 23 Сен 2014 в 12:24