2011-10-22 112 views
0

如何操作GLM对象以绕过此错误?我想对于预测治疗看不见的水平基础的情况下如何操作R中的GLM系数?

> master <- data.frame(x = factor(floor(runif(100,0,3)), labels=c("A","B","C")), y = rnorm(100)) 
> part.1 <- master[master$x == 'C',] 
> part.2 <- master[master$x == 'A' | master$x == 'B',] 
> model.2 <- glm(y ~ x, data=part.2) 
> predict.1 <- predict(model.2, part.1) 
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : factor 'x' has new level(s) C 

我试着这样做(即,给他们的系数为零。):

> model.2$xlevels$x <- c(model.2$xlevels, "C") 
> predict.1 <- predict(model.2, part.1) 

但它不进球模型正确:

> predict.1[1:5] 
     2   3   6   8   10 
0.03701494 0.03701494 0.03701494 0.03701494 0.03701494 
> summary(model.2) 

Call: 
glm(formula = y ~ x, data = part.2) 
<snip> 
Coefficients: 
      Estimate Std. Error t value Pr(>|t|) 
(Intercept) 0.12743 0.18021 0.707 0.482 
xB   -0.09042 0.23149 -0.391 0.697 

predict.1应该只有0.12743。

这显然只是一个修剪版本 - 我的真实模型中有25个左右的变量,所以predict.1 <- rep(length(part.1), 0.12743)的答案对我没有用处。

感谢您的帮助!

+0

嗯。这可以通过黑客来实现,但相当棘手。你能给出更多的上下文吗? –

+0

本质上,我正在根据协变量建立两个单独的预测模型。如果我可以对整个数据集进行模型预测,而不仅仅是他们所模拟的一半,那么这将大大简化我的评分和评估代码。 – notrick

+1

你在做什么没有意义。你用来预测的数据不包含'x = C'。所以当'x = C'时,你无法用它来预测'y'。这就像建立一个平日的销售模式,并要求它预测周末的销售情况。如果您希望将数据集分解为校准样本和验证样本,则需要这样做,使得两个样本都包含相似的协变量分布。 – Ramnath

回答

0

我不同意你应该期待任何预测。你开发一个没有项目的模型,其变量x是一个其值为“C”的因子,所以你不应该期待任何预测。你的努力产生1:5的预测也应该失败。

1

如果您知道到观测其中x ==“C”完全一样X ==“A”,那么你可以这样做:

> part.1$x <- factor(rep("A",nrow(part.1)),levels=c("A","B")) 
> predict(model.2, part.1) 

,这将给你的纯拦截模式。

+0

这似乎是最好的解决方法。 –