循环预测模型:求无需创建纯数值数据集的残差拟合图代码(省RAM)
问题
我希望为数据集中的每个数值变量生成残差vs拟合图,示例代码如下:
plot(glm(Outcome~Age, family="binomial", data=pima_train))
当前我的代码通过循环存储回归模型摘要:
mod_summaries <- list() # creating empty list for(i in 2:ncol(select_if(is.numeric(pima_train)))) { # Head of for-loop predictors_i <- colnames(pima_train)[2:i] # Create vector of predictor names mod_summaries[[i - 1]] <- summary( # Store regression model summary in list lm(y ~ ., data[ , c("y", predictors_i)])) }
现寻求无需创建仅包含数值变量的完整数据集的优化代码,以节省RAM空间。
解决方案
核心思路
直接在原数据集上识别数值变量列名,动态构建模型公式,全程不生成新的数值子集数据集,从根源上避免额外内存占用。
代码实现
场景1:为每个数值变量单独建模并生成残差图(匹配示例的二分类glm模型)
# 提取数值变量列名(排除响应变量Outcome,根据实际数据调整) numeric_cols <- names(pima_train)[sapply(pima_train, is.numeric) & names(pima_train) != "Outcome"] mod_summaries <- list() # 循环处理每个数值变量 for (col in numeric_cols) { # 动态构建公式并拟合模型 model <- glm(formula = paste("Outcome ~", col), family = "binomial", data = pima_train) # 生成残差vs拟合图(which=1指定该类型图) plot(model, which = 1) # 存储模型摘要到列表 mod_summaries[[col]] <- summary(model) }
场景2:逐步添加数值变量建模(匹配原代码的逐步回归逻辑)
# 提取所有数值变量列名 numeric_cols <- names(pima_train)[sapply(pima_train, is.numeric)] # 指定响应变量名(根据你的实际数据调整) response_var <- "y" # 移除响应变量本身,避免纳入预测因子 numeric_cols <- numeric_cols[numeric_cols != response_var] mod_summaries <- list() # 循环逐步增加预测变量 for(i in seq_along(numeric_cols)) { # 选取前i个数值变量作为预测因子 selected_preds <- numeric_cols[1:i] # 构建多变量公式 model_formula <- as.formula(paste(response_var, "~", paste(selected_preds, collapse = " + "))) # 直接在原数据集上拟合模型,无需生成子集 model <- lm(formula = model_formula, data = pima_train) # 生成残差vs拟合图 plot(model, which = 1) # 存储模型摘要 mod_summaries[[i]] <- summary(model) }
优化点说明
- 零额外内存开销:用
sapply(pima_train, is.numeric)直接在原数据集上判断数值列,仅生成列名字符向量,完全避免创建新的数值子集数据框。 - 动态公式构建:通过
paste()拼接公式字符串并转为公式对象,直接在原数据集上调用建模函数,无需切片生成新数据。 - 适配两种需求:分别提供单变量逐个建模和逐步添加变量建模的代码,匹配不同业务场景。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

