廣義線性迴歸模型之0,1變量回歸(logit/probit迴歸)—R語言實現

1、廣義線性迴歸

在這裏插入圖片描述
廣義線性模型有三個組成部分:
(1) 隨機部分, 即變量所屬的指數族分佈 族成員, 諸如正態分佈, 二項分佈, Poisson 分佈等等. (2) 線性部分, 即 η = x⊤β. (3) 連接函數 g(µ) = η。 R 中的廣義線性模型函數glm() 對指數族中某分佈的默認連接函數 是其典則連接函數, 下表列出了 R 函數glm() 所用的某些指數族分佈的 典則連接函數.
在這裏插入圖片描述

2、0-1因變量的迴歸模型

對於因變量爲0,1變量的問題,可以考慮兩種模型來解決
在這裏插入圖片描述
經過Probit變換Logit變換,兩種模型可以寫成:
在這裏插入圖片描述

多變量情況:

logit迴歸
在這裏插入圖片描述
probit迴歸
在這裏插入圖片描述

3、案例分析

R中的廣義線性迴歸函數爲:glm()
語法爲:glm(formula, family = gaussian, data, weights, subset, na.action, start = NULL, etastart, mustart, offset, control = glm.control(…), model = TRUE, method = “glm.fit”, x = FALSE, y = TRUE, contrasts = NULL, …)
與線性迴歸lm不同之處就在於參數family,這個參數的作用在於定義一個族以及連接函數,使用該連接函數將因變量的期望與自變量聯繫起來,例如:上面講到的logit模型和probit模型的參數分別爲family= binomial(link=logit)和family= binomial(link=probit).

數據集介紹

數據來自新竹市輸血服務中心的記錄http://archive.ics.uci.edu/ml/datasets/Blood+Transfusion+Service+Center變量有Recency(上次獻血距離研究時的月份),Frequency(總獻血次數),Time(第一次獻血是多少個月之前),Donate(是否將在2007年3月再獻血,1爲會,0爲不會)
在這裏插入圖片描述
分別三個變量與因變量的相關性
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
通過圖可以看出,三個變量與因變量還是有一定的關係的。
完整代碼附上,備註的比較詳細,也比較簡單。

a<-read.csv("Trans.csv",header=T)
a<-a[,-3] #去掉第三列
names(a)<-c("x1","x2","x3","y") #設置變量名
a1<-a[c(1:400),] #取前400行數據,賦值給a1
a2=a[c(401:748),] #取出從401行開始剩下所有行的數據,賦值給a2

a1[c(1:5),] #展示a1前5行數據

#畫圖
par(mfrow=c(2,2)) #設置畫圖模式爲2*2的格式
boxplot(x1~y,data=a1,main="Recency") #畫出Recency與Donated的盒狀圖
boxplot(x2~y,data=a1,main="Frequency") #畫出Frequency與Donated的盒狀圖
boxplot(x3~y,data=a1,main="Time") #畫出Time與Donated的盒狀圖

par(mfrow=c(1,1)) #設置畫圖模式爲1x1的格式

#擬合迴歸圖
glm0.a=glm(y~1,family=binomial(link=logit),data=a1) #擬合logistic迴歸,不使用任何變量的空模型
glm1.a=glm(y~x1+x2+x3,family=binomial(link=logit),data=a1) #擬合logit迴歸,使用所有變量全模型
anova(glm0.a,glm1.a) #計算glm0.a與glm1.a的deviance
1-pchisq(30.13,3)	#計算模型顯著性檢驗的P值
glm1.b=glm(y~x1+x2+x3,family=binomial(link=probit),data=a1)	#擬合porbit迴歸,使用所有變量的全模型


#參數估計
library(car)
Anova(glm1.a,type="III")	#對模型glm1.a做三型方差分析
summary(glm1.a)		#顯示模型glm1.a的各方面細節,包括參數估計值、P值等
Anova(glm1.b,type="III")		#對模型glm1.b做三型方差分析
summary(glm1.b)			#顯示模型glm1.b的各方面細節,包括參數估計值、P值等
AIC(glm1.a)
AIC(glm1.b)

#預測與評估
p=predict(glm1.a,a2)	#利用模型glm1.a對數據a2進行預測
p=exp(p)/(1+exp(p))		#計算預測得到的概率
p1 = predict(glm1.b,a2)#標準正分佈
p1 = pnorm(p1)

a2$y.pred=1*(p>0.5)	  #以0.5爲閾值生成預測值
table(a2[,c(4,5)])		#計算預測值與真實值的2維頻數表
a21=a2[a2$y==1,]
nrow(a21)
nrow(a2)
a2$y.pred=1*(p>0.18)		#以0.18爲閾值生成預測值
table(a2[,c(4,5)])		#計算預測值與真實值的2維頻數表
ngrids=100		#設置格點數爲100
TPR=rep(0,ngrids)		#爲TPR(true positive ratio)賦初值
FPR=rep(0,ngrids)		#爲FPR(false positive ratio)賦初值
for(i in 1:ngrids){
p0=i/ngrids;	#選取閾值p0
y.true=a2$y		#從a2中取出真實值並賦值給y.true
y.pred=1*(p>p0)	#以p0爲閾值生成預測值
TPR[i]=sum(y.pred*y.true)/sum(y.true)	#計算TPR
FPR[i]=sum(y.pred*(1-y.true))/sum(1-y.true)	#計算FPR
}

#畫出ROC圖
plot(FPR,TPR,type="l",col=2)	#畫出FPR與TPR的散點圖,即ROC曲線
points(c(0,1),c(0,1),type="l",lty=2) #添加對角線

p=matrix(0,length(a2[,1]),3)	#生成矩陣,用於存儲各模型的預測值
p[,1]=predict(glm0.a,a2)		  #利用模型glm0.a對數據a2進行預測
p[,2]=predict(glm1.a,a2)		#利用模型glm1.a對數據a2進行預測
p[,3]=predict(glm1.b,a2)		#利用模型glm1.b對數據a2進行預測
p[,c(1:2)]=exp(p[,c(1:2)])/(1+exp(p[,c(1:2)]))					#計算預測得到的概率
p[,3]=pnorm(p[,3])							#計算預測得到的概率

plot(c(0,1),c(0,1),type="l",main="FPR vs. TPR",xlab="FPR",ylab="TPR")		#畫圖,生成基本框架
FPR=rep(0,ngrids)								#爲FPR賦初值
TPR=rep(0,ngrids)								#爲TPR賦初值
for(k in 1:3){
  prob=p[,k]								#ȡ??p?е?K?е?ֵ??????K??ģ?͵?Ԥ??????
  for(i in 1:ngrids){
    p0=i/ngrids							#ѡȡ??ֵ
    y.hat=1*(prob>p0)						#??????ֵ????Ԥ??ֵ
    FPR[i]=sum((1-y.true)*y.hat)/sum(1-y.true)			#????FPR
    TPR[i]=sum(y.true*y.hat)/sum(y.true)				#????TPR
  }
  points(FPR,TPR,type="b",col=k,lty=k,pch=k)				#??ͼ?????ӵ?k??ģ?͵?TPR??FPR??ɢ??ͼ
}
legend(0.6,0.5,c("logit??ģ??","logitȫģ??",	
                 "probitȫģ??"),lty=c(1:3),col=c(1:3),pch=c(1:3))			
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章