从R中的相关矩阵返回值

时间:2014-06-05 07:23:38

标签: r loops matrix return correlation

我有correl的相关矩阵(称为390 x 390),因此我想扫描0.800.99内的值。 cc1 <- NA #creates a NA vector to store values between 0.80 & 0.99 cc2 <- NA #creates a NA vector to store desired values p <- dim(correl)[2] #dim returns the size of the correlation matrix i =1 while (i <= p) { cc1 <- correl[,correl[,i] >=0.80 & correl[,i] < 1.00] cc2<- cbind(cc2,cc1) i <- i +1 } 。我写了以下循环:

cc2

我遇到的问题是我也会将不需要的相关性(低于0.80的相关性)转换为#Sample of what I mean: SPY.Adjusted AAPL.Adjusted CHL.Adjusted CVX.Adjusted 1 SPY.Adjusted 1.0000000 0.83491778 0.6382930 0.8568000 2 AAPL.Adjusted 0.8349178 1.00000000 0.1945304 0.1194307 3 CHL.Adjusted 0.6382930 0.19453044 1.0000000 0.2991739 4 CVX.Adjusted 0.8568000 0.11943067 0.2991739 1.0000000 5 GE.Adjusted 0.6789054 0.13729877 0.3356743 0.5219169 6 GOOGL.Adjusted 0.5567947 0.10986655 0.2552149 0.2128337

row.names

我只想在所需范围内(0.80&amp; 0.99)返回相关性而不会丢失col.names或{{1}},因为我不知道哪个是哪个。

3 个答案:

答案 0 :(得分:3)

让我们创建一个简单的可重现的例子

m = matrix(runif(100), ncol=10)
rownames(m) = LETTERS[1:10]
colnames(m) = rownames(m)

棘手的部分是获得包含变量名称的漂亮返回结构。所以我会将矩阵折叠成标准数据框

dd = data.frame(cor = as.vector(m1), 
                     id1=rownames(m), 
                     id2=rep(rownames(m), each=nrow(m)))

删除重复的条目

dd = dd[as.vector(upper.tri(m, TRUE)),]

然后照常选择

dd[dd$cor > 0.8 & dd$cor < 0.99,]

答案 1 :(得分:1)

很高兴你找到了答案,但这是另一个将结果放在一个整洁的数据框中以防万一其他人正在寻找答案。

此解决方案使用corrr包(以及使用附加的dplyr函数):

library(corrr)

mtcars %>% 
  correlate() %>% 
  shave() %>% 
  stretch(na.rm = TRUE) %>% 
  filter(between(r, .8, .99))

#> # A tibble: 3 × 3
#>       x     y         r
#>   <chr> <chr>     <dbl>
#> 1   cyl  disp 0.9020329
#> 2   cyl    hp 0.8324475
#> 3  disp    wt 0.8879799

说明:

  • mtcars是数据。
  • correlate()创建关联数据框。
  • shave()是可选的,删除上三角形(以删除重复项)。
  • stretch()将数据框(矩阵格式)转换为长格式。
  • filter(between(r, .8, .99))仅选择.8和.99
  • 之间的相关性

答案 2 :(得分:0)

当我正确理解你的问题时,人们不会期望对称矩阵作为返回对象。对于你的每个变量,你想要提取与它高度相关的其他变量 - 但是这个数量因变量而异,所以你不能使用矩阵。 如果您坚持矩阵/数据框架,我宁愿用NA

替换小的相关性

correl[correl<0.8] <- NA

然后像这样

访问与变量高度相关的列名(例如在第一行中)

colnames(correl)[!is.na(correl[1,])]

(虽然NA步骤有点无用,因为您可以使用约束直接访问colnames colnames(correl)[correl[1,]>0.8)]