【发布时间】:2014-08-28 05:00:30
【问题描述】:
假设我有以下代码:
X <- model.matrix(~factor(1:2))
beta <- c(1, 2)
然后我从两个多元正态分布中抽取 70 和 40 个值:
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))
很容易看出S1 是70x2 矩阵和S2 一个40x2 矩阵。
现在我在 R 中构建一个 for 循环:
z <- list()
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta + X %*% S1[1,] + X %*% S2[i,] + rnorm(2, mean = 0, sd = 0.45)
Y <- do.call(rbind, z)
}
这给了我一个矩阵,其中包含S2 中的40 元素与S1 的1st 元素的所有组合。我想要的是完全跨越S1 和S2 这两个矩阵。也就是说,我希望 for 循环首先挑选出S1[1,],然后完全遍历S2[i,](例如在内部循环中)并将结果存储在矩阵中,然后挑选出S1[2,] 再次遍历S2[i,] 并存储结果在矩阵中等等。如果我需要给我正在寻找的东西命名,我会说"crossed for loops"。我发现很难想出允许我这样做的R-code。任何提示将不胜感激。
也许这个例子会让这个想法变得更清晰:
我的想法相当于为S1[i,] 中的每个元素构造70 个for-loops 并将结果绑定到70*40*2x1 矩阵中:
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[1,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y1 <- unname(do.call(rbind, z))
}
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[2,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y2 <- unname(do.call(rbind, z))
}
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[3,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y3 <- unname(do.call(rbind, z))
}
.
.
.
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[70,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y70 <- unname(do.call(rbind, z))
}
Y <- rbind(Y1, Y2, Y3, …, Y70)
我最理想的做法是使用for-loops 或任何其他可以处理S1 和S2 不同维度的灵活方式。
【问题讨论】:
-
您的示例不是complete or reproducible,因此很难准确回答。似乎您可以在这里使用
outer,但不清楚您期望的结果是什么(假设您的代码不可运行)。 -
很抱歉。该示例现在应该可以重现了。
-
是的,我想我在文中提到了这一点:“将结果存储在矩阵中”。但我可能不清楚。理想情况下,输出将是一个矩阵。我考虑在每次通过
S2[j,]迭代后连接每个S1[i,], i = 1, …, 70的矩阵以形成一个大矩阵。 -
它应该是一个
(70*40*2)x2 = 5600x2-矩阵:70 := number of elements in S1,40 := number of elements in S2,2 := number of rows in X。 -
是的,对不起,我的速度这么慢,半决赛明天开始。