广义线性模型二(Generalized Linear Models,GLM)

在上一篇广义线性模型一(Generalized Linear Models,GLM) - 简书 (jianshu.com),我们大致了解了glm的应用范围,并从三个方面探索模型构建:

1、如何使用glm构建logistics回归
2、如何提取模型中的参数
3、不同模型之间如何比较

接下来,我们继续从四个方面谈一谈logistics回归:

1、模型可视化(列线图)
2、使用构建的模型预测结局
3、评价模型的效能
区分度(discrimination ability):C指数、ROC曲线、NRI、IDI
一致性(calibration ability):校准曲线
4、临床效能分析(Decision Curve Analysis):DCA, 生存曲线

【参考】rms.pdf (r-project.org)


以上四个方面并不能完全分开来讲,因此我将可以使用同一R代码的部分一起讲解,如下:列线图的构建和校准曲线、DCA放在一起,预测结局变量及ROC放在一起。

一、列线图及校准曲线

在上一篇文章中,构建logistic回归我们使用了glm()函数,构建方式如下:
fit.reduced <- glm(ynaffair ~ age + yearsmarried + religiousness + rating, data=Affairs, family=binomial())
当我们要对其进行可视化时,就像我在cox回归模型的展示中说的,想要使用rms绘制列线图,就只能使用rms来构建模型

survival包和rms包都生成原材料比如都养猪,同时rms还做香肠,rms还只用自己家的猪。害,所以没办法,你家猪再优质,想吃香肠就只能去找rms包
survival包学习笔记——cox回归(一) - 简书 (jianshu.com)

列线图

继续上一篇构建的模型,我们来绘制列线图

library(rms)
ddist <- datadist(Affairs)
options(datadist='ddist')
fit.reduced1 <- lrm(ynaffair ~ age + yearsmarried + religiousness + 
                      rating, data=Affairs,x = T,y = T)
summary(fit.reduced1 )
nomo <- nomogram(fit.reduced1,
                 lp = F,                                #是否为线性
                 fun = plogis,                          #系数转换的具体过程
                 fun.at = c(0.1,0.2,0.3,0.5,0.7,0.9),   #最后一行的分段
                 funlabel = "离婚率" )                   #最后一行的名字
plot(nomo)

image.png

这里我们每次使用只需要更改数据集的名字即可啦!


校准曲线

一致性分析:校准曲线

首先绘制校准曲线,校准曲线所依赖的模型是上步rms::lrm()构建的模型,因此绘制完列线图可以直接绘制校准曲线。

library(rms)
ddist <- datadist(Affairs)
options(datadist='ddist')
fit.reduced1 <- lrm(ynaffair ~ age + yearsmarried + religiousness + 
                      rating, data=Affairs,x = T,y = T)
summary(fit.reduced1 )


calb <- calibrate(fit.reduced1, 
                  cmethod='hare',    #logistic回归使用的方法
                  method='boot',    #使用抽样的办法,抽样1000次
                  B=1000)
plot(calb,xlim=c(0,1.0),ylim=c(0,1.0))

image.png

二、模型预测及ROC曲线绘制

模型已经拟合好了,那么他是否可以根据我们的变量来预测结局呢?

结局预测

那是当然,使用函数predict

S3 method for class 'glm'

predict(object, newdata = NULL, type = c("link", "response", "terms"), se.fit = FALSE, dispersion = NULL, terms = NULL, na.action = na.pass, ...)

S3 method for class 'lm'

predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf, interval = c("none", "confidence", "prediction"), level = 0.95, type = c("response", "terms"), terms = NULL, na.action = na.pass, pred.var = res.var/weights, weights = 1, ...)

参数介绍

fit: 这里fit就是刚刚拟合的函数,
newdata: 可以是多种多样的
1、可以是原来的数据,预测后可以用来绘制ROC曲线
2、可以是新的数据,来计算敏感性、特异性
3、可以是自己生成的数据,来展示某一变量的影响情况
type: 预测数据的类型
1、response,fit是线性模型时,返回值是规范化后的连续值; fit是二分类模型时,返回值是发生结局变量的可能性(probabilities)
2、term: 返回一个矩阵,里面包含这个模型中的每个参数项的预测值,每一项之和或者其他运算得到返回值(formular中的y值)

实战

这三个参数,已经够我们使用的了,接下来我们实战看一下

library(rms)
library(xlsx)
library(tidyverse)

fit <- glm(HPD与否~.,data = data,family = binomial())
summary(fit)
image
a <- predict(fit,newdata = data,type = "terms",se.fit = T)
b <- predict(fit,newdata = data,type = "response")
type="terms"

term="response"

计算C指数及ROC曲线绘制

区分度——C指数

rms包计算C指数

library(rms)
ddist <- datadist(Affairs)  #将数据组装
options(datadist='ddist')
fit.reduced1 <- lrm(ynaffair ~ age + yearsmarried + religiousness + 
                      rating, data=Affairs,x = T,y = T)
 #相对于基础包中的glm,这里多了 x 和 y 参数
fit.reduced1 
image.png

ROCR包绘制ROC曲线

这里使用ROCR必须依赖rms得到的fit,同列线图

library(rms)
ddist <- datadist(Affairs)  #将数据组装
options(datadist='ddist')
fit.reduced1 <- lrm(ynaffair ~ age + yearsmarried + religiousness + 
                      rating, data=Affairs,x = T,y = T)


Affairs$predvalue<-predict(fit.reduced1)
#这里已经在前文中包装了相关的数据,所以无需赋值newdata,type
library(ROCR)
pred <- prediction(Affairs$predvalue, Affairs$ynaffair) 
 #结局变量必须是二分类变量(0,1),否则结果会报错
perf<- performance(pred,"tpr","fpr")
plot(perf)
abline(0,1)
auc <- performance(pred,"auc")
auc@y.values #auc即是C-statistics
perf
AUC
ROC

ROCR得到perf后,使用plot(perf)绘制的ROC曲线较简单,接下来我们使用pROC优化ROC曲线

pROC包

输入变量只需要predict得到的预测值和准确值

library(pROC)
pdf(file = 'roc.pdf',width = 5,height = 5)
plot.roc(Affairs$ynaffair~Affairs$predvalue,    #输入变量,实际变量~预测变量
         data = Affairs,
         axes=T, ## 是否显示xy轴
         legacy.axes=T, ## TRUE为1-specificity,FLASE为specificity
         main="ROC for HPD与否", ## Title
         
         col= "black", ## 曲线颜色
         lty=1, ## 曲线形状
         lwd=3, ## 曲线粗细
         identity=T, ## 是否显示对角线
         identity.col="black", ## 对角线颜色
         identity.lty=2, ## 对角线形状
         identity.lwd=2, ## 对角线粗细
         
         print.thres=TRUE, ## 是否输出cut-off值
         print.thres.best.method="youden",
         print.thres.pch=20, ## cut-off点的形状
         print.thres.col="black", ## cut-off点和文本的颜色
         print.thres.cex=1.2, ## 文本放大的倍数(比起原始值) 
         #print.thres.pattern="%.3f", ## cut-off文本的格式
         #print.thres.pattern.cex=1.2,
         
         print.auc=T, ## 是否显示AUC
         ci=T, ## 是否显示CI
         print.auc.pattern="AUC = 0.704", ## 展示AUC的格式
         print.auc.x=0.4, ## AUC值的X位置
         print.auc.y=0.15, ## AUC值的Y位置
         print.auc.cex=1.2, ## AUC值的放大倍数
         print.auc.col='black', ## ACU值的颜色
         auc.polygon=TRUE, ## 是否将ROC下面积上色
         auc.polygon.col='white', 
         auc.polygon.density=NULL,
         auc.polygon.lty=2,
         auc.polygon.angle=45,
         auc.polygon.border='black',
         
         max.auc.polygon=TRUE,
         max.auc.polygon.col='white',
         max.auc.polygon.lty=2
)
dev.off()
ROC曲线

最后

由于篇幅的问题,剩余的内容继续在下一篇中分享

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

推荐阅读更多精彩内容