2014-09-06 68 views
1

我已經獲得了由非r用戶設置的logit模型的一些係數。我想將這些係數導入r,並在相同的數據集(ROC和混淆矩陣)和我自己的模型上生成一些擬合估計的好處。我首先想到的是使用的東西給係數強制到現有GLM的物體,像預測()與r中的任意係數

summary(fit)$coefficients[,1] <- y

summary(fit)$coefficients <- x

,其中Y和X包含我試圖用它來預測係數和配合矩陣是以前創建的適合數據集的虛擬glm對象。當然,這隻給我一些錯誤。

是否有任何方法將任意係數向量傳遞給predict()函數或指定模型中的係數?我可以通過傳遞一個向量到GLM中的偏移參數來強制執行此操作嗎?謝謝

編輯:正如在評論中提到的,使用任意係數沒有太多的統計基礎。我有一個商業合作伙伴認爲他/她「知道」了正確的係數,我正試圖根據這些估計值與正確模型生成的係數來量化預測能力的損失。

Edit2:根據BondedDust的回答,我能夠強制係數,但無法清除由於強制而返回的預測()返回的錯誤消息,它會顯示predict.lm,它被調用預測,還會查看係數的等級並導致錯誤。

+0

迴應[這個問題](http://stackoverflow.com/questions/24112860/manually-build-logistic-regression-model-for-prediction-in-r/24113738#24113738)我做了一個[makeglm ()](https://gist.github.com/MrFlick/ae299d8f3760f02de6bf)的功能,聽起來像在這種情況下會很有用。如果您可能提供了更具體的樣本,我們可能會嘗試一下。 – MrFlick 2014-09-06 00:17:06

+1

@Stencill 您可以通過將數據中的相關變量乘以給定的係數手動計算預測值嗎?例如'coefVector%*%t(cbind(1,dataVariables))'。 (其中coefVector是所提供的係數矢量,datavariables是您的相關係數數據) – user20650 2014-09-06 04:47:41

+0

@BondedDust對不起,週末遠離電腦 - 我會繼續及時更新從現在開始。 – Stencil 2014-09-08 17:12:07

回答

3

如果您按照通過predict.glm的代碼將代碼傳遞給predict.lm,那麼看起來需要更改的模型列表的節點確實是fit$coefficients。但是,更改summary()對象將不起作用。 glm和lm對象中的[['coefficients']]不是具有列的矩陣:'估計','標準。錯誤','t值','Pr(> | t |)',如由summary產生的,而只是一個係數向量。

fit$coefficients <- y 
newpred <- predict(fit) 

如果您需要進一步使用fit,您可以複製並使用它。

+0

這工作。非常感謝。這有點破解,因爲glm對象的其餘部分(Pvalues等)現在不匹配,但我能夠成功通過predict()。 – Stencil 2014-09-08 17:10:32

+0

劃痕,似乎我正在通過適合不正確的預測。 > pred < - predict(fit,newdata = sample1) 其中fit是包含修改係數的glm對象,返回以下錯誤: > [[.data.frame](beta,piv)中的錯誤:未定義列選擇 :警告信息: 在predict.lm(object,newdata,se.fit,scale = 1,type = ifelse(type ==: )中,從缺乏等級的擬閤中預測可能會產生誤導 – Stencil 2014-09-08 17:41:15

+0

這絕對是一種破解,你肯定是要求的,你使用的方法沒有真正的統計基礎,我不知道你在哪裏解決這個問題,你應該先A)發佈一個數據例子,並且B)更新你的問題編輯過程而不是發表評論給我的答案。 – 2014-09-08 17:57:16

5

這不是您發佈的問題的答案 - 哪個BondedDust回答 - 但描述了一種替代方法來計算預測概率本身,這可能有助於在這種情況下。

# Use the mtcars dataset for a minimum worked example 
data(mtcars) 

# Run a logistic regression and get predictions 
mod <- glm(vs ~ mpg + factor(gear) + factor(am), mtcars, family="binomial") 
p1 <- predict(mod, type="response") 

# Calculate predicted probabilities manually 
m <- model.matrix(~ mpg + factor(gear) + factor(am), mtcars)[,] 
p2 <- coef(mod) %*% t(m) 
p2 <- plogis(p2) 

all(p1 == p2) 
#identical(as.numeric(p1), as.numeric(p2)) 

您可以用給定的係數向量替換coef(mod)model.matrix將生成計算所需的虛擬變量 - 檢查排序與係數向量的順序相同。

+0

謝謝,我能夠得到這個工作。 – Stencil 2014-09-09 21:21:57

+0

如果我想根據probit模型(即'glm'命令中的'family = binomial(link =「probit」)')進行預測,我將如何更改上述(即'plogis(p2)')? – rp1 2017-09-15 23:41:21

+1

@ rp1;我不確定 - probit鏈接的公式是什麼? (作爲'plogis' =='1 /(1 + e(-xb))')。我*想*您將使用'pnorm'函數('pnorm(p2)'),但最好在https://stats.stackexchange.com/questions – user20650 2017-09-15 23:54:22

1

或者,你可以使用這樣的事情:

fit <- lm(Y ~ A + B + C, data=fakedata)

fit$coefficients <- c(1, 2, 3) # this would change the coefficients for A, B, C to 1, 2 and 3, respectively.

Y_hat_new <- predict(fit, new_fakedata) # this Y_hat_new will be calculated as your new predicted outcome given the new coefficients and/or new_fakedata.

的結果應該是一樣的,如果你遵循model.matrix路線。