调查包的 F 参数没有给出预期的输出

F argument of survey package does not give expected output

跟进R's survey package interpolation handling for median estimates,没有引起多少反馈。我设法将问题归结为以下几点:

我正在使用 R 的 survey 包来获取一组数据的中值估计值。复制此问题的数据可作为 dput 文本 here.

我使用的设计是 class svyrep.design 定义如下:

design <- svydesign(id = ~id_directorio, strata = ~estrato, weights = ~f_pers, check.strata = TRUE, data = datos)
set.seed(234262762)
repdesign <- as.svrepdesign(design, type = "subbootstrap", replicates=20)
options(survey.lonely.psu="adjust")

svyby 中的 svyquantile 按预期完成工作:

svyby(formula = ~ing_t_p, by = ~CL_GRUPO_OCU_08, repdesign, svyquantile, quantiles=c(0.5),  method="constant", 
      f = 0.5, ties = "rounded", vartype=c("ci", "se"), ci=TRUE, na.rm=FALSE)

         CL_GRUPO_OCU_08         V1        se         cv        cv%
ISCO08_1        ISCO08_1 1002513.04 269630.31 0.26895442  26.895442
ISCO08_2        ISCO08_2  744505.53  68827.09 0.09244672   9.244672
ISCO08_3        ISCO08_3  489789.32  42839.16 0.08746447   8.746447
ISCO08_4        ISCO08_4  449806.52  69526.34 0.15456944  15.456944
ISCO08_5        ISCO08_5  286705.37  13392.01 0.04671002   4.671002
ISCO08_6        ISCO08_6  449613.04       NaN        NaN        NaN
ISCO08_7        ISCO08_7   93032.83 109534.62 1.17737600 117.737600
ISCO08_8        ISCO08_8  564514.15 437752.31 0.77544967  77.544967
ISCO08_9        ISCO08_9  293712.84  24497.97 0.08340790   8.340790

但是,请参阅类别 ISCO08_6 的估算值。它没有给出预期的中位数结果。相反,显示的是两者中最小的数字:

datos %>% filter(CL_GRUPO_OCU_08 == "ISCO08_6")

# A tibble: 2 x 5
  id_directorio estrato f_pers ing_t_p CL_GRUPO_OCU_08
          <dbl>   <dbl>  <dbl>   <dbl> <chr>          
1         24568    2021   98.7 449613. ISCO08_6       
2         24568    2021   98.7 551525. ISCO08_6    

f 参数应该处理这个(它管理数据插值);确实它适用于所有其他情况,但它对 ISCO08_6 行没有影响。我发现这个问题会影响只有 2 或 4 个数据点的估计。

那么当数据点数量较少时,如何使用这种方法获得中位数结果?

好的,看来您需要要求一个比 0.5 稍大 的分位数才能得到您想要的结果。我将调查这是否是一个错误,或者是否有必要与 SUDAAN 等其他系统达成协议。我将为下一个版本修复或记录此问题(或者可能添加另一个选项)。分位数是最差的。

以下是仅使用 svyquantile()

的示例
> svyquantile(~ing_t_p, quantile=0.5000001, design=dd, f=0.5, ies="rounded", method="constant")
             0.5
ing_t_p 500569.2
> svyquantile(~ing_t_p, quantile=0.5000001, design=dd, f=0, ties="rounded", method="constant")
           0.5
ing_t_p 449613
> svyquantile(~ing_t_p, quantile=0.5000001, design=dd, f=1, ties="rounded", method="constant")
             0.5
ing_t_p 551525.3

这里使用 svyby()。请注意,您必须在第一个参数中使用 formula=,否则 f=0.5 参数会被 R 解释为 formula=0.5

> svyby(formula=~ing_t_p, by = ~CL_GRUPO_OCU_08, design, svyquantile, quantiles=c(0.5000001),f=0.5, method="constant", vartype=c("ci", "se"), ci=TRUE, na.rm.all=FALSE)
         CL_GRUPO_OCU_08    ing_t_p        se      ci_l      ci_u
ISCO08_1        ISCO08_1 1002513.04 254418.31 550769.11 1629454.6
ISCO08_2        ISCO08_2  749355.06  62294.16 649720.53  899613.0
ISCO08_3        ISCO08_3  489789.32  32140.54 409819.42  538808.8
ISCO08_4        ISCO08_4  449806.52  74549.55 349699.00  650000.0
ISCO08_5        ISCO08_5  286705.37  15349.64 240706.43  301766.1
ISCO08_6        ISCO08_6  500569.18       NaN       NaN       NaN
ISCO08_7        ISCO08_7   93032.83 108653.60  55000.00  503500.0
ISCO08_8        ISCO08_8  564514.15 429428.77  80470.95 2061000.0
ISCO08_9        ISCO08_9  293712.84  18830.76 245000.00  320539.5
There were 12 warnings (use warnings() to see them)