数据分析 | 如何用医疗保险数据预测医疗护理质量

快放假了,这应该是年前最后一篇文章,提前祝大家新年快乐!

接着上次的课程,本周刷完了逻辑回归课程。选取一则医疗相关的案例进行分析,通过医疗保险数据来评估医疗护理的好坏。有兴趣的可以在公众号后台回复“quality”获取数据下载链接,一起参与分析。


还是先加载数据,看看数据的基本特征。

> quality<-read.csv("quality.csv")

> str(quality)

可以看出有14个变量和131名观测者。第一个变量MemberID表示观测者编号,从InpatientDays到AcuteDrugGapSmall均为自变量,分别为:InpatientDays(住院天数)、ERVisits(病人进急诊室的次数)、OfficeVisits(诊室看病的病人数量)、Narcotics(病人使用麻醉药品处方的数量)、DaysSinceLastERVisit(病人上一次到急诊室的时间至该研究结束的时间)、Pain(病人中抱怨疼痛的数量)、TotalVisits(病人来访任何医护人员的总次数)、ProviderCount(服务病人的服务者数量)、MedicalClaims(病人申请医疗理赔的天数)、ClaimLines(病人医疗理赔的所有次数)、StartedOnCombination(病人是否开始联合使用药物来治疗糖尿病)、AcuteDrugGapSmall(处方用完后迅速补充的急性药物的部分)。最后一个PoorCare为因变量(0表示病人受到了高质量的护理-goodcare;1表示病人受到了低质量的护理-PoorCare)。

我们使用OfficeVisits(来访病人的数量)和Narcotics(麻醉药品处方的数量)两个变量对因变量进行预测。

> table(quality$PoorCare)

0  1

98 33

先看看baseline model,有33人是PoorCare,98人是goodcare。所以,baseline model的准确率为98/(98+33)=0.748,用来和逻辑回归的模型进行对比。


由于这节课只给到一个数据集,故需要使用random.split()函数将数据分成training set 和testing set两部分。注意:此处需要安装caTools包。

> install.packages(“caTools”)

> library(caTools)

而random.split( )会将数据进行随机分配,为了便于教学,让所有的分析者得到同样的数据,需要设置相同的seed,即所有的分析者在set.seed( )函数中选取一个相同的数字(课程中填了88)。

> set.seed(88)

> split<-sample.split(quality$PoorCare,SplitRatio = 0.75)# 比例的设置范围一般在0.5-0.8,数据量多,则可以把Training set少分配,而Testing set多分配,以增加预测信度。

> split

返回TRUE表示抽取观测值放在Training set中,FALSE表示抽取观测值放在Testing set中。故需要创建两个数据集,然后建立回归模型。

> qualityTrain <- subset(quality, split == TRUE)

> qualityTest <- subset(quality, split == FALSE)

> qualityLog<-glm(PoorCare~OfficeVisits+Narcotics, data=qualityTrain,

family=binomial)

> summary(qualityLog)

上图的模型结果可以看出,和线性回归很相似。两个变量前的系数均为正数,且变量显著,表明这两个变量增加会对因变量产生正的效果,即更好的预测接收到PoorCare的情况。除此之外,最下面是AIC,主要用来将模型进行对比,从而检测模型的拟合度。

> predictTrain<-predict(qualityLog,type = "response")#告知预测函数给出概率

> summary(predictTrain)

> tapply(predictTrain, qualityTrain$PoorCare, mean)#对预测值按照训练数据集PoorCare的类别进行分类计算平均数

        0         1

0.1894512    0.4392246

对预测值按照训练数据集PoorCare的类别进行分类,并计算不同类别的概率平均数(1表示训练集是PoorCare,预测值也是PoorCare;0表示训练集是GoodCare,预测值是PoorCare)。预测PoorCare的概率要大于实际training set中PoorCare概率的值,表示是好事,可以提前进行干预。



逻辑回归的结果是概率值,一般情况下,我们想要二分变量的预测,比如这个病人接受到高质量的护理,还是低质量的护理,这时需要用到阈值t:

如果P(PoorCare)>t,预测为poor quality care;

如果P(PoorCare)


那么如何选取t值呢?

t值的选取和一类错误、二类错误有关,即不同的t值会对sensitivity和specificity造成不同的影响,所以选取t值需要根据具体情况而定。比如在这个案例中,主要目的是想提高对PoorCare的预测,那么可以适当降低t值,获得较高的sensitivity(True positive rate)。反之,如果想提高对goodcare的预测,可以适当提高t值,获得较高的specificity(True negative rate)。

(此处实际上就是信号检测论的基本原理,如果不是很明白,强烈建议观看该链接中的视频:https://www.youtube.com/watch?v=vtYDyGGeQyo)

> table(qualityTrain$PoorCare,predictTrain>0.2)#第二个参数表示预测值大于阈值0.2,则返回TRUE,反之,返回FALSE

   FALSE TRUE

  0    54   20

  1     9   16

因此,sensitivity1=16/(16+9)=0.64,specificity1=54/(54+20)=0.73


> table(qualityTrain$PoorCare,predictTrain>0.5)

    FALSE TRUE

  0    70    4

  1    15   10

sensitivity2=10/(10+15)=0.4,specificity2=70/(70+4)=0.99

我们可以看到,随着阈值t的增加,sensitivity会相应降低,而specificity会相应提高。


那么,阈值t要选取多少呢? 可以用ROC(接受者操作特性曲线)来综合判断。

> install.packages(“ROCR”)

> library(ROCR)

> ROCRperd<-prediction(predictTrain,qualityTrain$PoorCare)

> ROCRperf<-performance(ROCRperd,"tpr", "fpr")

> plot(ROCRperf,colorize=TRUE,print.cutoffs.at=seq(0,1,by=0.1),text.adj=c(-0.2,0.5))

如果想要较低的虚报率(图中横轴,表示1-specificity),那么就最大化命中率(图中的纵轴,表示sensitivity)的同时,保持较低的虚报率,比如使用(0.1,0.5)的阈值,接近0.3。反之亦然。

假如我们使用阈值0.3,此时对testing set进行预测。

> predictTest<-predict(QualityLog,newdata = qualityTest,type = "response")

> table(qualityTest$PoorCare,predictTest>0.3)

  FALSE TRUE

  0    19    5

  1     2    6

> as.numeric(performance(ROCRperd,"auc")@y.values) #计算AUC

[1] 0.7745946

计算出模型预测testing set样本的准确率为(19+6)/(19+5+2+6)= 0.78,预测的质量AUC=0.77。该模型可以识别大多数接受低质量护理的病人。



上一篇学的是线性模型,可以通过一系列连续变量来预测正态分布的结果变量。但实际情况中,很多结果变量并不是正态分布,比如:通过/失败,活着/死亡。这就需要用逻辑回归来做预测。

说实话,这个unit我看到更多的是理论,对于实际来说,逻辑回归的模型并不是很容易解释,比如模型的两个自变量相关系数都为正数,但如何解释对PoorCare和goodcare的影响?这难道就是“听过很多道理,依然过不好这一生”?

简单看了下Unit3,表示Trees可以更好的解释模型,那就拭目以待吧。



相关文章

数据分析 | 如何利用NBA数据去预测赛季得分

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 本系列文章面向深度学习研发者,希望通过Image Caption Generation,一个有意思的具体任务,深入...
    imGeek阅读 1,780评论 0 8
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,837评论 1 10
  • 昨天的开赛已经成为历史,心情由紧张到无助到平和,历史已经过去,其实收获也很多。 今天谈单了,真是赶鸭子上...
    FineYoga芸芸阅读 218评论 0 0
  • 有意图,有意向的构图,将一对元素,如柔软的草与僵硬的松塔相结合。 拍摄一个事物时把它放在对立的情景中,效果会很棒的...
    简单的颐阅读 657评论 0 0