我有一个包含93个变量的数据集,我试图检查所有变量之间的相关性,然后筛选高于绝对值0.5的相关性。我使用How to compute correlations between all columns in R and detect highly correlated variables来帮助解决这个问题,我的代码如下所示:
library(tibble)
library(dplyr)
library(tidyr)
co_mat = data %>%
as.matrix %>%
cor %>%
as.data.frame %>%
rownames_to_column(var = 'var1') %>%
gather(var2, value, -var1)
co_mat2 = filter(co_mat, abs(value) > .5)
这很好用,除了我注意到我有很多变量与自身相关的实例。
我还注意到有些情况下,相同的变量被测试两次相关,但是在不同的列中(即冗余相关)。
我想在co_mat2 [来自我的代码]中返回一个相关表[matrix]。但是,我想消除测试变量与自身相关性的行。我还想消除冗余相关的行。
提前谢谢。
答案 0 :(得分:0)
你可能需要这样的东西:
library(tidyverse)
# get names of dataset
x = names(mtcars)
data.frame(t(combn(x,2)), stringsAsFactors = F) %>%
rowwise() %>%
mutate(v = cor(mtcars[,X1], mtcars[,X2]))
# # A tibble: 55 x 3
# X1 X2 v
# <chr> <chr> <dbl>
# 1 mpg cyl -0.852
# 2 mpg disp -0.848
# 3 mpg hp -0.776
# 4 mpg drat 0.681
# 5 mpg wt -0.868
# 6 mpg qsec 0.419
# 7 mpg vs 0.664
# 8 mpg am 0.600
# 9 mpg gear 0.480
# 10 mpg carb -0.551
# # ... with 45 more rows
您获得数据集的所有列的组合,然后为每个对获得相关性。这将排除一个变量与其自身的相关性以及相同变量之间的相关性,但顺序不同。
请记住,如果你向你的函数进行矢量化,你可以避开rowwise
部分,比如
GetCor = function(x,y) cor(mtcars[,x], mtcars[,y])
GetCor = Vectorize(GetCor)
data.frame(t(combn(x,2)), stringsAsFactors = F) %>%
mutate(v = GetCor(X1,X2))
然后,您可以将相关阈值应用于输出的列v
,然后根据需要重新整形。
答案 1 :(得分:0)
这是获得数据框中所有变量成对关联的一种方法:
# generate some fake data, some of whose columns are correlated
set.seed(6933)
dat <- data.frame(
a = c(rnorm(10, 1), rnorm(10, 2), rnorm(10, 3)),
b = c(rnorm(10, 2), rnorm(10, 4), rnorm(10, 6)),
c = c(rnorm(10, 5), rnorm(10, 3), rnorm(10, 7)),
d = c(rnorm(10, 3), rnorm(10, 2), rnorm(10, 1)),
e = c(rnorm(10, 9), rnorm(10, 5), rnorm(10, 2)))
# make a df of all the pairwise combinations of column names (10 rows)
corrs_df <- as.data.frame(t(combn(names(dat), m=2)))
# compute the correlation between each of the columns of `dat`
corrs_df$cor <- apply(corrs_df, 1, function(x) cor(dat[[x[1]]], dat[[x[2]]]))
然后,您可以按某个值过滤corrs_df
,以获得低于(或高于)某个阈值的对的集合:
threshold <- .5
corrs_df[corrs_df$cor < threshold, ] # 9 rows remain
您也可以根据相关性的绝对值是否高于阈值进行过滤,例如:
corrs_df[abs(corrs_df$cor) < threshold, ] # 7 rows remain
答案 2 :(得分:0)
如果您需要重复执行此操作,请考虑以下问题:
require(tidyverse)
require(Hmisc)
构建功能:
flattenCorrMatrix <- function(DF) {
DF <- DF %>% as.matrix() %>% Hmisc::rcorr()
ut <- upper.tri(DF$r)
flat <- data.frame(row = rownames(DF$r)[row(DF$r)[ut]], column = rownames(DF$r)[col(DF$r)[ut]],
cor = (DF$r)[ut], p = DF$P[ut], n = DF$n[ut])
return(flat)
}
运行数据(我使用了mtcars数据集):
mtcars %>%
flattenCorrMatrix() %>%
filter(cor < abs(0.5))
输出:
row column cor p n
1 mpg cyl -0.85216196 6.112688e-10 32
2 mpg disp -0.84755138 9.380328e-10 32
3 mpg hp -0.77616837 1.787835e-07 32
4 cyl drat -0.69993811 8.244636e-06 32
5 disp drat -0.71021393 5.282022e-06 32
6 hp drat -0.44875912 9.988772e-03 32
7 mpg wt -0.86765938 1.293958e-10 32
8 drat wt -0.71244065 4.784260e-06 32
9 mpg qsec 0.41868403 1.708199e-02 32
10 cyl qsec -0.59124207 3.660533e-04 32
11 disp qsec -0.43369788 1.314404e-02 32
12 hp qsec -0.70822339 5.766253e-06 32
13 drat qsec 0.09120476 6.195826e-01 32
14 wt qsec -0.17471588 3.388683e-01 32
15 cyl vs -0.81081180 1.843018e-08 32
16 disp vs -0.71041589 5.235012e-06 32
17 hp vs -0.72309674 2.940896e-06 32
18 drat vs 0.44027846 1.167553e-02 32
19 wt vs -0.55491568 9.798492e-04 32
20 cyl am -0.52260705 2.151207e-03 32
21 disp am -0.59122704 3.662114e-04 32
22 hp am -0.24320426 1.798309e-01 32
23 wt am -0.69249526 1.125440e-05 32
24 qsec am -0.22986086 2.056621e-01 32
25 vs am 0.16834512 3.570439e-01 32
26 mpg gear 0.48028476 5.400948e-03 32
27 cyl gear -0.49268660 4.173297e-03 32
28 disp gear -0.55556920 9.635921e-04 32
29 hp gear -0.12570426 4.930119e-01 32
30 wt gear -0.58328700 4.586601e-04 32
31 qsec gear -0.21268223 2.425344e-01 32
32 vs gear 0.20602335 2.579439e-01 32
33 mpg carb -0.55092507 1.084446e-03 32
34 disp carb 0.39497686 2.526789e-02 32
35 drat carb -0.09078980 6.211834e-01 32
36 wt carb 0.42760594 1.463861e-02 32
37 qsec carb -0.65624923 4.536949e-05 32
38 vs carb -0.56960714 6.670496e-04 32
39 am carb 0.05753435 7.544526e-01 32
40 gear carb 0.27407284 1.290291e-01 32