2011-10-22 114 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

這似乎是最好的解決方法。 –