Answer
If you think there's a strong relationship between the 2020 value and the current value, then it would be helpful to also use probability proportional to size (PPS) sampling. PPS sampling is commonly used by statistical agencies such as the U.S. Bureau of Labor Statistics, which for example samples businesses with probabilities proportional to a measure of size such as total employees or reported income.
PPS sampling can be used in addition to or instead of stratified sampling. So you can define strata, allocate sample sizes using Neyman allocation, and then sample objects within each stratum using probabilities proportional to your "measure of size", which in this case is the known 2020 dollar value of the object.
A simpler and probably more effective method is to use systematic sampling with probability proportional to size. Systematic sampling can be used to implicitly stratify your data, so that you don't have to define strata manually and conduct Neyman allocation. This blog post provides an explanation of how systematic sampling is used to "implicitly stratify" a population for the purpose of sampling:
https://www.practicalsignificance.com/posts/systematic-sampling-as-implicit-stratification/
Systematic sampling often tends to be more precise than regular stratified simple random sampling.
References
Chapter 6 of the classic sampling textbook "Sampling: Design and Analysis" by Sharon Lohr provides a good introduction to PPS sampling. Section 5.6 of "Sampling and Estimation from Finite Population" by Yves Tillé provides a more detailed mathematical treatment of the method of systematic PPS sampling. Page 205 of the textbook "Sampling Techniques" by William Cochran provides a more accessible introduction to systematic sampling and an intuitive explanation of why it often yields more precise estimates compared to stratified simple random sampling.
- Lohr, Sharon L. 2022. Sampling: Design and Analysis. Third edition. Boca Raton: CRC Press.
- Tillé, Yves. 2020. Sampling and Estimation from Finite Population. Hoboken, NJ: Wiley.
- Cohcran, William. 1977. Sampling Techniques. Third Edition.
Software
The 'sampling' package in R provides methods for PPS sampling, including the method of systematic PPS sampling.
https://cran.r-project.org/web/packages/sampling/index.html
The example R code below shows how to select a sample using systematic PPS sampling, and repeats this 10,000 times using simulation so that we can see how accurate the estimates are based on this sampling method.
In this example, we draw a sample of 500 libraries from a Census of 9,245 U.S. public libraries. We want to estimate the mean circulation among libraries in the U.S. So we define our sampling probabilities proportional to library size, where size is measured in terms of the total number of staff at a library. This makes sense since these two variables are fairly correlated (i.e., libraries with more staff also tend to have more books).
In the simulation output below, we can see that on average the estimate from our sample is no more than about 9% too small or too large.
library(sampling)
# Load example data to use as a population ----
data('library_census', package = 'svrep')
# Impute missing values ----
library_census$TOTSTAFF <- ifelse(
is.na(library_census$TOTSTAFF),
mean(library_census$TOTSTAFF, na.rm = TRUE),
library_census$TOTSTAFF
)
library_census$TOTCIR <- ifelse(
is.na(library_census$TOTCIR),
mean(library_census$TOTCIR, na.rm = TRUE),
library_census$TOTCIR
)
# Define sampling probabilities to be proportional to `TOTSTAFF`
sampling_probs <- sampling::inclusionprobabilities(
a = pmax(library_census$TOTSTAFF, 0.01),
n = 500
)
# Repeatedly sample using systematic PPS ----
set.seed(2023)
estimates <- replicate(n = 10000, expr = {
sample_indicators <- sampling::UPsystematic(
pik = sampling_probs
) |> as.logical()
selected_sample <- library_census[sample_indicators,]
# Calculate weights to use for estimation
selected_sample$WEIGHT <- 1/sampling_probs[sample_indicators]
# Produce an estimate
survey_estimate <- weighted.mean(
x = selected_sample$TOTCIR,
w = selected_sample$WEIGHT
)
return(survey_estimate)
})
true_value <- mean(library_census$TOTCIR)
relative_error <- abs(estimates - true_value)/true_value
mean(relative_error)
#> [1] 0.0916447