使用带有 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