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_norsvyplan_precresult for a mean or a proportion, fromn_mean(),n_prop(),prec_mean()orprec_prop(). It supplies two things: the responding sample the panel must deliver, and the estimand whose precision is reported at every wave. Its ownresp_rateis removed first, so the requirement is a count of respondents and no response is counted twice: the panel'sresp_rateis the only recruitment response that reaches the answer. Where the two differ the target's is reported as unused, at the call and again insummary(). 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 wavejrespondents who respond again at wavej + 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],
1by default. It is separate fromretentionbecause 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 asurvey.designor asvyplan()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_issuedFixed panels only. Units to issue to the one cohort.
n_entrants,n_in_sample,n_cohortsRotating 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_sampleis also the cumulative recruitment that reaching a steady state takes, whether the cohorts are taken on at once or phased in over the firstn_cohortsoccasions.n_targetThe responding sample the target requires.
n_respThe responding sample the design delivers where the target is stated: at
target_wavefor a fixed panel, pooled across the live cohorts for a rotating one. It is whatse,moeandcvare computed on.n_assured,assured_feasibleRecruitment 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,rmoePrecision of the embedded estimand at
n_resp. For a fixed panel sized in the usual direction these reproduce the target's own precision exactly.wavesOne row per wave of a unit's life: the conditional
retentioninto it, the cumulative response probabilityq, the shareloss_shareof the whole life's loss that happens at it, the expected respondentsn_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 andn_respsums to the occasion's sample.start,launch,launch_wavesPresent when
startwas given.launchhas 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, andsteady_statemarking 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_wavesdecomposes 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, aswavesis.targetThe 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