使用 R 调查包中的 rake() 函数创建的倾斜权重的正确方法是什么?
R 文档给出了以下示例:
library(survey)
data(api)
dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)
pop.types <- data.frame(stype=c("E","H","M"), Freq=c(4421,755,1018))
pop.schwide <- data.frame(sch.wide=c("No","Yes"), Freq=c(1072,5122))
dclus1r<-rake(dclus1, list(~stype,~sch.wide), list(pop.types, pop.schwide))
svymean(~api00, dclus1r)
mean SE
api00 641.23 23.704
但是当我直接使用权重时,我得到了不同的 SE 估计:
apiclus1$rwt<-weights(dclus1r)
rakeddesign<-svydesign(id=~dnum, weights=~rwt, fpc=~fpc, weight=~rwt,data=apiclus1)
svymean(~api00, rakeddesign)
mean SE
api00 641.23 23.806
在这个例子中差异很小,但在我拥有的其他数据中差异非常大。
您在倾斜后得到的答案是正确的,而您通过将倾斜的权重放入
svydesign
并且不告诉它它们被倾斜而得到的答案是错误的(但通常不是非常错误)。
使用
rake
调整权重,并向调查设计对象添加信息,以实现正确的标准误差估计。倾斜会添加信息(来自您指定的总体总数),并且此信息会减少相对于您碰巧拥有该组权重时所得到的标准误差。
倾斜是通过迭代后分层完成的。计算后分层后的标准误差涉及从将用于标准误差估计的残差中减去后分层均值。对于倾斜估计器,这种减法是迭代完成的。
相关代码(
survey::svyrecvar
内)看起来像
else if (inherits(psvar, "raking")) {
for (iterations in 1:10) {
for (margin in psvar) {
psw <- attr(margin, "weights")
x <- x - psw * apply(x/psw, 2, ave, margin)
}
}
}
如果您获得了倾斜权重并且知道倾斜变量,您可以告诉
svydesign
权重已经通过 calibrate.formula
选项进行了倾斜。
有时,对于其他人收集的公共使用数据,您没有倾斜变量,您必须假装倾斜权重是抽样权重。当您这样做时,标准误差估计值会变得比应有的稍大。