R語言代寫回歸中的Hosmer-Lemeshow擬合優度檢驗


原文鏈接:http://tecdat.cn/?p=6166

 

在依賴模型得出結論或預測未來結果之前,我們應盡可能檢查我們假設的模型是否正確指定。也就是說,數據不會與模型所做的假設沖突。對於二元結果,邏輯回歸是最流行的建模方法。在這篇文章中,我們將看一下 Hosmer-Lemeshow邏輯回歸的擬合優度檢驗。

 

Hosmer-Lemeshow擬合優度檢驗


Hosmer-Lemeshow擬合優度檢驗是基於根據預測的概率或風險將樣本分開。具體而言,基於估計的參數值,對於樣本中的每個觀察,基於每個觀察的協變量值計算概率。

 

然后根據樣本的預測概率將樣本中的觀察分成g組(我們回過頭來選擇g)。假設(通常如此)g = 10。然后第一組由具有最低10%預測概率的觀察組成。第二組由預測概率次之小的樣本的10%等組成。

 在實踐中,只要我們的一些模型協變量是連續的,每個觀測將具有不同的預測概率,因此預測的概率將在我們形成的每個組中變化。為了計算我們預期的觀察數量,Hosmer-Lemeshow測試取組中預測概率的平均值,並將其乘以組中的觀察數。測試也執行相同的計算,然后計算Pearson擬合優度統計量

 

   

選擇組的數量


就我所見,關於如何選擇組數g的指導很少。Hosmer和Lemeshow的模擬結論是基於使用的,建議如果我們在模型中有10個協變量 。

直觀地說,使用較小的g值可以減少檢測錯誤規范的機會。 

 

R 

首先,我們將使用一個協變量x模擬邏輯回歸模型中的一些數據,然后擬合正確的邏輯回歸模型。 

n < -  100
x < - rnorm(n)
xb < - x
pr < - exp(xb)/(1 + exp(xb))
y < - 1 *(runif(n)<pr)
mod < - glm(y~x,family = binomial)

接下來,我們將結果y和模型擬合概率傳遞給hoslem.test函數,選擇g = 10組:

        Hosmer and Lemeshow goodness of fit (GOF) test

data:  mod$y, fitted(mod)
X-squared = 7.4866, df = 8, p-value = 0.4851

這給出p = 0.49,表明沒有合適的不良證據。 我們還可以從我們的hl對象中獲得一個觀察到的與預期的表:

cbind(hl$observed,hl$expected)
y0 y1 yhat0 yhat1
[0.0868,0.219] 8 2 8.259898 1.740102
(0.219,0.287] 7 3 7.485661 2.514339
(0.287,0.329] 7 3 6.968185 3.031815
(0.329,0.421] 8 2 6.194245 3.805755
(0.421,0.469] 5 5 5.510363 4.489637
(0.469,0.528] 4 6 4.983951 5.016049
(0.528,0.589] 5 5 4.521086 5.478914
(0.589,0.644] 2 8 3.833244 6.166756
(0.644,0.713] 6 4 3.285271 6.714729
(0.713,0.913] 1 9 1.958095 8.041905

為了幫助我們理解計算,現在讓我們自己手動執行測試。首先,我們計算模型預測概率,然后根據預測概率的十分位數對觀測值進行分類:

pihat <- mod$fitted
pihatcat <- cut(pihat, brks=c(0,quantile(pi 1,0.9,0.1)),1),  els=FALSE)

接下來,我們循環通過組1到10,計算觀察到的0和1的數量,並計算預期的0和1的數量。為了計算后者,我們找到每組中預測概率的均值,並將其乘以組大小,這里是10:

meanprobs <- array(0, dim=c(10,2))
expevents <- array(0, dim=c(10,2))
obsevents <- array(0, dim=c(10,2))

for (i in 1:10) {
	meanprobs[i,1] <- mean(pihat[pihatcat==i])
 
	obsevents[i,2] <- sum(1-y[pihatcat==i])
}

最后,我們可以通過表格的10x2單元格中的(觀察到的預期)^ 2 /預期的總和來計算Hosmer-Lemeshow檢驗統計量:

 
[1] 7.486643

與hoslem.test函數的測試統計值一致。

改變組的數量
接下來,讓我們看看測試的p值如何變化,因為我們選擇g = 5,g = 6,直到g = 15。我們可以通過一個簡單的for循環來完成:

for(i in 5:15){
	print(hoslem.test(mod $ y,fits(mod),g = i)$ p.value)
}
[1] 0.4683388
[1] 0.9216374
[1] 0.996425
[1] 0.9018581
[1] 0.933084
[1] 0.4851488
[1] 0.9374381
[1] 0.9717069
[1] 0.5115724
[1] 0.4085544
[1] 0.8686347

雖然p值有所改變,但它們都顯然不重要,所以他們給出了類似的結論,沒有證據表明不合適。因此,對於此數據集,選擇不同的g值似乎不會影響實質性結論。

通過模擬檢查Hosmer-Lemeshow測試


要完成,讓我們進行一些模擬,以檢查Hosmer-Lemeshow測試在重復樣本中的表現。首先,我們將從先前使用的相同模型重復采樣,擬合相同(正確)模型,並使用g = 10計算Hosmer-Lemeshow p值。我們將這樣做1000次,並將測試p值存儲在一個數組中:

pvalues < -  array(0,1000)

for(i in 1:1000){
	n < -  100
	x < -  rnorm(n)
 	pr < -  exp(xb)/(1 + exp(xb))
 	mod < -  glm(y~x,family = binomial)
 }

完成后,我們可以計算出p值小於0.05的比例。由於此處正確指定了模型,因此我們希望這種所謂的類型1錯誤率不大於5%:

 
[1] 0.04

因此,在1,000次模擬中,Hosmer-Lemeshow測試在4%的情況下給出了顯着的p值,表明不合適。所以測試錯誤地表明在我們預期的5%限制內不合適 - 它似乎工作正常。

現在讓我們改變模擬,以便我們適合的模型被錯誤地指定,並且應該很難適應數據。希望我們會發現Hosmer-Lemeshow測試在5%的時間內正確地找到了不合適的證據。具體來說,我們現在將生成跟隨具有協變量的邏輯模型,但我們將繼續使用線性協變量擬合模型,以便我們的擬合模型被錯誤地指定。 

 

我們發現,計算p值小於0.05的比例


[1] 0.648

因此,Hosmer-Lemeshow測試為我們提供了65%的不合適的重要證據。

 

如果您有任何疑問,請在下面發表評論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM