为什么尝试 filter/subset 倾斜调查设计对象会失败?

Why do attempts to filter/subset a raked survey design object fail?

我正在尝试过滤调查设计对象中的行以排除特定的数据子集。在下面的示例中,它包含来自几所学校的调查数据,我试图排除来自加利福尼亚州阿拉米达县学校的数据。

令人惊讶的是,当调查设计对象包括通过耙取创建的权重时,尝试过滤或子集数据失败。我认为这是一个错误,但我不确定。为什么倾斜权重的存在会改变尝试过滤或子集数据的结果?

library(survey)

data(api)

# Declare basic clustered design ----
cluster_design <- svydesign(data = apiclus1,
                            id = ~dnum,
                            weights = ~pw,
                            fpc = ~fpc)

# Add raking weights for school type ----
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))

raked_design <- rake(cluster_design,
                     sample.margins = list(~stype,~sch.wide),
                     population.margins = list(pop.types, pop.schwide))

# Filter the two different design objects ----
subset_from_raked_design <- subset(raked_design, cname != "Alameda")

subset_from_cluster_design <- subset(cluster_design, cname != "Alameda")

# Count number of rows in the subsets
# Note that they surprisingly differ
  nrow(subset_from_raked_design)
#> [1] 183
  nrow(subset_from_cluster_design)
#> [1] 172

无论您如何尝试对数据进行子集化,都会出现此问题。例如,当您尝试使用行索引仅对前 10 行进行子集化时会发生以下情况:

nrow(cluster_design[1:10,])
#> 10
nrow(raked_design[1:10,])
#> 183

此行为是 survey 程序包试图帮助您避免犯统计错误这一事实的结果。

对于涉及 calibration/post-stratification/raking 的特别复杂的设计,不能简单地通过过滤掉感兴趣的子群体之外的数据来计算子群体的估计值;这种方法 produces misleading standard errors and confidence intervals.

因此,为了避免 运行 陷入这个 统计 问题,survey 包不允许您完全删除您的子集之外的记录兴趣。相反,它实际上会记录您要忽略的行,然后将概率权重调整为有效的零。

在这个问题的示例中,您可以看到在要过滤掉的行中,它们在 subset_from_raked_design$prob 对象中的值等于 Inf(这实际上意味着相应的行在数据中分配的权重为零。)

subset_from_raked_design$prob[1:12]
#> Inf Inf Inf Inf Inf Inf
#> Inf Inf Inf Inf Inf 
#> 0.01986881 ....

raked_design$prob[1:12]
#> 0.01986881 0.03347789 0.03347789 0.03347789 0.03347789 0.03347789
#> 0.03347789 0.03347789 0.03347789 0.02717969 0.02717969
#> 0.01986881 ....