【问题标题】:Error with svyglm function in survey package in R: "all variables must be in design=argument"R 中的调查包中的 svyglm 函数出错:“所有变量都必须在设计=参数中”
【发布时间】:2021-03-03 21:46:20
【问题描述】:

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

El_under_glm

评估错误(附加、数据、环境): 找不到对象“.survey.prob.weights”

我将变量改为 0 和 1:

Under_narm$SO2REG

但接下来会遇到不同的问题:

El_under_glm

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

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

SAMPdesign=svydesign(data=Under_narm, id= ~NHISPID, weight= ~SAMPWEIGHT)

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

【问题讨论】:

  • 这是来自 ipums 的疾病预防控制中心的全国健康访谈调查吗?我很困惑为什么您的 svydesign() 行与 ftp.cdc.gov/pub/Health_Statistics/NCHS/Dataset_Documentation/… 不匹配?对不起,如果我忽略了一些东西..
  • @AnthonyDamico 你是绝对正确的——我试图使用一个子集,但忘记了你链接的 R 文档有不同的子集(这应该有助于我完全避免重新缩放问题)。谢谢并道歉!
  • 如果您放置在模型中的一个或多个变量不在数据集中,则可能会重现同样的错误。确保模型中的所有变量都在您使用的数据集中。

标签: r survey weighted


【解决方案1】:

使用一些虚构的示例数据,我能够通过设置 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)

【讨论】:

  • 非常感谢!我重新运行了 SAMPdesign 线,改为准二项式,并设置 rescale=TRUE,这种组合似乎奏效了。我可能不得不摆弄 .survey.prob.weights 因为我认为重新缩放会影响结果的可解释性,但今天早上这是一个巨大的胜利。再次感谢!
  • 重新缩放不影响结果的可解释性;这纯粹是一个计算问题。
猜你喜欢
  • 1970-01-01
  • 2020-02-21
  • 2021-11-18
  • 2020-11-13
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多