use stepAIC on a list of models

前端 未结 2 727

I want to do stepwise regression using AIC on a list of linear models. idea is to use e a list of linear models and then apply stepAIC on each list element. It fails.

<
相关标签:
2条回答
  • 2020-12-03 13:40

    As it seems that stepAIC goes out of loop environment (that is in global environment) to look for the data it needs, I trick it using the assign function:

        results <- do.call(rbind, lapply(response, function (i) { 
        assign("i", response, envir = .GlobalEnv)
                mdl <- gls(as.formula(paste0(i,"~",paste(expvar, collapse = "+")), data= parevt, correlation = corARMA(p=1,q=1,form= ~as.integer(Year)), weights= varIdent(~1/Linf_var), method="ML")
                mdl <- stepAIC(mdl, direction ="backward")
    }))
    
    0 讨论(0)
  • 2020-12-03 13:50

    I'm not sure what may have changed in the versioning to make the debugging so difficult, but one solution would be to use do.call, which evaluates the expressions in the call before executing it. This means that instead of storing just d in the call, so that update and stepAIC need to go find d in order to do their work, it stores a full representation of the data frame itself.

    That is, do

    do.call("lm", list(y~x1+x2+x3, data=d))
    

    instead of

    lm(y~x1+x2+x3, data=d)
    

    You can see what it's trying to do by looking at the call element of the model, perhaps like this:

    dat.lin.model.lst <- lapply(split(dat, dat$id), function(d)
                                do.call("lm", list(y~x1+x2+x3, data=d)) )
    dat.lin.model.lst[[1]]$call
    

    It's also possible to make your list of data frames in the global environment and then construct the call so that update and stepAIC look for each data frame in turn, because their environment chains always lead back to the global environment; like this:

    dats <- split(dat, dat$id)
    dat.lin.model.list <- lapply(seq_along(dats), function(d)
                do.call("lm", list(y~x1+x2+x3, data=call("[[", quote(dats),i))) )
    

    To see what's changed, run dat.lin.model.lst[[1]]$call again.

    0 讨论(0)
提交回复
热议问题