首页 > 解决方案 > 阈值的相关变量

问题描述

我有一个包含 93 个变量的数据集,我试图检查所有变量之间的相关性,然后筛选绝对值 0.5 以上的相关性。我使用了如何计算 R 中所有列之间的相关性并检测高度相关的变量来帮助我解决这个问题,我的代码如下所示:

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 [从我的代码] 中返回一个相关表 [矩阵]。但是,我想消除测试变量与自身相关性的行。我还想消除冗余相关行。

先感谢您。

标签: rcorrelation

解决方案


你可能需要这样的东西:

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输出列,然后根据需要进行整形。


推荐阅读