如何仅从 R 中的特定列对中提取显着相关性?
Posted
技术标签:
【中文标题】如何仅从 R 中的特定列对中提取显着相关性?【英文标题】:How to extract only significant correlations from specific column pairs in R? 【发布时间】:2022-01-22 22:46:03 【问题描述】:我需要计算一些特定变量(列)的相关性。
要计算我通过这段代码得到的特定列的相关性:
df<-read.csv("http://renatabrandt.github.io/EBC2015/data/varechem.csv", row.names=1)
cor_df<-(cor(df, method="spearman")[1:6, 7:14])%>%as.data.frame()
输出
但是我希望 R 创建一个新矩阵,但仅具有具有显着性水平的相关性,其 p 值 [1:6, 7:14],也就是说排除那些不显着的(p-值 >0.05)
我希望删除不重要的那些,或者用 NA 填充,或者只包含能指的新 data.frame。
我的期望是:
【问题讨论】:
(1) 请提供样本数据。 (2) 即使相关性不显着,矩阵也必须有空间容纳一对,您是否期望NA
s 用于不重要的对?请提供您的预期输出。
我添加了原始的df。是的,我想生成一个只有显着相关性的输出(一个新的 data.frame)。
请不要发布代码/数据/错误的图像:它会破坏屏幕阅读器并且无法复制或搜索(参考:meta.***.com/a/285557 和 xkcd.com/2116)。请直接包含代码、控制台输出或数据(例如,data.frame(...)
或来自dput(head(x))
的输出)。
(我很抱歉,也许我的第一条评论应该说“可用示例数据,拜托”。我不会试图刮数据图像中的数据,并且您最容易在 R 控制台中获得它。)
嗨@wesleysc352,请在下面找到一种可能的解决方案。希望它能满足您的需求。干杯。
【参考方案1】:
请在下面使用Hmisc
、corrplot
和dplyr
库找到一种可能的解决方案
Reprex
使用Hmisc
库的rcorr()
函数计算相关系数和相应的p 值
library(Hmisc)
library(corrplot)
library(dplyr)
coeffs <- rcorr(as.matrix(df), type="spearman")[[1]][1:6, 7:14]
coeffs
#> Al Fe Mn Zn Mo Baresoil
#> N -0.151805133 -0.1295934 -0.01261144 -0.07526648 0.004643575 0.15481627
#> P -0.001739509 -0.1200000 0.60782609 0.73423234 0.035371924 0.03043478
#> K 0.006089604 -0.1156773 0.67579910 0.74244074 -0.039359822 0.18264841
#> Ca -0.289628187 -0.3982609 0.63130435 0.68638545 -0.175533171 0.27739130
#> Mg -0.187866932 -0.2382609 0.57043478 0.60069601 -0.118938093 0.29739130
#> S 0.320574163 0.1117634 0.51402480 0.77789865 0.334337367 0.07784301
#> Humdepth pH
#> N 0.1307120 -0.07186484
#> P 0.2102302 -0.12114884
#> K 0.2963972 -0.31001388
#> Ca 0.4396914 -0.25114066
#> Mg 0.4912655 -0.33161178
#> S 0.1698382 -0.21448892
pvalues <- rcorr(as.matrix(df), type="spearman")[[3]][1:6, 7:14]
pvalues
#> Al Fe Mn Zn Mo Baresoil
#> N 0.4788771 0.54615126 0.9533606683 7.266830e-01 0.9828194 0.4700940
#> P 0.9935636 0.57648987 0.0016290786 4.418653e-05 0.8696630 0.8877339
#> K 0.9774704 0.59039698 0.0002896520 3.264276e-05 0.8551122 0.3929703
#> Ca 0.1698232 0.05391473 0.0009388912 2.126270e-04 0.4119734 0.1894124
#> Mg 0.3793530 0.26221751 0.0036070461 1.909894e-03 0.5798929 0.1581543
#> S 0.1266908 0.60311127 0.0101838168 7.669395e-06 0.1103062 0.7176938
#> Humdepth pH
#> N 0.54266218 0.7386046
#> P 0.32412825 0.5728181
#> K 0.15961613 0.1404062
#> Ca 0.03156073 0.2365150
#> Mg 0.01477451 0.1134202
#> S 0.42754109 0.3141949
使用corrplot()
函数进行可视化
r <- corrplot(coeffs,
method = "number",
p.mat = pvalues,
sig.level = 0.05, # displays only corr. coeff. for p < 0.05
insig = "blank", # else leave the cell blank
tl.srt = 0, # control the orintation of text labels
tl.offset = 1) # control of the offset of the text labels
使用corrplot()
函数的结果构建更“传统”的结果矩阵
# Keep only the correlation coefficients for pvalues < 0.05
ResultsMatrix <- r$corrPos %>%
mutate(corr = ifelse(p.value < 0.05, corr, NA))
# Set factors to control the order of rows and columns in the final cross-table
ResultsMatrix$xName <- factor(ResultsMatrix$xName,
levels = c("Al", "Fe", "Mn", "Zn", "Mo", "Baresoil", "Humdepth", "pH"))
ResultsMatrix$yName <- factor(ResultsMatrix$yName,
levels = c("N", "P", "K", "Ca", "Mg", "S"))
# Build the cross-table and get a dataframe as final result
xtabs(corr ~ yName + xName,
data = ResultsMatrix,
sparse = TRUE,
addNA = TRUE) %>%
as.matrix() %>%
as.data.frame()
输出
#> Al Fe Mn Zn Mo Baresoil Humdepth pH
#> N NA NA NA NA NA NA NA NA
#> P NA NA 0.6078261 0.7342323 NA NA NA NA
#> K NA NA 0.6757991 0.7424407 NA NA NA NA
#> Ca NA NA 0.6313043 0.6863854 NA NA 0.4396914 NA
#> Mg NA NA 0.5704348 0.6006960 NA NA 0.4912655 NA
#> S NA NA 0.5140248 0.7778986 NA NA NA NA
由reprex package (v2.0.1) 于 2021 年 12 月 21 日创建
【讨论】:
很棒的代码。我只是不明白为什么在coeffs
和pvalue
的rcorr
函数中添加了[1]
和[3]
?此外,rcorr
函数如何知道它是计算相关性和 p 值。问候。
嗨@wesleysc352。非常感谢您的反馈。解释一下,[[1]]
和 [[3]]
在这里是因为 rcorr()
函数的结果是一个列表:coeffs
是列表的第一个元素,pvalues
是第三个元素。对于您的第二点,我不确定我是否完全理解您的问题,但这只是 rcorr()
函数输出相关系数(第一个元素)、观察数(第二个元素)和 pvalues(第三个)的默认行为一个列表。你可以看到这个here。干杯。以上是关于如何仅从 R 中的特定列对中提取显着相关性?的主要内容,如果未能解决你的问题,请参考以下文章
生成具有特定列且仅在 corrplot 中具有显着值的相关矩阵
如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?