1

我想用来predict.lm为模型中的预测变量生成拟合值。换句话说,我想将对象中的系数估计值乘以具有nlm的新数据框中的值。结果是一个具有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))

但是有没有更简单的方法?

4

0 回答 0