【问题标题】:Issue with the tabmeans.survey multi-categorical variables. Not recognising variables in the designtabmeans.survey 多类别变量的问题。未识别设计中的变量
【发布时间】:2020-06-05 10:26:18
【问题描述】:

我在使用调查和选项卡包分析 r 上的调查数据时遇到问题。

我认为我正确设置了调查设计对象,但是当我尝试运行 tabmean.survey 函数比较超过 2 个类别的平均值时,该函数无法识别设计中的变量。

这是使用我的数据的示例:

svyd<-svydesign(id=~psu,                      #PSU variable
                  strata=~strata,             #Strata variable              
                  weights=~ca_betaindin_xw,   #Weight variable
                  data=usds)

svyd_emp<-subset(svyd, usds$samp_employ==1)   #subset the data to required analytic sample

t1<-tabmeans.svy(age~ethnicity, 
                 design = svyd_emp)           #Run tabmeans.svy comparing means of age by ethnicity

产生此错误的原因:

svyglm.survey.design 中的错误(年龄 ~ 1,设计 = 设计): 所有变量都必须在 design= 参数中

当我使用二进制变量尝试相同的函数时,该函数可以工作

t2<-tabmeans.svy(age~sex, 
                 design = svyd_emp)           #Run tabmeans.svy comparing means of age by sex
                                              #WORKS

以前使用此函数比较多类别变量的平均值。我无法弄清楚为什么该函数现在会抛出错误。 survey.design 对象具有对象中列出的变量。

我无法分享我的数据,但我使用调查包中的“api”数据集重现了同样的问题。

data(api)
sdesign<-svydesign(id=~dnum+snum, 
                   strata=~stype, 
                   weights=~pw, 
                   data=apistrat, 
                   nest = TRUE)
t3<-tabmeans.svy(api00~stype,            # stype has 3 categories = DOESNT WORK
                    design=sdesign)
t4<-tabmeans.svy(api00~sch.wide,
                    design=sdesign)      # sch.wide has 2 categories = WORKS

感谢有关如何解决此问题的任何想法或建议。

非常感谢

【问题讨论】:

  • library(tab) 中的这个函数看起来有错误,你可能想在 github 上提出问题?如果您的变量有两个以上的级别,tabmeans.svy 期望名为 AgeSex 的变量尽管在其文档中没有这么说? github.com/vandomed/tab/blob/master/R/tabmeans_svy.R#L179
  • 错误消息svyglm.survey.design(Age ~ 1, design = design) 说您使用了Age 而不是age。对吗?

标签: r survey


【解决方案1】:

感谢您提供可重现的示例。当我运行它时,我得到了

> t3<-tabmeans.svy(api00~stype,            # stype has 3 categories = DOESNT WORK
+                     design=sdesign)
Error in svyglm.survey.design(Age ~ 1, design = design) : 
  all variables must be in design= argument
> traceback()
4: stop("all variables must be in design= argument")
3: svyglm.survey.design(Age ~ 1, design = design)
2: svyglm(Age ~ 1, design = design)
1: tabmeans.svy(api00 ~ stype, design = sdesign)

这令人不安,因为它为什么要寻找Age 变量? (这在您的示例中被掩盖了一点,因为您有一个 age 变量)。

查看tabmeans.svy的代码我明白了

    if (num.groups == 2) {
        fit <- svyttest(formula, design = design)
        diffmeans <- -fit$estimate
        diffmeans.ci <- -rev(as.numeric(fit$conf.int))
        p <- fit$p.value
    }
    else {
        fit1 <- svyglm(Age ~ 1, design = design)
        fit2 <- svyglm(Age ~ Sex, design = design)
        fit <- do.call(anova, c(list(object = fit1, object2 = fit2), 
            anova.svyglm.list))
        p <- as.numeric(fit$p)
    }

这解释了问题:如果有两个以上的组,它会忽略您的变量,而是测试SexAge 的影响。

我怀疑维护者的剪切和粘贴错误。我已经提交了一个 GitHub 问题。不幸的是,我看不到一个简单的解决方法。

【讨论】:

  • 是的,这是关于“api”数据集上的错误消息的奇怪之处。感谢您对此进行调查,虽然没有立竿见影的解决方案,但让我感到有点欣慰的是,错误不是因为我错过了一些明显的事情。
猜你喜欢
  • 2019-07-29
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多