Skip to contents

Compute the sampling error (SE, margin of error, CV) for the equal-weight mean of the occasion estimates of a repeated survey, given the size of each occasion and how far consecutive occasions overlap. An annual average from quarterly rounds is the ordinary case. This is the inverse of n_pooled().

Usage

prec_pooled(var = NULL, ...)

# Default S3 method
prec_pooled(
  var = NULL,
  n,
  occasions,
  ...,
  sd = NULL,
  p = NULL,
  mu = NULL,
  alpha = 0.05,
  N = Inf,
  deff = 1,
  resp_rate = 1,
  overlap = 0,
  overlap_cor = NULL,
  cor_decay = NULL,
  df = NULL,
  plan = NULL,
  .overlap_basis = NULL
)

# S3 method for class 'svyplan_n'
prec_pooled(var, ...)

Arguments

var

For the default method: the population variance \(S^2\) on one occasion, taken to be the same on each. Supply this or p, not both. For svyplan_n objects: a sample size result from n_pooled().

...

Additional arguments passed to methods. Unused arguments are rejected.

n

Sample size per occasion, gross units drawn.

occasions

Number of occasions entering the average, at least 2.

sd

Population standard deviation on one occasion, an alternative spelling of var. Supply exactly one of var or sd.

p

The proportion being averaged, as an alternative to var. The occasion variance is then \(Np(1-p)/(N-1)\), the same finite population variance prec_prop() uses, and mu is determined and must not be supplied.

mu

The level being averaged, on the var scale. Required only for the relative measures: cv and rmoe are defined against it and are NA without it. Determined by p on the proportion scale.

alpha

Significance level, default 0.05.

N

Population size. Inf (default) means no finite population correction.

deff

Design effect multiplier (> 0), applied to the variance of the pooled estimate rather than to any one occasion. See Details.

resp_rate

Expected response rate, in (0, 1]. Default 1 (no adjustment). It applies to every occasion and nets each size down to n * resp_rate before the covariance is formed. It is a single round's response, not attrition across a panel.

overlap

Fraction of one occasion's responding sample carried into a later one, in [0, 1]. One number, meaning the same overlap at every lag, or one per lag, so overlap[1] is the consecutive-occasion figure. A design_overlap() result is accepted directly at resp_rate = 1; see Details on why not below it. 0 (default) makes the occasions independent, and the pooled variance is then a single occasion's divided by occasions.

overlap_cor

Correlation between two occasions among the units they share, in [0, 1]. One number for every lag, or one per lag. Default 0, which makes overlap irrelevant, since it is the product overlap * overlap_cor that moves the variance. Supply this or cor_decay, not both.

cor_decay

Correlation at lag \(m\) taken as \(\rho^m\), an alternative to stating overlap_cor lag by lag. It is the shape most panels have, a correlation falling away with distance, and a single number is rarely the right one over a long horizon.

df

Degrees of freedom of the variance estimator the planned design will have, typically sampled PSUs minus strata, and available from design_df(). It switches the interval quantile from normal to t. NULL (default) applies no adjustment.

plan

Optional svyplan() object providing design defaults.

.overlap_basis

Internal. Records whether a stored overlap profile was resolved from a design_overlap() object ("issued") or supplied as respondent overlap ("respondent"), so that a round trip or a grid meets the same refusal the first call would have. Set from the result being re-read; there is no reason to pass it by hand.

Value

A svyplan_prec object with type = "pooled":

se

Standard error of the pooled estimate, computed on the net sizes n * resp_rate.

moe

Margin of error, qnorm(1 - alpha / 2) * se.

cv

Standard error relative to the level, se / abs(mu). NA when mu is neither supplied nor determined by p.

params

The validated inputs. Dispersion is always stored as var, and overlap and overlap_cor as resolved vectors of one entry per lag, whatever form they were supplied in, alongside the overlap_basis they were resolved under.

Nothing here is rounded, so passing a continuous n back from n_pooled() reproduces its se, moe and cv exactly.

Details

The estimand is the equal-weight mean of the occasion estimates, \(\bar y = T^{-1}\sum_t \bar y_t\). Three things share that name and this is none of the other two: it is not a pooled variance, and it is not the pooling of the rotating cohorts that make up one occasion, which n_panel() describes.

Writing \(T\) for occasions, \(n\) for the net size, \(o_m\) for the overlap at lag \(m\) and \(\rho_m\) for the correlation there, the occasions carry

$$Var(\bar y_t) = \frac{S^2}{n}\Big(1 - \frac{n}{N}\Big), \qquad Cov(\bar y_t, \bar y_s) = \rho_m S^2 \Big(\frac{o_m}{n} - \frac{1}{N}\Big),$$

the same kernel prec_change() takes a difference on, and the average of them has

$$V = \frac{1}{T^2}\Big[\,T\,Var(\bar y_t) + 2\sum_{m=1}^{T-1}(T-m)\,Cov_m\Big].$$

A lag whose overlap is zero contributes exactly zero, which is the rule prec_change() applies at overlap = 0 read lag by lag. Two boundaries fix the whole: a fresh sample each occasion pools to \(Var(\bar y_t)/T\), independent averaging, and a full panel measured with correlation 1 pools to \(Var(\bar y_t)\), the same units every time and averaging buys nothing.

deff multiplies the assembled variance. It is the design effect of the pooled estimate, which is not in general any one occasion's.

Overlap works against a pooled estimate, when it works at all

A covariance is subtracted in a difference and added in a sum, so whichever sign it carries, it moves a change and a pooled average in opposite directions. When the covariance is positive, which is the ordinary case, overlap improves a change and inflates a pooled average, and planners routinely get that backwards.

The covariance is positive exactly when \(o_m > n/N\): shared units above what independent draws from the same finite population would already give the two occasions. Without a finite population correction any positive overlap qualifies, so the ordinary case is the only case there. With one, an overlap below the sampling fraction means the occasions are negatively coordinated, sharing fewer units than chance, and the directions reverse: at N = 1000, n = 500, overlap = 0.25 and overlap_cor = 0.8, two occasions have a pooled variance of 0.030 against 0.050 for independent ones, while the change variance rises from 0.200 to 0.280. The kernel is a valid covariance throughout.

The level at a single occasion is unaffected either way, being a function of that occasion's size alone, so it is a reference line rather than a third position: what trades off is the change against the pooled estimate. ?prec_change and this page size the two arms.

Issued overlap and respondent overlap

A bare number is the overlap between the responding samples, matching prec_change(). design_overlap() reports the overlap between the issued ones, and the two coincide only at full response, so its result is accepted here at resp_rate = 1 and refused below it. The conversion needs an assumption about how response at one occasion depends on response at another, which this function does not make: under independent response the responding overlap is about resp_rate times the issued one, and stating it is the planner's decision rather than this function's.

When the inputs do not describe a covariance

A lag's covariance changes sign once its overlap falls below the sampling fraction n / N, and a covariance whose sign varies across lags need not be a valid covariance at all. This is checked on the assembled matrix, because a kernel that fails it can still return a positive pooled variance, and a design refused here is one whose stated overlap, correlation and sampling fraction cannot hold together. High sampling fractions are where it bites, from about n / N = 0.6 upwards over a long horizon, and much of that region is also a rotation that would exhaust its own population; the message says so when it does.

What the overlap covariance assumes

As in prec_change(), the covariance is a model form, a correlation between occasions among the units they share and simple random sampling otherwise. It is not the design-based covariance of a complex master sample, which carries its own pairwise inclusion probabilities.

References

Kish, L. (1965). Survey Sampling. Wiley. Chapter 12.

See also

n_pooled() for the inverse (compute n from a precision target), prec_change() for the other arm of the trade-off, design_overlap() for the overlap a rotation schedule gives, prec_mean() and prec_prop() for a single occasion.

Other precision functions: prec_alloc(), prec_change(), prec_cluster(), prec_mean(), prec_multi(), prec_multi_cluster(), prec_panel(), prec_prop(), prec_twophase()

Examples

# Four independent quarterly rounds averaged into an annual figure
prec_pooled(var = 100, n = 500, occasions = 4)
#> Sampling precision for pooled estimate (mean scale)
#> n = 500 per occasion, 4 occasions (var = 100, deff = 1)
#> No between-occasion covariance (overlap x overlap_cor = 0)
#> se = 0.2236, moe = 0.4383

# The same rounds from a rotating panel: overlap inflates the average
prec_pooled(var = 100, n = 500, occasions = 4, overlap = 0.75,
            cor_decay = 0.8)
#> Sampling precision for pooled estimate (mean scale)
#> n = 500 per occasion, 4 occasions (var = 100, deff = 1)
#> overlap = 0.75, overlap_cor = 0.8 at lag 1, shared out to lag 3
#> se = 0.3586, moe = 0.7029

# An annual average of a proportion measured monthly
prec_pooled(p = 0.3, n = 1200, occasions = 12, overlap = 0.75,
            cor_decay = 0.9)
#> Sampling precision for pooled estimate (proportion scale)
#> n = 1200 per occasion, 12 occasions (p = 0.3, deff = 1)
#> overlap = 0.75, overlap_cor = 0.9 at lag 1, shared out to lag 11
#> se = 0.009682, moe = 0.01898, cv = 0.03227, rmoe = 0.06325

# Overlap read off a rotation schedule, at full response
prec_pooled(var = 100, n = 500, occasions = 8,
            overlap = design_overlap("4", max_lag = 7), cor_decay = 0.8)
#> Sampling precision for pooled estimate (mean scale)
#> n = 500 per occasion, 8 occasions (var = 100, deff = 1)
#> overlap = 0.75, overlap_cor = 0.8 at lag 1, shared out to lag 3
#> se = 0.2593, moe = 0.5083

# Round-trip from n_pooled
res <- n_pooled(var = 100, moe = 1, occasions = 4, overlap = 0.5,
                cor_decay = 0.7)
prec_pooled(res)
#> Sampling precision for pooled estimate (mean scale)
#> n = 179 per occasion, 4 occasions (var = 100, deff = 1)
#> overlap = 0.5, overlap_cor = 0.7 at lag 1, shared out to lag 3
#> se = 0.5102, moe = 1