欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

用R语言建立logistic回归模型
变量解释说明:
响应变量是affairs(是否为婚外情,0表示无,否则有)
自变量即为 gender(性别) age(年龄) yearsmarried (结婚时长)children(是否有小孩) religiousness(信仰宗教) education(受教育程度) occupation(职位) rating(不太清楚)

数据处理

# 查看数据响应数据的各个取值的占比情况
table(Affairs$affairs)

用R语言建立logistic回归模型
结果显示,有婚外情的有出现过1次,2次等等多次的,他们都属于属于婚外情,所以,我们需要构建一个新变量将其组合在一起。

Affairs$ynaffair <- ifelse(Affairs$affairs==0,0,1)
table(Affairs$ynaffair)

用R语言建立logistic回归模型观察到数据分布还行,不至于差异特别大(比如婚外情的占了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)

用R语言建立logistic回归模型

模型优化

红框框起来的即为通过模型的,其他的变量不合格,我们需要丢弃

fit.reduced <- glm(ynaffair ~  age + yearsmarried + religiousness + rating,family=binomial(),data=Affairs)
summary(fit.reduced)

模型中的变量均显示显著性检验,都通过了,模型构建成功
用R语言建立logistic回归模型

使用前面表格的函数

anova(fit.ful,fit.reduced,test="Chisq")# 模型是否有差异

前后两个模型的方差检验,看优化前后模型是否有差别,因p值=0.2108>0.05,所以两者还是有区别的;统计学知识(logistic回归用卡方检验)
用R语言建立logistic回归模型

# logistics回归方程模型的系数展示
coef(fit.reduced)

用R语言建立logistic回归模型
#这个是以控制变量的形式,一个变量变,其他的不变,都取平均值,以此来判断随着这个变量的变化,相应变量是如何变的。比如:随着年龄的增大,婚外情发生的概率是变小的。

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

用R语言建立logistic回归模型

# 协方差矩阵
vcov(fit.reduced)

用R语言建立logistic回归模型