我正在Linux机器(服务器)上进行R 2.15.3中的子采样任务, 在某些子采样迭代中出现错误(这是由于不合适的子采样数据集)。
能够在没有循环的情况下运行许多子采样迭代
停止,在每次迭代中,我以下列方式使用try()
:
set.seed(1234)
interestingobject <- list()
for(i in 1:300) {
anyproblems <- try(0 + "0")
while(class(anyproblems) == "try-error") {
anyproblems <- try({
<code line 1>
<code line 2>
<code line 3>
.
.
.
})
}
interestingobject[[i]] <- <object from iteration i>
}
现在我有以下'奇怪'的问题:
经过几次迭代后,第一个错误发生在
try({ ... })
。我认为这没问题
因为'while'循环应该继续,直到没有错误
在try({ ... })
中再次发生。
但问题是在发生第一次错误后,
同样的错误一次又一次地发生,因为同样的错误
样本被抽出,我不知道为什么。
更新:在“代码行1”行之前,我只是画画
cat(runif(1), "\n")
内的随机数(try({ ... })
)
代码一直持续到最后,但是进入一个循环,这意味着
“有趣的对象”中的元素正在重复每一对
迭代。
我真的不知道这是怎么发生的。
我想这个问题可以用某种相关的东西来解释
R生成/处理随机数的方式(或类似的东西)。
然而,如果没有确切的代码,似乎有点困难 后者可能没什么用,因为它是相当的 长而混乱。
如何解释这样的事情发生?
绘制的随机数也在循环中重复,所以真的是 每次迭代都会重复同样的事情。
编辑(可能对问题不重要):代码的一些规范: 在每次迭代中都进行了交叉验证,其中还有一个嵌套交叉验证,其中 - 使用交叉验证 - 在每个外部交叉验证迭代中优化调整参数。
也许值得知道调整参数的调整 - 以及因此在相应的交叉验证中随机拆分到折叠中 - 是由一个 在代码之外定义的自编函数。
更新2:感谢评论者,我现在已经使用了调试,发现当场发生了第一次错误(只有一个类的观察)以及循环开始的地方也会收到警告:
在get(.obj,envir = dump [[。selection]]中: 重新启动中断的承诺评估
也许这有帮助。这个警告信息意味着什么?可能是随机数发生器的种子重置了吗?
答案 0 :(得分:-2)
由于我没有更好的解决方案,我现在做了一个丑陋的解决方法,在那里 每次重复try({...})中的过程时重新设置的随机种子, 是否有错误。 由于随机选择的种子本身会受到问题的影响 随机数在循环中,它们在整体之前绘制 子采样开始:
set.seed(1234)
interestingobject <- list()
########
# New: #
########
ranseed <- sample(1000000:10000000, size=100000)
count <- 1
#######
for(i in 1:300) {
anyproblems <- try(0 + "0")
while(class(anyproblems) == "try-error") {
########
# New: #
########
set.seed(ranseed[count])
count <- count+1
########
anyproblems <- try({
<code line 1>
<code line 2>
<code line 3>
.
.
.
})
}
interestingobject[[i]] <- <object from iteration i>
}
因为这显然只是一个粗略的解决方案,我仍然会 非常高兴,如果有人能给出提示可能会发生的事情!
在try({...})里面的代码中我没有设置种子。不过也许吧 打包的代码中的函数正在发生一些事情 我使用:&#34; rfCMA&#34;来自包&#34; CMA&#34;,它本身使用&#34; randomForest&#34; 来自同名的包装&#34; rfCMA&#34;。 &#34; mtry&#34;在随机森林中 优化功能&#34;调&#34;也来自&#34; CMA&#34; -package。
编辑:我再次检查了try({...})里面的代码,发现没有错误。如果有人认为上述解决方案可能有问题,请告诉我!我不明白为什么它可能是错的,因为每次在try({...})内发生错误时,相应的迭代被丢弃并通过set.seed(ranseed [count])确定它完全是绘制了独立的。