Search code examples
rglmgam

Running multiple GAMM models using for loop or lapply


Can someone please help me with running multiple GAMM models in a for loop or lapply: I have a set of 10 response and 20 predictor variables in a large data frame arranged in columns.

I'd like to apply GAMM model for each predictor-response combination, and summarize their coefficients and significance tests in a table.

models<-gamm(AnimalCount ~ s(temperature), data=dat,family=poisson(link=log) , random=list(Province=~1) )


Solution

  • I think one way to do this is to create a "matrix" list where the number of rows and columns corresponds to the number of responses (i) and predictors (j), respectively. Then you can store each model result in the cell[i, j]. Let me illustrate:

    ## make up some data
    library(mgcv)
    set.seed(0) 
    dat <- gamSim(1,n=200,scale=2)
    set.seed(1)
    dat2 <- gamSim(1,n=200,scale=2)
    names(dat2)[1:5] <- c("y1", paste0("x", 4:7))
    d <- cbind(dat[, 1:5], dat2[, 1:5])
    

    Now the made-up data has 2 responses (y, y1) and 8 predictors (x0 ~ x7). I think you can simplify the process by storing the responses and predictors in separate data frames:

    d_resp <- d[ c("y", "y1")]
    d_pred <- d[, !(colnames(d) %in% c("y", "y1"))]
    
    ## create a "matrix" list of dimensions i x j
    results_m <- vector("list", length=ncol(d_resp)*ncol(d_pred))
    dim(results_m) <- c(ncol(d_resp), ncol(d_pred))
    
    for(i in 1:ncol(d_resp)){
      for(j in 1:ncol(d_pred)){
        results_m[i, j][[1]] <- gamm(d_resp[, i] ~ s(d_pred[, j]))
      }
    }
    
    # flatten the "matrix" list
    results_l <- do.call("list", results_m)
    

    You can use sapply/lapply to create a data frame to summarize coefficients, etc. Say, you want to extract fixed-effect intercepts and slopes and stored in a data frame.

    data.frame(t(sapply(results_l, function(l) l$lme$coef$fixed)))