用R语言建立logistic回归模型
程序员文章站
2022-07-14 21:12:53
...
用R语言建立logistic回归模型
公式:fm<-glm(formula,family=binomial(link=logit),data=data.frame)
其中:link=logit可以不写。
函数 | 用途 |
---|---|
summary() | 展示拟合模型的详细结果 |
coefficients() | 列出拟合模型的模型参数(截距项和斜率) |
fitted() | 列出拟合模型的预测值 |
confint() | 提供参数的置信区间 |
residuals() | 列出拟合模型的残差值 |
anova() | 生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表 |
vcov() | 列出模型参数的协方差矩阵 |
AIC() | 输出赤池信息统计量 |
plot() | 生成评价拟合模型的诊断图 |
predict() | 用拟合模型对新的数据集预测响应变量值 |
以R语言中Affairs数据集作为实验
数据加载中
install.packages("AER")
library(AER)
data("Affairs")
head(Affairs)
变量解释说明:
响应变量是affairs(是否为婚外情,0表示无,否则有)
自变量即为 gender(性别) age(年龄) yearsmarried (结婚时长)children(是否有小孩) religiousness(信仰宗教) education(受教育程度) occupation(职位) rating(不太清楚)
数据处理
# 查看数据响应数据的各个取值的占比情况
table(Affairs$affairs)
结果显示,有婚外情的有出现过1次,2次等等多次的,他们都属于属于婚外情,所以,我们需要构建一个新变量将其组合在一起。
Affairs$ynaffair <- ifelse(Affairs$affairs==0,0,1)
table(Affairs$ynaffair)
观察到数据分布还行,不至于差异特别大(比如婚外情的占了90%以上,如果是这样的话,我们需要进行类失衡处理,这个还可以)
对相应变量进行因子转化
Affairs$ynaffair <- factor(Affairs$ynaffairs,lecels=c(1,0),labels=c('yes','no'))
建模
glm(formula = ynaffair ~ gender + age + yearsmarried + children +
religiousness + education + occupation + rating, family = binomial(),
data = Affairs)
summary(fit.ful)
模型优化
红框框起来的即为通过模型的,其他的变量不合格,我们需要丢弃
fit.reduced <- glm(ynaffair ~ age + yearsmarried + religiousness + rating,family=binomial(),data=Affairs)
summary(fit.reduced)
模型中的变量均显示显著性检验,都通过了,模型构建成功
使用前面表格的函数
anova(fit.ful,fit.reduced,test="Chisq")# 模型是否有差异
前后两个模型的方差检验,看优化前后模型是否有差别,因p值=0.2108>0.05,所以两者还是有区别的;统计学知识(logistic回归用卡方检验)
# logistics回归方程模型的系数展示
coef(fit.reduced)
#这个是以控制变量的形式,一个变量变,其他的不变,都取平均值,以此来判断随着这个变量的变化,相应变量是如何变的。比如:随着年龄的增大,婚外情发生的概率是变小的。
testdata <- data.frame(rating=c(1,2,3,4,5),age=mean(Affairs$age),yearsmarried=mean(Affairs$yearsmarried,religiousness=mean(Affairs$religiousness)))
testdata
testdata$prob <- predict(fit.reduced,newdata=testdata,type="response")
testdata2<-data.frame(rating=mean(Affairs$rating),age=seq(17,57,10),yearsmarried=mean(Affairs$yearsmarried),religiousness=mean(Affairs$religiousness))
testdata2$prob <- predict(fit.reduced,newdata=testdata2,type="response")
testdata2
# 协方差矩阵
vcov(fit.reduced)