【发布时间】:2014-06-08 22:43:12
【问题描述】:
我想重复该过程,除非在存储结果时满足条件。
这是一个简单的例子,我知道循环中要执行的周期数:
# just example data
smpls <- rnorm(100,50,50)
ncycles <- 1000
outm <- matrix(nrow=ncycles, ncol = 1)
#重复这个过程n个循环
for(i in 1:ncycles){
outm[i] <- mean(sample(smpls, 50))
}
# get average of outm
outm <- mean(sample(smpls, 50))
但我的情况不同,因为我不知道 ncyles。我想继续采样,除非样本的方差非常低或收敛(我猜这是“while”循环。例如,除非在以下情况下 vsd 小于 1。
vsd <- NULL
outm <- mean(sample(smpls, 50))
while (vsd > 1){
outm[i] <- mean(sample(smpls, 50))
vsd <- sd(outm)
}
我不知道这里要设置的 i 的值。帮助表示赞赏
编辑:
smpls <- rnorm(100,50,50)
iter <- 0
# maximum iteration
itermax <- 1000
outm <- rep(NA, itermax)
vsd <- 2
while((vsd > 1 ) && (iter < itermax)) {
outm[iter] <- mean(sample(smpls, 50))
vsd <- sd(outm)
iter <- iter+1
}
Error in while ((vsd > 1) && (iter < itermax)) { :
missing value where TRUE/FALSE needed
达到收敛时停止的主要思想是节省时间。尽管上面仅使用均值函数的示例很快,但我的原始函数需要大量时间来进行迭代,我想在它收敛时停止它。
【问题讨论】:
-
只要
outm的标准差大于 1,您就在循环。但是,在您的第一次迭代后,outm的长度为 1,标准差为 0,导致您的循环终止. -
开始
outm作为一个长向量,比如 10K。如果迭代索引超出范围,请检查将其再扩展 10K 的循环。收敛后修剪 NA。不用说你需要初始化和增加i。这将最大限度地减少outm从头开始重写的次数。 -
感谢 @ilir、SHRram 和 josilber - 尝试调整循环仍然出错,请参阅当前编辑
-
您的代码中仍然存在一些小问题。首先,您应该使用 1 初始化变量
iter(R 中的向量从 1 开始,而不是 0),然后在您的第一个循环运行中,您从单个值计算sd,这会在 R 中引发 NA。感觉,在while循环外计算第一个outm,然后开始iter,即使值为2,然后,因为你在初始outm中有NA,计算sd通过sd(outm,na.rm=TRUE)和你的while循环应该可以工作。
标签: r loops while-loop