2014-07-07 15 views
2

假設我有以下代碼:交叉for循環:挑選第i個第一環路然後循環的元件完全通過第二環路

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)) 

可以很容易看到S170x2矩陣和S2 a 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) 
    } 

這給了我一個包含在S240元素與S11第一單元的所有組合的矩陣。我想是完全跨兩個矩陣S1S2。這是我想要的for循環挑出S1[1,]第一,然後通過S2[i,](例如,在內部循環)完全迭代,並存儲在一個矩陣中的結果然後通過S2[i,]再次挑出S1[2,]迭代並且將結果存儲在一個矩陣等。如果我需要給我一個名字,我要找的是"crossed for loops"。我發現它拿出R -code,讓我做到這一點非常努力。任何提示將不勝感激。


也許這個想法會得到這個例子更清楚:

我的想法是相當於建設70個for -loops在S1[i,]每一個元素,並在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等靈活的方式來做到這一點。

+1

你舉的例子不是[完成或重現性(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible例如),所以很難準確回答。看起來你可能可以在這裏使用'outer',但是你不知道你期望的結果是什麼(因爲你的代碼不是可運行的)。 – MrFlick

+0

對不起。這個例子現在應該是可重現的。 –

+0

是的,我以爲我在文中提到過這個問題:「將結果存儲在矩陣中」。但我可能一直不清楚。理想情況下,輸出將是一個矩陣。我想通過'S2 [j,]'遍歷每個'S1 [i,],i = 1,...,70'的矩陣形成一個大矩陣。 –

回答

1

我意識到這不是for -loops的問題,但是用我存儲變量的方式。我想要什麼樣的解決方案是:

library(MASS) 
z <- list() 
y <- list() 
for(j in 1:dim(S1)[1]){ 
    for(i in 1:dim(S2)[1]){ 
     z[[i]] <- X %*% beta+X %*% S1[j,]+X %*% S2[i,]+matrix(rnorm(2, mean = 0 , sd = sigma), ncol = 2, nrow = 2) 
     Z <- unname(do.call(rbind, z)) 
    } 
     y[[j]] <- Z 
     Y <- unname(do.call(rbind, y)) 
} 
2

確定。我可能會做一些事情來儘可能提高效率。首先,我們可以預先計算所有的矩陣乘法與

Xb <- X %*% beta 
XS1 <- X %*% t(S1) 
XS2 <- X %*% t(S2) 

然後我們可以clculate的S1/S2的值的所有組合與expand.grid

idx <- unname(c(expand.grid(A=1:ncol(XS1), B=1:ncol(XS2)))) 

然後,我們可以定義變換

fx<-function(a, b) { 
    t(Xb + XS1[,a, drop=F] + XS2[,b,drop=F] + rnorm(2, mean = 0, sd = 0.45)) 
} 

我們假設,我們將通過對S1的索引和S2的索引。然後我們將數據結合到您的公式中。最後,我們使用這個輔助功能和指標與一組do.call小號

xx <- do.call(rbind, do.call(Map,c(list(fx), idx))) 

首先我們使用Map來計算所有組合,那麼我們就用rbind合併所有的結果。這實際上產生了一個2800x2矩陣。 (70 * 40)* 2。行的順序是S1移動最快,然後是S2。

相關問題