0

我一直在使用一个非常大的全局模型的包 MuMIn 作为垫脚石来运行挖泥机,最终目标是获取每个变量的重要性值。挖泥机确实在 2 天内成功运行,但后来我需要添加 2 个变量,并且在添加后它还没有运行完成。它在 R 崩溃之前第一次运行了 7 天(我假设),因为当我接下来检查它时,R 已经关闭,当我再次启动 RStudio 时没有错误消息,这是一个新窗口。我再次启动代码,这次它运行了 8 天,然后才做同样的事情。

我将解释我的全局模型和子集,以便清楚为什么代码需要这么长时间才能运行:它是一个具有 19 个变量和 4 个交互项的游戏(除“年份”之外的所有数字都是分类的)。有些变量不能一起出现在模型中,因为一个是另一个的替代版本,所以我有这些的子集。交互项使事情变得更加复杂,因为当交互项在模型中时,项的平滑版本不能成为主要影响,因为该项的未平滑版本会自动包含在内,该项的未平滑版本也不会显示为当交互项不在模型中时的主要影响,因为可能已经存在该项的平滑版本。任一选项都会导致模型中一个术语的双重表示,因此我也将这些选项子集化了。这是显示挖泥船的全局模型和代码的代码:

library(MuMIn)
options(na.action = "na.fail")

real.model2 <- gam(resqpa ~ factor(year) + s(elev) + factor(year)*elev + 
s(bf1) + s(bf2) + s(bf3) + s(open) + s(water) + s(bfbs1) + s(bfbs2) + 
s(bfbs3) + s(bs2) + s(bs3) + s(mix) + s(cs1) + s(cs2) + factor(year)*bfbs2 + 
factor(year)*bfbs3 + factor(year)*bs2 + factor(year)*bs3 + s(allbf) + s(ct1) 
+ s(ct2) + s(allcs), family=binomial(link="cloglog"))

fits6 <- dredge(real.model2, subset =  (!("s(allbf)" & "s(bf1)")) 
            & (!("s(allbf)" & "s(bf2)")) 
            & (!("s(allbf)" & "s(bf3)")) 
            & (!("s(ct1)" & "s(bf1)")) 
            & (!("s(ct1)" & "s(bfbs1)")) 
            & (!("s(ct2)" & "s(bf2)")) 
            & (!("s(ct2)" & "s(bfbs2)"))
            & (!("s(ct2)" & "s(bs2)"))
            & (!("s(allcs)" & "s(cs1)"))
            & (!("s(allcs)" & "s(cs2)"))
            & (!(`s(elev)` & "elev:factor(year)")) & (!elev  | `elev:factor(year)`) 
            & (!(`s(bfbs2)` & "bfbs2:factor(year)")) & (!bfbs2  | `bfbs2:factor(year)`) 
            & (!(`s(bfbs3)` & "bfbs3:factor(year)")) & (!bfbs3  | `bfbs3:factor(year)`) 
            & (!(`s(bs2)` & "bs2:factor(year)")) & (!bs2  | `bs2:factor(year)`) 
            & (!(`s(bs3)` & "bs3:factor(year)")) & (!bs3  | `bs3:factor(year)`))

在 R 第二次崩溃后,我进行了诊断;但是,错误的时间戳与 R 崩溃的时间不匹配,所以我不知道这是否提供信息。

24 Sep 2018 03:06:26 [rdesktop] ERROR system error 231 (All pipe instances 
are busy); OCCURRED AT: virtual void 
rstudio::core::http::NamedPipeAsyncClient::connectAndWriteRequest()

这是需要更多计算能力的问题,还是有更简洁/更正确的方法来编写此代码以使其完成?提前感谢您对此的任何帮助!

4

1 回答 1

1

如果您通过 RStudio 运行 R,则很难说出导致错误的原因。尝试在纯 R 中运行您的 R 脚本,而不是在 RGui(或via R CMD batch)中,以便在崩溃后保留您的输出。还将dredge参数设置traceTRUE,以便您可以查看导致问题的模型。

另一种方法是通过创建一个list所有模型调用dredge(..., evaluate = FALSE),之后您可以在其上循环,eval使用调用。您可以将所有这些模型对象存储在一个列表中,但这会创建一个非常大的对象,因此save每次将它们放在磁盘上而不是保存在内存中可能会更好,和/或创建可以稍后合并的部分模型选择rbind表上。这种方法的优点是您可以在之前崩溃的点之后重新启动循环(如果您save在磁盘上有所有必要的数据)。

于 2018-09-26T13:19:40.157 回答