Я не могу исправить ваш tidyverse
код, потому что я не работаю с этим пакетом. Но я могу объяснить, почему predict
терпит неудачу в первом случае.
Позвольте мне использовать встроенный набор данных trees
для демонстрации:
head(trees, 2)
# Girth Height Volume
#1 8.3 70 10.3
#2 8.6 65 10.3
Обычный способ использования lm
-
fit <- lm(Girth ~ ., trees)
Имена переменных (в RHS ~
):
attr(terms(fit), "term.labels")
#[1] "Height" "Volume"
Эти переменные необходимо указывать в newdata
при использовании predict
.
predict(fit, newdata = data.frame(Height = 1, Volume = 2))
# 1
#11.16125
Теперь, если вы подходите модели с использованием матрицы:
X <- as.matrix(trees[2:3])
y <- trees[[1]]
fit2 <- lm(y ~ X)
attr(terms(fit2), "term.labels")
#[1] "X"
Переменная, которую нужно указать в newdata
для predict
, теперь X
, а не Height
или Girth
. Обратите внимание, что, поскольку X
является матричной переменной, вам необходимо защитить ее с помощью I()
при передаче ее во фрейм данных.
newdat <- data.frame(X = I(cbind(1, 2)))
str(newdat)
#'data.frame': 1 obs. of 1 variable:
# $ X: AsIs [1, 1:2] 1 2
predict(fit2, newdat)
# 1
#11.16125
Неважно, что cbind(1, 2)
не имеет имен столбцов. Важно то, что эта матрица называется X
в newdat
.