基于人口以外的变量的总和进行校准
Calibration based on the total of a variable other than the population
我一直在使用 survey
包处理一些调查数据。我阅读了关于 post-分层和校准的文档 available,但是我在尝试根据已知的人口总数而不是人口总数来校准抽样权重时遇到了困难。
为了清楚起见,我准备了一个例子:假设我有一个按性别分层的样本的收入信息,这让我可以创建 svydesign
对象:
data = data.frame(id = c(1:5),
sex = c("F","F","F","C","C"),
income = c(100,150,75,200,100),
sw = c(2,2,3,3,3))
dis = svydesign(ids = ~id,
strata = ~ sex,
weights = ~sw,
data = data)
然后我可以按性别计算总收入:
svyby(~income,~ sex,dis,svytotal)
gender income se
F F 725 90.13878
M M 900 300.00000
但是,我不知道人口中有多少男性或女性,但我知道按性别划分的总收入:
gender income
F 800
M 800
我一直没能找到一种方法来使用 calibrate
或 postStratify
函数通过 se = 0(即校准(post-分层)总人口与各组总人口不同的调查设计)。
我知道我可以通过乘以比率校准因子(将估计总数除以按性别划分的已知总数)来校准抽样权重。这种方法有一些局限性,如 here 所述,因为我会得到正确的点估计而不是标准误差。
提前感谢您阅读本文!任何建议,将不胜感激。 :)
这是一个解决方法。
您的所有数据都存储在 dis$variables
,您可以从那里导出数据并进行计算。我希望这可以激发更好的解决方案
library(dplyr)
dis$variables %>%
group_by(sex) %>%
summarize(sw_sum = sum(sw),
n_sex = n()) %>%
ungroup() %>%
mutate(total_sex = sw_sum*n_sex) %>%
select(sex, total_sex)
输出
我认为您可以对此进行校准,但请记住,有一个模型在幕后进行这项工作。与 R
中的任何模型一样,您必须使用公式对象。为了做到这一点,我会这样做:
library( survey )
data = data.frame(id = c(1:5),
sex = c("F","F","F","M","M"),
income = c(100,150,75,200,100),
sw = c(2,2,3,3,3))
dis = svydesign(ids = ~id,
strata = ~ sex,
weights = ~sw,
data = data)
(我将 sex
变量中的“C”更改为“M”,以使合计“标签”有意义。)此时,运行 校准:
dis.cal <- calibrate(dis, ~-1+sex:income , c( `sexM:income`=800 , `sexF:income` = 800 )
现在,让我们比较一下结果。对于最初的调查设计对象,我们有:
> svyby(~income,~ sex,dis, svytotal)
sex income se
F F 725 90.13878
M M 900 300.00000
现在,经过校准,我们有:
> svyby(~income,~ sex,dis.cal , svytotal)
sex income se
F F 800 5.413807e-14
M M 800 1.180346e-13
正如我们预期的那样,SE 几乎为零。
也就是说,我会注意您应用此技术的实际场景。例如,测量误差、小样本和其他问题可能是有问题的。如果研究变量与辅助变量不相关,您甚至会失去一些效率。我建议阅读 Deville 和 Sarndal (1992)、Lumley (2011) 书中的校准章节和 Nascimento Silva's working paper.
我一直在使用 survey
包处理一些调查数据。我阅读了关于 post-分层和校准的文档 available,但是我在尝试根据已知的人口总数而不是人口总数来校准抽样权重时遇到了困难。
为了清楚起见,我准备了一个例子:假设我有一个按性别分层的样本的收入信息,这让我可以创建 svydesign
对象:
data = data.frame(id = c(1:5),
sex = c("F","F","F","C","C"),
income = c(100,150,75,200,100),
sw = c(2,2,3,3,3))
dis = svydesign(ids = ~id,
strata = ~ sex,
weights = ~sw,
data = data)
然后我可以按性别计算总收入:
svyby(~income,~ sex,dis,svytotal)
gender income se
F F 725 90.13878
M M 900 300.00000
但是,我不知道人口中有多少男性或女性,但我知道按性别划分的总收入:
gender income
F 800
M 800
我一直没能找到一种方法来使用 calibrate
或 postStratify
函数通过 se = 0(即校准(post-分层)总人口与各组总人口不同的调查设计)。
我知道我可以通过乘以比率校准因子(将估计总数除以按性别划分的已知总数)来校准抽样权重。这种方法有一些局限性,如 here 所述,因为我会得到正确的点估计而不是标准误差。
提前感谢您阅读本文!任何建议,将不胜感激。 :)
这是一个解决方法。
您的所有数据都存储在 dis$variables
,您可以从那里导出数据并进行计算。我希望这可以激发更好的解决方案
library(dplyr)
dis$variables %>%
group_by(sex) %>%
summarize(sw_sum = sum(sw),
n_sex = n()) %>%
ungroup() %>%
mutate(total_sex = sw_sum*n_sex) %>%
select(sex, total_sex)
输出
我认为您可以对此进行校准,但请记住,有一个模型在幕后进行这项工作。与 R
中的任何模型一样,您必须使用公式对象。为了做到这一点,我会这样做:
library( survey )
data = data.frame(id = c(1:5),
sex = c("F","F","F","M","M"),
income = c(100,150,75,200,100),
sw = c(2,2,3,3,3))
dis = svydesign(ids = ~id,
strata = ~ sex,
weights = ~sw,
data = data)
(我将 sex
变量中的“C”更改为“M”,以使合计“标签”有意义。)此时,运行 校准:
dis.cal <- calibrate(dis, ~-1+sex:income , c( `sexM:income`=800 , `sexF:income` = 800 )
现在,让我们比较一下结果。对于最初的调查设计对象,我们有:
> svyby(~income,~ sex,dis, svytotal)
sex income se
F F 725 90.13878
M M 900 300.00000
现在,经过校准,我们有:
> svyby(~income,~ sex,dis.cal , svytotal)
sex income se
F F 800 5.413807e-14
M M 800 1.180346e-13
正如我们预期的那样,SE 几乎为零。
也就是说,我会注意您应用此技术的实际场景。例如,测量误差、小样本和其他问题可能是有问题的。如果研究变量与辅助变量不相关,您甚至会失去一些效率。我建议阅读 Deville 和 Sarndal (1992)、Lumley (2011) 书中的校准章节和 Nascimento Silva's working paper.