编写调查分析模型的R函数出现报错,寻求解决方案
构建调查模型汇总表函数的问题解决
数据准备
library(survey) library(gtsummary) # 加载数据 data(api) # 声明调查设计 dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)
需求
写一个函数,传入一个因变量,生成该变量与自变量both的调查回归模型的gt汇总表(比如用both预测awards的模型)。
原代码及报错
原尝试代码
mod_create <- function(y){ model <- svyglm(y~both, design = dclus1, family = quasibinomial()) tbl <- tbl_regression(model, exponentiate = TRUE) %>% add_global_p() return(tbl) } mod_create(awards)
报错信息
Error in svyglm.survey.design(y ~ awards, design = dclus1, family = quasibinomial()) : all variables must be in design= argument 4.stop("all variables must be in design= argument") 3.svyglm.survey.design(y ~ awards, design = dclus1, family = quasibinomial()) 2.svyglm(y ~ awards, design = dclus1, family = quasibinomial()) 1.mod_create(both)
问题根源
直接把变量名当参数传进函数,R没法正确把它解析成公式里的变量,反而会把参数值当成公式的一部分,导致模型找不到正确的变量。
解决代码
方法1:传变量名的字符串
mod_create <- function(y_var){ # 动态构造公式:因变量 ~ both formula <- reformulate("both", response = y_var) model <- svyglm(formula, design = dclus1, family = quasibinomial()) tbl <- tbl_regression(model, exponentiate = TRUE) %>% add_global_p() return(tbl) } # 调用示例 mod_create("awards")
方法2:直接传变量名(更便捷)
mod_create <- function(y_var){ # 获取传入的变量名 y_name <- deparse(substitute(y_var)) formula <- reformulate("both", response = y_name) model <- svyglm(formula, design = dclus1, family = quasibinomial()) tbl <- tbl_regression(model, exponentiate = TRUE) %>% add_global_p() return(tbl) } # 调用示例 mod_create(awards)
说明
reformulate函数能帮你生成正确的公式对象,确保svyglm能从设计对象里找到对应的变量。- 第二种方法用
deparse(substitute(y_var))把传入的变量名转换成字符串,不用手动加引号,用起来更顺手。
内容的提问来源于stack exchange,提问作者crytpodoc
相关产品推荐
相关产品推荐

