2016-09-16 2 views
0

У меня есть большая корреляционная матрица (примерно 50 * 50). Я вычислил матрицу с помощью функции cor (mydata). Теперь я хотел бы иметь равную матрицу значимости. Использование cor.test() У меня может быть один уровень значимости, но есть ли простой способ получить все 1200?R Корреляционная значимость матрицы

+0

'кор .test' работает с парными образцами 'x' и' y', как вы могли бы видеть из документации '? cor.test'. Если вы хотите сделать это больше для всех комбинаций «x1, ..., x50», вам нужно перебирать между ними ... Да, это легко сделать. –

ответ

0

Я думаю, что это должен делать то, что вы хотите, мы используем expand.grid в сочетании с функцией apply:

Поскольку вы не предоставили свои данные, я создал свой собственный набор.

set.seed(123) 
xmat <- matrix(rnorm(50), ncol = 5) 
matrix(apply(expand.grid(1:ncol(xmat), 1:ncol(xmat)), 
     1, 
     function(x) cor.test(xmat[,x[1]], xmat[,x[2]])$`p.value`), 
     ncol = ncol(xmat), byrow = T) 

      [,1]  [,2]  [,3]   [,4]  [,5] 
[1,] 0.00000000 0.08034470 0.24441138 3.293644e-02 0.3234899 
[2,] 0.08034470 0.00000000 0.08716815 4.482848e-01 0.4824117 
[3,] 0.24441138 0.08716815 0.00000000 2.063439e-01 0.9504582 
[4,] 0.03293644 0.44828479 0.20634394 1.063504e-62 0.8378530 
[5,] 0.32348990 0.48241166 0.95045815 8.378530e-01 0.0000000 

Обратите внимание, что если вы не хотите matrix, а вместо этого были удобны с data.frame, мы могли бы использовать combn, который будет включать в себя гораздо меньше итераций и быть более эффективными.

cbind(t(combn(1:ncol(xmat), 2)), 
    combn(1:ncol(xmat), 2, function(x) cor.test(xmat[,x[1]], xmat[,x[2]])$`p.value`) 
) 

     [,1] [,2]  [,3] 
[1,] 1 2 0.08034470 
[2,] 1 3 0.24441138 
[3,] 1 4 0.03293644 
[4,] 1 5 0.32348990 
[5,] 2 3 0.08716815 
[6,] 2 4 0.44828479 
[7,] 2 5 0.48241166 
[8,] 3 4 0.20634394 
[9,] 3 5 0.95045815 
[10,] 4 5 0.83785303 

В качестве альтернативы, можно выполнить ту же самую операцию, но использовать оператор трубы %>%, чтобы сделать его немного более кратким:

library(magrittr) 
combn(1:ncol(xmat), 2) %>% 
    apply(., 2, function(x) cor.test(xmat[,x[1]], xmat[,x[2]])$`p.value`) %>% 
    cbind(t(combn(1:ncol(xmat), 2)), .) 
0

Вот одно решение:

data <- swiss 
#cor(data) 
n <- ncol(data) 
p.value.vec <- apply(combn(1:ncol(data), 2), 2, function(x)cor.test(data[,x[1]], data[,x[2]])$p.value) 
p.value.matrix = matrix(0, n, n) 
p.value.matrix[upper.tri(p.value.matrix, diag=FALSE)] = p.value.vec 
p.value.matrix[lower.tri(p.value.matrix, diag=FALSE)] = p.value.vec 
p.value.matrix 

      [,1]   [,2]   [,3]   [,4]   [,5]   [,6] 
[1,] 0.000000e+00 1.491720e-02 9.450437e-07 1.028523e-03 1.304590e-06 2.588308e-05 
[2,] 1.491720e-02 0.000000e+00 3.658617e-07 3.585238e-03 5.204434e-03 4.453814e-01 
[3,] 9.450437e-07 9.951515e-08 0.000000e+00 9.951515e-08 6.844724e-01 3.018078e-01 
[4,] 3.658617e-07 1.304590e-06 4.811397e-08 0.000000e+00 4.811397e-08 5.065456e-01 
[5,] 1.028523e-03 5.204434e-03 2.588308e-05 3.018078e-01 0.000000e+00 2.380297e-01 
[6,] 3.585238e-03 6.844724e-01 4.453814e-01 5.065456e-01 2.380297e-01 0.000000e+00