2013-08-19 42 views
7

我有一个线性模型,其中一个自变量是一个因子,我试图对包含新因子水平的数据集进行预测(因子水平为wasn在模型估计的数据集中)。我希望能够通过手动指定将应用于因子的系数来对新因子水平的观察结果进行预测。例如,假设我估计了三种商店的每日销售量,并将第四种类型的商店引入到数据集中。我没有关于它的历史数据,但我可能会认为它会像其他商店的加权组合一样行事,对此我有模型系数。在预测时手动设置新因子水平的系数

如果我尝试将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中的各个列来手动进行预测。然而,鉴于我正在使用的真实模型具有许多变量和交互项,并且我希望能够通过更改模型公式轻松循环访问各种模型规范,所以这很麻烦。有没有办法让我基本上为模型对象添加一个新的系数,然后用它来进行预测?如果没有,是否有另一种方法比手动设置整个预测步骤麻烦?

+0

'?update'可能会告诉您如何以编程方式操作公式,而不求助于使用字符串 – dardisco

+0

有关如何预测新级别的更多详细信息会更好。 “一些加权组合”不是很精确。 –

+0

如果您想在许多型号上尝试此功能,并使用不同的系数值确定您的附加系数级别,则可以编写一个功能来执行此操作。我会尝试从lm对象中提取'model.matrix'和'coefficients',插入因子水平和系数,然后使用矩阵乘法来获得预测结果。 – Edwin

回答

1

Assumming你想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) 
0

这里是你可以这样做:

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

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