Я реализую методику, согласно которой я беру две матрицы (M1 и M2) и умножаю их каждую на один и тот же вектор «шампуров» (B), получая векторы результатов R1 и R2, а затем беру корреляцию этих векторов, как:
P1 <- data.frame(split(rnorm(5*16, 1, 1), 1:16))
M1 <- matrix(unlist(P1[1,]), nrow = 4)
M1[upper.tri(M1)] <- t(M1)[upper.tri(M1)]
P2 <- data.frame(split(rnorm(5*16, 1, 1), 1:16))
M2 <- matrix(unlist(P2[1,]), nrow = 4)
M2[upper.tri(M2)] <- t(M2)[upper.tri(M2)]
B <- rnorm(4, 0, 1)
R1 <- M1 %*% B
R2 <- M2 %*% B
cor(R1, R2)
Однако мне нужно расширить это двумя способами: i ) Мне нужно сделать это для n (4000, но здесь показано для 2) векторов B, которых я достиг, используя функцию, как показано ниже, и ii ) , выполняя это для каждой итерации апостериорного распределения матриц (1000, используя 5 здесь впример), которого я добился с помощью цикла for внутри функции.Это возвращает фрейм данных с одной строкой на итерацию и 1 столбцом на вертел, а каждая ячейка дает корреляцию векторов ответа.Хотя это работает, цикл for работает медленно -
com_rsk_p2 <- function(m1, m2, n = 2){
nitt <- length(m1[,1])
k <- sqrt(length(m1))
B <- split(rnorm(n*k, 0, 1), 1:n)
rv_cor <- split(rep(NA, times = n*nitt), 1:nitt)
for(i in 1:nitt){
R1 <- sapply(B, function(x) x %*% matrix(unlist(m1[i,]), ncol = k))
R2 <- sapply(B, function(x) x %*% matrix(unlist(m2[i,]), ncol = k))
rv_cor[[i]] <- diag(matrix(mapply(cor, list(R1), list(R2)), ncol = n))
}
return(t(data.frame(rv_cor)))
}
Я работал над этим в течение нескольких дней, но вкратце - возможно ли использовать не-цикл /применить подход, чтобы каждая итерация M1 и M2 умножалась на каждый вертел, сохраняя результирующие векторные корреляции для каждого случая? Я уверен, что должен быть какой-то трюк, который мне не хватает!
> out <- com_rsk_p2(P1, P2)
> out
[,1] [,2]
X1 0.7622732 0.8156658
X2 0.4414054 0.4266134
X3 0.4388098 -0.1248999
X4 0.5438046 0.7723585
X5 -0.5833943 -0.5294521
В идеале я бы хотел, чтобы объекты R1
и R2
оставались внутри функции, потому что я буду использовать их для некоторых других вещей позже, когда добавлю к этой функции (вычисление углов между векторами и т. Д.).
Обновлено 26/04/2018 Я создал список матриц и матрицы векторов B, и я могу умножить одну матрицу на каждый вектор B, как показано ниже -ключ, который я ищу, - это расширить его до эффективного подхода, который умножает каждую матрицу в списке на каждый вектор B:
P1 <- data.frame(split(round(rnorm(5*16, 1, 1),2), 1:16))
P2 <- data.frame(split(round(rnorm(5*16, 1, 1),2), 1:16))
nitt <- length(P1[,1])
k <- sqrt(length(P1))
M1L <- list(rep(NA, times = nitt))
M2L <- list(rep(NA, times = nitt))
for(i in 1:nitt){
M <- matrix(P1[i,], byrow = T, ncol = k)
M[lower.tri(M)] <- t(M)[lower.tri(M)]
M1L[[i]] <- M
M <- matrix(P2[i,], byrow = T, ncol = k)
M[lower.tri(M)] <- t(M)[lower.tri(M)]
M2L[[i]] <- M
}
B <- matrix(round(rnorm(2*4, 0, 1),2), ncol = 2)
matrix(unlist(M2L[[1]]), ncol = 4) %*% B
> matrix(unlist(M2L[[1]]), ncol = 4) %*% B
[,1] [,2]
[1,] 0.1620 -0.3203
[2,] 0.6027 0.8148
[3,] 0.9763 -1.3177
[4,] -0.5369 0.5605