我想使用predict.lm
为模型中的预测变量生成拟合值。换句话说,我想将lm
对象中的系数估计乘以具有 n 行的新数据帧中的值。结果是具有 n 行的矩阵,其中每个值已乘以其对应的系数。
当新数据框为lm
对象中的每个系数估计值都有一列时,这很容易实现。例如:
y <- rnorm(6)
x1 <- rnorm(6)
x2 <- rnorm(6)
modEasy <- lm(y ~ x1 + x2)
dfEasy <- data.frame(x1 = rnorm(6), x2 = rnorm(6))
predict(modEasy, newdata = dfEasy, type = "terms")
但是当模型包含因子变量或多项式时,生成拟合值很棘手。在这些情况下,新数据框的 k 列少于 k 。例如:
y <- rnorm(6)
x1 <- rnorm(6)
x2 <- factor(rep(letters[1:3], 2))
modHard <- lm(y ~ x1 + x2)
dfHard <- data.frame(x1 = rnorm(6), x2 = factor(rep(letters[1:3], each=2)))
predict(modHard, newdata = dfHard, type = "terms")
在这种情况下,modHard$coefficients
包含x1
的估算值以及x2
的每个因素级别的估算值。但dfHard
只有两列:一列用于x1
,另一列用于x2
。因此,predict
会返回一个只有两列的矩阵:一列用于x1
,另一列用于x2
。
在这种情况下,我希望预测返回一个矩阵,其中包含x1
列和x2
的每个级别。我可以使用以下代码生成该矩阵:
mf <- model.frame(formula(modHard), dfHard)
mm <- model.matrix(formula(modHard), mf)
t(modHard$coefficients * t(mm))
但是有更简单的方法吗?