Advertisement

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

阅读量:

目录

数据集介绍

导入数据,相关变量解释

进行逻辑回归

计算相关指标值

绘制ROC曲线

计算AUC值与 Kappa值

总结


数据集介绍

在开始之前,请介绍所使用的数据集:南非心脏病数据SAheart包

SAheart属于R语言中的一个软件包,在其内部整合了南非心脏病相关数据。该数据库则涵盖了南非人口样本的心脏病相关信息。

南非心脏病数据集(South African Heart Disease Data)汇编了一组关于心脏病危险因子的数据。其中包含来自五个县内的462个样本信息,并详细记录了每个样本的年龄特征及其相关的身体指标如体重指数、血压和胆固醇水平等。这项研究旨在探讨这些危险因子与其相关的心脏病之间的联系。

通过对这些数据进行分析研究,能够深入探讨不同变量与心脏病之间的关联性关系,并开发出一个能够判断一个人是否患有心脏病的预测模型.这个数据集在心脏病研究领域以及统计学习领域内均具有广泛的适用性和重要性.

导入数据,相关变量解释

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

首先分析数据中的各个变量及其含义:

掌握了各变量的具体意义后,在开展回归分析前,在开展回归分析前,在进行回归建模之前,在进行统计建模之前,在建立预测模型之前,在构建数据分析模型之前,在准备数据分析工作时

复制代码
 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

上述结果呈现了各变量的最低限度、25%分位数、中间位置的数值以及最高限度,并报告了其估算结果、标准误、Z得分以及P值;依据P值分析显示,在α=0.05水平下,tobacco、ldl、famhistPresent 以及age 四个变量具有统计学意义。

长期吸烟习惯 (tobacco)、LDL胆固醇水平 (ldl)、高血压家族病史 (famhistPresent)、A型行为倾向 (typea) 和 年龄 (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%,回归方程效果一般。

计算相关指标值

改写说明

复制代码
 #计算边际效应

    
 > 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

随着累积烟草使用量的每增加一个单位,患冠心病的风险将相应提升 0.01715倍;每升高一个单位的低密度脂蛋白胆固醇,患冠心病的风险相应上升 0.03073倍;而从无到有时的心脏病家族史,则会使患冠心病的风险提高约 14.36%。

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

同样,我们利用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% 被准确归类为无冠心病的情况

召回比例达到64.29%,即在所有被预测为冠心病患者的所有样本中,约有64.29%的实际病例。

绘制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曲线下方区域的面积, 其数值越大通常表示模型性能越优, 模型的具体计算结果为0.7877604。其值越接近1则表明模型预测能力越强, 而当其值靠近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 时, 表明模型在类别划分上表现完美; 而当其数值趋近于 0 则表明该模型仅能与其目标进行随机猜测相当甚至出现负面效果

此外还可以观察到 Kappa 值的标准误(standard error, ASE)为 0.0973 z 值为 3.713 p 值等于 0.0002046 这些统计量可用于检验 Kappa 值的显著性 在此例中 p 值小于 0.05 表明 Kappa 值具有统计学意义

总结

综上所述,在南非心脏病数据集 SAheart 的基础上进行了逻辑回归分析,并深入探讨了多个预测变量对其存在情况的影响。通过模型评估结果表明:该模型在预测方面表现出了显著的优势,并且整体表现仍需进一步优化以达到最佳效果

在未来的深入研究中 我们可能需要探索一些策略以提升模型的表现 从而增强其预测能力 例如 我们可能需要引入更多相关且有帮助的预估指标 或者采用特征选择的方法来精炼出最具代表性的预估指标 此外 我们还可以考虑运用不同的分类算法(例如支持向量机 随机森林等)来进行模型开发 并对各类型别进行效果评估 通过以上种种努力 我们期望能够建立起一个更为精准 可靠的心脏病诊断模式


本人初来乍到,请各位大神不吝赐教。文中可能存在不足之处,请各位多包涵。十分感谢各位不吝赐教。期待您的中肯建议和宝贵意见❤️

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

全部评论 (0)

还没有任何评论哟~