⼴义线性回归模型之0,1变量回归(logitprobit回归)—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, subt, na.action, start = NULL, etastart, mu
start, offt, control = l(…), model = TRUE, method = “glm.fit”, x = FALSE, y = TRUE, contrasts = NULL, …)
与线性回归lm不同之处就在于参数family,这个参数的作⽤在于定义⼀个族以及连接函数,使⽤该连接函数将因变量的期望与⾃变量联系起来,例如:上⾯讲到的logit模型和probit模型的参数分别为family= binomial(link=logit)和family= binomial(link=probit).
数据集介绍
a<-read.csv("Trans.csv",header=T)
a<-a[,-3]#去掉第三列
names(a)<-c("x1","x2","x3","y")#设置变量名
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(fal positive ratio)赋初值
for(i in1:ngrids){
千里姻缘一线牵p0=i/ngrids;#选取阈值p0
y.pred=1*(p>p0)#以p0为阈值⽣成预测值
TPR[i]=sum(y.ue)/ue)#计算TPR
FPR[i]=sum(y.pred*(ue))/ue)#计算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 in1:3){
prob=p[,k]#ȡ??p?е?K?е??K??ģ?͵?Ԥ
for(i in1:ngrids){
p0=i/ngrids # ȡ??
y.hat=1*(prob>p0)#?Ԥ??
FPR[i]=sum((ue)*y.hat)/ue)#FPR
TPR[i]=ue*y.hat)/ue)#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))