【问题标题】:Puzzling error in svyby of survey package调查包的 svyby 中令人费解的错误
【发布时间】:2018-01-15 17:54:38
【问题描述】:

我正在使用survey R 包中的“svyby”函数,并收到一个我不知道如何处理的错误。 一开始,我使用变量cntry作为分组,接下来,我使用essround作为分组,一切顺利。但是当我使用它们的组合 ~cntry+essround 时,它会返回一个错误。

我很困惑它如何可以单独为每个分组工作,但不能用于组合分组。

这在某种程度上与省略的数据有关,例如当我删除所有空单元格时(即使用 na.omit(dat) 而不是 dat 来定义调查设计)它开始工作。但我不想丢掉所有的缺失。我认为 svymean 的 na.rm 论点应该处理它。请注意,变量 cntryessround 不包含任何缺失值。

library("survey")
s.w <- svydesign(ids = ~1, data = dat, weights = dat[,weight]) 

svyby(~ Security, by=~ essround,       s.w, svymean, na.rm=T) # Works
svyby(~ Security, by=~ cntry,          s.w, svymean, na.rm=T) # Also works
svyby(~ Security, by=~ essround+cntry, s.w, svymean, na.rm=T) # Gives an error

Error in tapply(1:NROW(x), list(factor(strata)), function(index) { : 
  arguments must have same length

所以我的问题是 - 如何让它工作?

更新。 对不起,我误读了文档。通过在svyby 函数中添加na.rm.all = TRUE 即可解决问题。

【问题讨论】:

  • 我会试试:by=~ interaction(essround,cntry)
  • 还是同样的错误。

标签: r survey


【解决方案1】:

请原谅我迟到的答案,但我只是在寻找类似问题的解决方案,刚刚为自己解决了。检查essroundcntrySecurity 的交叉表中是否有任何空单元格(使用table())。如果这样做,请尝试使用 ordered() 将分组变量转换为有序因子,并在运行 svyby() 之前使用函数的 levels 参数明确命名您的级别。有序因子将在交叉表中显示频率为 0,而常规因子将丢弃空单元格。

【讨论】:

  • 我试过但得到同样的错误:(dat$cntry.o &lt;- ordered(dat$cntry, levels=unique(dat$cntry)) dat$essround.o &lt;- ordered(dat$essround, levels=unique(dat$essround)) s.w &lt;- svydesign(ids = ~1, data = dat, weights = dat[,weight]) svyby(~ Security, by=~ essround.o+cntry.o, s.w, svymean, na.rm=T)
  • @Maksim Security 是什么类型的变量?当我为自己解决类似问题时,我试图将svymean 应用于一个因子(称为X),通过svyby 由其他两个变量分解,以获得每个级别的案例百分比的X。所以在我的情况下,我也必须让X 成为一个有序的因素。但如果你只想要 Security 的分类平均值,这对你来说就不一样了
  • 一般来说,我认为将连续变量存储为一个因子,无论是否有序,都不是一个好主意。 (我假设您的 X 在计算平均值时是连续的)。顺便说一句,我的情况的解决方案只是将 na.rm.all = TRUE 添加到 svyby 函数
  • @Maksim 是的,你是对的;我的意思是我的X 是分类的,所以将它作为一个因素存储就可以了。
【解决方案2】:

我不知道具体原因,但这是我解决相同问题的方法。这似乎与svyby 处理NA 数据的方式有关——即使您指定na.rm=T。我制作了我的数据框的子集,并发现如果子集小于某个阈值(在我的情况下为 500,但确切值有待确定)并且包含 NA - 适用于其他子集,它确实会发生比如大于 10,000 的 NA 或小于 500 的 NA。在您的情况下,应该有一个 essround==x &amp; cntry==y 的子集,它很小,而 Security = NA 在哪里。所以,在你做svyby之前清理数据没有NA(可以是删除、估计或单独分组——这取决于你)然后再试一次。它对我有用。

【讨论】:

  • 感谢您的建议,但正如我所说,我不想按列表删除所有 NA - 我的数据集包含许多变量,按列表删除意味着删除超过 50% 的案例,这不是可以接受。我可以手动逐对删除 NA,并手动为每对变量进行 svydesigns,但这非常繁琐且耗时。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2021-10-26
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多