使用for循环批量生成递增编号模型时遇变量报错问题求助
解决svyglm模型构建中的「变量不在设计对象」报错问题
错误原因分析
报错的核心问题是公式构造错误:原代码中reformulate(paste0(y, "both"))会把因变量名和自变量名直接拼接成一个不存在的变量(比如y=api00时会生成api00both),导致svyglm无法在调查设计对象中找到对应的变量,从而抛出错误。
同时,reformulate()的用法逻辑有误:该函数第一个参数是自变量向量,response参数指定因变量,而非直接拼接字符串。
修正步骤
- 调整公式构造方式,明确因变量(循环的目标变量)和自变量(
both)的关系,正确生成因变量 ~ both的模型公式。 - 确保函数内的公式能被svyglm正确识别,变量均存在于调查设计对象中。
修正后的完整代码
library(tidyverse) library(survey) library(gtsummary) library(srvyr) # 加载数据 data(API) # 声明调查设计 dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc) # 修正后的模型构建函数 mod_create <- function(y){ # 正确构造公式:y作为因变量,both作为自变量 model_formula <- as.formula(paste(y, "~ both")) # 也可以用reformulate的标准写法:reformulate("both", response = y) model <- svyglm(model_formula, design = dclus1, family = quasibinomial()) tbl <- tbl_regression(model, exponentiate = TRUE) %>% add_global_p() return(tbl) } # 批量执行的循环代码 vars_to_mod <- colnames(apiclus1[12:15]) model_tables <- list() for (i in seq_along(vars_to_mod)) { model_tables[[i]] <- mod_create(vars_to_mod[i]) } # 为列表元素命名(带递增编号) names(model_tables) <- paste0('table.', seq_along(vars_to_mod))
补充说明
- 若需求是将
both作为因变量,目标变量作为自变量,只需将公式改为as.formula(paste("both ~", y))即可。 - 使用
seq_along(vars_to_mod)替代1:length(vars_to_mod),能避免变量列表为空时出现逻辑错误。
内容的提问来源于stack exchange,提问作者crytpodoc
相关产品推荐
相关产品推荐

