Skip to contents

Surveys 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.12755336

Proportions 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.02204793

An 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 stunting

Within 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 stunting

Domains 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.3647

The 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 stunting

These 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                   1561

Allow 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                1735

State 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.

References

ICF International. 2012. Demographic and Health Survey Sampling and Household Listing Manual. Calverton, Maryland: MEASURE DHS. https://dhsprogram.com/pubs/pdf/DHSM4/DHS6_Sampling_Manual_Sept2012_DHSM4.pdf.
Khan, Shane, and Attila Hancioglu. 2019. “Multiple Indicator Cluster Surveys: Delivering Robust Data on Children and Women Across the Globe.” Studies in Family Planning 50 (3): 279–86. https://doi.org/10.1111/sifp.12103.