R绘制logistic回归限制性立方样条图

R绘制logistic回归限制性立方样条图


限制性立方样条用于研究X和y的非线性关系,通常的结果是一条曲线。通过曲线可以判断转折点。

限制性立方样条包括线性模型、logistic模型、Cox回归模型三种情况,今天介绍基于logistic回归模型的限制性立方样条图

变量要求:x为连续性变量,y为2分类变量。

今天展示的是BMI对心血管风险的影响,

自变量 : BMI    

因变量 :  心血管                  

协变量:地区、sex、age

老规矩,直接看数据形式和最终的效果图:

数据情况:这里展示前几行

结果图:

数据用的其实就是原始数据,下面直接说明怎么绘制吧!!

同样,注意两个##的地方代码就是需要更改的地方

 

.libPaths()#查看R包位置

##这里改成自己电脑的路径

setwd("C:/Users/12974/Desktop/百度经验/简书/R绘制限制性立方样条图")#设置工作空间

getwd()#加载工作空间

 

#包安装

install.packages("foreign")

install.packages("ggplot2")

install.packages("rms")

install.packages("survival")

install.packages("Hmisc")

install.packages("splines")

#批量包加载

ps <- c("foreign","ggplot2","rms","survival","Hmisc","splines")

for(i in ps){library(i, character.only = T)}; rm(i)

 

 

#导入数据

mydata <- read.csv("cc1.csv",as.is = TRUE,header = T,sep = ",", fileEncoding='utf-8')

names(mydata)#查看所有变量名字

attach(mydata)

 

#变量因子化,意思就是把分类变量变为真正的分类变量

##地区、sex需要

mydata$地区<-as.factor(mydata$地区)

mydata$sex<-as.factor(mydata$sex)

mydata$心血管<-as.factor(mydata$心血管)

##设置分类变量的参照组

mydata$地区<-relevel(mydata$地区, ref="1")

mydata$sex<-relevel(mydata$sex, ref="1")

mydata$心血管<-relevel(mydata$心血管, ref="0")

#注意:这里我说明一下,结局变量心血管:值是1/0;

#其实不设置R默认以“0“为参照

 

#接着为后续程序设定数据环境,也就是打包数据,这一步在预测模型中也常做

dd <- datadist(mydata)

options(datadist='dd')

 

#拟合logistic回归的限制性立方样条

##(心血管 为y,bmi 为x ,3是拟合曲线的时候采用三个节点)

##后面的+地区+sex+age 是一些协变量

fit<-lrm(心血管~rcs(bmi,3)+地区+sex+age,data=mydata)

#这里先看看结果

fit

##########图片1

#可以看到,地区展示了地区=2和地区=3的结果,因为前面我们设置地区参照组是 1

#性别展示sex=2的结果,因为前面我们设置sex参照组是 1

 

##由于限制性立方样条推荐拟合3~5个节点,这里分别拟合3个模型

fit3<-lrm(心血管~rcs(bmi,3)+地区+sex+age,data=mydata)

fit4<-lrm(心血管~rcs(bmi,4)+地区+sex+age,data=mydata)#模型出错

fit5<-lrm(心血管~rcs(bmi,5)+地区+sex+age,data=mydata)#模型出错

#然后查看AIC,选择AIC最小的

AIC(fit3)

AIC(fit4)

AIC(fit5)

#由于上面模型出现

Warning message:

In lrm(心血管 ~ rcs(bmi, 5) + 地区 + sex + age, data = mydata) :

  Unable to fit model using “lrm.fit”

#这样的错误,后面我猜测应该是bmi对心血管影响只有1个转折点,所以4和5个节点无法拟合

#这个也是我猜的,有大神的话,评论区可以留言

 

#最后我选择fit3,3个节点

fit<-update(fit3)#更新模型

 

#使用anova()可以看p值,这里是为后续图上放 卡方值和P值 做准备

an<-anova(fit)

#这个结果主要是看bmi对心血管非线性关系的p值,可以发现二者存在非线性关系,如下图

an

########图片2

##生成预测值,并作图 (exp相当于把预测值转换成了OR)

plot(Predict(fit, bmi,fun=exp), anova=an, pval=T)

OR<-Predict(fit, bmi,fun=exp,ref.zero = TRUE)

 

#ggplot画图

ggplot(OR,anova=an, pval=T)

#进一步美化

#anova=an, pval=T:增加卡方值和P值

p1<-ggplot(anova=an, pval=T)+

#画曲线

  geom_line(data=OR, aes(bmi,yhat),linetype=1,size=1,alpha = 0.9,colour="red")+

#画置信区间

  geom_ribbon(data=OR, aes(bmi,ymin = lower, ymax = upper),alpha = 0.3,fill="red")+

#x轴任意刻度:增加一条竖线

  geom_vline(aes(xintercept=23.9), colour="#BB0000", linetype="dashed")+

#y轴任意刻度:增加一条横线

  geom_hline(yintercept=1, linetype=2,size=1)+

#去除背景

  theme_classic()+

#增加标签

  labs(title = "RCS", x="bmi", y="OR (95%CI)")+

#x轴范围

  scale_x_continuous(limits = c(10, 50),

#x轴刻度

                   breaks = c(10,15,20,25,30,35,40,45,50))+

#y轴范围

  scale_y_continuous(limits = c(0, 1.5),

#y轴刻度

                     breaks = c(0,0.5,1,1.5,2,2.5,3))+

#手动给图上增加标签

  geom_text(aes(x=15,y=1,label='bmi=23.9'),

            vjust=1.5,hjust=0,size=2.5)

 

p1

########结果图1

#结果解释:

随着bmi增加,心血管风险增加,当BMI>23.9,心血管风险变化不大;

由于是模拟的数据,可能和实际不符,这里仅供参考

 

 

#那么接下来,绘制性别分层的图

##计算不同性别的OR值

OR1 <- Predict(fit, bmi, sex=c('1','2'),

               fun=exp,type="predictions",

               ref.zero=TRUE,conf.int = 0.95,digits=2)

 

#美化

p2<-ggplot()+

#画曲线,多color = sex

  geom_line(data=OR1, aes(bmi,yhat, color = sex),

            linetype="solid",size=1,alpha = 0.9)+

#画置信区间,多color = sex

  geom_ribbon(data=OR1,

              aes(bmi,ymin = lower, ymax = upper,fill = sex),

              alpha = 0.2)+

#两条线的颜色

  scale_color_manual(values = c('red','blue'))+

#两个置信区间的颜色

  scale_fill_manual(values = c("red","blue"))+

#x轴任意刻度:增加一条竖线

  geom_vline(aes(xintercept=23.9), colour="#BB0000", linetype="dashed")+

#x轴任意刻度:再增加一条竖线

  geom_vline(aes(xintercept=26), colour="#BB0000", linetype="dashed")+

#y轴任意刻度:增加一条横线

  geom_hline(yintercept=1, linetype=2,size=1)+

#去除背景

  theme_classic()+

#增加标签

  labs(title = "RCS", x="bmi", y="OR (95%CI)")+

#x轴范围

  scale_x_continuous(limits = c(10, 50),

#x轴刻度

                     breaks = c(10,15,20,25,30,35,40,45,50))+

#y轴范围

  scale_y_continuous(limits = c(0, 1.5),

#y轴刻度

                     breaks = c(0,0.5,1,1.5,2,2.5,3))+

#手动给图上增加标签

  geom_text(aes(x=15,y=1,label='bmi=23.9'),

            vjust=1.5,hjust=0,size=2.5)+

#手动给图上增加标签

  geom_text(aes(x=27,y=0.9,label='bmi=23.9'),

            vjust=1.5,hjust=0,size=2.5)

p2

########结果图2

#可以看到男性和女性的结果与前面基本一致

 

 

#最后导出图片

ggsave(filename = "结果1.png",#命名

plot=p1,#哪张图

path = "C:/Users/12974/Desktop/百度经验/简书/R绘制限制性立方样条图",

#保存路径

       units="px",

width = 1200,#宽度

height = 800 #高度

)

 

ggsave(filename = "结果2.png",#命名

plot=p2,#哪张图

path = "C:/Users/12974/Desktop/百度经验/简书/R绘制限制性立方样条图",

#保存路径

       units="px",

width = 1200,#宽度

height = 800 #高度

)

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

推荐阅读更多精彩内容