1. 矩阵相关性计算方法

base::cor/cor.test

R基础函数cor或cor.test都可计算相关性系数,但cor可直接计算矩阵的相关性,而cor.test不可。

两者计算非矩阵时,cor仅得到相关系数,而cor.test还能得到pvalue。

  1. library(ggplot2)
  2. cor(mtcars)
  3. cor.test(mtcars) #error
  4. cor.test(mtcars,mtcars) #error
  5. cor(mtcars$mpg,mtcars$cyl) #only cor
  6. x=cor.test(mtcars$mpg,mtcars$cyl) #cor and pvalue
  7. x$estimate
  8. x$p.value

可以用基础函数cor得到相关性矩阵,再自己编写脚本获得pvalue矩阵。

  1. M = cor(mtcars)
  2. #自编写函数得到pvalue矩阵
  3. cor.mtest <- function(mat, ...) {
  4. mat <- as.matrix(mat)
  5. n <- ncol(mat)
  6. p.mat<- matrix(NA, n, n)
  7. diag(p.mat) <- 0
  8. for (i in 1:(n - 1)) {
  9. for (j in (i + 1):n) {
  10. tmp <- cor.test(mat[, i], mat[, j], ...)
  11. p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
  12. }
  13. }
  14. colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
  15. p.mat
  16. }
  17. matrix_p=cor.mtest(mtcars)

psych::corr.test

使用psych包中的corr.test函数,可直接获得矩阵相关性系数和pvalue(也可用于非矩阵),而且还可直接得到矫正后的pvalue。

  1. library(psych)
  2. corr.test(mtcars)
  3. cor <- corr.test(mtcars,
  4. method = "pearson",
  5. adjust = "fdr") #同p.adjust函数
  6. cor$r
  7. cor$p
  8. cor$p.adj #但得到的是向量,数目也不对
  9. test <- p.adjust(cor$p,method = "fdr")
  10. identical(cor$p.adj,test) #不等







Hmisc::rcorr

使用Hmisc包中的rcorr函数,直接得到相关性系数和pvalue矩阵。

  1. library(Hmisc)
  2. #注意要将数据框转换为矩阵
  3. cor.mat <- rcorr(as.matrix(mtcars), type = "pearson")
  4. cor.mat$r
  5. cor.mat$P





可视化时,pvalue矩阵对角线的显著性我们不必要展示,可以替换下。另外,如果后续不展示全部矩阵,只展示过了设置条件的部分,则可进行过滤。

  1. # # only keep comparisons that have some abs. correlation >= .5 (optional)
  2. # keep <- rownames(cor.mat$r)[rowSums(abs(cor.mat$r)>=0.5) > 1]
  3. # cor.mat <- lapply(cor.mat, function(x) x[keep, keep])
  4. # set diagonal to 1, since it is not interesting and should not be marked
  5. diag(cor.mat$P) <- 1

其他工具

其他还有工具,如ggcor + ggcorrplot, 但不建议使用,增加学习成本,以上方法足以成对所有情况。

另外统计和绘图R包rstatix也可计算相关矩阵,显示和标记显著性水平,而且可以gather和spread相关性矩阵,可tidyverse语法类似。这个包值得好好学习:https://rpkgs.datanovia.com/rstatix/index.html

2. 相关性矩阵转化为两两相关

一般来说,我们得到的是相关性系数矩阵和pvalue矩阵,但输出数据时最好转换为两两之间的行列式格式。

这种转换以上的rstatix包可轻松解决。

请参考:https://rpkgs.datanovia.com/rstatix/reference/cor_reshape.html

另外,我们也可自己编写脚本得到:

  1. flattenCorrMatrix <- function(cormat, pmat) {
  2. ut <- upper.tri(cormat)
  3. data.frame(
  4. row = rownames(cormat)[row(cormat)[ut]],
  5. column = rownames(cormat)[col(cormat)[ut]],
  6. cor =(cormat)[ut],
  7. p = pmat[ut]
  8. )
  9. }
  10. res <- flattenCorrMatrix(cor.mat$r, cor.mat$P)
  11. res

3. 可视化

得到了相关性和pvalue两个矩阵,我们一般以热图展示为好。

corrplot

经典的相关性展示工具。很多可选样式:https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

我仅展示几个案例,更多参数自己调节。

  1. #仅cor
  2. corrplot.mixed(M)
  3. #cor,仅0.05
  4. corrplot.mixed(M,
  5. insig = 'label_sig',
  6. p.mat=matrix_p,
  7. pch.cex = 0.9,
  8. pch.col = 'grey20')
  9. #细分
  10. corrplot(M,
  11. p.mat = matrix_p,
  12. tl.pos = 'd',
  13. order = 'hclust',
  14. type = "upper",
  15. #addrect = 2,
  16. insig = 'label_sig',
  17. sig.level = c(0.001, 0.01, 0.05),
  18. pch.cex = 0.9,
  19. pch.col = 'grey20')





gplots::heatmap.2

相对于上图,我更喜欢用热图来展示。

  1. library(RColorBrewer)
  2. library(gplots)
  3. my_palette <- colorRampPalette(c("blue","white","red")) (100)
  4. # plot heatmap and mark cells with abs(r) >= .5 and p < 0.05
  5. heatmap.2(cor.mat$r,
  6. # cexRow = .35, cexCol = .35,
  7. trace = 'none',
  8. # key.title = 'Spearman correlation',
  9. # keysize = .5, key.par = list(cex=.4),
  10. notecol = 'black', srtCol = 30,
  11. col = my_palette,
  12. cellnote = ifelse(cor.mat$P < 0.05 & abs(cor.mat$r)>=0.5, "*", ""))



以上我仅标出相关性绝对值大于0.5,pvalue<0.05的数据。当然可以做更细致划分。

pheatmap

pheatmap参数更好调些,看个人喜好。

  1. #pheatmap
  2. pheatmap(cor.mat$r,
  3. color = my_palette,
  4. display_numbers = ifelse(cor.mat$P < 0.05 & abs(cor.mat$r)>=0.5, "*", ""))

Ref:

https://www.jianshu.com/p/b76f09aacd9c

https://chowdera.com/2020/12/20201218185101270B.html

https://stackoverflow.com/questions/66305232/r-how-to-plot-a-heatmap-that-shows-significant-correlations

http://www.sthda.com/english/wiki/correlation-matrix-an-r-function-to-do-all-you-need

http://www.sthda.com/english/wiki/correlation-matrix-a-quick-start-guide-to-analyze-format-and-visualize-a-correlation-matrix-using-r-software

R语言矩阵相关性计算及其可视化?的更多相关文章

  1. R语言做相关性分析

    衡量随机变量相关性的方法主要有三种:pearson相关系数,spearman相关系数,kendall相关系数: 1.       pearson相关系数,亦即皮尔逊相关系数 pearson相关系数用来 ...

  2. R语言矩阵matrix函数

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...

  3. R语言的导数计算(转)

    转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽 ...

  4. R语言矩阵维度“消失”的问题

    矩阵(matrix)是R语言中很基础的一种数据结构,也是R语言使用者经常使用的一种数据结构.矩阵的维度一般为二维(m*n). R语言中矩阵的操作是非常简单易懂的,但是在对R语言做矩阵操作时,有个地方需 ...

  5. 用数据说话,R语言有哪七种可视化应用?

    今天,随着数据量的不断增加,数据可视化成为将数字变成可用的信息的一个重要方式.R语言提供了一系列的已有函数和可调用的库,通过建立可视化的方式进行数据的呈现.在使用技术的方式实现可视化之前,我们可以先和 ...

  6. R语言矩阵

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素. R创建矩阵的语法: matrix(data, nrow, ncol, byrow, dimnames) 参数说明: data - ...

  7. R 操作矩阵和计算SVD的基本操作记录

    在R中可以用函数matrix()来创建一个矩阵,应用该函数时需要输入必要的参数值. > args(matrix) function (data = NA, nrow = 1, ncol = 1, ...

  8. R语言 vegan包计算物种累计曲线

    vegan 包是进行群落数据分析最常用的R包,其中的 specaccum 函数用来计算物种的累计曲线 首先看下官方示例: library(vegan) data(BCI) sp1 <- spec ...

  9. R语言笔记005——计算描述性统计量

    数据的分布特征: 分布的集中趋势,反应各数据向其中心值靠拢或聚集的程度(平均数,中位数,四分位数,众数) 分布的离散程度,反应各数据远离其中心值的趋势(极差,四分位差,方差,标准差,离散系数) 分布的 ...

随机推荐

  1. 代码混淆保安全「GitHub 热点速览 v.21.43」

    作者:HelloGitHub-小鱼干 虽然让代码难以阅读看似是件难以理解的事情,但是混淆后的代码起到了类似加密的作用,而且经过混淆的代码依旧能实现原代码的功能.javascript-obfuscato ...

  2. QQ消算轰炸,我好无聊真的

    from pynput.keyboard import Key,Controller import time from random import choice time.sleep(5) # 创建键 ...

  3. Spring 5 MVC 中的 Router Function 使用

    Spring 5 发行已经好几年了,里面提出了好几个新点子.其中一个就是 RouterFunction,这是个什么东西呢? Spring框架给我们提供了两种http端点暴露方式来隐藏servlet原理 ...

  4. Seata整合SpringBoot和Mybatis

    Seata整合SpringBoot和Mybatis 一.背景 二.实现功能 三.每个服务使用到的技术 1.账户服务 2.订单服务 四.服务实现 1.账户服务实现 1.引入jar包 2.项目配置 3.建 ...

  5. 单片机STM32的启动文件详解--学习笔记

    启动文件简介 启动文件由汇编编写,是系统上电复位后第一个执行的程序.主要做了以下工作: 1.初始化堆栈指针SP=_initial_sp 2.初始化PC 指针=Reset_Handler 3.初始化中断 ...

  6. 字符串匹配(kmp+trie+aho-corasic automaton+fail tree)

    目录 kmp 那么怎么快速求最长前缀后缀呢 trie aho-corasic automaton fail tree kmp 对于一个字符串\(s_{0\dots n}\),称\(s_{0\dots ...

  7. TCP/IP简述

    一.TCP/IP简述 TCP/IP从字面异议看起来是指TCP和IP两种协议,实际上,它只是利用IP进行通信时必须用到的协议群的统称.具体的来说,IP或ICMP.TCP或UDP.Telnet或FTP.以 ...

  8. Xpath运算符

    5.position定位 >>print tree.xpath('//*[@id="testid"]/ol/li[position()=2]/text()')[0] & ...

  9. vim实用插件

    转载:Vim 实用插件推荐(2017) - 知乎 (zhihu.com) 1.插件管理器 ----------------------------------------- Vundle.vim - ...

  10. 第36篇-return字节码指令

    方法返回的字节码相关指令如下表所示. 0xac ireturn 从当前方法返回int 0xad lreturn 从当前方法返回long 0xae freturn 从当前方法返回float 0xaf d ...