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

我可以通过简单地将系数乘以 data.frame 中的各个列来手动进行预测。但是,考虑到我正在使用的真实模型具有许多变量和交互项,这很麻烦,并且我希望能够通过更改模型公式轻松地循环通过各种模型规范。有没有办法让我从本质上向模型对象添加一个新系数,然后用它来进行预测?如果没有,是否有另一种方法比手动设置整个预测步骤更简单?

4

2 回答 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)
于 2013-10-23T00:09:43.587 回答
1

这是您可以执行的操作:

  1. 使用 rbind,堆叠训练和测试数据集。
  2. 分解预测变量。
  3. 将堆栈划分回训练和测试数据集。

这样,所有级别都将出现在两个数据集中。

于 2014-04-24T18:08:08.760 回答