Использование предиката lm на основе model.matrix с различными контрастами в R - PullRequest
1 голос
/ 29 мая 2019

Целью является прогнозирование новых наблюдений на основе модели множественной регрессии.

Модель включает в себя два фактора («ec» с кодированием эффекта, «dc» с фиктивным кодированием) и числовую переменную («num») плюс термин взаимодействия «ec» и «num».

Однако функция предиката lm, основанная на новых данных, не работает.

# Dependent variable 

y <- rnorm(12, 50, 10)

# Independent variables

# Dummy coding

dc <- factor(x=c("Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel", "Schlecht", "Gut", "Mittel"))

contrasts(dc) <- contr.treatment(3, 1)

# Effect coding

ec <- factor(x=c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"))

contrasts(ec) <- contr.sum(4)

num <- rnorm(12, 10, 2)

# Design matrix

df <- data.frame(dc = dc, ec = ec, num = num)

lm_dm <- model.matrix(~ 1 + ec + dc * num, df)

lm <- lm(y ~ 0 + lm_dm)

# prediction

newdata <- data.frame(dc = c("Schlecht", "Gut", "Gut"), ec = c("C", "D", "B"), num = c(9, 8, 12))

predict.lm(lm, newdata)

Как я могу использовать оценочную модель для проведения нового прогноза?

1 Ответ

0 голосов
/ 30 мая 2019

Проблема заключается в том, что модель оценивается с использованием внешней матрицы, а не аргумента data. Вместо этого мы можем сделать

mod <- lm(y ~ 1 + ec + dc * num, data = df)
predict.lm(mod, newdata)
#        1        2        3 
# 24.19016 71.26768 59.50670

Придерживаться этого не сложно. Например, переменные в вашей версии mod имеют имена lm_dmec1, lm_dmdc3, которым мы должны соответствовать. Кроме того, в процессе предоставления lm_dm в целом мы теряем информацию о том, что ec и dc являются факторами; по этой причине мы не можем использовать dc и ec в качестве факторов в вашем newdata; вместо этого мы должны иметь фиктивные переменные для всех уровней. Таким образом, лучшая альтернатива, по-видимому, состоит в том, чтобы выполнить прогнозирование вручную:

model.matrix(~ 1 + ec + dc * num, newdata) %*% coef(mod)
#       [,1]
# 1 57.08853
# 2 31.90847
# 3 47.81049
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...