2017-01-15 65 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)'? –