Парные матричные корреляции в R - как перебрать все пары? - PullRequest
4 голосов
/ 27 октября 2010

У меня есть 13 матриц различных размеров, которые я хотел бы использовать в парных матричных корреляциях с пользовательской функцией (которая вычисляет коэффициент Rv). Функция принимает два аргумента (matrix1, matrix2) и создает скаляр (в основном многовариантное значение r). Я хотел бы запустить функцию на всех возможных парах матриц (итого 78 корреляций) и получить матрицу 13 на 13 результирующих значений Rv с именами 13 матриц в строках и столбцах. Я подумал о том, чтобы попытаться сделать это, поместив матрицы в список и используя двойной цикл for для просмотра элементов списка, но это кажется очень сложным. Я привел пример с фиктивными данными ниже. У кого-нибудь есть предложения по поводу того, как к этому можно подойти? Заранее спасибо.

# Rv function  
Rv <- function(M1, M2) {  
    tr <- function(x) sum( diag(x) )   
    psd <- function(x) x %*% t(x)   
    AA <- psd(M1)  
    BB <- psd(M2)  
    num <- tr(AA %*% BB)  
    den <- sqrt( tr(AA %*% AA) * tr(BB %*% BB) )  
    Rv <- num / den  
    list(Rv=Rv, "Rv^2"=Rv^2)  
}  

# data in separate matricies  
matrix1 <- matrix(rnorm(100), 10, 10)  
matrix2 <- matrix(rnorm(100), 10, 10)  
# ... etc. up to matrix 13  

# or, in a list  
matrix1 <- list( matrix(rnorm(100), 10, 10) )  
rep(matrix1, 13) # note, the matrices are identical in this example   

# call Rv function  
Rv1 <- Rv(matrix1, matrix2)  
Rv1$Rv^2  

# loop through all 78 combinations?  
# store results in 13 by 13 matrix with matrix rownames and colnames?  

1 Ответ

4 голосов
/ 27 октября 2010

В прошлом я использовал expand.grid(), затем apply().Вот более простой пример, использующий всего 1: 3, а не 1: 13.

R> work <- expand.grid(1:3,1:3)
R> work
  Var1 Var2
1    1    1
2    2    1
3    3    1
4    1    2
5    2    2
6    3    2
7    1    3
8    2    3
9    3    3
R> apply(work, 1, function(z) prod(z))
[1] 1 2 3 2 4 6 3 6 9
R> 

Очевидно, вам нужна другая рабочая функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...