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))