我有一个线性模型,其中一个独立变量是一个因素,我试图对包含新因子水平的数据集进行预测(一个因子水平不在数据集中,模型是据估计)。我希望能够通过手动指定将应用于因子的系数,用新因子水平对观测值进行预测。例如,假设我估算了三种类型商店的每日销售量,并在数据集中引入了第四种类型的商店。我没有它的历史数据,但我可能会认为它会像其他商店的加权组合一样,我有模型系数。
如果我尝试将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 :(得分: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 :(得分:0)
以下是您可以做的事情:
这样,所有级别都将出现在两个数据集中。