调查包中的令人费解的错误

时间:2018-01-15 17:54:39

标签: r survey

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

我很困惑,它如何分别为每个分组工作,但不适用于组合分组。

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

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

所以我的问题是 - 如何让它发挥作用?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我不确切知道为什么,但这是我如何解决同样的问题。它似乎与svyby处理NA数据的方式有关 - 即使您指定na.rm=T也是如此。我创建了数据框的子集,发现如果子集小于某个阈值(在我的情况下它是500,但确切的值是确定的)并且包含NA,它确实会发生 - 适用于其他子集,例如大于10,000,NA或小于500而不NA。在您的情况下,应该有essround==x & cntry==y的子集,该子集很小且Security = NA。因此,在您执行NA之前清除数据不要svyby(可以删除,估算或单独分组 - 这取决于您),然后再次尝试。它对我有用。