调查包的 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)
跟进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)