分享

30天学会R DAY19:ggplot2:组间比较如何标注P值

 妙趣横生统计学 2019-12-08

第19天 ggplot2数据可视化(2)数据组间比较绘图方法

在医学数据进行统计分析时,经常需要借助图形来表达均数、标准误、率、构成比、P值,标签等指标,本章将对医学数据组间比较绘图方法。

在进行绘图之前,我们先导入数据,并对数据进行前处理。

elder1<-read.csv("elder1.csv")

elder2<-read.csv("elder2.csv") #导入数据库

newdata<-merge(elder1,elder2, by="ID") #合并

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

newdata$sleep<-as.factor(newdata$sleep) #将分类变量转成因子

newdata<- na.omit(newdata) #剔除缺失数据

一、定量数据组间比较

医学数据中,最为常见的就是对两组或多组的定量、定性数据进行比较,结果的表达有均数±标准差,或者是中位数(四分位间距),这两种形式的结果可以分别用误差条图、箱式图进行表达。

1、正态分布数据比较(误差条图)

如果我们对不同性别的收缩压(SBP)进行分析,假设符合正态性和方差齐性,进行t检验后,可用误差条图表示各组间的均数,标准误,可信区间及P值。

在利用ggplot2进行之前,对数据的格式进行转化是非常重要,与其我们苦苦挣扎着在ggplot2里直接对原变量进行绘图,还不如把原变量数据进行转化生成新的变量,以适应ggplot2绘图功能。系统自带的dplyr包可以很好的帮助我们实现这一目的。

对数据格式进行转化

library(dplyr)  #加载dplyr包

by_sex<-group_by(newdata,sex)  #对性别进行分组

newdata1<-summarise(by_sex,n=n(),mean=mean(SBP),sd=sd(SBP)) #分别计算男女例数,均数,标准差

newdata1<-mutate(newdata1,se=sd/sqrt(n)) #对标准误进行计算

View(newdata1)

将原数据整理成绘图所需要的数据

下图就是绘制的不同性别收缩压的误差条图,有点难看,误差线太小,没办法,数据样本量大了,标准误自然就小了,看到的误差区间就很小,大家将就着看吧。

那么这个图要怎么绘制呢,我一步一步给大家讲解。

首先,我们先得加载ggplot2包,这个是必需的。

library(ggplot2) #加载ggplot2包

1)绘制不同性别血压值的条形图

ggplot(data = newdata1, aes(x = sex, y = mean,fill=sex)) + #x表示分组,y表示均数,fill表示对分组进行填充,如果不填,后面的scale_fill_ 就会运行不起来。

geom_bar(stat = "identity",width = 0.5) + #stat表示对原数据进行绘图,前期我们已经整理过了,所以不需要进行统计,width表示条形的宽度

scale_fill_manual(values = c("red","blue")) #根据自己的喜好选择颜色

2)绘制误差线

geom_errorbar(aes(ymax = mean + 1.96*se, ymin =mean -  1.96*se), width = 0.2) #ymax,ymin表示误差线的上限和下限,width表示误差线的宽度

3)绘制比较线条

geom_segment(aes(x=1, y=140, xend=1, yend=160))+

geom_segment(aes(x=2, y=140, xend=2, yend=160))+

geom_segment(aes(x=1, y=160, xend=2, yend=160)) #geom_segment 是在面版中绘制线段,比较线并不是一个图层,而是画了三线条而来的。

4)绘制P值

annotate("text", x=1.5, y=170, label="P>0.05", size=5) #P值就是作为标签画到面版上,x,y是P值所在的位置,label表示要画的标签,size表示标签的大小。

把这几步连接起来,完整的误差条图代码就是这样

ggplot(data = newdata1, aes(x = sex, y = mean,fill=sex)) +

 geom_bar(stat = "identity",width = 0.5) +

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

 geom_errorbar(aes(ymax = mean + 1.96*se, ymin =mean - 1.96*se),

      position = position_dodge(0.9), width = 0.2)+

 geom_segment(aes(x=1, y=140, xend=1, yend=160))+

 geom_segment(aes(x=2, y=140, xend=2, yend=160))+

 geom_segment(aes(x=1, y=160, xend=2, yend=160))+

 annotate("text", x=1.5, y=170, label="P>0.05", size=5)

2、偏态分布数据比较(箱式图)

如果我还是不同性别的收缩压(SBP)进行分析,假设SBP不符合正态性,进行秩和检验,可用箱式图表示各组间的中位数,上下四分位数。

利用原始数据绘制箱式图较为简单,不需要对原始数据进行转化。

1)绘制箱式图

ggplot(newdata, aes(x=sex, y=SBP))+ #x表示对不同组进行绘图,y 表示要分析的 变量

geom_boxplot(fill="red",outlier.shape=NA) #fill表示填充的颜色,两组颜色一致,如果在ggplot函数下,则两组颜色会不一致;outlier.shape表示是否要异常值

2) 绘制比较线和P值,误差条图已介绍,这里就不进行介绍了。

箱式图:完整的代码

ggplot(newdata, aes(x=sex, y=SBP))+

 geom_boxplot(fill="red",outlier.shape=NA)+

 geom_segment(aes(x=1, y=200, xend=1, yend=220))+

 geom_segment(aes(x=2, y=200, xend=2, yend=220))+

 geom_segment(aes(x=1, y=220, xend=2, yend=220))+

 annotate("text", x=1.5, y=230, label="P>0.05", size=5)

 

如果想要在箱式图里加上点,可以再加一个点的图层。

ggplot(newdata, aes(x=sex, y=SBP))+

 geom_boxplot(fill="red",outlier.shape=NA)+

 geom_segment(aes(x=1, y=200, xend=1, yend=220))+

 geom_segment(aes(x=2, y=200, xend=2, yend=220))+

 geom_segment(aes(x=1, y=220, xend=2, yend=220))+

 annotate("text", x=1.5, y=230, label="P>0.05", size=5)+

geom_jitter(size=0.5)

定量数据的组间比较,除了ggplot2本身的方法之外,还可以借助其他的工具,如ggpubr包来帮助标注P值,有兴趣可以自学。

二、定性数据组间比较

进行定性数据组间比较,会用到率或构成比两个指标,率一般用直条图表示,构成比用圆饼图表示。

1、不同组率之间的比较(直条图)

如果我要分析男女的失眠率进行比较分析,可用条形图将率反应出来,并将率标注在图形当中。

在进行绘图之前,还是要对原数据进行转化

by_sex<-group_by(newdata,sex)

newdata2<-summarise(by_sex,N=n(),n=mean(insomnia==1)) #当mean里面是逻辑符时,表示TRUE的比例,计算原始数据的失眠率

View(newdata2)

下图就是对不同性别失眠率的直条图

1)绘制不同性别的失眠率条形图

ggplot(newdata2, aes(x=sex, y=precent))+

geom_bar(stat = "identity",width = 0.5,fill="red")

2)在直条图中添加数字标签,保留小数点3位

geom_text(aes(label=round(precent,digits = 3)),colour="black",vjust=2) #label表示要绘制的标签,round对标签的小数点进行控制,colour表示标签的颜色,vjust表示标签的的位置。

直条图:完整的代码

ggplot(newdata2, aes(x=sex, y=precent))+

geom_bar(stat = "identity",width = 0.5,fill="red")+

 geom_text(aes(label=round(precent,digits = 4)),colour="black",vjust=2)

2、数据构成比的描述

如果我想要描述睡眠状况在老年人群中的分布情况,就可以利用到构成图,绘制也较简单,其中利用坐标系对直条图进行了转化

1)先绘制直条图,用不同颜色表标各部分所占的比例

ggplot(newdata, aes(x = "", fill = huji)) +

 geom_bar(width = 1) 

2)利用坐标第对坐标轴进行调整

coord_polar(theta = "y", start=0) #theta表示利用y的值,start表示从0开始

圆饼图:完整代码

ggplot(newdata, aes(x = "", fill = sleep)) +

 geom_bar(width = 1) +

 coord_polar(theta = "y", start=0)

以上就是在对数据进行比较分析的时候最常用的四种图型,后续将会给大家介绍重复测量数据,关联性数据绘图方法。

DAY19的内容就介绍到这里!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约