lapply и rbind неправильно добавляют результаты

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

когда я запускаю все команды с помощью цикла in, кроме последнего, я получаю разные значения определителя, но когда я запускаю код с циклами сразу, я получаю последнее значение определителя, повторяющееся для всех.

Пожалуйста, помогите и помогите справиться со всей подобной ситуацией.

Есть ли способ сделать этот код коротким и эффективным, чтобы можно было получить доступ к каждой отдельной переменной.


person itfeature.com    schedule 01.06.2013    source источник


Ответы (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)
}

Изменить: в комментариях вы спрашивали, как получить доступ к 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]].

person flodel    schedule 01.06.2013
comment
Спасибо за хороший ответ. Чтобы воспроизвести, как я могу получить доступ к отдельным x, например x1, x2, ... x6. Еще раз спасибо - person itfeature.com; 01.06.2013

person    schedule
comment
вам следует избегать матриц с одним столбцом, вместо этого используйте векторы. В любом случае, я думаю, вы имели в виду, что последняя строка внутри цикла была: matdet[i] <-ifelse(det1<1,det1,0). - person flodel; 01.06.2013