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

当我用 in 循环运行所有命令时,除了最后一个,我得到不同的行列式值,但是当我一次运行循环代码时,我得到所有重复的行列式的最后一个值。

请帮助和指导以控制这样的所有情况。

有没有办法为这段代码提供简短有效的方法,以便也可以访问每个单独的变量。

4

2 回答 2

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

于 2013-06-01T18:27:05.283 回答
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
于 2013-06-01T18:55:20.250 回答