我一直在使用大型全局模型的MuMIn包作为垫脚石进行疏通,最终目的是获取每个变量的重要性值。挖泥机确实在两天内成功运行,但后来我需要添加2个变量,并且在添加变量之后,该变量尚未运行完毕。它在R崩溃之前(我假设)第一次运行了7天,因为当我下次检查它时,R关闭了,当我再次启动RStudio时没有错误消息,这是一个新窗口。我再次启动代码,这次运行了8天,然后才做同样的事情。
我将解释我的全局模型和子集,以便弄清楚为什么代码需要花费这么长时间才能运行:这是一个包含19个变量和4个交互项的游戏(所有数字均为类别,“ year”除外) )。有些变量无法在模型中同时出现,因为一个变量是另一个变量的替代版本,因此我将它们作为子集。交互项使事情变得更加复杂,因为当交互项在模型中时,项的平滑版本不能成为主要影响,因为会自动包含该项的不平滑版本,该项的不平滑版本也不会显示为当交互项不在模型中时会产生主要影响,因为可能已经存在该项的平滑版本。每种选择都会导致模型中一个术语的双重表示,因此我也将这些选择子集了出去。这是显示挖泥机的全局模型和代码的代码:
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()
这是否是需要更多计算能力的问题,还是存在一种更简洁/更正确的方式编写此代码以使其完成? 预先感谢您对此的任何帮助!
答案 0 :(得分:1)
如果通过RStudio运行R,则很难确定是什么原因导致了错误。尝试在纯R而不是RGui(或 via R CMD batch
)中在控制台中的普通R中运行R脚本,以便在崩溃后保留输出。还将dredge
参数trace
设置为TRUE
,这样您就可以查看引起问题的模型。
另一种方法是通过list
为所有模型调用创建dredge(..., evaluate = FALSE)
,之后可以在其上循环,eval
对调用进行赋值。您可以将所有这些模型对象存储在一个列表中,但这将创建一个非常大的对象,因此每次将它们save
放在磁盘上而不是保留在内存中和/或创建部分模型选择表可能会更好。以后可以与rbind
合并。这种方法的优势在于,您可以重新启动循环,使其超过先前崩溃的点(如果您save
磁盘上所有必需的数据)。