R:保存 for 循环的模型输出 - 列表为空

R: Saving model output from for loop - list is blank

这是我第一次在这里发帖,如果我的问题或可重现的示例有任何问题,请提前致歉。我已经检查了类似的问题和他们的答案,但一直无法弄清楚我哪里出错了。

我有一个二元响应变量的光栅块,用于一组逻辑回归。我已经为 运行 每个模型编写了一个 for 循环,并将结果保存到一个列表中。当我测试一次迭代的代码时(即设置 i=1),模型输出按预期保存到列表中。但是,当我 运行 循环时,我得到一个空对象。

为示例创建简化数据,其中 r1 是预测变量,r2、r3 和 r4 是响应变量:

r1 <- r2 <- r3 <- r4 <- raster(nrow=10, ncol=10)
values(r1) <- sample(0:150000, 100, replace=T)

values(r2) <- sample(0:1, 100, replace=T)
values(r3) <- sample(0:1, 100, replace=T)
values(r4) <- sample(0:1, 100, replace=T)
Y_Vals <- brick(r2,r3,r4)

运行执行以下循环后,Models 列表是一个空对象(甚至不再是列表对象!):

Models <- list()
Models <- for(i in 1:nlayers(Y_Vals)){
  s <- stack(Y_Vals[[i]], r1)
  df <- data.frame(na.omit(values(s)))
  names(df) <- c("response_var", "pred_var")
  m <- glm(response_var~pred_var, data=df, family=binomial)
  Models[[i]] <- m
}

如果我将它拆开并且仅 运行 它用于 i 的一个实例,结果将按我的预期分配到列表中:

i <- 1

s <- stack(Y_Vals[[i]], r1)
df <- data.frame(na.omit(values(s)))
names(df) <- c("response_var", "pred_var")
m <- glm(response_var~pred_var, data=df, family=binomial)
Models[[i]] <- m

Models[[i]]

代码循环出现什么问题?

您的问题是(正如 Pkumar 在评论中所说)您正在将循环分配给变量。例如,如果您尝试 运行 代码段

x <- list()
for(i in 1:10){
  x[[i]] <- rnorm(i)
}
x # List of length 10, containing vectors of length 1:10

x <- for(i in 1:10){
  x[[i]] <- rnorm(i)
}
x # NULL

for-loop本身不是return一个值,它只是迭代。所以如果你改为 运行

Models <- list()
for(i in 1:nlayers(Y_Vals)){
  s <- stack(Y_Vals[[i]], r1)
  df <- data.frame(na.omit(values(s)))
  names(df) <- c("response_var", "pred_var")
  m <- glm(response_var~pred_var, data=df, family=binomial)
  Models[[i]] <- m
}

您会看到您期望的结果。请注意,迭代扩展列表是低效的。因此,为了提高效率,您可以从 Models <- vector('list', nlayers(Y_Vals)) 开始,这会略微提高您对较大数据集的性能。

您的 for 循环在每次迭代中将模型分配给 Models 中的一个点。然而,for 循环本身并不 return 一个值。因此,通过

Models <- for() {}

您为模型分配了一个空值。 只需删除 Models <- 就可以了。