【问题标题】:How to get a pariwise correlation dataframe from a matrix?如何从矩阵中获取成对相关数据框?
【发布时间】:2019-09-26 14:10:20
【问题描述】:

我有一个矩阵,用于计算列之间的相关性。我创建了一个函数,它以相关矩阵的形式给出结果(因为 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 

【问题讨论】:

    标签: r matrix correlation


    【解决方案1】:

    我只使用dplyrreshape2,它可以满足您的需求吗?

    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:

    我在互联网上查找,我找到了以下包: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
    

    propogate 似乎是处理非常大的矩阵的好东西,但我不确定是否能很好地理解输出的类型ff。在我的示例中,基本的 cor 函数比其他两个解决方案更快。你找到解决办法了吗?

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

    【讨论】:

    • 其实我想知道是否可以直接获取data.frame?我的意思是,当我计算矩阵的相关性时,我会得到一个相关性矩阵,然后提取相关性来制作我的 data.frame。我想跳过相关矩阵,直接获取data.frame形式的相关。
    • 我认为它不存在,实际上上面的解决方案只用 3 行代码就可以满足您的需求。是因为你有一个大数据集吗?
    • 事实上,我在处理大数据(我正在处理的用于制作草稿的矩阵有超过 820k 列..)
    • 实际上,我的矩阵太大而无法与propagatecorrr 一起使用:我收到有关内存空间的错误消息。因此,我决定将矩阵拆分为子矩阵,计算每个子矩阵之间的相关性(子矩阵 1 与子矩阵 2、子矩阵 1 与子矩阵 3、子矩阵 2 与子矩阵 3 等)。我将得到几个相关子矩阵:我为每个组合创建一个成对的相关数据框。然后,我收集这些数据帧中的每一个(我删除了重复的行),并得到了与我的起始矩阵相对应的最终 data.frame。
    • 感谢您的回答,我认为您选择了最佳解决方案。
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多