2016-08-02 2 views
0

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

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

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

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

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

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

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

+0

Я думаю, потому что при запуске, как ошибка get.models называя объекты драги модели: 'm1 <- драги (GAMM (Temp ~ s (Месяц, bs = "cc", k = k.month) + s (Дата, bs = 'cr') + Год, data = dat, корреляция = corARMA (form = ~ 1 | Year, p = 1), control = ctrl)) ' функция не падает с этой ошибкой. –

ответ

1

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

Таким образом, вместо

get.models(ms, 1) 

использования

eval(getCall(ms, 1)) 

 Смежные вопросы

  • Нет связанных вопросов^_^