Новые прогнозы полиномиальной регрессии

У меня есть следующая модель регрессии, и я пытаюсь сделать некоторые прогнозы, но всегда получаю сообщение об ошибке:

model1 <- lm(Sepal.Length ~ Petal.Length +  poly(Sepal.Width, 2), data = iris)
predict(model1, model1$model)

Ошибка в poly(Sepal.Width, 2, coefs = list(alpha = c(3.057333333333333, : объект 'Sepal.Width') не найден

Я знаю, что могу просто получить доступ к подходящим значениям для прогнозов. Но скажем, мои новые данные выглядят так:

newdata <- head(model1$model) + 1

Как я могу делать прогнозы для этого нового набора данных, не получая этой ошибки?


person user11143533    schedule 07.03.2019    source источник
comment
Прочтите документацию: help("predict.lm"). newdata должен иметь те же имена столбцов, что и data, переданные в lm. Здесь явно не тот случай.   -  person Roland    schedule 07.03.2019


Ответы (1)


Проблема в том, что вы используете слот model из вашего объекта lm, который содержит не исходные данные, а матрицу, где уже развернута полиномиальная часть:

head(model1$model)
#   Sepal.Length Petal.Length poly(Sepal.Width, 2).1 poly(Sepal.Width, 2).2
# 1          5.1          1.4            0.083201357           -0.016039377
# 2          4.9          1.4           -0.010776079           -0.053252127
# 3          4.7          1.3            0.026814895           -0.056361540
# 4          4.6          1.5            0.008019408           -0.057805919
# 5          5.0          1.4            0.101996844            0.009397687
# 6          5.4          1.7            0.158383306            0.121697905

Это, конечно, не работает, потому что predict хочет иметь столбец Sepal.Width. Вы можете предоставить правильный аргумент данных:

predict(model1, head(iris[, 1:4]) + 1)
#       1        2        3        4        5        6 
# 6.306370 5.845728 5.973836 5.979895 6.406965 6.868732
person thothal    schedule 07.03.2019
comment
Да, я знаю, но давайте предположим, что у меня нет фактического набора данных. Я просто использовал ирис в качестве примера - person user11143533; 07.03.2019
comment
Думаю, тогда я не совсем понял ваш вопрос. Для какого набора данных вы хотите получить прогнозы? Если это оригинальный, используйте fitted(.), если это любой другой, вы можете предоставить его самостоятельно. - person thothal; 07.03.2019
comment
@ user11143533 Вы ищете cbind(1, as.matrix(model1$model)[,-1]) %*% coef(model1)? Это даст вам подходящие значения и может быть адаптировано для прогнозирования с помощью новой матрицы. - person Roland; 07.03.2019