当前位置: 首页 > article >正文

相关性分析和作图

相关的类型

1. PearsonSpearmanKendall相关
Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。(连续)
Spearman等级相关系数则衡量分级定序变量之间的相关程度。(分类)
Kendall’s Tau 相关系数也是一种非参数的等级相关度量。
cor() 函数可以计算这三种相关系数,而 cov() 函数可用来计算协方差。两个函数的参数有
很多,其中与相关系数的计算有关的参数可以简化为:
cor(x, y = NULL, use = "everything",
    method = c("pearson", "kendall", "spearman"))
states<-state.x77[,1:6]
cov(states)#协方差
cor <- cor(states)#相关性

1.计量资料 计量资料(measurement data)又称定量资料(quantitative data)或数值变量(numericalvariable)资料。为观测每个观察单位某项指标的大小而获得的资料。其变量值是定量的,表现为数值大小,一般有度量衡单位。根据其观测值取值是否连续,又可分为连续型(continuous)或离散型(discrete)两类。前者可在实数范围内任意取值,如身高、体重、血压等;后者只取整数值,如某医院每年的病死人数等。

2.计数资料 计数资料(cnumeration data)又称定性资料(qualitative data)或无序分类变量(unorderedcategorical variable)资料,亦称名义变量(nominal variable)资料。为将观察单位按某种属性或类别分组计数,分组汇总各组观察单位数后而得到的资料。其变量值是定性的,表现为互不相容的属性或类别,如试验结果的阳性阴性、家族史的有无等。分两种情形:

(1)二分类:如检查某小学学生大便中的蛔虫卵,以每个学生为观察单位,结果可报告为蛔虫卵阴性与阳性两类;如观察某药治疗某病患者的疗效,以每个患者为观察单位,结果可归纳为治愈与未愈两类。两类间相互对立,互不相容。

(2)多分类:如观察某人群的血型分布,以人为观察单位,结果可分为A型、B型、AB型与O型,为互不相容的四个类别。

3.等级资料 等级资料(ranked data)又称半定量资料(semi-quantitative data)或有序分类变量(ordinalcategorical variable)资料。为将观察单位按某种属性的不同程度分成等级后分组计数,分类汇总各组观察单位数后而得到的资料。其变量值具有半定量性质,表现为等级大小或属性程度。如观察某人群某血清反应,以人为观察单位,根据反应强度,结果可分一、±、+、++、+++、++++六级;又如观察用某药治疗某病患者的疗效,以每名患者为观察单位,结果可分为治愈、显效、好转、无效四级等。

2. 偏相关
偏相关 是指在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。你可以使用
ggm 包中的 pcor() 函数计算偏相关系数。
library(ggm)
pcor(c(1,5,2,3,6),cov(states))
[1] 0.3462724
在控制了收入、文盲率和高中毕业率的影响时,人口和谋杀率之间的相关系数为
0.346

pcor(c(1,5,2,3,6),cov(states))##控制了变量

相关性的显著性检验

cor.test()

可以使用cor.test()函数对单个的PearsonSpearmanKendall相 系数进行检验。简化后的使用格式为:

cor.test(x, y,
         alternative = c("two.sided", "less", "greater"),#指定进行双侧检验或单侧检验
         method = c("pearson", "kendall", "spearman"),#计算的相关类型
         exact = NULL, conf.level = 0.95, continuity = FALSE, ...)
当研究的假设为总体的相关系数小于 0 时,请使用alternative= "less" 。在研究的假设为总体的相关系数大于 0 时,应使用 alternative="greater"。在默认 情况下,假设为 alternative="two.side" (总体相关系数不等于 0 )。
cor.test(states[,3],states[,5])

Pearson's product-moment correlation
data:  states[, 3] and states[, 5]
t = 6.8479, df = 48, p-value = 1.258e-08
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5279280 0.8207295
sample estimates:
      cor 
0.7029752 
这段代码检验了预期寿命和谋杀率的 Pearson 相关系数为 0的原假设。及预期寿命和谋杀率存在相关性。
corr.test()更好
cor.test 每次只能检验一种相关关系。但幸运的是, psych包中提供的 corr.test() 函数可以一次做更多事情。 corr.test() 函数可以为 Pearson Spearman 或Kendall 相关计算相关矩阵和显著性水平。
library(psych)
res <-corr.test(states,use = "pairwise")
#"pairwise"或"complete" 分别表示对缺失值执行成对删除或行删除
corr <- res$r#可以查看相关性R值
corp <- res$p#可以查看P值
res$p.adj#可以查看FDR值
library(psych)
res <- corr.test(data, exp, use = 'pairwise', 
                 method = 'spearman', adjust = 'holm',#FDR值
                 alpha = 0.05)
res$p.adj#可以查看FDR值
res$r#可以查看相关性R值

相关性方法选择

正态分布Pearson

        直线相关(linear correlation)又称简单相关(simple correlation),用于双变量正态分布(bivariate normaldistribution)资料。直线相关的性质可由散点图直观的说明。

        相关系数(coefficient of correlation)又称Pearson积差相关系数(coefficient of product-momentcorrelation),以符号r表示样本相关系数,符号p表示其总体相关系数。它用来说明具有直线关系的两变量间相关的密切程度与相关方向。R²取值在0到1之间且无单位,其数值大小反映了回归贡献的相对程度,也就是在Y的总变异中回归关系所能解释的百分比。回归平方和越接近总平方和,则r绝对值越接近1,说明相关的实际效果越好。

 正态分布检测:t检验(连续变量)和卡方检验(分类变量)-CSDN博客


data <- iris##鸢尾花数据集
data1 <- data[,c(1,5)]
data2 <- data1[data1$Species=="setosa"|data1$Species=="versicolor",]
##提取鸢尾花数据集的部分数据进行分析

shapiro.test(data2$Sepal.Length)
#W = 0.96964, p-value = 0.02076 不符合正太分布
 
#密度图
ggdensity(data2$Sepal.Length, 
          main = "Density plot of sepal length",
          xlab = "sepal length")
#正态性测试对样本量敏感。小样本最常通过正态性测试。
#因此,重要的是将外观检查和显着性测试相结合以做出正确的决定
#综合分析也可以采用t检验

秩相关Spearman

        秩相关(rank correlation)或称等级相关,是用双变量等级数据作直线相关分析,这类方法对原变量分布不作要求,属于非参数统计方法。适用于下列资料:①不服从双变量正态分布而不宜作积差相关分析,这一点从原始数据的基本统计描述或直观的散点图中可以看出;②总体分布型未知,例如限于仪器测量精度个别样品的具体数值无法读出而出现“超限值”时(如X<0.001);③原始数据是用等级表示用等级相关系数r来说明两个变量间直线相关关系的密切程度与相关方向

相关性热图

corrplot包corrplot函数
数据处理:计算相关性系数和P值
rm(list = ls())
library(corrplot)
# 计算相关性
corData = cor(mtcars,
              method = "pearson",            # 计算相关性的方法有"pearson", "spearman", "kendall"
              use = "pairwise.complete.obs") # 缺失值处理的方式
# 计算相关性的P值和置信区间
testRes = cor.mtest(mtcars,
                    conf.level = 0.95,       # 置信区间
                    method = "pearson")      # 计算相关性的方法有"pearson", "spearman", "kendall"
corrp <- testRes$p

绘图:
#pdf("plot.pdf",width = 4,height = 4)##保存图片
# 绘图
?corrplot
corrplot(corData,
         method = "square",           # 图案形状 "square"方框,"circle"圆, "ellipse"椭圆, "number"数字, "shade"阴影花纹, "color"颜色方框, "pie饼图"
         type = "full",               # 绘制范围"full"全部, "lower"下半部分, "upper"半部分
         col=colorRampPalette(c('#0000ff','#ffffff','#ff0000'))(100), # 主体颜色
         bg = "white",                # 背景颜色
         # col.lim = c(-1,1),         # 数据颜色的范围,是相关性数据的话,直接is.corr = T就好
         title = "ABCD",             # 标题
         is.corr = T,                 # 输入相关性矩阵,数据范围-1到1
         add = F,                     # 是否在原来的图层上添加图形
         diag = T,                    # 是否显示主对角
         outline = "green",           # 轮廓,True或False或设置颜色
         mar = c(5, 4, 4, 2),         # bottom,left,top,right 指定的边距行数(需要一定的边距才能显示标题)
         addgrid.col = NA,          # 网格线的颜色,NA为不绘制,NULl为默认的灰色
         addCoefasPercent = F,        # 是否把相关性数值改为百分数
         order = "original",          # 排序方式 c("original", "AOE", "FPC", "hclust", "alphabet")
         hclust.method = c("complete", "ward", "ward.D", "ward.D2", "single", "average","mcquitty", "median", "centroid"),
         
         #position of text labels标签参数(好像没有缩短图例的参数)
         tl.pos = "lt",               # 位置'lt', 'ld', 'td', 'd' or 'n'   
         tl.cex = 1,                  # 字体的大小
         tl.col = "black",            # 字体的颜色
         tl.offset = 0.4,             # 标签离图案的距离
         tl.srt = 60,                 # 坐标轴标签旋转角度
         #color-legend;图例参数
         cl.pos = "r",                # 图例位置:r右边 b下边 n不显示
         cl.length = NULL,            # 数字越大,图例的分隔越稠
         cl.cex = 0.8,                # 图例的字体大小
         cl.ratio = 0.2,             # 图例的宽度
         cl.align.text = "c",         # 图例文字的对齐方式 l左对齐 c居中 r右对齐
         cl.offset = 1,             # 图例文字距离图例颜色条的距离 居中时无效
         #数值显示
         number.cex = 1,              # 相关性数字标签的字体大小
         number.font = 2,             # 相关性数字标签的字体
         number.digits = 2,           # 相关性数字标签,保留的小数点位数
         na.label = "",               # 当为NA时,显示的内容
         ## P值矩阵
         p.mat = testRes$p,           
         sig.level = 0.05,            # 当p大于sig.level时触发动作
         insig = "label_sig",         # sig.level, insig, pch, pch.col, pch.cex,label_sig(星号)
         
         #置信区间
         plotCI = "n",                # c("n", "square", "circle", "rect")
         lowCI.mat = testRes$lowCI,   # p值置信区间下边界数据
         uppCI.mat = testRes$uppCI,   # p值置信区间上边界数据
)

添加下三角:上下三角不一致

add = T,   diag = F,

#添加图形
corrplot(corData,
         method = "number",            
         type = "lower",   #下三角
         col=colorRampPalette(c('#0000ff','#ffffff','#ff0000'))(100), # 主体颜色
         add = T,                      # 是否在原来的图层上添加图形
         diag = F,                     # 是否显示主对角
         order = "original",          
         na.label = "",                # 当为NA时,显示的内容
         p.mat = testRes$p,            # P值矩阵
         sig.level = 0.05,             # 当p大于sig.level时触发动作
)
dev.off()

ggcorrplot包ggcorrplot函数
数据
rm(list = ls())
library(ggcorrplot)
library(ggtext)
data(mtcars)
corr <- round(cor(mtcars), 2)#相关系数(保留2位小数)
p.mat <- cor_pmat(mtcars)##P值
作图

(这个图例要小很多)

?ggcorrplot
ggcorrplot(corr, method = "square", #"square", "circle"
           type ="full" , #full完全(默认),lower下三角,upper上三角
           ggtheme = ggplot2::theme_minimal,
           title = "ABCD",
           show.legend = TRUE,  #是否显示图例。
           legend.title = "CorrA", #指定图例标题。
           show.diag =T ,    #对角线
           colors = c("blue", "white", "red"), #颜色设置
           outline.color = "white", #指定方形或圆形的边线颜色
           hc.order = FALSE,  #是否按hclust(层次聚类顺序)排列
           ##显示相关性系数设置
           lab =F , #是否添加相关系数
           lab_col = "black", #相关系数的颜色,只有当lab=TRUE时有效
           lab_size = 4, #指定相关系数大小,只有当lab=TRUE时有效。
           
           #P值显示
           p.mat = p.mat ,  #p.mat= p_mat,insig= "pch", pch.col= "red", pch.cex= 4,
           sig.level = 0.05,#P值
           insig = c("pch", "blank"),#显示X
           pch = 8, #8为星号
           pch.cex = 4, #大小
           #标签
           tl.cex = 10, #指定变量文本的大小,
           tl.col = "black", #指定变量文本的颜色,
           tl.srt = 45, #指定变量文本的旋转角度。
           digits = 2 #指定相关系数的显示小数位数(默认2)。
           
)
dev.off()

如果需要显示相关性系数:展示

##显示相关性系数设置
           lab =T , #是否添加相关系数
           lab_col = "black", #相关系数的颜色,只有当lab=TRUE时有效
           lab_size = 4, #指定相关系数大小,只有当lab=TRUE时有效。

计算矩阵后使用pheatmap作图

pheatmap作图可以更好的展示P值

数据准备
rm(list = ls())
library(ggcorrplot)
library(ggtext)
library(psych)
library(pheatmap)
library(reshape2)

data(mtcars)
corr <- round(cor(mtcars), 2)
p.mat <- cor_pmat(mtcars)
table(p.mat<0.05)#P计数

##对所有p值进行判断,p<0.01的以“**”标注,p值0.01<p<0.05的以“*”标注
if (!is.null(p.mat)){
  ssmt <- p.mat< 0.01
  p.mat[ssmt] <-'**'
  smt <- p.mat >0.01& p.mat <0.05
  p.mat[smt] <- '*'
  p.mat[!ssmt&!smt]<- ''
} else {
  p.mat <- F
}
作图
#自定义颜色范围
mycol<-colorRampPalette(c("blue","white","tomato"))(100)
#绘制热图,可根据个人需求调整对应参数
?pheatmap
pheatmap(corr,
         scale = "none",#均一化处理
         cluster_row = T, #行距类
         cluster_col = T, #列聚类
         treeheight_col = 0, #设置为0 即不显示聚类树
         treeheight_row = 20,#行聚类树
         border=NA,#边框颜色
         display_numbers = p.mat,##显著性标记
         fontsize_number = 12, 
         number_color = "white",
         cellwidth = 20, #格子宽度
         cellheight =20,#格子高度
         color=mycol,#颜色
         legend=T,#是否显示图例
         main="ABCD")#标题
dev.off()

参考:

1:医学统计学/孙振球,徐勇勇主编.—4版.一北京:人民卫生出版社,2014

2:R语言实战/(美)卡巴科弗(Kabacoff,R.I.)著;高涛,肖楠,陈钢译.--北京:人民邮电出版社,

2013.1

3:R语言---相关系数_r语言相关系数-CSDN博客


http://www.kler.cn/a/148276.html

相关文章:

  • 准确率调整研究中心
  • 鸿蒙学习基本概念
  • OpenGL ES 共享上下文实现多线程渲染
  • 结构体是否包含特定类型的成员变量
  • 使用elementUI实现表格行拖拽改变顺序,无需引入外部库
  • 【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
  • php高级工程师范文模板
  • 完美解决:Nginx访问PHP出现File not found.
  • 逆向扒cocosjs安卓包教程-破解加密的js源码
  • vue+elementUI的tabs与table表格联动固定与滚动位置
  • 【JUC】十二、CompletableFuture(上)
  • Java 之 lambda 表达式(二)---- Stream 操作 API
  • C语言—什么是数组名
  • 5种主流API网关技术选型,yyds!
  • Python基础语法之学习print()函数
  • JAVA 使用stream流将List中的对象某一属性创建新的List
  • ubuntu中root和普通用户切换方法
  • LeetCode Hot100 20.有效的括号
  • Android Frameworks 开发总结之七
  • UniApp 中的 u-input 属性讲解
  • 大数据-之LibrA数据库系统告警处理(ALM-37006 Coordinator进程异常)
  • python tkinter 使用(八)
  • C++之STL库:string类(用法列举和总结)
  • springboot项目修改项目名称
  • JVM的知识点
  • python:由深浅拷贝谈到变量值的核心区别