繁体   English   中英

如何从矩阵中获得一个pariwise相关数据帧?

[英]How to get a pariwise correlation dataframe from a matrix?

我有一个矩阵,可以在其上计算各列之间的相关性。 我创建了一个以相关矩阵形式给出结果的函数(由于apply()函数),但是我想直接获取成对的相关数据帧。 是否有可能没有任何中间矩阵:矩阵->成对相关数据帧

cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
return(res)}

这是相同的功能,我只是添加了一些行来获取想要的data.frame

cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
colnames(res)=rownames(res)=colnames(y)
Df<-data.frame(var1=rownames(res)[row(res)[upper.tri(res)]],
var2=colnames(res)[col(res)[upper.tri(res)]],
corr=res[upper.tri(res)])
return(Df)}

这给我这样的东西

var1 var2 value
var1 var3 value
var2 var3 value 

我只使用dplyrreshape2 ,它对您想要的reshape2吗?

library(reshape2)
library(dplyr)

set.seed(1)
n <- 10
df <- data.frame(var1 = rnorm(n), var2 = rnorm(n), var3 = rnorm(n))
melt(cor(df), id = c("Var1", "Var2")) %>%
  filter(Var1 != Var2) %>%
  filter(duplicated(value))

我做出了一个可能对您不利的假设,即假设对称系数之间的相关系数之间没有重复。 希望对您有所帮助。

编辑1:

我在Internet上查找以下软件包: corrr ,其中它们是一个函数correlate ,直接向您返回data.frame。 如果要指定输出,则以下几行将为您提供附近的内容:

install.packages('corrr')
library(corrr)
stretch(correlate(df))

但是之后,您需要执行与上述相同的技巧,才能仅拥有所需的内容。

编辑2:

我再次在互联网上查看有什么可以帮助您的东西,事实上,唯一一个在输入中采用矩阵并提供data.frame的程序包是corrr但是我在更大的矩阵上对其进行了测试,而且确实很慢。

n <- 100
p <- 8000
m <- n * p 
df <- data.frame(matrix(rnorm(m), nrow = n, ncol = p))


t <- Sys.time()
m_cor <- cor(df)
t <- Sys.time() - t
t1 <- t 

library(corrr)

t <- Sys.time()
m_cor <- correlate(df)
t <- Sys.time() - t
t2 <- t

library(propagate)

t <- Sys.time()
m_cor <- bigcor(df)
t <- Sys.time() - t
t3 <- t

Wherease propogate似乎是一件好事,以处理大量的基质,但我不知道要很好的理解类型ff的输出。 以我为例,基本的cor函数比其他两个解决方案要快。 你有什么解决办法吗?

我很高兴看到您的建议,因为这是一个有趣的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM