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
。
只是想根据@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
}