【问题标题】:mgcv::gamm() and MuMIn::dredge() errorsmgcv::gamm() 和 MuMIn::dredge() 错误
【发布时间】:2016-12-08 03:34:39
【问题描述】:

我一直在尝试使用包mgcv 在一个函数中拟合多个 GAM,并通过模型选择程序粗略地选择最合适的模型。但是我的函数运行第一个模型然后似乎无法再次识别输入数据dat

我得到了错误

is.data.frame(data) 中的错误:找不到对象“dat”。

我认为这是一个范围界定问题,我已查看 herehere 寻求帮助,但无法弄清楚。

代码和数据如下(希望可重现): https://github.com/cwaldock1/Help/blob/master/test_gam.csv

library(mgcv)

# Function to fit multiple models 
best.mod <- function(dat) {

# Set up control structure
ctrl <- list(niterEM = 0, msVerbose = TRUE, optimMethod="L-BFGS-B")

# AR(1)
m1 <- get.models(dredge(gamm(Temp ~ s(Month, bs = "cc") + s(Date, bs = 'cr') + Year,
         data = dat, correlation = corARMA(form = ~ 1|Year, p = 1),
         control = ctrl)), subset=1)[[1]]

# AR(2)
m2 <- get.models(dredge(gamm(Temp ~ s(Month, bs = "cc") + s(Date, bs = 'cr') + Year,
         data = dat, correlation = corARMA(form = ~ 1|Year, p = 2),
         control = ctrl)), subset=1)[[1]]

# AR(3)
m3 <- get.models(dredge(gamm(Temp ~ s(Month, bs = "cc") + s(Date, bs = 'cr') + Year,
         data = dat, correlation = corARMA(form = ~ 1|Year, p = 3),
         control = ctrl)), subset = 1)[[1]]


### Select best model to work with based on unselective AIC criteria 
if(AIC(m2$lme) > AIC(m1$lme)){mod = m1}else{mod = m2} 
if(AIC(mod$lme) > AIC(m3$lme)){mod = m3}else{mod = mod}

return(mod$gam)
}

mod2 <- best.mod(dat = test_gam)

任何帮助将不胜感激。

谢谢, 康纳

【问题讨论】:

  • 我认为错误是 get.models 调用挖泥模型对象,因为当运行为:m1 &lt;- dredge(gamm(Temp ~ s(Month, bs = "cc", k = k.month) + s(Date, bs = 'cr') + Year, data = dat, correlation = corARMA(form = ~ 1|Year, p = 1), control = ctrl)) 时,该函数不会因此错误而崩溃。

标签: r regression mixed-models gam mgcv


【解决方案1】:

get.models 在模型的 formula 环境中进行评估,在 gamm 中是 (总是?).GlobalEnv,虽然它应该是函数的环境(即 sys.frames(sys.nframe()))。

所以,而不是

get.models(ms, 1)

使用

eval(getCall(ms, 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多