2017-01-15 35 views
3

从矩阵(nxm)开始,我想创建一个新的Matrix mxm,其中包含起始矩阵列的排列之间的相关性2。因此,如果我的输入是Matrix 3x3 ,我想计算列12,13,23的相关性并将结果分配给目的地矩阵。 Banally我用两个嵌套的for循环(~O(n^2)列置换的矩阵相关

for (i in 1:n) { 
    for (j in i+1:n) { 
    if (j <= n) { 
     tmp = cor(inMatrix[, i], inMatrix[, j]) 
     dstMatrix[i,j] = tmp; 
    } 
    } 
} 

这似乎是工作的,我想知道是否存在一个更好的方法来实现它在R.

+0

如果前两行读作为(I在1:(M - 1)){ 为(j中第(i + 1):m){'? –

+0

简单的'cor(inMatrix)'有什么问题?这是一个复杂的问题吗? –

+0

感谢for循环索引的输入! @apom – Serena

回答

3

简单cor(inMatrix)做它(全矩阵直接传递到cor()):

n <- 7 
m <- 5 
set.seed(123) 
inMatrix <- replicate(m, sample(c(1, - 1), 1) * cumsum(runif(n))) 
inMatrix 
#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 0.7883051 -0.4566147 0.04205953 -0.7085305 -0.7954674 
# [2,] 1.1972821 -1.4134481 0.36998025 -1.2525965 -0.8200811 
# [3,] 2.0802995 -1.8667822 1.32448390 -1.8467385 -1.2978771 
# [4,] 3.0207667 -2.5443529 2.21402322 -2.1358983 -2.0563366 
# [5,] 3.0663232 -3.1169863 2.90682662 -2.2830119 -2.2727445 
# [6,] 3.5944287 -3.2199110 3.54733344 -3.2460361 -2.5909256 
# [7,] 4.4868478 -4.1197359 4.54160321 -4.1483352 -2.8225513 

dstMatrix <- matrix(nrow = m, ncol = m) 
for (i in 1:(m - 1)) { 
    for (j in (i+1):m) { 
    if (j <= n) { 
     tmp = cor(inMatrix[, i], inMatrix[, j]) 
     dstMatrix[i,j] = tmp; 
    } 
    } 
} 
dstMatrix 
#  [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] NA -0.9823516 0.9902370 -0.9688212 -0.9825973 
# [2,] NA   NA -0.9811424 0.9570599 0.9626469 
# [3,] NA   NA   NA -0.9742235 -0.9862355 
# [4,] NA   NA   NA   NA 0.9331879 
# [5,] NA   NA   NA   NA   NA 

dstMatrix_2 <- cor(inMatrix) 
dstMatrix_2 
#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 1.0000000 -0.9823516 0.9902370 -0.9688212 -0.9825973 
# [2,] -0.9823516 1.0000000 -0.9811424 0.9570599 0.9626469 
# [3,] 0.9902370 -0.9811424 1.0000000 -0.9742235 -0.9862355 
# [4,] -0.9688212 0.9570599 -0.9742235 1.0000000 0.9331879 
# [5,] -0.9825973 0.9626469 -0.9862355 0.9331879 1.0000000 
dstMatrix == dstMatrix_2 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] NA TRUE TRUE FALSE TRUE 
# [2,] NA NA TRUE FALSE TRUE 
# [3,] NA NA NA FALSE TRUE 
# [4,] NA NA NA NA FALSE 
# [5,] NA NA NA NA NA 

# The difference lies in machine precision magnitude, not sure what caused it: 
dstMatrix - dstMatrix_2 
#  [,1] [,2] [,3]   [,4]   [,5] 
# [1,] NA 0 0 -1.110223e-16 0.000000e+00 
# [2,] NA NA 0 2.220446e-16 0.000000e+00 
# [3,] NA NA NA -1.110223e-16 0.000000e+00 
# [4,] NA NA NA   NA 1.110223e-16 
# [5,] NA NA NA   NA   NA 
1

计算相关系数的列的组合。 combn函数用于获得对列号

作为每@Sotos的,功能可以直接传递到combn,因此它避免使用apply()

cor_vals <- combn(1:col_n, 2, function(x) cor(mat1[, x[1]], mat1[, x[2]])) 
# cor_vals <- apply(combn(1:col_n, 2), 2, function(x) cor(mat1[, x[1]], mat1[, x[2]])) 

将名称指定给相关值

cor_vals <- setNames(cor_vals, combn(1:col_n, 2, paste0, collapse = '')) 
cor_vals 
#  12   13   23 
# 0.1621491 -0.8211970 0.4299367 

数据:

set.seed(1L) 
row_n <- 3 
col_n <- 3 
mat1 <- matrix(runif(row_n * col_n, min = 0, max = 20), nrow = row_n, ncol = col_n) 
+0

@有趣。我不知道这个函数可以传入combn。谢谢。我将编辑我的答案 – Sathish

+0

感谢您的输入!是'R'的基础包的'combn'部分?作为输出,我想得到一个矩阵'n x n',结果在我用于cor的列的索引处。例如。如果我正在计算'1,3'的cor,我希望在结果矩阵的索引'1,3'处得到结果 – Serena

+0

不应该是'm' x'm'而不是'n' x 'N'?为什么不简单地使用'cor(inMatrix)'? –