The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Two-phase (double) sampling

When there is a second phase of sampling

In a two-phase (or double) sample, a large first-phase sample is drawn and some cheap information is collected on all of it; then a subsample of the first-phase units is drawn for a costlier follow-up – a longer questionnaire, a lab measurement, an income module. The follow-up variable is observed only on the subsample, and the subsampled units must stand in for the whole first-phase sample.

step_subsample() records that second phase. It expands each subsampled unit by the inverse of its phase-2 selection probability and drops the units that were not subsampled, and – crucially – it tells bootstrap_weights() that the variance now has two components.

A worked example

We build a first-phase sample of households and take a Poisson subsample of them (the follow-up rate varies by region). The follow-up variable is income.

set.seed(1)
NH  <- 4000L; m <- 3L                       # first-phase households, members each
reg <- sample(c("A", "B", "C"), NH, replace = TRUE, prob = c(0.5, 0.3, 0.2))
u   <- rnorm(NH, c(A = 10, B = 16, C = 24)[reg], 4)

frame <- data.frame(
  hh      = rep(seq_len(NH), each = m),
  region  = rep(reg, each = m),
  income  = rep(u, each = m) + rnorm(NH * m, 0, 5),
  w1      = 10                              # first-phase design weight
)

## phase 2: Poisson subsample of households, rate by region
p2_by  <- c(A = 0.25, B = 0.45, C = 0.70)
sel_hh <- runif(NH) < p2_by[reg]
frame$selected <- as.integer(frame$hh %in% which(sel_hh))
frame$p2       <- p2_by[frame$region]

The recipe expands the subsample; the phase-2 sampling unit is the household:

spec <- weighting_spec(frame, base_weights = w1) |>
  step_subsample(selected = selected, prob = p2, psu = "hh")

fit <- prep(spec)
summary(fit)
#> 
#> == Weighting specification (weightflow) ==
#> Data    : 12000 cases
#> Base wts: w1
#> Steps   :
#>   1. phase-2 subsample  [subsample_1]
#> Status  : estimated (prep)
#> 
#> Stage summary:
#>                   stage n_active sum_wts cv_wts deff_kish n_eff
#>                    base    12000  120000  0.000     1.000 12000
#>  stage_1_step_subsample     4845  121838  0.432     1.187  4082
#> 
#> deff_kish = 1 + CV^2 (Kish design effect from unequal weighting);
#> n_eff = n_active / deff_kish. Both worsen with each adjustment and
#> improve with trimming.
#> 
#> --- Step 1: phase-2 subsample ---
#>  n_selected n_dropped psu n_psu2  design min_prob max_prob
#>        4845      7155  hh   1615 poisson     0.25      0.7
#> Kish deff: 1.000 -> 1.187   |   n_eff: 12000 -> 4082

The two-phase variance

The sampling variance of a two-phase estimator is the sum of two components,

\[V = V_1 + V_2,\]

the first-phase sampling variance plus the expected conditional variance of the phase-2 subsample. A single-phase bootstrap of the achieved sample captures only \(V_1\) and undercovers.

When the recipe contains a step_subsample(), bootstrap_weights() switches to the two-phase coupling automatically – no extra arguments:

boot <- bootstrap_weights(spec, replicates = 200, seed = 1, progress = FALSE)
boot_mean(boot, "income")
#>   estimate        se ci_lower ci_upper
#> 1 14.49937 0.2037054 14.10012 14.89863

The per-unit resampling factor has variance \((1 - f_1)\,\pi_2 + (1 - \pi_2)\): the phase-1 component (seen through the subsample) plus the phase-2 conditional component. The two add – a naive product of two factors would add a spurious interaction term and overstate the variance. In practice the factor is drawn from a strictly positive Gamma of that mean and variance, so every replicate weight stays positive and any downstream step (including a response-propensity GLM) re-runs cleanly.

f1 is the first-phase sampling fraction; it defaults to 0 (negligible, as in most household surveys) and can be supplied through the fpc argument of bootstrap_weights() when it is not.

Note what f1 = 0 does to the factor variance: \((1-0)\,\pi_2 + (1-\pi_2) = 1\) for every unit, so \(\pi_2\) drops out of the coupling. With a negligible first-phase fraction each phase-2 sampling unit simply gets an independent factor of variance 1 (a Bayesian-bootstrap / Exponential(1) multiplier). This is correct, not a bug: \(\pi_2\) enters the estimate through the weights (\(w = w_1/\pi_2\)), not through the resampling factor, so lowering \(\pi_2\) does not move d when f1 = 0 – it is the phase-1 fraction, not \(\pi_2\), that pulls d below 1.

The cascade is re-run on every replicate

The whole recipe is re-executed for each bootstrap replicate, so any nonresponse adjustment or calibration placed after the subsample has its variance captured as well. A fuller two-phase recipe:

weighting_spec(frame, base_weights = w1) |>
  step_subsample(selected = selected, prob = p2, psu = "hh") |>
  step_nonresponse(respondent = responded, method = "weighting_class", by = "region") |>
  step_calibrate(margins = list(region = region_totals), method = "poststratify")

Each replicate re-estimates the nonresponse factors and re-solves the calibration on the perturbed weights, so the reported standard error reflects the sampling of both phases and the recipe together.

Calibrating the subsample to the first-phase sample

National statistical offices often calibrate the second-phase sample not to known population totals but to the totals estimated by the first-phase sample – the larger phase is used as a reference for the smaller one. This is the two-phase regression estimator (Fuller 1998): it gains efficiency by borrowing the first-phase information, and its target totals are themselves random, so their sampling variance must be propagated.

No special engine is needed: this falls out of composing step_subsample() with a reference_sample() built from the first-phase sample. Supply the first-phase sample as the reference, together with its own replicate weights, and calibrate to it:

# `phase1` is the full first-phase sample (with the auxiliary `x` and its weight
# `w1`); `phase1_reps` are replicate weights for the first-phase design.
ref <- reference_sample(phase1, weights = "w1", replicates = phase1_reps)

weighting_spec(sample, base_weights = w1) |>
  step_subsample(selected = selected, prob = p2, psu = "hh") |>
  step_calibrate(method = "linear", formula = ~ x, population = ref)

Each bootstrap replicate re-estimates the first-phase totals from the paired first-phase replicate (the sample-based calibration of Opsomer and Erciulescu 2021) and re-solves the calibration. The two variance components separate on their own: after calibration the step_subsample() factor carries the residual variance, and the reference replicates carry the variance of the predicted part, reproducing V = V1(y) + V2(residuals) with no double counting. Monte Carlo confirms this composition returns the two-phase regression variance (ratio ~ 1.0), including with second-phase nonresponse and clustered households.

Scope

The second phase is modelled as a Poisson (independent / Bernoulli) selection of the sampling unit nested in the first phase (the household-subsampling case). This is deliberately the general-purpose model rather than one design per scheme: when the phase-2 sampling fraction is small – the usual situation, since a costly follow-up subsamples only a fraction of the first phase – a Poisson second phase closely approximates, and is slightly conservative for, the without-replacement and stratified subsampling schemes used in practice, because the finite-population correction they add is negligible at a small fraction. The per-unit factor therefore needs only the selection probability and the sampling unit, not the full phase-2 stratification. An exact stratified without-replacement second phase, and a coarser first-phase clustering (areas then households), are planned extensions; today jackknife_weights() refuses a two-phase recipe (use the bootstrap), and bootstrap_weights() raises a clear error rather than silently undercovering when first-phase strata/psu are supplied.

References

Sarndal, Swensson and Wretman (1992), Model Assisted Survey Sampling, ch. 9; Fuller (1998), Statistica Sinica 8(4); Kim, Navarro and Fuller (2006); Beaumont and Patak (2012); Opsomer and Erciulescu (2021), Survey Methodology.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.