使用带有 covmat 选项的 svyby 时,带有 NA 数据的 R Survey 包出现问题

Issue with R Survey package with NA data when using svyby with covmat option

我想从调查数据(具有调查权重、psu 和分层)中获取子组均值之间的差异,但由于缺少观察值 (NA),我无法这样做。你介意帮帮我吗?

我使用了“调查”包,创建了一个调查设计,并使用 svyby 按子组(城市)对我的观察结果进行了分组,其中包含 NA(下例中的收入)。我还设置了 covmat = True 以便稍后可以使用 svycontrast 来计算标准误差。但是,当我这样做时,我得到了 NA。

library(survey)
data <- data.frame(psu = 1:8, city = rep(1:2, 4), income = c(2:8, NA), weights = 1)
svy <- svydesign(id=~psu, data = data, weights =~weights)
svyby(~income,~city, svy, svymean, covmat=TRUE) 

  city income       se
1    1      5 1.195229
2    2     NA      NaN

然后我尝试添加各种 NA 删除,但其中 none 似乎有效。

> svyby(~income,~city, svy, svymean, covmat=TRUE, na.rm.by=T, na.rm.all=T) 
   city income       se
 1    1      5 1.195229
 2    2     NA      NaN
svyby(~income,~city, svy, svymean, covmat=TRUE, na.rm = T) 
Error in inflmats[[i]][idxs[[i]], ] <- infs[[i]] : 
  number of items to replace is not a multiple of replacement length

欢迎任何建议。

看起来像一个错误。

解决方法是提前子集化:

> data <- data.frame(psu = factor(1:8), city = rep(1:2, 4), income = c(2:8, NA), weights = 1)
> svy <- svydesign(id=~psu, data = data, weights =~weights)
> svyby(~income,~city, subset(svy,!is.na(income)), svymean, covmat=TRUE)->a
> a
  city income       se
1    1      5 1.195229
2    2      5 1.007905
> vcov(a)
         1        2
1 1.428571 0.000000
2 0.000000 1.015873