You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写调查分析模型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:05:46