廣義線性模型 R--glm函數


R語言glm函數學習: 

  【轉載時請注明來源】:http://www.cnblogs.com/runner-ljt/

    Ljt

    作為一個初學者,水平有限,歡迎交流指正。

 

glm函數介紹:

glm(formula, family=family.generator, data,control = list(...))


family:每一種響應分布(指數分布族)允許各種關聯函數將均值和線性預測器關聯起來

 常用的family:

binomal(link='logit')         ----響應變量服從二項分布,連接函數為logit,即logistic回歸

binomal(link='probit')       ----響應變量服從二項分布,連接函數為probit

poisson(link='identity')     ----響應變量服從泊松分布,即泊松回歸

 

control:控制算法誤差和最大迭代次數

glm.control(epsilon = 1e-8, maxit = 25, trace = FALSE)  

     -----maxit:算法最大迭代次數,改變最大迭代次數:control=list(maxit=100)

 

 

glm函數使用:

 

> 
> data<-iris[1:100,]
> samp<-sample(100,80)
> names(data)<-c('sl','sw','pl','pw','species')
> testdata<-data[samp,]
> traindata<-data[-samp,]
> 
> lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata)
Warning messages:
1: glm.fit:算法沒有聚合 
2: glm.fit:擬合機率算出來是數值零或一 
> summary(lgst)

Call:
glm(formula = testdata$species ~ pl, family = binomial(link = "logit"), 
    data = testdata)

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-1.836e-05  -2.110e-08  -2.110e-08   2.110e-08   1.915e-05  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)   -83.47   88795.25  -0.001    0.999
pl             32.09   32635.99   0.001    0.999

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1.1085e+02  on 79  degrees of freedom
Residual deviance: 1.4102e-09  on 78  degrees of freedom
AIC: 4

Number of Fisher Scoring iterations: 25

>

  

注意在使用glm函數就行logistic回歸時,出現警告:

Warning messages:
1: glm.fit:算法沒有聚合
2: glm.fit:擬合機率算出來是數值零或一

同時也可以發現兩個系數的P值都為0.999,說明回歸系數不顯著。

 

 

第一個警告:算法不收斂。
     由於在進行logistic回歸時,依照極大似然估計原則進行迭代求解回歸系數,glm函數默認的最大迭代次數 maxit=25,當數據不太好時,經過25次迭代可能算法 還不收斂,所以可以通過增大迭代次數嘗試解決算法不收斂的問題。但是當增大迭代次數后算法仍然不收斂,此時數據就是真的不好了,需要對數據進行奇異值檢驗等進一步的處理。

 

> 
> lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata,control=list(maxit=100))
Warning message:
glm.fit:擬合機率算出來是數值零或一 
> summary(lgst)

Call:
glm(formula = testdata$species ~ pl, family = binomial(link = "logit"), 
    data = testdata, control = list(maxit = 100))

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-1.114e-05  -2.110e-08  -2.110e-08   2.110e-08   1.162e-05  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept)    -87.18  146399.32  -0.001        1
pl              33.52   53808.49   0.001        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1.1085e+02  on 79  degrees of freedom
Residual deviance: 5.1817e-10  on 78  degrees of freedom
AIC: 4

Number of Fisher Scoring iterations: 26

> 

  

如上,通過增加迭代次數,解決了第一個警告,此時算法收斂。

但是第二個警告仍然存在,且回歸系數P=1,仍然不顯著。

 

第二個警告:擬合概率算出來的概率為0或1

首先,這個警告是什么意思?
我們先來看看訓練樣本的logist回歸結果,擬合出的每個樣本屬於'setosa'類的概率為多少?

 

>
>lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata,control=list(maxit=100))
>p<-predict(lgst,type='response')
>plot(seq(-2,2,length=80),sort(p),col='blue')
>

 

                                         

 

可以看出訓練樣本為'setosa'類的概率不是幾乎為0,就是幾乎為1,並不是我們預想中的logistic模型的S型曲線,這就是第二個警告的意思。

 

  那么問題來了,為什么會出現這種情況?
 (以下內容只是本人參考一些解釋的個人理解)

  這種情況的出現可以理解為一種過擬合,由於數據的原因,在回歸系數的優化搜索過程中,使得分類的種類屬於某一種類(y=1)的線性擬合值趨於大,分類種類為另一   類(y=0)的線性擬合值趨於小。

由於在求解回歸系數時,使用的是極大似然估計的原理,即回歸系數在搜索過程中使得似然函數極大化:

 

                                                      

 

 

所以在搜索過程中偏向於使得y=1的h(x)趨向於大,而使得y=0的h(x)趨向於小。

 

                                                                

即系數Θ使得 Y=1類的 -ΘTX 趨向於大,使得Y=0類的 -ΘTX 趨向於小。而這樣的結果就會導致P(y=1|x;Θ)-->1  ; P(y=0|x;Θ)-->0  .

 

那么問題又來了,什么樣的數據會導致這樣的過擬合產生呢?

 先來看看上述logistic回歸中種類為setosa和versicolor的樣本pl值的情況。(橫軸代表pl值,為了避免樣本pl數據點疊加在一起,增加了一個無關的y值使樣本點展開)

                                        

 可以看出兩類數據明顯的完全線性可分

故在回歸系數搜索過程中只要使得一元線性函數h(x)的斜率的絕對值偏大,就可以實現y=1類的h(x)趨向大,y=0類的h(x)趨向小。

所以當樣本數據完全可分時,logistic回歸往往會導致過擬合的問題,即出現第二個警告:擬合概率算出來的概率為0或1。

出現了第二個警告后的logistic模型進行預測時往往是不適用的,對於這種線性可分的樣本數據,其實直接使用規則判斷的方法則簡單且適用(如當pl<2.5時則直接判斷為setosa類,pl>2.5時判斷為versicolor類)。

 

以下,對於不完全可分的二維訓練數據展示logistic回歸過程。

 

> 
> data<-iris[51:150,]
> samp<-sample(100,80)
> names(data)<-c('sl','sw','pl','pw','species')
> testdata<-data[samp,]
> traindata<-data[-samp,]
>
> lgst<-glm(testdata$species~sw+pw,binomial(link='logit'),data=testdata)
> summary(lgst)

Call:
glm(formula = testdata$species ~ sw + pw, family = binomial(link = "logit"), 
    data = testdata)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.82733  -0.16423   0.00429   0.11512   2.12846  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -12.915      5.021  -2.572   0.0101 *  
sw            -3.796      1.760  -2.156   0.0310 *  
pw            14.735      3.642   4.046 5.21e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 110.85  on 79  degrees of freedom
Residual deviance:  24.40  on 77  degrees of freedom
AIC: 30.4

Number of Fisher Scoring iterations: 7

>#畫擬合概率曲線圖
> p<-predict(lgst,type='response')
> plot(seq(-2,2,length=80),sort(p),col='blue')
>
>#畫訓練樣本數據散點圖
>a<-testdata$species=='versicolor'
> x1<-testdata[a,'sw']
> y1<-testdata[a,'pw']
> x2<-testdata[!a,'sw']
> y2<-testdata[!a,'pw']
> summary(testdata$sw)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.700   2.900   2.881   3.100   3.800 
> summary(testdata$pw)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.300   1.600   1.672   2.000   2.500 
> 
> plot(x1,y1,xlim=c(1.5,4),ylim=c(.05,3),xlab='sw',ylab='pw',col='blue')
> points(x2,y2,col='red')
> 
> #畫分類邊界圖,即畫h(x)=0.5的圖像
> x3<-seq(1.5,4,length=100)
> y3<-(3.796/14.735)*x3+13.415/14.735
> lines(x3,y3)

  

擬合概率曲線圖:

(基本上符合logistic模型的S型曲線)

                                                  

 

訓練樣本散點圖及分類邊界:

(畫logistic回歸的分類邊界即畫曲線h(x)=0.5)

 

                                                 

 

 


免責聲明!

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



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