只是一些杂乱的笔记,没有注明出处。
简单的逻辑回归模型 logistic regression model,适用于因变量是二分变量的分析。
回归的本质是建立一个模型用来预测,而逻辑回归的独特性在于,预测的结果是只能有两种,true or false。
在R里面做逻辑回归也很简单,只需要构造好数据集,然后用glm函数(广义线性模型(generalized linear model))建模即可,预测用predict函数。
library(DAAG)
head(anesthetic)
cdplot(factor(nomove)~conc,data=anesthetic,main='条件密度图',ylab='病人移动',xlab='麻醉剂量')
#原始数据建模
# glm()是建立广义线性模型的函数。逻辑回归要采用的就是广义线性模型.
anes1=glm(nomove~conc,family=binomial(link='logit'),data=anesthetic,weights= nomove)
#注意这里的weights参数是必须的,因为R无法识别这个占比所基于的基数是多少。
summary(anes1)
#汇总数据
anestot=aggregate(anesthetic[,c('move','nomove')],by=list(conc=anesthetic$conc),FUN=sum)
anestot$conc=as.numeric(as.character(anestot$conc))
anestot$total=apply(anestot[,c('move','nomove')],1,sum)
anestot$prop=anestot$nomove/anestot$total
#汇总数据建模1
anes2=glm(cbind(nomove,move)~conc,family=binomial(link='logit'),data=anestot)
#汇总数据建模2
anes3=glm(prop~conc,family=binomial(link='logit'),weights=total,data=anestot)
# 根据logistic模型,我们可以使用predict函数来预测结果,下面根据上述模型来绘图
x=seq(from=0,to=3,length.out=30)
y=predict(anes1,data.frame(conc=x),type='response')
plot(prop~conc,pch=16,col='red',data=anestot,xlim=c(0.5,3),main='Logistic回归曲线图',ylab='病人静止概率',xlab='麻醉剂量')
lines(y~x,lty=2,col='blue')
可以用两种形式的数据来做分析:
- 汇总数据。一种方法是将两种结果的向量合并做为因变量,如anes2模型。
另一种是将比率做为因变量,总量做为权重进行建模,如anes3模型。这两种建模结果是一样的。 - 原始数据,因变量0,1编码。
模型输出的结果,采用summary()来查看,可以看到具体的模型信息,回归系数,系数是否显著等。(需要注意的是,Logistic为非线性模型,回归系数是通过极大似然估计方法计算所得)
summary() 展示拟合模型的详细结果
如果某个变量有多个不同的水平,你想查看一下这个变量总体是否有统计学意义,可以做一下联合检验,用anova()来查看分析偏差表。
anova() 生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表
结果可以这么理解,随着变量从第一个到最后一个逐个加入模型,模型的课解释方差发生变化,通过看p值,是否通过显著性检验。
说明由上述这些变量组成的模型是有意义的,并且是正确的。
anova(object = model2,test = "Chisq")
可以看到这个数据集是关于申请学校是否被录取的,根据学生的GRE成绩,GPA和排名来预测该学生是否被录取。
其中GRE成绩是连续性的变量,学生可以考取任意正常分数。
而GPA也是连续性的变量,任意正常GPA均可。
最后的排名虽然也是连续性变量,但是一般前几名才有资格申请,所以这里把它当做因子,只考虑前四名!
而我们想做这个逻辑回归分析的目的也很简单,就是想根据学生的成绩排名,绩点信息,托福或者GRE成绩来预测它被录取的概率是多少!
结果解读:
> mydata$rank <- factor(mydata$rank)
> mylogit <- glm(admit ~ gre + gpa + rank, data = mydata, family = "binomial")
> summary(mylogit)
Call:
glm(formula = admit ~ gre + gpa + rank, family = "binomial", data = mydata)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.6268 -0.8662 -0.6388 1.1490 2.0790
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.989979 1.139951 -3.500 0.000465 ***
gre 0.002264 0.001094 2.070 0.038465 *
gpa 0.804038 0.331819 2.423 0.015388 *
rank2 -0.675443 0.316490 -2.134 0.032829 *
rank3 -1.340204 0.345306 -3.881 0.000104 ***
rank4 -1.551464 0.417832 -3.713 0.000205 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 499.98 on 399 degrees of freedom
Residual deviance: 458.52 on 394 degrees of freedom
AIC: 470.52
Number of Fisher Scoring iterations: 4
根据对这个模型的summary结果可知:
GRE成绩每增加1分,被录取的优势对数(log odds)增加0.002
而GPA每增加1单位,被录取的优势对数(log odds)增加0.804,不过一般GPA相差都是零点几。
最后第二名的同学比第一名同学在其它同等条件下被录取的优势对数(log odds)小了0.675,看来排名非常重要啊!!!
这里必须解释一下这个优势对数(log odds)是什么意思了,如果预测这个学生被录取的概率是p,那么优势对数(log odds)就是log2(p/(1-p)),一般是以自然对数为底。
零偏差和剩余偏差之间的差异越大越好。通过分析表格,我们可以看到每次添加一个变量时出现偏差的情况。同样,增加Pclass,Sex and Age可以显着减少残余偏差。这里的大p值表示没有变量的模型或多或少地解释了相同的变化量。最终你想看到的是一个显着的下降和偏差AIC。
glmer()模型下,需要用Anova 大写,Anova(model,type=3)来查看卡方值和p值,这样输出结果和jamovi是相同的。
> Anova(mymodel,type = 3)
Analysis of Deviance Table (Type III Wald chisquare tests)
Response: punishornot
Chisq Df Pr(>Chisq)
(Intercept) 6.2574 1 0.0123674 *
power 1.3830 1 0.2395917
member 36.7568 2 1.043e-08 ***
playera 948.5700 6 < 2.2e-16 ***
power:member 15.0146 2 0.0005491 ***
power:playera 22.7321 6 0.0008914 ***
member:playera 26.1596 12 0.0101894 *
power:member:playera 20.0121 12 0.0668580 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1