在 model.matrix 的基础上使用 predict.lm 在 R 中具有不同的对比度
Using predict.lm based on a model.matrix with different contrasts in R
目的是根据多元回归模型预测新观察结果。
该模型包括两个因子("ec" 带效应编码,"dc" 带虚拟编码)和一个数字变量 ("num") 加上交互项 "ec"和 "num".
但是,基于新数据的predict.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)
如何使用估计模型进行新的预测?
问题是模型是使用外部矩阵而不是 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
目的是根据多元回归模型预测新观察结果。
该模型包括两个因子("ec" 带效应编码,"dc" 带虚拟编码)和一个数字变量 ("num") 加上交互项 "ec"和 "num".
但是,基于新数据的predict.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)
如何使用估计模型进行新的预测?
问题是模型是使用外部矩阵而不是 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