Planning for multiple indicators and domains
Source:vignettes/articles/multi-indicator.Rmd
multi-indicator.RmdSurveys commonly publish several indicators and estimates for several
subpopulations. This article shows how their requirements combine into
one sample size. See Precision targets if
moe, rmoe, and cv are new to
you.
Several indicators in one sample
Each row of the input table is one indicator with its anticipated value, precision target, and design assumptions:
targets <- data.frame(
name = c("stunting", "vaccination", "anemia"),
p = c(0.25, 0.70, 0.12),
moe = c(0.05, 0.05, 0.03),
deff = c(2.0, 1.5, 2.5)
)
multi_plan <- n_multi(targets)
multi_plan
#> Multi-indicator sample size
#> n = 1127 (binding: anemia)
#>
#> name .n .cv_target .cv_achieved .binding
#> stunting 577 0.10204269 0.07297042
#> vaccination 485 0.03644382 0.02388518
#> anemia 1127 0.12755336 0.12755336 *n_multi() calculates each requirement and takes the
largest. The binding indicator, marked with * in the
output, determines the common sample size. The other indicators meet or
exceed their requested precision.
Assess the precision each indicator receives at that size with
prec_multi():
prec_multi(multi_plan)
#> Multi-indicator sampling precision
#>
#> name .se .moe .rmoe .cv
#> stunting 0.02551067 0.05 0.20000000 0.10204269
#> vaccination 0.02551067 0.05 0.07142857 0.03644382
#> anemia 0.01530640 0.03 0.25000000 0.12755336Proportions and means can share a table. Use p for a
proportion and var with mu for a mean:
mixed_targets <- data.frame(
name = c("vaccination", "expenditure"),
p = c(0.70, NA),
var = c(NA, 40000),
mu = c(NA, 800),
cv = c(0.05, 0.10),
deff = c(1.5, 2.0)
)
n_multi(mixed_targets)
#> Multi-indicator sample size
#> n = 258 (binding: vaccination)
#>
#> name .n .cv_target .cv_achieved .binding
#> vaccination 258 0.05 0.05000000 *
#> expenditure 13 0.10 0.02204793An indicator table can also supply resp_rate,
df, prop_method, or min_cases by
row. See ?n_multi for the complete column contract.
Domains sampled as separate quotas
A domain is a population for which the survey needs a separate estimate. When regions are explicit sampling quotas, their requirements add because every quota must be fielded:
regional_targets <- data.frame(
name = rep(c("stunting", "vaccination"), each = 3),
region = rep(c("North", "Central", "South"), 2),
p = c(0.35, 0.25, 0.40, 0.60, 0.75, 0.55),
moe = 0.05,
deff = c(2.5, 2.0, 3.0, 1.5, 1.2, 1.8)
)
regional_plan <- n_multi(
regional_targets,
domains = "region",
domain_sampling = "separate"
)
regional_plan
#> Multi-indicator sample size (3 domains, separate quotas)
#> n = 2557 (sum of domain quotas)
#> Largest single domain = 1107 (binding: stunting)
#>
#> region .n .binding
#> North 874 stunting
#> Central 577 stunting
#> South 1107 stunting
regional_plan$domains
#> region .n .binding
#> 1 North 873.9319 stunting
#> 2 Central 576.2188 stunting
#> 3 South 1106.3401 stuntingWithin each region, one indicator binds. The reported overall
n is the sum of the regional requirements.
n_domain_max is only the largest single regional
requirement, not the national total.
Use min_n_domain when operations require a minimum quota
independently of the statistical target:
n_multi(
regional_targets,
domains = "region",
domain_sampling = "separate",
min_n_domain = 300
)
#> Multi-indicator sample size (3 domains, separate quotas, min_n_domain = 300)
#> n = 2557 (sum of domain quotas)
#> Largest single domain = 1107 (binding: stunting)
#>
#> region .n .binding
#> North 874 stunting
#> Central 577 stunting
#> South 1107 stuntingDomains that occur naturally in one sample
Some domains, such as age or sex groups, are not separate sampling
quotas. They appear within a common sample at an anticipated rate. Set
domain_sampling = "natural" and provide that rate in
share:
natural_targets <- data.frame(
name = "coverage",
group = c("common", "rare"),
p = 0.50,
moe = c(0.05, 0.10),
share = c(0.90, 0.10)
)
natural_plan <- n_multi(
natural_targets,
domains = "group",
domain_sampling = "natural"
)
natural_plan
#> Multi-indicator sample size (2 domains, natural incidence)
#> n = 961 (largest quota / share)
#> Largest single domain = 385 (binding: coverage)
#>
#> group .n .binding .share
#> common 385 coverage 0.9
#> rare 97 coverage 0.1
transform(
natural_plan$domains,
overall_requirement = .n / .share
)
#> group .n .binding .share overall_requirement
#> 1 common 384.14588 coverage 0.9 426.8288
#> 2 rare 96.03647 coverage 0.1 960.3647The common group needs the larger sample within its domain,
which is n_domain_max. The rare group nevertheless
determines the overall sample because only 10% of the sample is expected
to belong to it. In natural-domain mode, the binding overall requirement
is the largest .n / .share, not the largest raw
.n.
This calculation targets the expected domain yield. It does not guarantee that a realized random sample will contain the required count. Natural-domain sizing is unavailable for multistage indicator tables because a population share alone does not describe how domain members are distributed across clusters. In that setting, size domains separately or use a design-specific model based on the frame.
Domains known on the frame can instead be represented as explicit strata or allocation constraints. Continue with sample allocation or joint allocation for those designs.
Relative precision in MICS and DHS
The distinction between rmoe and cv matters
in major household survey programs. MICS sample-size tools express some
requirements as a relative margin of error, which maps to
rmoe (Khan and Hancioglu 2019). DHS
documentation uses relative standard error, also called the coefficient
of variation, which maps to cv (ICF International 2012). These quantities
are not interchangeable outside the Wald relationship described in Precision targets.
Here is an illustrative MICS-style table with a 12% relative margin of error:
relative_targets <- data.frame(
name = rep(c("stunting", "vaccination"), each = 3),
region = rep(c("North", "Central", "South"), 2),
p = c(0.35, 0.25, 0.40, 0.60, 0.75, 0.55),
rmoe = 0.12,
deff = c(2.5, 2.0, 3.0, 1.5, 1.2, 1.8),
resp_rate = c(0.90, 0.85, 0.95, 0.90, 0.85, 0.95)
)
relative_plan <- n_multi(relative_targets, domains = "region")
relative_plan
#> Multi-indicator sample size (3 domains, separate quotas)
#> n = 4523 (sum of domain quotas)
#> Largest single domain = 1884 (binding: stunting)
#>
#> region .n .binding
#> North 1377 stunting
#> Central 1884 stunting
#> South 1264 stuntingThese values illustrate the interface. They are not a country-specific survey design.
Convert analysis units to listing units
The unit returned by a calculation is the unit described by its indicator and design inputs. For this example, assume both indicators refer to the same eligible population and all eligible people in participating households are approached. The anticipated design effects must cover the intended household sampling design. If fieldwork samples households, preserve each region’s requirement when converting to household counts.
Here the indicator table’s resp_rate describes
individual completion conditional on household participation. The issued
person counts therefore already allow for individual nonresponse. Use
the expected number of eligible people per participating household:
household_plan <- as.data.frame(relative_plan)
household_plan$people_to_issue <- ceiling(household_plan$.n)
target_population_share <- 0.18
mean_household_size <- 4.5
eligible_per_household <- target_population_share * mean_household_size
household_plan$households_to_complete <- ceiling(
household_plan$people_to_issue / eligible_per_household
)
household_plan[c("region", "people_to_issue", "households_to_complete")]
#> region people_to_issue households_to_complete
#> 1 North 1377 1701
#> 2 Central 1884 2326
#> 3 South 1264 1561Allow separately for household nonresponse, which has not been included in this example’s indicator table:
household_response <- 0.90
household_plan$households_to_issue <- ceiling(
household_plan$households_to_complete / household_response
)
household_plan[c("region", "households_to_complete", "households_to_issue")]
#> region households_to_complete households_to_issue
#> 1 North 1701 1890
#> 2 Central 2326 2585
#> 3 South 1561 1735State whether an eligibility or response adjustment is already present before converting units. Applying either adjustment twice will overstate the fieldwork requirement. Eligibility and household size can also vary by region. These conversions plan expected yields, rather than guaranteeing enough eligible respondents in every region.
If indicators refer to different eligible populations, convert each indicator’s required person count to households using its own expected yield and response rates, then take the largest household requirement within each region. Taking the largest person count first can miss the indicator that requires the most households. If only some eligible people are selected within a household, include that subsampling in the expected yield and use design assumptions appropriate to that selection procedure.