我有来自分层简单随机抽样设计的调查数据,其中某些层仅包含单个抽样单位(即使层总体规模可能>1)。这些在 R 调查包 ( http://r-survey.r-forge.r-project.org/survey/exmample-lonely.html )中被称为“孤独 PSU” 。处理这种情况有多种选择,我感兴趣的是“调整”选项。
的文档options(survey.lonely.psu="adjust")指出
“单个 PSU 层的数据以样本总平均值为中心,而不是层平均值。”
在尝试此选项时,我预计如果更改另一个层中的数据,我的单 PSU 层的方差将会改变,但事实并非如此。这是一个小例子:
library(survey)
options(survey.lonely.psu="adjust")
# sample 1
dat1 <- data.frame(N = c(3, 3, 2), h = c(1, 1, 2), y = c(2, 6, 15))
survey1 <- svydesign(~1, fpc = ~N, strata = ~h, data = dat1)
svyby(~y, by = ~h, design = survey1, FUN = svytotal)
Run Code Online (Sandbox Code Playgroud)
在结果中,请注意层 2(即单 PSU 层)的标准误差:
h y se
1 1 12 3.464102
2 2 30 21.213203
Run Code Online (Sandbox Code Playgroud)
现在,如果我像这样更改层 1 中的数据
# sample 2
(dat2 <- data.frame(N = c(3, 3, 2), h = c(1, 1, 2), y = c(200, 600, 15)))
(survey2 <- svydesign(~1, fpc = ~N, strata = ~h, data = dat2))
svyby(~y, by = ~h, design = survey2, FUN = svytotal)
Run Code Online (Sandbox Code Playgroud)
第 1 层的结果按预期发生变化,但第 2 层的标准误差仍然相同
h y se
1 1 1200 346.4102
2 2 30 21.2132
Run Code Online (Sandbox Code Playgroud)
我是否误解了文档的含义或者这可能是一个错误?
仅供参考,这是我的会话信息:
R version 3.1.3 (2015-03-09)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
other attached packages:
[1] survey_3.30-3
Run Code Online (Sandbox Code Playgroud)
编辑
我对收到的最初答案的解释是,当数据是使用该函数的子集时,方差调整不会生效svyby。然而,当我将分层总体的总方差与总总体的方差进行比较时,似乎就像没有孤立初级抽样单位时一样,总方差只是独立抽样的层方差的方差:
> vcov(svyby(~y, by = ~h, design = survey1, FUN = svytotal))
1 2
1 12 0
2 0 450
> vcov(svytotal(~y, survey1))
y
y 462
Run Code Online (Sandbox Code Playgroud)
如果在合并所有数据时发生某种以总均值为中心的情况,则后一个方差似乎应该有所不同。
svyby作为一个相关问题,以下是估计平均值与总数时的比较:
> svyby(~y, by = ~h, design = survey1, FUN = svymean)
h y se
1 1 4 1.155
2 2 15 0.000
> svyby(~y, by = ~h, design = survey1, FUN = svytotal)
h y se
1 1 12 3.464
2 2 30 21.213
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么在估计总数时会估计第 2 层(其中包含一个孤独 PSU)的方差,但在估计平均值时却不会。
TL;DR:调查包目前在使用时存在“调整”选项的错误,svytotal()但在svymean(). 这篇博文详细介绍了:
https ://www.practicalsignificance.com/posts/bugs-with-singleton-strata/
目前,使用“调整”选项,调查包只是将单独的 PSU 以 0 为中心,然后将平方添加到估计的协方差矩阵中。svymean()这对于、和许多其他函数来说是完全合理的svyratio(),但对于 来说这是一个错误svytotal()。
为什么?
R 包使用基于影响函数的线性化方法来估计方差。这篇博文解释了这意味着什么并提供了一些参考:
本质上,对于感兴趣的统计量,我们通过将其表示为影响函数的加权总和并估计该加权总和的方差来计算其方差。对于平均值或比率等统计数据,影响函数的加权总和始终为 0。总计是一种特殊情况,其中影响函数等于原始变量,因此它们的总和通常不为零。
survey.lonely.psu = 'adjust'应该做什么“调整”选项的文档称,它的工作原理是“重新居中”单独的 PSU。如果初级抽样单位不孤独,我们可以通过计算初级抽样单位总数与其所在层平均初级抽样单位总数之间的平方差来合理估计其方差贡献。但由于它是该层中唯一的事业单位,因此这种差异为零。理论上,对于,我们通过计算所有层 中survey.lonely.psu = 'adjust'PSU 总数与平均 PSU 总数之间的平方差来估计其方差贡献。
svytotal()由于调查包使用基于影响函数的线性化方法,因此对于除总计之外的所有统计数据,所有层的平均 PSU 总计为零。我认为正因为如此,编写调查包时,当用户指定 时,单独 PSU 的方差贡献只需对 PSU 总数进行平方(即减去零)即可。这很聪明,适用于均值、比率等。但它不适用于总数,因为其影响函数的总和不为零的独特属性。survey.lonely.psu = 'adjust'
https://www.practicalsignificance.com/posts/bugs-with-singleton-strata/