R语言矩阵相关性计算及其可视化?
1. 矩阵相关性计算方法
base::cor/cor.test
R基础函数cor或cor.test都可计算相关性系数,但cor可直接计算矩阵的相关性,而cor.test不可。
两者计算非矩阵时,cor仅得到相关系数,而cor.test还能得到pvalue。
library(ggplot2)
cor(mtcars)
cor.test(mtcars) #error
cor.test(mtcars,mtcars) #error
cor(mtcars$mpg,mtcars$cyl) #only cor
x=cor.test(mtcars$mpg,mtcars$cyl) #cor and pvalue
x$estimate
x$p.value
可以用基础函数cor得到相关性矩阵,再自己编写脚本获得pvalue矩阵。
M = cor(mtcars)
#自编写函数得到pvalue矩阵
cor.mtest <- function(mat, ...) {
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat<- matrix(NA, n, n)
diag(p.mat) <- 0
for (i in 1:(n - 1)) {
for (j in (i + 1):n) {
tmp <- cor.test(mat[, i], mat[, j], ...)
p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
}
}
colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
p.mat
}
matrix_p=cor.mtest(mtcars)
psych::corr.test
使用psych包中的corr.test函数,可直接获得矩阵相关性系数和pvalue(也可用于非矩阵),而且还可直接得到矫正后的pvalue。
library(psych)
corr.test(mtcars)
cor <- corr.test(mtcars,
method = "pearson",
adjust = "fdr") #同p.adjust函数
cor$r
cor$p
cor$p.adj #但得到的是向量,数目也不对
test <- p.adjust(cor$p,method = "fdr")
identical(cor$p.adj,test) #不等
Hmisc::rcorr
使用Hmisc包中的rcorr函数,直接得到相关性系数和pvalue矩阵。
library(Hmisc)
#注意要将数据框转换为矩阵
cor.mat <- rcorr(as.matrix(mtcars), type = "pearson")
cor.mat$r
cor.mat$P
可视化时,pvalue矩阵对角线的显著性我们不必要展示,可以替换下。另外,如果后续不展示全部矩阵,只展示过了设置条件的部分,则可进行过滤。
# # only keep comparisons that have some abs. correlation >= .5 (optional)
# keep <- rownames(cor.mat$r)[rowSums(abs(cor.mat$r)>=0.5) > 1]
# cor.mat <- lapply(cor.mat, function(x) x[keep, keep])
# set diagonal to 1, since it is not interesting and should not be marked
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
另外,我们也可自己编写脚本得到:
flattenCorrMatrix <- function(cormat, pmat) {
ut <- upper.tri(cormat)
data.frame(
row = rownames(cormat)[row(cormat)[ut]],
column = rownames(cormat)[col(cormat)[ut]],
cor =(cormat)[ut],
p = pmat[ut]
)
}
res <- flattenCorrMatrix(cor.mat$r, cor.mat$P)
res
3. 可视化
得到了相关性和pvalue两个矩阵,我们一般以热图展示为好。
corrplot
经典的相关性展示工具。很多可选样式:https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html
我仅展示几个案例,更多参数自己调节。
#仅cor
corrplot.mixed(M)
#cor,仅0.05
corrplot.mixed(M,
insig = 'label_sig',
p.mat=matrix_p,
pch.cex = 0.9,
pch.col = 'grey20')
#细分
corrplot(M,
p.mat = matrix_p,
tl.pos = 'd',
order = 'hclust',
type = "upper",
#addrect = 2,
insig = 'label_sig',
sig.level = c(0.001, 0.01, 0.05),
pch.cex = 0.9,
pch.col = 'grey20')
gplots::heatmap.2
相对于上图,我更喜欢用热图来展示。
library(RColorBrewer)
library(gplots)
my_palette <- colorRampPalette(c("blue","white","red")) (100)
# plot heatmap and mark cells with abs(r) >= .5 and p < 0.05
heatmap.2(cor.mat$r,
# cexRow = .35, cexCol = .35,
trace = 'none',
# key.title = 'Spearman correlation',
# keysize = .5, key.par = list(cex=.4),
notecol = 'black', srtCol = 30,
col = my_palette,
cellnote = ifelse(cor.mat$P < 0.05 & abs(cor.mat$r)>=0.5, "*", ""))
以上我仅标出相关性绝对值大于0.5,pvalue<0.05的数据。当然可以做更细致划分。
pheatmap
pheatmap参数更好调些,看个人喜好。
#pheatmap
pheatmap(cor.mat$r,
color = my_palette,
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语言矩阵相关性计算及其可视化?的更多相关文章
- R语言做相关性分析
衡量随机变量相关性的方法主要有三种:pearson相关系数,spearman相关系数,kendall相关系数: 1. pearson相关系数,亦即皮尔逊相关系数 pearson相关系数用来 ...
- R语言矩阵matrix函数
矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...
- R语言的导数计算(转)
转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽 ...
- R语言矩阵维度“消失”的问题
矩阵(matrix)是R语言中很基础的一种数据结构,也是R语言使用者经常使用的一种数据结构.矩阵的维度一般为二维(m*n). R语言中矩阵的操作是非常简单易懂的,但是在对R语言做矩阵操作时,有个地方需 ...
- 用数据说话,R语言有哪七种可视化应用?
今天,随着数据量的不断增加,数据可视化成为将数字变成可用的信息的一个重要方式.R语言提供了一系列的已有函数和可调用的库,通过建立可视化的方式进行数据的呈现.在使用技术的方式实现可视化之前,我们可以先和 ...
- R语言矩阵
矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素. R创建矩阵的语法: matrix(data, nrow, ncol, byrow, dimnames) 参数说明: data - ...
- R 操作矩阵和计算SVD的基本操作记录
在R中可以用函数matrix()来创建一个矩阵,应用该函数时需要输入必要的参数值. > args(matrix) function (data = NA, nrow = 1, ncol = 1, ...
- R语言 vegan包计算物种累计曲线
vegan 包是进行群落数据分析最常用的R包,其中的 specaccum 函数用来计算物种的累计曲线 首先看下官方示例: library(vegan) data(BCI) sp1 <- spec ...
- R语言笔记005——计算描述性统计量
数据的分布特征: 分布的集中趋势,反应各数据向其中心值靠拢或聚集的程度(平均数,中位数,四分位数,众数) 分布的离散程度,反应各数据远离其中心值的趋势(极差,四分位差,方差,标准差,离散系数) 分布的 ...
随机推荐
- 【UE4 设计模式】设计模式一些概念
定义 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性. 四人帮 GOF ( Gang of Four ...
- 这样调优之后,单机也能扛下100W连接
1 模拟单机连接瓶颈 我们知道,通常启动一个服务端会绑定一个端口,例如8000端口,当然客户端连接端口是有限制的,除去最大端口65535和默认的1024端口及以下的端口,就只剩下1 024~65 53 ...
- segyio库的使用
最近在使用segyio库读取segy文件的时候默认读取总是出现问题,经过分析发现是我们通常所用的segy格式与本库的默认格式略有不同,修改参数就可以读取: 1) with segyio.open(fi ...
- 详解DNS域名解析系统(域名、域名服务器[根、顶级、授权/权限、本地]、域名解析过程[递归与迭代])
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105583806 学习课程:<2019王道考研计算机网络> 学习目的 ...
- createContext 你用对了吗?
目录 前言 性能问题的根源 问题1(整体重复渲染):Provider组件包裹的子组件全部渲染 问题2(局部重复渲染):使用useContext导致组件渲染 解决方案 解决问题1 解决问题2 参考 前言 ...
- SpringCloud微服务实战——搭建企业级开发框架(十一):集成OpenFeign用于微服务间调用
作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案.首先, ...
- Python NameError: name 'unicode' is not defined
Python2 的unicode 函数在 Python3 中被命名为 str.在 Python3 中使用 ·str 来代替 Python2 中的 unicode.
- 树形DP 枚举祖宗的例题
这类题目是真的很头疼....其实这类题目的特征也很明显,叶子结点贡献答案时和其所在链的祖宗有关,也就是说要想得知其贡献必须知道他的所有祖宗的贡献,其实处理方法也不是太难,就是在dfs枚举时顺便把祖宗的 ...
- STL 去重 unique
一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ...
- CSS学习笔记:定位属性position
目录 一.定位属性简介 二.各属性值的具体功能 1. relative 2. absolute 3. fixed 三.三种定位属性的效果总结 参考资料:https://www.bilibili.com ...