Skip to contents

Compute how many units to recruit so that a panel still delivers a required responding sample after several waves of attrition, either for a fixed panel followed to a chosen wave or for a rotating panel at steady state. The requirement and the estimand both come from an existing sizing or precision result, so the panel arithmetic is stated once and the design it serves is stated where it always was.

Usage

n_panel(
  target,
  retention,
  ...,
  resp_rate = 1,
  design = c("fixed", "rotating"),
  target_wave = NULL,
  assurance = NULL,
  start = NULL
)

Arguments

target

A svyplan_n or svyplan_prec result for a mean or a proportion, from n_mean(), n_prop(), prec_mean() or prec_prop(). It supplies two things: the responding sample the panel must deliver, and the estimand whose precision is reported at every wave. Its own resp_rate is removed first, so the requirement is a count of respondents and no response is counted twice: the panel's resp_rate is the only recruitment response that reaches the answer. Where the two differ the target's is reported as unused, at the call and again in summary(). Clustered, allocation, multi-indicator, multi-domain, change and two-phase results are refused, their stage-specific and occasion-specific sizes not being one responding count.

retention

Conditional retention, one value per wave transition, each in (0, 1]. retention[j] is the share of wave j respondents who respond again at wave j + 1. Its length plus one is the number of waves in a unit's life, so a five-wave panel takes four values.

...

Additional arguments are not supported and produce an error.

resp_rate

Response rate at recruitment, wave 1, in (0, 1], 1 by default. It is separate from retention because the first wave is where most of a panel's loss happens, and an average rate spread over the waves would under-issue.

design

"fixed" for one cohort followed across its waves, or "rotating" for equal cohorts entering every occasion and leaving at the end of their life. The two return different quantities, described under Value. This argument names the panel type. It never accepts a survey.design or a svyplan() object.

target_wave

The wave at which the target must be met, defaulting to the last. Sizing to reach a precision at wave 3 of a five-wave panel is a legitimate request, and waves 4 and 5 are still reported. It must be absent for a rotating design, whose target is an occasion rather than a wave.

assurance

Probability in (0, 1), or NULL (default). The recruitment above is an expected-value calculation, which leaves about half of all panels short of the target. Supplying a level reports, next to it, the recruitment for which the required respondents arrive with at least that probability. See Details.

start

How a rotating design's cohorts are brought in, or NULL (default). "gradual" recruits one cohort an occasion, so the design fills up over a life; "immediate" splits the first occasion into equal panels planned for life lengths from the full life down to one occasion, all beginning at wave 1, so it is full at once. Supplying either reports what the design delivers at each occasion until it settles. The default plans no launch, which is what the recruitment above describes either way. Not available for a fixed panel, which recruits one cohort.

Value

A svyplan_panel object. prec_panel() returns the same class, $solved naming the direction it was computed in. Fields:

n_issued

Fixed panels only. Units to issue to the one cohort.

n_entrants, n_in_sample, n_cohorts

Rotating panels only. Entrants per occasion once the design is running, the units the design holds across every live cohort, and how many cohorts that is. The first two are different budget lines and are named separately for that reason: n_in_sample is also the cumulative recruitment that reaching a steady state takes, whether the cohorts are taken on at once or phased in over the first n_cohorts occasions.

n_target

The responding sample the target requires.

n_resp

The responding sample the design delivers where the target is stated: at target_wave for a fixed panel, pooled across the live cohorts for a rotating one. It is what se, moe and cv are computed on.

n_assured, assured_feasible

Recruitment meeting the target with probability at least assurance, when a level was given, and whether a finite population can supply it. See Details.

se, moe, cv, rmoe

Precision of the embedded estimand at n_resp. For a fixed panel sized in the usual direction these reproduce the target's own precision exactly.

waves

One row per wave of a unit's life: the conditional retention into it, the cumulative response probability q, the share loss_share of the whole life's loss that happens at it, the expected respondents n_resp, and the precision an estimate using only those respondents would have. For a rotating design the rows are the cohorts alive at one occasion and n_resp sums to the occasion's sample.

start, launch, launch_waves

Present when start was given. launch has one row per occasion up to the steady state and one past it: the entrants taken on, the units in sample, the expected respondents, the precision they buy, and steady_state marking the occasion from which the design holds one cohort at every wave. That is the composition rather than the count. Where no wave loses anyone, the counts coincide from the first occasion and the mix still does not. launch_waves decomposes each occasion into the waves in sample at it, which is where the reason for the precision at an occasion can be read. Both are continuous, as waves is.

target

The embedded object, unchanged.

Details

Writing \(r\) for resp_rate and \(c_j\) for retention[j], the probability that a unit approached at recruitment is still responding at wave \(w\) is

$$q_w = r \prod_{j < w} c_j,$$

and the two designs invert it differently:

$$\text{fixed: } n_{\text{issued}} = n_{\text{target}} / q_w, \qquad \text{rotating: } n_{\text{entrants}} = n_{\text{target}} / \sum_{s} q_s.$$

Both are exact expected values under the stated rates. They are not the same quantity and the object never writes one over the other. The fixed figure is the whole issue to one cohort, while the rotating figure is what enters at each occasion, with n_in_sample the separate line for the units every live cohort holds at once.

A rotating panel pools every live cohort into one occasion, so its responding sample is \(e \sum_s q_s\) rather than one cohort's count at its final wave. On the example below the two differ by a factor of five.

Where a panel loses its sample

waves$loss_share divides the whole life's loss across the waves. It is usually concentrated at recruitment, 61 percent of it in the example below, which is the argument for resp_rate and retention being separate arguments rather than one average rate.

Bringing a rotating design up to its steady state

A rotating design's recruitment describes it at a steady state, which it reaches once every stage of the life is represented at one occasion. Getting there is a design decision, and start reports what each choice delivers on the way.

A gradual launch recruits one cohort an occasion, so the sample climbs over a full life before it is the design's own. An immediate launch splits the first occasion into equal panels with planned life lengths from the full life down to one occasion. Every panel begins at wave 1, and together they hold the whole sample from the first occasion. design_overlap() gives the same mature membership-overlap profile under either launch. During a gradual launch, realized overlap is higher until every life stage is represented because no full set of cohorts has yet rotated through. The launch tables therefore describe both the early membership mix and its response and precision path.

The point of reporting it is that an immediate launch is not in response equilibrium at its first occasion even though it is in membership equilibrium. Every unit there is at wave 1, so that occasion holds

$$R_1 - e \sum_s q_s = e \sum_s (q_1 - q_s) \ge 0,$$

at least as many respondents as the design ever holds again, and strictly more as soon as any wave retains less than all of the one before. The two coincide exactly when every retention is 1, whatever resp_rate is, since it cancels from both sides. Where they differ the early precision is temporarily better. On the example below the first occasion holds 1172 respondents against the design's 1001, moe 0.0287 against 0.0310, converging down as the interview mix matures. A gradual launch approaches the same figure from below. Either way the early occasions rest on a different response composition from the rest of the series, which launch_waves is there to expose and which is what nonresponse weighting has to carry.

Both are described for a life without a break in it. A schedule that leaves the sample and returns needs launch cohorts that are selected before they are first interviewed, which is a longer definition than this argument carries.

Assurance

For a fixed panel the assured recruitment is the smallest \(g\) with \(P(\mathrm{Binomial}(g, q_w) \ge n_{\text{target}}) \ge\) assurance. For a rotating panel the respondents at one occasion are a sum of binomials at different cumulative probabilities, one per live cohort, so the distribution is Poisson-binomial rather than binomial. It is assembled exactly, by convolving one distribution per cohort, rather than approximated by a binomial on their mean rate.

The level is marginal. For a rotating design it holds at one occasion, and consecutive occasions share cohorts, so the chance that every occasion of a run clears its target is lower and is not computed here.

A requested level can be out of reach. Where the assured recruitment exceeds a finite N, not even a census of the frame delivers the target that often. The recruitment it would take is still reported, that being the number a planner needs in order to argue for a larger frame or a smaller target, and assured_feasible is FALSE alongside a warning. Neither the expected design nor its precision is affected, which is why this is not an error: assurance is an addition to a plan that stands without it. A warning alone would not do, though, since it does not survive into the object a script reads.

What the rates are, and what they are not

This is arithmetic on declared rates. Where the rates come from is the planner's problem: attrition modelling, attrition weighting and any adjustment for informative dropout are outside what the package does.

Two assumptions are worth stating because they push in opposite directions. A unit lost at wave \(j\) is treated as lost for good, so a panel whose nonrespondents return at a later wave will do better than planned here and this over-issues. And the rates are one set for the whole sample: where response differs by domain, recruitment should be solved separately within groups of similar attrition, which over-represents the hard-to-retain groups at wave 1. Call n_panel() once per group and hand the results on as a named vector.

A target's constraints hold where the target is stated. Sizing to a min_cases floor at wave 3 of a five-wave panel leaves waves 4 and 5 with fewer expected cases than the floor, which is a consequence of target_wave and not a failure of the constraint.

The deff of the embedded target is applied unchanged at every wave. A panel adds a within-unit correlation over time that a cross-sectional design effect does not describe, and that correlation works for a change and against a pooled average, so a design serving either should carry a design effect chosen for that estimand.

One class for both directions

n_panel() and prec_panel() both return svyplan_panel, unlike the rest of the package where the two directions return svyplan_n and svyplan_prec. A panel's recruitment and its precision move together across the waves and are only readable side by side, so the object holds both whichever direction produced it, and $solved records which. The class is a sibling of svyplan_n, not a subtype: $n_issued is a count of units to release, and the methods registered for an analysis sample would each answer a different question about it.

References

Smith, P., Lynn, P., and Elliot, D. (2009). Sample design for longitudinal surveys. In P. Lynn (ed.), Methodology of Longitudinal Surveys, 21-33. Wiley.

See also

prec_panel() for the same design from a recruitment you already have, design_overlap() for the overlap a rotation produces, n_change() for sizing the change between two occasions.

Other sample size functions: n_alloc(), n_change(), n_cluster(), n_mean(), n_multi(), n_multi_cluster(), n_pooled(), n_prop(), n_twophase()

Examples

# UK LFS: five quarterly waves, 73 percent at recruitment then high
# conditional retention. Issue 1815 addresses to hold 1000 at wave 5.
target <- n_prop(p = 0.5, moe = 0.031)
lfs <- n_panel(
  target,
  retention = c(0.878, 0.963, 0.936, 0.956),
  resp_rate = 0.728
)
lfs
#> Panel recruitment (fixed, 5-wave life)
#> issued: 1815 -> 1000 responding at wave 5
#> proportion (wald): se = 0.01582, moe = 0.031, cv = 0.0316
#> 
#>  wave retention n_resp se      moe    
#>  1              1321   0.01376 0.02696
#>  2    0.878     1160   0.01468 0.02878
#>  3    0.963     1117   0.01496 0.02932
#>  4    0.936     1046   0.01546 0.03031
#>  5    0.956     1000   0.01582 0.031  
#> 
#> # summary() for the launch, the loss and per-wave cv

# Precision at every wave, and where the loss happens
lfs$waves
#>   wave retention         q loss_share    n_resp         se        moe
#> 1    1        NA 0.7280000 0.60550724 1320.8645 0.01375754 0.02696429
#> 2    2     0.878 0.6391840 0.19771592 1159.7190 0.01468228 0.02877675
#> 3    3     0.963 0.6155342 0.05264754 1116.8094 0.01496168 0.02932436
#> 4    4     0.936 0.5761400 0.08769657 1045.3336 0.01546474 0.03031033
#> 5    5     0.956 0.5507898 0.05643274  999.3389 0.01581662 0.03100000
#>           cv expected_cases
#> 1 0.02751509       660.4322
#> 2 0.02936457       579.8595
#> 3 0.02992337       558.4047
#> 4 0.03092947       522.6668
#> 5 0.03163323       499.6695

# The same rates run as a rotating panel: entrants per occasion, and the
# larger number the five live cohorts hold between them
rot <- n_panel(
  target,
  retention = c(0.878, 0.963, 0.936, 0.956),
  resp_rate = 0.728,
  design = "rotating"
)
c(entrants = rot$n_entrants, in_sample = rot$n_in_sample)
#>  entrants in_sample 
#>  321.3672 1606.8361 

# Sizing to reach the target earlier: waves past it carry fewer units
n_panel(target, retention = c(0.878, 0.963, 0.936, 0.956),
        resp_rate = 0.728, target_wave = 3)$waves$n_resp
#> [1] 1181.9307 1037.7351  999.3389  935.3812  894.2245

# What the design delivers while it is being brought up
n_panel(target, retention = c(0.878, 0.963, 0.936, 0.956),
        resp_rate = 0.728, design = "rotating",
        start = "immediate")$launch
#>   period n_entrants n_in_sample    n_resp         se        moe         cv
#> 1      1  1606.8361    1606.836 1169.7767 0.01461903 0.02865277 0.02923806
#> 2      2   321.3672    1606.836 1055.6065 0.01538930 0.03016248 0.03077861
#> 3      3   321.3672    1606.836 1032.8056 0.01555825 0.03049361 0.03111650
#> 4      4   321.3672    1606.836 1007.4856 0.01575254 0.03087441 0.03150508
#> 5      5   321.3672    1606.836  999.3389 0.01581662 0.03100000 0.03163323
#> 6      6   321.3672    1606.836  999.3389 0.01581662 0.03100000 0.03163323
#>         rmoe steady_state expected_cases
#> 1 0.05730554        FALSE       584.8883
#> 2 0.06032496        FALSE       527.8032
#> 3 0.06098721        FALSE       516.4028
#> 4 0.06174882        FALSE       503.7428
#> 5 0.06200000         TRUE       499.6695
#> 6 0.06200000         TRUE       499.6695

# The same recruitment phased in one cohort an occasion instead
n_panel(target, retention = c(0.878, 0.963, 0.936, 0.956),
        resp_rate = 0.728, design = "rotating",
        start = "gradual")$launch$n_resp
#> [1] 233.9553 439.3681 637.1806 822.3331 999.3389 999.3389

# Why the first occasion of an immediate launch is the most precise one:
# every unit in it is at wave 1
imm <- n_panel(target, retention = c(0.878, 0.963, 0.936, 0.956),
               resp_rate = 0.728, design = "rotating", start = "immediate")
subset(imm$launch_waves, period <= 2)
#>   period wave  n_issued    n_resp
#> 1      1    1 1606.8361 1169.7767
#> 2      2    1  321.3672  233.9553
#> 3      2    2 1285.4689  821.6511

# Expected recruitment leaves half of all panels short, and assurance does
# not
n_panel(target, retention = c(0.9, 0.9), resp_rate = 0.8,
        assurance = 0.95)$n_assured
#> [1] 1591