当预测时手动设置新因子水平的系数

7
我有一个线性模型,其中一个自变量是一个因子,我试图对包含新因子水平(在模型估计的数据集中不存在的因子水平)的数据集进行预测。我希望能够通过手动指定将应用于该因子的系数来对具有新因子水平的观察结果进行预测。例如,假设我为三种类型的商店估计每日销售额,并将第四种商店引入数据集。我没有它的历史数据,但我可能会假设它的行为类似于其他商店的加权组合,这些商店我有模型系数。
如果我尝试将predict.lm()应用于新数据,我将收到一个错误,告诉我该因子具有新级别(这是有道理的)。
df <- data.frame(y=rnorm(100), x1=factor(rep(1:4,25)))
lm1 <- lm(y ~ x1, data=df)
newdata <- data.frame(y=rnorm(100), x1=factor(rep(1:5,20)))
predict(lm1, newdata)

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  factor x2 has new levels 5

我可以通过简单地将系数乘以数据框中的各列来手动进行预测。 然而,由于我使用的实际模型具有许多变量和交互项,我希望能够通过更改模型公式轻松地循环遍历各种模型规格,这样做非常繁琐。 是否有一种方法可以将新系数添加到模型对象中,然后使用它进行预测? 如果没有,是否有比手动设置整个预测步骤更不繁琐的其他方法?


“?update” 可以向您展示如何在编程中以程序方式操作公式,而无需使用字符串。 - dardisco
更详细地说明您希望如何预测新水平会更好。"一些加权组合"并不是非常精确。 - Hong Ooi
如果您想在许多模型上尝试并使用不同的系数值来处理额外的因子水平,您可以编写一个函数来完成此操作。我会尝试从lm对象中提取'model.matrix'和'coefficients',插入因子水平和系数,然后使用矩阵乘法来获得预测结果。 - Edwin
2个回答

1
假设您希望将第5级别等权重,您可以转换为矩阵,插入25%,并将其乘以模型的系数...
n.mat <- model.matrix(~x1, data=newdata)
n.mat[n.mat[,5] == 1, 2:4] <- .25
n.mat <- n.mat[,-5]
n.prediction <- n.mat %*% coef(lm1)

1

以下是你可以做的:

  1. 使用rbind,将训练集和测试集堆叠起来。
  2. 将预测变量因子化。
  3. 将堆叠的数据重新分成训练集和测试集。

这样两个数据集中就都会有所有的水平值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接