【机器学习实战】南非心脏病数据——基于逻辑回归

目录

数据集介绍

导入数据,相关变量解释

进行逻辑回归

计算相关指标值

绘制ROC曲线

 计算AUC值与 Kappa值

总结


数据集介绍

在开始之前,请让我们先来介绍一下所用的数据包:南非心脏病数据 SAheart包

SAheart是R语言中的一个数据包,其中包含了南非心脏病数据集。该数据集提供了关于南非人口样本的心脏病相关的信息。

南非心脏病数据集(South African Heart Disease Data)收集了一组有关心脏病风险因素的数据。该数据集由5个县的462个个体组成,其中包括了有关他们的年龄、性别、体重指数、收缩压、胆固醇水平等多个特征。该数据集的目的是研究这些风险因素与心脏病之间的关系。

通过分析这些数据,可以探索不同变量与心脏病之间的关联性,并建立预测模型来预测一个人是否患有心脏病。这个数据集在心脏病研究领域和统计学习中被广泛使用。

导入数据,相关变量解释

使用R包 ElemStatLearn 的南非心脏病数据 SAheart 进行逻辑回归。

首先,我们来看一下数据的各个变量表示的含义:
 chd (是否有冠心病,即 coronary heart disease)。
sbp (收缩压即systolic blood pressure)
tobacco (累计抽烟量)
ldl (低密度脂蛋白胆固醇,即lowdensity lipoprotein cholesterol)
famhist (是否有家族心脏病史)
typea (A型行为,即type-A behavior)
alcohol (当前饮酒量)
age (发病时年龄),以及两个关于肥胖程度的数值型度量 adiposity 与 obesity。

了解变量各个含义之后,我们正式开始回归,在回归开始之前,我们需要先做一部分的工作,比如,设置“chd(是否有冠心病,即 coronary heart disease)”为响应变量,并且查看现有数据当中冠心病的比例,最后我们查看该数据集的数据结构。

load("Data_ElemStatLearn.RData")
> #(1)
> #将chd设置为响应变量,并计算该样本当中冠心病的比例
> SAheart$chd <- factor(SAheart$chd,levels = 0:1,ordered = TRUE)
> levels(SAheart$chd) <- c("No","Yes")
> str(SAheart)
'data.frame':	462 obs. of  10 variables:
 $ sbp      : int  160 144 118 170 134 132 142 114 114 132 ...
 $ tobacco  : num  12 0.01 0.08 7.5 13.6 6.2 4.05 4.08 0 0 ...
 $ ldl      : num  5.73 4.41 3.48 6.41 3.5 6.47 3.38 4.59 3.83 5.8 ...
 $ adiposity: num  23.1 28.6 32.3 38 27.8 ...
 $ famhist  : Factor w/ 2 levels "Absent","Present": 2 1 2 2 2 2 1 2 2 2 ...
 $ typea    : int  49 55 52 51 60 62 59 62 49 69 ...
 $ obesity  : num  25.3 28.9 29.1 32 26 ...
 $ alcohol  : num  97.2 2.06 3.81 24.26 57.34 ...
 $ age      : int  52 63 46 58 49 45 38 58 29 53 ...
 $ chd      : Ord.factor w/ 2 levels "No"<"Yes": 2 2 1 2 2 1 1 2 1 2 ...
> (prop.table(table(SAheart$chd)))

       No       Yes 
0.6536797 0.3463203 

代码运行结果显示,该数据集包含462个数据,10个变量;

并且该数据集中患有冠心病的比例为34.62%。

进行逻辑回归

接下来,我们设置随机数种子,预留100个观测值作为随机数种子。


 set.seed(1)
> train_index<- sample(1:462,362)
> train_data <- SAheart[train_index,]
> test_data <- SAheart[-train_index,]
>

进行逻辑回归,“family =binomial”表明进行逻辑回归;同时,我们使用summary()函数查看其结构

#(3)chd对其他变量进行回归
> #使用逻辑回归模型,拟合变量chd与其他变量
> reg_train <- glm(chd~.,data=train_data,family =binomial) 
> summary(reg_train)

回归结果如下:

Call:
glm(formula = chd ~ ., family = binomial, data = train_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8874  -0.7857  -0.4558   0.8709   2.4458  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -4.8018154  1.4645690  -3.279 0.001043 ** 
sbp             0.0014877  0.0067392   0.221 0.825284    
tobacco         0.1011628  0.0299636   3.376 0.000735 ***
ldl             0.1812776  0.0688090   2.635 0.008426 ** 
adiposity       0.0197353  0.0323313   0.610 0.541591    
famhistPresent  0.8014100  0.2593765   3.090 0.002003 ** 
typea           0.0336875  0.0138505   2.432 0.015006 *  
obesity        -0.0725419  0.0489357  -1.482 0.138235    
alcohol         0.0008675  0.0051177   0.170 0.865399    
age             0.0413134  0.0133585   3.093 0.001984 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 465.32  on 361  degrees of freedom
Residual deviance: 369.50  on 352  degrees of freedom
AIC: 389.5

Number of Fisher Scoring iterations: 5

上述结果,给出了各变量的最小值、四分位数、中位数以及最大值,并且给出了他们的估计值、标准误差、Z值以及P值;由P值结果可知,变量tobacco、ldl、famhistPresent 、age   较为显著。

tobacco(累积烟草使用量)、ldl(低密度脂蛋白胆固醇)、famhistPresent(心脏病家族史)、typea(A 型行为)和 age(年龄)的系数估计值均具有统计学意义(p 值小于 0.05)。这意味着这些变量与冠心病的存在较大关系。

同时,给出赤池信息准则AIC为389.5。

接下来,让我们计算R平方,看看方程效果如何。

#(4)计算R平方
> (reg_train$null.deviance-reg_train$deviance)/reg_train$null.deviance #׼2
[1] 0.2059303

 结果显示R平方仅为20.59%,回归方程效果一般。

计算相关指标值

而后,我们计算各个变量 的边际效应,从中可以看出变量 “ldl'对与心脏病影响显著,接下来是变量”tobacco",也就是累计抽烟量和胆固醇对于冠心病有较为显著的影响。

#计算边际效应
> train_effects <- margins(reg_train)
> train_effects
Average marginal effects
glm(formula = chd ~ ., family = binomial, data = train_data)

       sbp tobacco     ldl adiposity   typea obesity  alcohol      age
 0.0002522 0.01715 0.03073  0.003345 0.00571 -0.0123 0.000147 0.007003
 famhistPresent
         0.1436

当 tobacco(累积烟草使用量)增加一个单位时,患冠心病的概率将增加 0.01715。当 ldl(低密度脂蛋白胆固醇)增加一个单位时,患冠心病的概率将增加 0.03073。当 famhist(心脏病家族史)从无到有时,患冠心病的概率将增加 0.1436。 

也就意味着冠心病在很大程度上是受遗传因素影响。

同样,我们利用sumamry()函数查看其数据分布结构:

> summary(train_effects)
         factor     AME     SE       z      p   lower  upper
      adiposity  0.0033 0.0055  0.6116 0.5408 -0.0074 0.0141
            age  0.0070 0.0022  3.2198 0.0013  0.0027 0.0113
        alcohol  0.0001 0.0009  0.1695 0.8654 -0.0016 0.0018
 famhistPresent  0.1436 0.0473  3.0344 0.0024  0.0508 0.2363
            ldl  0.0307 0.0113  2.7307 0.0063  0.0087 0.0528
        obesity -0.0123 0.0082 -1.5007 0.1334 -0.0284 0.0038
            sbp  0.0003 0.0011  0.2208 0.8252 -0.0020 0.0025
        tobacco  0.0171 0.0048  3.5966 0.0003  0.0078 0.0265
          typea  0.0057 0.0023  2.4994 0.0124  0.0012 0.0102
> plot(train_effects,main="边际效应图")

可视化边际效应图: 

其算起逻辑回归的各项指标:

#(6)准确率、错误率、灵敏度、特异度与召回率:
> prop_test<- predict(reg_train,newdata=test_data,type="response") 
> pred_test<- prop_test >0.5 
> (table_test <- table(predict=pred_test,actual=test_data$chd))
       actual
predict No Yes
  FALSE 54  18
  TRUE  10  18
> (accuracy <- (table_test[1,1]+table_test[2,2])/sum(table_test))
[1] 0.72
> (error_rate<- (table_test[1,2]+table_test[2,1])/sum(table_test))
[1] 0.28
> (sensitivity <- (table_test[2,2])/(table_test[1,2]+table_test[2,2]))
[1] 0.5
> (specificity <- (table_test[1,1])/(table_test[1,1]+table_test[2,1]))
[1] 0.84375
> (recall <- (table_test[2,2])/(table_test[2,1]+table_test[2,2]))
[1] 0.6428571

结果显示:

回归的正确率在百分之七十左右,模型拟合效果较好;

模型的灵敏度为 0.5,表示在所有实际患有冠心病的观测中,有 50% 被模型正确预测为患有冠心病;

特异度为 0.84375,表示在所有实际未患冠心病的观测中,有 84.375% 被模型正确预测为未患冠心病;

召回率为 0.6428571,表示在所有被模型预测为患有冠心病的观测中,有 64.28571% 实际患有冠心病。

绘制ROC曲线

使用R包“ROCR”计算ROC,并绘制ROC曲线:

library(ROCR)
> pred_ob <- prediction(prop_test,test_data$chd) 
> perf_ob <- performance(pred_ob,x.measure="fpr",measure="tpr")
> plot(perf_ob,xlab="??????", ylab="??????",main="ROC曲线",xlim=c(0,1),ylim=c(0,1),col="red",type="l")
> abline(0,1)

 计算AUC值与 Kappa值

接下来,计算AUC的值,即ROC曲线下的面积,该数值往往越大越好,模型的 AUC 值为 0.7877604。AUC 值越接近 1,表示模型的预测性能越好;AUC 值越接近 0.5,表示模型的预测性能越差。

#(8)计算AUC
> auc_test <- performance(pred_ob,measure="auc") #AUC
> auc_test@y.values
[[1]]
[1] 0.7877604

 在绘制ROC曲线以及计算AUC的值之后,我们计算其Kappa值,

#(9)计算Kappa值
install.packages("vcd")
library(vcd)
install.packages("Kappa")
Kappa(table_test) 

 Kappa(table_test) 
            value    ASE     z  Pr(>|z|)
Unweighted 0.3613 0.0973 3.713 0.0002046
Weighted   0.3613 0.0973 3.713 0.0002046

根据上述结果,我们可以看到模型的 Kappa 值为 0.3613。这意味着模型的预测性能比随机分类器好,但并不是非常理想。Kappa 值越接近 1,表示模型的预测性能越好;Kappa 值越接近 0,表示模型的预测性能越差。

此外,我们还可以看到 Kappa 值的标准误(ASE)为 0.0973,z 值为 3.713,p 值为0.0002046。这些统计量可用于评估 Kappa 值的显著性。在这个例子中,p 值小于 0.05,表示 Kappa 值具有统计学意义。

总结

总之,我们使用南非心脏病数据集 SAheart 进行了逻辑回归分析,探究了多个预测变量对冠心病存在的影响。根据模型的评估结果,我们发现模型的预测性能比随机分类器好,但并不是非常理想。

在未来的研究中,我们可以尝试采取一些措施来优化模型,以提高其预测性能。例如,我们可以尝试添加更多有用的预测变量,或者使用特征选择方法来筛选最相关的预测变量。此外,还可以尝试使用其他分类算法(如支持向量机、随机森林等)来构建模型,并比较不同模型的预测性能。通过这些努力,我们希望能够构建一个更加准确、可靠的冠心病预测模型。


新人报道,还请各位大佬多多指教,内容如有不当之处,还请大佬多多指点,在评论区留下您宝贵的意见

如果您觉得文章质量还不错的话,希望点赞👍收藏📁评论📒

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值