ошибки mgcv::gamm() и MuMIn::dredge()

Я пытался подогнать несколько GAM с помощью пакета mgcv внутри функции и грубо выбрать наиболее подходящую модель с помощью процедур выбора модели. Но моя функция запускает первую модель, а затем, похоже, снова не распознает входные данные dat.

я получаю ошибку

Ошибка в is.data.frame(data): объект 'dat' не найден.

Я думаю, что это проблема области видимости, и я просмотрел здесь и здесь за помощью, но не могу понять.

Код и данные следующие (надеюсь, воспроизводимые): 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)

Любая помощь будет принята с благодарностью.

Спасибо, Конор


person Conor Waldock    schedule 02.08.2016    source источник
comment
Я думаю, что ошибка заключается в том, что get.models вызывает объекты модели драги, потому что при запуске как: m1 <- 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)) функция не вылетает с этой ошибкой.   -  person Conor Waldock    schedule 03.08.2016


Ответы (1)


get.models оценивается в среде formula модели, которая в gamm является (всегда?) .GlobalEnv, в то время как она должна быть средой функции (т.е. sys.frames(sys.nframe())).

Итак, вместо

get.models(ms, 1)

использовать

eval(getCall(ms, 1))
person Kamil Bartoń    schedule 03.08.2016