首页 > 解决方案 > R 中的调查包中的 svyglm 函数出错:“所有变量都必须在设计=参数中”

问题描述

新的stackoverflow。我正在处理一个使用 NHIS 数据的项目,但即使对于具有二元预测变量和二元结果变量的简单、未经调整的逻辑回归,我也无法让 svyglm 函数工作(最终我想使用多个分类预测变量,但是一个一步一步)。

El_under_glm<-svyglm(ElUnder~SO2, design=SAMPdesign, 子集=NULL, family=binomial(link="logit"), rescale=FALSE, 相关=TRUE)

eval 中的错误(extras、data、env):找不到对象“.survey.prob.weights”

我将变量更改为 0 和 1:

Under_narm$SO2REG<-ifelse(Under_narm$SO2=="异性恋", 0, 1) Under_narm$ElUnderREG<-ifelse(Under_narm$ElUnder=="No", 0, 1)

但随后得到一个不同的问题:

El_under_glm<-svyglm(ElUnderREG~SO2REG, design=SAMPdesign, 子集=NULL, family=binomial(link="logit"), rescale=FALSE, 相关=TRUE)

svyglm.survey.design 中的错误(ElUnderREG ~ SO2REG,design = SAMPdesign,:所有变量都必须在 design= 参数中

这是我用来计算权重的设计——我很确定它是正确的:

SAMPdesign=svydesign(数据=Under_narm,id=~NHISPID,重量=~SAMPWEIGHT)

任何和所有的帮助表示赞赏!我很好地掌握了统计数据,但编码速度很慢。让我知道我是否可以提供任何其他信息。

标签: rsurveyweighted

解决方案


使用一些虚构的示例数据,我能够通过设置让您的模型运行rescale = TRUE。该文件指出

重新调整权重,以提高数值稳定性。默认重新调整权重以求和样本大小。使用 FALSE 不重新调整权重。

因此,一种解决方案可能就是设置rescale = TRUE.

library(survey)
  # sample data
  Under_narm <- data.frame(SO2 = factor(rep(1:2, 1000)),
                           ElUnder = sample(0:1, 1000, replace = TRUE),
                           NHISPID = paste0("id", 1:1000),
                           SAMPWEIGHT = sample(c(0.5, 2), 1000, replace = TRUE))
                           
  # with 'rescale' = TRUE
  SAMPdesign=svydesign(ids = ~NHISPID,
                       data=Under_narm,
                       weights = ~SAMPWEIGHT)
 
  El_under_glm<-svyglm(formula = ElUnder~SO2, 
                       design=SAMPdesign,
                       family=quasibinomial(), # this family avoids warnings
                       rescale=TRUE) # Weights rescaled to the sum of the sample size.
  
  summary(El_under_glm, correlation = TRUE) # use correlation with summary()
  

否则,使用“survey:::svyglm.survey.design”查找此函数方法的代码,似乎可能存在错误。我可能是错的,但是当“rescale”为 FALSE 时,我的阅读.survey.prob.weights似乎没有被分配一个值。

    if (is.null(g$weights)) 
      g$weights <- quote(.survey.prob.weights)
    else g$weights <- bquote(.survey.prob.weights * .(g$weights)) # bug?
    g$data <- quote(data)
    g[[1]] <- quote(glm)
    if (rescale) 
      data$.survey.prob.weights <- (1/design$prob)/mean(1/design$prob)

.survey.prob.weights如果您在全局环境中分配一个数值向量,可能会有一种解决方法。不知道这些值应该是什么,但是如果您执行以下操作,您的错误就会消失。(.survey.prob.weights 需要是数据长度的两倍。)

SAMPdesign=svydesign(ids = ~NHISPID,
                     data=Under_narm,
                     weights = ~SAMPWEIGHT)

.survey.prob.weights <- rep(1, 2000)

El_under_glm<-svyglm(formula = ElUnder~SO2, 
                     design=SAMPdesign,
                     family=quasibinomial(), 
                     rescale=FALSE)

summary(El_under_glm, correlation = TRUE)

推荐阅读