這是不可能得到的新的因子水平估計,在固定效應模型,包括線性模型和廣義線性模型。 glm
(以及lm
)記錄了在模型擬合期間呈現和使用的因子水平,可在testreg$xlevels
中找到。
您的模型估計模型公式爲:
returnShipment ~ size + color + price + manufacturerID + salutation +
state + age + deliverytime
然後predict
抱怨125,136,137 manufactureID
新因子水平。這意味着,這些級別不在testreg$xlevels$manufactureID
之內,因此沒有用於預測的相關係數。在這種情況下,我們不得不放棄這個因素變量,並使用一個預測公式:
returnShipment ~ size + color + price + salutation +
state + age + deliverytime
然而,標準predict
程序不能把你的自定義預測公式。有常用的兩種解決方案:
- 提取模型矩陣和模型係數從
testreg
,並手動預測我們想通過矩陣向量乘法模型項。這是the link在你的文章中給出的建議;
- 將
test
中的因子水平重置爲出現在testreg$xlevels$manufactureID
中的任何一個水平,例如testreg$xlevels$manufactureID[1]
。因此,我們仍然可以使用標準predict
進行預測。
現在,讓我們先拿起用於模型擬合的因子水平
xlevels <- testreg$xlevels$manufacturerID
mID125 <- xlevels[1]
然後我們給這個級別的預測數據:
replacement <- factor(rep(mID125, length = nrow(test)), levels = xlevels)
test$manufacturerID <- replacement
而且我們已經準備好預測:
pred <- predict(testreg, test, type = "link") ## don't use type = "response" here!!
最後,我們調整這個線性預測R,減去係數估計:
est <- coef(testreg)[paste0(manufacturerID, mID125)]
pred <- pred - est
最後,如果你想在原有規模的預測,你申請鏈接函數的反函數:
testreg$family$linkinv(pred)
更新:
您抱怨說您在嘗試上述解決方案時遇到了各種麻煩。這是爲什麼。
您的代碼:
testreg <- glm(train$returnShipment~ train$size + train$color +
train$price + train$manufacturerID + train$salutation +
train$state + train$age + train$deliverytime,
family=binomial(link="logit"), data=train)
是指定你的模型公式一個非常糟糕的方式。 train$returnShipment
等將嚴格限制變量的環境到數據幀train
,並且在稍後使用其他數據集(如test
)進行預測時會遇到麻煩。
對於這樣的缺點一個簡單的例子,我們模擬了一些玩具的數據和適合GLM:
set.seed(0); y <- rnorm(50, 0, 1)
set.seed(0); a <- sample(letters[1:4], 50, replace = TRUE)
foo <- data.frame(y = y, a = factor(a))
toy <- glm(foo$y ~ foo$a, data = foo) ## bad style
> toy$formula
foo$y ~ foo$a
> toy$xlevels
$`foo$a`
[1] "a" "b" "c" "d"
現在,我們看到的一切都帶有一個前綴foo$
。在預測:
newdata <- foo[1:2, ] ## take first 2 rows of "foo" as "newdata"
rm(foo) ## remove "foo" from R session
predict(toy, newdata)
我們得到一個錯誤:
Error in eval(expr, envir, enclos) : object 'foo' not found
好風格是從功能的data
參數指定獲取數據的環境:
foo <- data.frame(y = y, a = factor(a))
toy <- glm(y ~ a, data = foo)
然後foo$
消失。
> toy$formula
y ~ a
> toy$xlevels
$a
[1] "a" "b" "c" "d"
這可以解釋兩件事情:
- 您的評論,當你做
testreg$xlevels$manufactureID
,你NULL
向我抱怨;你貼
預測誤差
Error in model.frame.default(Terms, newdata, na.action=na.action, xlev=object$xlevels):
Factor 'train$manufacturerID' has new levels 125, 136, 137
抱怨train$manufacturerID
而不是test$manufacturerID
。
謝謝。但我不想放棄一個完整的因子變量,而只是製造商ID的級別125,136和137。我可以像這樣使用你的第一條代碼行:mID125 < - manufacturerID [125]? – Vinc
好吧,也許我誤解你或單詞因素變量。因此,變量manufacturerID的級別125,136和137未在glm()中使用,但存在於測試數據部分(您稱爲newdata)中。 – Vinc
對不起,但我完全不明白。這就是爲什麼它不起作用。我會編輯我的問題,讓你知道我做得好嗎? – Vinc