Основная причина, по которой вы не должны использовать что-то вроде lm(data$y ~ data$whatever)
, заключается в том, что здесь хранится жестко запрограммированная ссылка на столбцы в вашем наборе обучающих данных.Вместо того чтобы использовать набор данных Auto, давайте использовать набор данных mtcars, поставляемый в качестве примера в качестве примера.
Давайте подгоним модель неверным способом:
m <- lm(mtcars$mpg ~ mtcars$wt)
После этого модель *Компонент 1007 * теперь относится конкретно к mtcars$mpg
и mtcars$wt
, а не к переменным mpg
и wt
:
m$terms
# mtcars$mpg ~ mtcars$wt
# attr(,"variables")
# list(mtcars$mpg, mtcars$wt)
# attr(,"factors")
# mtcars$wt
# mtcars$mpg 0
# mtcars$wt 1
# ...
Теперь попробуйте предсказать, используя эту модель:
predict(m, newdata=data.frame(wt=4))
# 1 2 3 4 5 6 7 8 9 10 11 12 13
# 23.282611 21.919770 24.885952 20.102650 18.900144 18.793255 18.205363 20.236262 20.450041 18.900144 18.900144 15.533127 17.350247
# 14 15 16 17 18 19 20 21 22 23 24 25 26
# 17.083024 9.226650 8.296712 8.718926 25.527289 28.653805 27.478021 24.111004 18.472586 18.926866 16.762355 16.735633 26.943574
# 27 28 29 30 31 32
# 25.847957 29.198941 20.343151 22.480940 18.205363 22.427495
# Warning message:
# 'newdata' had 1 row but variables found have 32 rows
Что случилось?Вместо поиска переменной с именем wt
метод predict
ищет что-то с именем mtcars$wt
.В вашем newdata
нет ничего подобного, поэтому в качестве запасного варианта он выглядит в глобальной среде (технически он пытается сначала вычислить выражение mtcars$wt
в среде newdata
, а затем в среде, гдебыла установлена модель, которая является глобальной средой).Это успешно выполняется и фактически разрешается в исходный столбец данных, который мы использовали для соответствия модели.Из-за этого аргумент newdata
по существу игнорируется.
Теперь, если мы подгоним модель правильным образом с помощью
m2 <- lm(mpg ~ wt, data=mtcars)
Это сохранит имена переменных mpg
и wt
в модели, а поиск по названию будет работать как задумано:
predict(m2, newdata=data.frame(wt=4))
# 1
# 15.90724