当前位置:首页 > 新闻资讯

logistic回归预测婚姻出轨|R语言

当通过一系列连续型和/或类别型预测变量来预测二值型结果变量时,Logistic回归是一个非
常有用的工具。本文不涉及理论推导,重点通过实践来熟悉logestic分析过程,案例来自《R语言实战》第13章logestic案例
--------文章结构---------------

数据描述(变量介绍)

数据集探索(回归方程、置信区间、评估)

Logistic预测例子(随便举了个例子)

总结(疑难杂症)

---------------------------

数据描述:

婚外情数据即著名的“Fair’s Affairs”,取自于1969年《今日心理》(Psychology Today)所做的一个非常有代表性的调查,该数据从601个参与者身上收集了9个变量:

  • affairs:过去一年出轨次数
  • gender:性别
  • age:年龄
  • yearsmarried:结婚年限
  • children:是否有小孩
  • religiousness:宗教信仰程度
  • education:教育程度(20分为满分)
  • occupation:职业种类(逆向编号的戈登7种分类)
  • rating:对婚姻满意度(5分为满分)

数据集探索过程:

1.导入数据

install.packages("AER") data(Affairs,package="AER")2.利用summary()来查看数据一些描述性统计量

由上图我们可以知道:

  • 样本中男性286人,女性315人
  • 被调查者中年龄最小17岁,最大为57岁,平均年龄为32岁
  • 被调查婚姻中有小孩的有430人,没有小孩的有171人
  • 宗教信仰程度平均值为3.116,对婚姻满意度平均值为3.932(两个均为5分值)
利用table查看出轨次数可以看出601个参与者中有451人从来没有出轨,38个人出轨12次。

3.检查缺失值和异常值

#查看缺失值 sum(is.na(Affairs)) #查看异常值 library(ggplot2) boxplot(Affairs$age)没有缺失值。

在处理异常值上我主要从年龄、婚姻年限、宗教信仰程度三个方面进行异常值检查(其余变量在前面的summary检查中可以看出)下图是年龄的箱线图结果,可以看出有一个异常值。下一步我们需要做的,就是把这个异常值找出来。

age变量的箱线图
定位并查看异常值:

max(Affairs$age) Affairs[Affairs$age==57,] #定位到年龄最大值为57岁,查看满足条件的行——异常值处理有些疑惑————————————————————-

共有22条年龄为57岁数据,在这里对于这22条数据如何处理?原本我打算用删除这些年龄为57的数据,毕竟相比于601的总样本量,22条数据不算什么。

事实证明,这些数据不能删

为啥呢?我删除了这57条数据后,在后边建模时,年龄的变量P>0.05,而书上P<0.05,也就是说,假如我删除了这57条数据,后面就不能把age的变量考虑进来用作评估是否会出轨的指标。对于异常值的处理除了删除也可以忽略,这次按书上要求,选择不对这些异常值做处理。

————————————————————————————————

4.将数据变量全变为数值型变量

为了方便后续的建模分析,把数据变量全转为数值型变量,其中gender列女(F)为1,男(M)为0,Children列有孩子为1,没孩子为0.

PS:转为数值型,前面一定要加一个table()不然会急死你

#转为数值型 table(Affairs$affairs) a <- sub("female",1,Affairs$gender) b <- sub("male",0,a) Affairs$gender <- a Affairs$gender <-b as.numeric(Affairs$gender) table(Affairs$children) c <- sub("yes",1,Affairs$children) d<- sub("no",0,c) Affairs$children <- c Affairs$children<-d as.numeric(Affairs$children)5.logestic回归分析

#建立模型 fit.full <- glm(affairs~gender+age+yearsmarried+children+religiousness+education+occupation+rating, data=Affairs,family = binomial()) summary(fit.full)输出结果:

从回归系数的p值(最后一栏)可以看到,性别P=0.241083、是否有孩子那列P=0.172508、学历P=0.676851、职业P=0.676851,P值很大(大于0.05),不拒绝原假设,对方程的贡献都不显著(你无法拒绝参数为0的假设)。去除这些变量重新拟合模型,检验新模型是否拟合得好:

fit.reduced <- glm(affairs ~ age + yearsmarried + religiousness + rating, data=Affairs, family=binomial()) summary(fit.reduced)可以看出新模型的每个回归系数都非常显著(age/yearsmarried/religiousness/rating的p<0.05)。由于两模型嵌套( fit.reduced 是 fit.full的一个子集),可以使用 anova() 函数对它们进行比较,对于广义线性回归,可用卡方检验。

anova(fit.reduced,fit.full,test="Chisq")结果的卡方值不显著(p=0.2108>0.05),表明四个预测变量的新模型与九个完整预测变量的模型拟合程度一样好。这使得你更加坚信添加性别、孩子、学历和职业变量不会显著提高方程的预测精度,因此可以依据更简单的模型进行解释。

查看回归系数(四个预测变量):

“在Logistic回归中,响应变量是Y=1的对数优势比(log)。回归系数的含义是当其他预测变量不变时,一单位预测变量的变化可引起的响应变量对数优势比的变化。由于对数优势比解释性差,你可对结果进行指数化。” ——《R语言实战》
因此我们对结果进行指数化:

exp(coef(fit.reduced))结果解读:

我们可以写出公式

Y=0.9653437X1+1.1058594X2+0.7196258X3+0.6304248X4

可以看到婚龄增加一年,婚外情的优势比将乘以1.1058594(保持年龄、宗教信仰和婚姻评定不变);相反,年龄增加一岁,婚外情的的优势比则乘以0.9653437。因此,随着婚龄的增加和年龄、宗教信仰与婚姻评分的降低,婚外情优势比将上升。因为预测变量不能等于0,截距项在此处没有什么特定含义。

利用 confint() 函数获取系数的置信区间。

exp(confint(fit.reduced)) 上图为在优势比尺度上得到系数95%的置信区间。对于二值型Logistic回归,某预测变量n单位的变化引起的较高值上优势比的变化为exp(β j )^n,它反映的信息可能更为重要。比如,保持其他预测变量不变,婚龄增加一年,婚外情的优势比将乘以1.106,而如果婚龄增加10年,优势比将乘以1.106^10,即2.7。

6.模型评估

install.packages("pROC") library(pROC) pre <- predict(fit.reduced,Affairs) modelroc <- roc(Affairs$affairs,pre) plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2), grid.col=c("green", "red"), max.auc.polygon=TRUE, auc.polygon.col="skyblue", print.thres=TRUE)通常一个二值分类器可以通过ROC(Receiver Operating Characteristic)曲线和AUC值来评价优劣。在R中,可以利用pROC包,它能方便比较两个分类器,还能自动标注出最优的临界点,在下图中最优点FPR=1-TNR=0.732,TPR=0.593,AUC值为0.704,说明该模型的预测效果还是不错的。

Logistic预测例子

前半部分我们探索了些基本统计量,最后也算出了回归方程、置信区间,接下来就是进行建模预测分析。(需提前证明线性、正态、方差齐性。)

———举个栗子—————————

  • 这天,钻石王老五的妈妈来居委会找做数据的977同志,说自己儿子45岁,结婚8年,研究生学历,狂热宗教徒,无子,婚姻满意度一般(所在地区和本次样本数据集地区相同)他出轨可能性大吗?
  • 20岁结婚的潘金莲美若天仙,结婚2年,有一子,婚姻满意度较坏,本科学历,丈夫武大郎想探究下妻子出轨可能性
977同志眉头一皱发现事情并不简单,换上道服(打开R studio),掐指一算(建立训练集和测试集)

testdata <- data.frame(rating=c(3, 2), age=c(45,20), yearsmarried=c(8,2), religiousness=c(5,1)) testdata进行预测:

testdata$prob <- predict(fit.reduced, newdata=testdata, type="response") testdata看得出预测结果潘金莲要比钻石王老五出轨可能性更大。







总结:

1.熟悉logistic回归数据分析过程

2.过程中发现一个问题,无法非常流利的进行数值与文字转换,用sub可以将男女转为数字1,0却不能进行计算,理由很简单,字符串类型是chr,哪怕用了as.numeric转换也不对,算是一个坑,争取在月底前写篇专门的字符转换文章总结

3.进行数值型操作时一定要先table()一下,这样后续才不会排除掉其他值,比如这次的如果没有table,直接sub替换男女,结果是,男全部转换成功,剩余的变为NA。。。

4.知道如何用R语言表示回归方程和置信区间,但逻辑回归和线性回归的概念性总结没有完全整理清楚,只知道什么情况下会用逻辑回归的二分类

----------------------------------------------------

最后,想说

婚姻这方面任何数据分析都比不上女人男人的第六感=。。 =.......

(换句话说机器模型最终还要基于业务实际情况的啦~~)

文中有不足的地方欢迎指正

完结撒花~~~


联系我们

Contact us
 

宁波邦越调查联系方式

热 线:400-6819-007 (24小时服务)
联系人:胡先生
总 机:0574-87241215
手 机:13777092292
Q Q:470471186
邮 箱:zjby007@163.com
地 址:宁波市高新区科贸中心东楼
网 站:www.cx007.net
 
Copyright © 2026. All rights reserved.宁波鄞州邦越市场调查有限公司 版权所有.
我们不辜负每一份委托,客户需求为我己任,客户满意为我目标!
浙ICP备11058344号-6