0

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)

どんな助けでも大歓迎です。

ありがとう、コナー

4

1 に答える 1

1

get.modelsモデルのformula環境で評価されますが、これgammは (常に?).GlobalEnvであり、関数の環境 (つまり sys.frames(sys.nframe())) である必要があります。

だから、代わりに

get.models(ms, 1)

使用する

eval(getCall(ms, 1))
于 2016-08-03T17:57:28.013 に答える