我有以下代码:
beta <- c(1, 2, 3)
X1 <- matrix(c(1, 1, 1, 1,
0, 1, 0, 1,
0, 0, 1, 1),
nrow = 4,
ncol = 3)
Z1 <- matrix(c(1, 1, 1, 1,
0, 1, 0, 1),
nrow = 4,
ncol = 2)
Z2 <- matrix(c(1, 1, 1, 1,
0, 1, 0, 1),
nrow = 4,
ncol = 2)
library(MASS)
S1 <- mvrnorm(70, mu = c(0,0), Sigma = matrix(c(10, 3, 3, 2), ncol = 2))
S2 <- mvrnorm(40, mu = c(0,0), Sigma = matrix(c(10, 4, 4, 2), ncol = 2))
z <- list()
y <- list()
for(j in 1:dim(S1)[1]){
for(i in 1:dim(S2)[1]){
z[[i]] <- X1 %*% beta+Z1 %*% S1[j,]+Z2 %*% S2[i,]+matrix(rnorm(4, mean = 0 , sd = 0.27), nrow = 4)
Z <- unname(do.call(rbind, z))
}
y[[j]] <- Z
Y <- unname(do.call(rbind, y))
}
X1
是4x3
,Z1
和Z2
是4x2
矩阵。因此,每次调用X1 %*% beta+X2 %*% S1[j,]+X2 %*% S2[i,]+matrix(rnorm(4, mean = 0 , sd = sigma), nrow = 4)
时,它都会输出4x1
矩阵。到目前为止,我将所有这些值存储在两个列表的内部和外部循环中,然后调用rbind()
将它们转换为矩阵。有没有办法直接将它们存储在矩阵中?
答案 0 :(得分:2)
如果您依赖apply
函数和向量回收,则可以避免使用列表。我把你的方程分解成了它的部分。 (我希望我能准确地解释它!)
Mb <- as.vector(X1 %*% beta)
M1 <- apply(S1,1,function(x) Z1 %*% x )
M2 <- apply(S2,1,function(x) Z2 %*% x ) + Mb
Mout <- apply(M1,2,function(x) M2 + as.vector(x))
as.vector(Mout) + rnorm(length(Mout), mean = 0 , sd = 0.27)
因为随机数在矩阵乘法后添加(即不参与任何计算),你可以将它们放在最后。
另请注意,您不能将较小的矩阵添加到较大的矩阵中,但如果您先将其作为矢量,则R将根据需要进行回收。因此,当Mb(长度为4的向量)被添加到具有4行和n列的矩阵中时,它将被回收n次。