我想用来predict.lm
为模型中的预测变量生成拟合值。换句话说,我想将对象中的系数估计值乘以具有n行lm
的新数据框中的值。结果是一个具有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。例如:
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
只有两列:一列 forx1
和一列 for x2
。结果,predict
返回一个只有两列的矩阵:一列 for x1
,另一列 for x2
。
在这种情况下,我希望预测返回一个矩阵,其中x1
包含每个级别的列x2
。我可以使用以下代码生成该矩阵:
mf <- model.frame(formula(modHard), dfHard)
mm <- model.matrix(formula(modHard), mf)
t(modHard$coefficients * t(mm))
但是有没有更简单的方法?