2013-06-01 7 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) 
} 

Edit: вы спросили в комментариях, как получить доступ X с помощью replicate. Вам нужно будет сделать 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