使用for循环或lapply运行多个GAMM模型

时间:2014-07-21 10:58:59

标签: r glm gam

有人可以帮我在for循环或lapply中运行多个GAMM模型:我在列中排列的大型数据框中有一组10个响应和20个预测变量。

我想为每个预测变量 - 响应组合应用GAMM模型,并在表格中总结它们的系数和显着性检验。

模型< -gamm(AnimalCount~s(温度),data = dat,family = poisson(link = log),random = list(省= ~1))

1 个答案:

答案 0 :(得分:2)

我认为一种方法是创建一个“矩阵”列表,其中行数和列数分别对应于响应数(i)和预测变量(j)。然后,您可以将每个模型结果存储在单元格[i,j]中。让我来说明一下:

## 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])

现在,构成的数据有2个响应(y,y1)和8个预测变量(x0~x7)。我认为您可以通过将响应和预测变量存储在不同的数据框中来简化流程:

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)

您可以使用sapply / lapply创建数据框来汇总系数等。比如说,您想要提取固定效果截距和斜率并存储在数据框中。

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