Skip to contents

Model for the outcome for the mass imputation estimator. The implementation is currently based on RANN::nn2 function and thus it uses Euclidean distance for matching units from SAS_A (non-probability) to SBS_B (probability) based on predicted values from model xi\boldsymbol{x}_i based either on method_glm or method_npar. Estimation of the mean is done using SBS_B sample.

This implementation extends Yang et al. (2021) approach as described in Chlebicki et al. (2025), namely:

pmm_weights

if k>1 weighted aggregation of the mean for a given unit is used. We use distance matrix returned by RANN::nn2 function (pmm_weights from the control_out() function)

nn_exact_se

if the non-probability sample is small we recommend using a mini-bootstrap approach to estimate variance from the non-probability sample (nn_exact_se from the control_inf() function)

pmm_k_choice

the main nonprob function allows for dynamic selection of k neighbours based on the variance minimization procedure (pmm_k_choice from the control_out() function)

Usage

method_pmm(
  y_nons,
  X_nons,
  X_rand,
  svydesign,
  weights = NULL,
  family_outcome = "gaussian",
  start_outcome = NULL,
  vars_selection = FALSE,
  pop_totals = NULL,
  pop_size = NULL,
  control_outcome = control_out(),
  control_inference = control_inf(),
  verbose = FALSE,
  se = TRUE
)

Arguments

y_nons

target variable from non-probability sample

X_nons

a model.matrix with auxiliary variables from non-probability sample

X_rand

a model.matrix with auxiliary variables from non-probability sample

svydesign

a svydesign object

weights

case / frequency weights from non-probability sample

family_outcome

family for the glm model

start_outcome

start parameters

vars_selection

whether variable selection should be conducted

pop_totals

a place holder (not used in method_pmm)

pop_size

population size from the nonprob function

control_outcome

controls passed by the control_out function

control_inference

controls passed by the control_inf function

verbose

parameter passed from the main nonprob function

se

whether standard errors should be calculated

Value

an nonprob_method class which is a list with the following entries

model_fitted

fitted model either an glm.fit or cv.ncvreg object

y_nons_pred

predicted values for the non-probablity sample

y_rand_pred

predicted values for the probability sample or population totals

coefficients

coefficients for the model (if available)

svydesign

an updated surveydesign2 object (new column y_hat_MI is added)

y_mi_hat

estimated population mean for the target variable

vars_selection

whether variable selection was performed

var_prob

variance for the probability sample component (if available)

var_nonprob

variance for the non-probability sampl component

model

model type (character "pmm")

family

depends on the method selected for estimating E(Y|X)

Details

Matching

In the package we support two types of matching:

  1. y^y^\hat{y} - \hat{y} matching (default; control_out(pmm_match_type = 1)).

  2. y^y\hat{y} - y matching (control_out(pmm_match_type = 2)).

Analytical variance

The variance of the mean is estimated based on the following approach (a) non-probability part (SAS_A with size nAn_A; denoted as var_nonprob in the result) is currently estimated using the non-parametric mini-bootstrap estimator proposed by Chlebicki et al. (2025, Algorithm 2). It is not proved to be consistent but with good finite population properties. This bootstrap can be applied using control_inference(nn_exact_se=TRUE) and can be summarized as follows:

  1. Sample nAn_A units from SAS_A with replacement to create SAS_A' (if pseudo-weights are present inclusion probabilities should be proportional to their inverses).

  2. Estimate regression model E[YX]=m(X,)\mathbb{E}[Y|\boldsymbol{X}]=m(\boldsymbol{X}, \cdot) based on SAS_{A}' from step 1.

  3. Compute ν^(i,t)\hat{\nu}'(i,t) for t=1,,k,iSBt=1,\dots,k, i\in S_{B} using estimated m(x,)m(\boldsymbol{x}', \cdot) and {(yj,xj)jSA}\left\lbrace(y_{j},\boldsymbol{x}_{j})| j\in S_{A}'\right\rbrace.

  4. Compute 1kt=1kyν^(i)\displaystyle\frac{1}{k}\sum_{t=1}^{k}y_{\hat{\nu}'(i)} using YY values from SAS_{A}'.

  5. Repeat steps 1-4 MM times (we set (hard-coded) M=50M=50 in our code).

  6. Estimate V^1=var(μ^)\hat{V}_1=\text{var}({\hat{\boldsymbol{\mu}}}) obtained from simulations and save it as var_nonprob.

(b) probability part (SBS_B with size nBn_B; denoted as var_prob in the result)

This part uses functionalities of the {survey} package and the variance is estimated using the following equation:

V^2=1N2i=1nBj=1nBπijπiπjπijm(xi;β^)πim(xi;β^)πj. \hat{V}_2=\frac{1}{N^2} \sum_{i=1}^{n_B} \sum_{j=1}^{n_B} \frac{\pi_{i j}-\pi_i \pi_j}{\pi_{i j}} \frac{m(\boldsymbol{x}_i; \hat{\boldsymbol{\beta}})}{\pi_i} \frac{m(\boldsymbol{x}_i; \hat{\boldsymbol{\beta}})}{\pi_j}.

Note that V^2\hat{V}_2 in principle can be estimated in various ways depending on the type of the design and whether population size is known or not.

Examples


data(admin)
data(jvs)
jvs_svy <- svydesign(ids = ~ 1,  weights = ~ weight, strata = ~ size + nace + region, data = jvs)

res_pmm <- method_pmm(y_nons = admin$single_shift,
                      X_nons = model.matrix(~ region + private + nace + size, admin),
                      X_rand = model.matrix(~ region + private + nace + size, jvs),
                      svydesign = jvs_svy)

res_pmm
#> Mass imputation model (PMM approach). Estimated mean: 0.6969 (se: 0.0146)