2013-06-01 48 views
0
當我運行在除最後一個循環,我得到行列式的值不同,但所有的命令
SimNo <- 10 

for (i in 1:SimNo){ 
    z1<-rnorm(1000,0,1) 
    z2<-rnorm(1000,0,1) 
    z3<-rnorm(1000,0,1) 
    z4<-rnorm(1000,0,1) 
    z5<-rnorm(1000,0,1) 
    z6<-rnorm(1000,0,1) 

    X<-cbind(z1,z2,z3,z4,z5,z6) 
    sx<-scale(X)/sqrt(999) 
    det1<-det(t(sx)%*%sx) 
    detans<-do.call(rbind,lapply(1:SimNo, function(x) ifelse(det1<1,det1,0))) 
} 

,當我運行代碼的,一旦我得到重複所有決定的最後價值循環。lapply和rbind無法正常將結果追加

請幫助和引導來控制這樣的所有情況。

是否有辦法爲這段代碼提供簡短有效的方法,以便每個單獨的變量也可以被訪問。

回答

2

無論何時您多次重複相同的操作並且沒有輸入,請考慮使用replicate。在這裏,你可以用它兩次:

SimNo <- 10 

det1 <- replicate(SimNo, { 
    X <- replicate(6, rnorm(1000, 0, 1)) 
    sx <- scale(X)/sqrt(999) 
    det(t(sx) %*% sx) 
}) 

detans <- ifelse(det1 < 1, det1, 0) 

否則,這是你的代碼應該與你的for循環看着。你需要創建一個向量,在每個循環迭代存儲你的輸出:

SimNo <- 10 
detans <- numeric(SimNo) 
for (i in 1:SimNo) { 
    z1<-rnorm(1000,0,1) 
    z2<-rnorm(1000,0,1) 
    z3<-rnorm(1000,0,1) 
    z4<-rnorm(1000,0,1) 
    z5<-rnorm(1000,0,1) 
    z6<-rnorm(1000,0,1) 

    X<-cbind(z1,z2,z3,z4,z5,z6) 
    sx<-scale(X)/sqrt(999) 
    det1<-det(t(sx)%*%sx) 
    detans[i] <- ifelse(det1<1,det1,0) 
} 

編輯:您在評論中問道,如何使用replicate訪問X。您將不得不使replicate創建並將所有X矩陣存儲在列表中。然後使用*apply家庭的功能,以循環遍及列表來完成計算:

X <- replicate(SimNo, replicate(6, rnorm(1000, 0, 1)), simplify = FALSE) 

det1 <- sapply(X, function(x) { 
    sx <- scale(x)/sqrt(999) 
    det(t(sx) %*% sx) 
}) 

detans <- ifelse(det1 < 1, det1, 0) 

這裏,X現在是矩陣的一個列表,這樣你就可以得到如通過做第二次模擬的矩陣X[[2]]

+0

感謝您的回答。 用於複製我如何訪問單個x,例如x1,x2,... x6。再次感謝 –

+0

@ itfeature.com,請參閱我編輯的答案。 – flodel

+0

非常感謝。必須解決許多問題。 –

0
SimNo <- 10 
matdet <- matrix(data=NA, nrow=SimNo, ncol=1, byrow=TRUE) 

for (i in 1:SimNo){ 
    z1<-rnorm(1000,0,1) 
    z2<-rnorm(1000,0,1) 
    z3<-rnorm(1000,0,1) 
    z4<-rnorm(1000,0,1) 
    z5<-rnorm(1000,0,1) 
    z6<-rnorm(1000,0,1) 

    X<-cbind(z1,z2,z3,z4,z5,z6) 
    sx<-scale(X)/sqrt(999) 
    det1<-det(t(sx)%*%sx) 

matdet[i] <-do.call(rbind,lapply(1:SimNo, function(x) ifelse(det1<1,det1,0))) 
} 
matdet 
+0

你應該避免單列矩陣,而是使用矢量。無論如何,我認爲你的意思是循環內的最後一行是:'matdet [i] <-ifelse(det1 <1,det1,0)'。 – flodel