目录
数据集介绍
在开始之前,请让我们先来介绍一下所用的数据包:南非心脏病数据 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 进行了逻辑回归分析,探究了多个预测变量对冠心病存在的影响。根据模型的评估结果,我们发现模型的预测性能比随机分类器好,但并不是非常理想。
在未来的研究中,我们可以尝试采取一些措施来优化模型,以提高其预测性能。例如,我们可以尝试添加更多有用的预测变量,或者使用特征选择方法来筛选最相关的预测变量。此外,还可以尝试使用其他分类算法(如支持向量机、随机森林等)来构建模型,并比较不同模型的预测性能。通过这些努力,我们希望能够构建一个更加准确、可靠的冠心病预测模型。
新人报道,还请各位大佬多多指教,内容如有不当之处,还请大佬多多指点,在评论区留下您宝贵的意见❤
如果您觉得文章质量还不错的话,希望点赞👍收藏📁评论📒