我正在实施一种技术,我将两个矩阵(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循环实现了这一点。这将返回一个数据帧,每次迭代一行,每个串一列,每个单元格给出响应向量的相关性。虽然这有效,但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的每个向量乘以单个矩阵,如下所示 - 关键字I我正在寻找的是将其扩展为一种有效的方法,它将列表中的每个矩阵乘以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