有效地将距离相关性(或其他函数)应用于非常大的数据集的每对列

问题描述 投票:0回答:1

我正在使用

energy::dcor
来计算向量对之间的距离相关性。

但是,我现在需要处理很多列(~2600),而我的代码大约需要 1 小时左右才能完成。

我知道这可能是正常的,但我想检查是否有更好、更有效的方法来做到这一点(例如使用 data.table、避免 for 循环等)。

我的代码:

N <- 100
K <- 200
foo <- matrix(runif(N*K), nrow = N, ncol = K)
colnames(foo) <- colnames(foo, do.NULL = FALSE, prefix = "col")
result <- matrix(NA, nrow = ncol(foo), ncol = ncol(foo))
dimnames(result) <- list(colnames(foo), colnames(foo))

for (i in 1:ncol(foo)) {
  other.cols <- setdiff(1:ncol(foo), i)
  for (j in other.cols) {
    X <- na.omit(foo[, c(i, j)])
    r <- energy::dcor(X[, 1], X[, 2])
    result[i,j] <- r
  }
}

进行一些分析后,我发现

X <- na.omit(foo[, c(i, j)])
是花费大部分时间来计算的行,但我不知道如何改进它。基本上这是必需的,因为
dcor
不希望数据集中出现
NA

r performance matrix correlation
1个回答
0
投票

只是想根据@minem的建议发布改进。

我确保不会两次计算同一列对的相关性。由于矩阵是对称的,我只计算上三角形,然后沿对角线将其镜像到下三角形(使用此解决方案)。

更新代码

N <- 100
K <- 200
foo <- matrix(runif(N*K), nrow = N, ncol = K)
colnames(foo) <- colnames(foo, do.NULL = FALSE, prefix = "col")
result <- matrix(NA, nrow = ncol(foo), ncol = ncol(foo))
dimnames(result) <- list(colnames(foo), colnames(foo))
processed <- rep(NA, k) # THIS IS NEW

for (i in 1:ncol(foo)) {
  processed <-processed[i] # THIS IS NEW
  other.cols <- setdiff(1:ncol(foo), i)
  for (j in other.cols) {
    if (j %in% processed) next # THIS IS NEW
    X <- na.omit(foo[, c(i, j)])
    r <- energy::dcor(X[, 1], X[, 2])
    result[i,j] <- r
  }
  result[lower.tri(result)] <- t(result)[lower.tri(result)] # THIS IS NEW
}
© www.soinside.com 2019 - 2024. All rights reserved.