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 <-
就可以了。
这是我第一次在这里发帖,如果我的问题或可重现的示例有任何问题,请提前致歉。我已经检查了类似的问题和他们的答案,但一直无法弄清楚我哪里出错了。
我有一个二元响应变量的光栅块,用于一组逻辑回归。我已经为 运行 每个模型编写了一个 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 <-
就可以了。