Missing data mechanisms with an analyst's decision checklist
In this article (6 sections)
Investigate why values are missing before choosing deletion or imputation. MCAR, MAR and MNAR describe assumptions about the missingness process relative to observed and unobserved data; they are not labels a null-count table can reliably assign by itself.
A useful analyst workflow combines source knowledge, missingness patterns and sensitivity analysis, while preserving the original missing-value indicators.
Distinguish the mechanisms
MCAR means missingness does not depend on the relevant observed or unobserved values. MAR permits dependence on observed information, with no additional dependence on the missing values after conditioning on that information. MNAR retains dependence on unobserved values under the specified model.
Stef van Buuren's missing-data mechanism discussion explains these concepts and their implications for handling missing observations. MAR is an assumption relative to the information available, not a claim that missingness is uniformly random.
Construct three mechanisms deliberately
The simulation below creates a fully observed binary segment x and an outcome y related to that segment. It then hides outcomes through three explicitly authored processes.
import numpy as np
rng = np.random.default_rng(157)
x = rng.binomial(1, .5, size=20000)
y = 2 + 2*x + rng.normal(0, 1, size=len(x))
missing = {
'MCAR': rng.random(len(x)) < .3,
'MAR_given_x': rng.random(len(x)) < (.1 + .6*x),
'MNAR': rng.random(len(x)) < (1/(1+np.exp(-(y-3)))),
}
full_mean = float(y.mean())
observed_means = {name: float(y[~mask].mean()) for name, mask in missing.items()}
assert abs(observed_means['MCAR'] - full_mean) < .06
assert observed_means['MAR_given_x'] < full_mean - .2
assert observed_means['MNAR'] < full_mean - .2
assert all(0 < mask.mean() < 1 for mask in missing.values())
print({'full_mean': full_mean, 'observed_means': observed_means,
'missing_rates': {name: float(mask.mean()) for name, mask in missing.items()}})The mechanisms are known because the code constructs them. The result is not a diagnostic algorithm that can discover the true mechanism from an incomplete real dataset. Run it in the analyst statistics lab.
Explain the MAR example carefully
In the MAR_given_x process, x=1 outcomes are more likely to be missing. Because x=1 also tends to have larger y, the unadjusted observed mean is lower than the full mean.
Conditioning on the fully observed x is relevant to a justified adjustment under this authored mechanism. Simply calling the data MAR does not mean complete-case averaging is unbiased for every target quantity.
In the MNAR process, missingness depends directly on y, including the values that become hidden. An adjustment based only on observed x would not automatically remove that dependence.
Use a decision checklist before repairing
- 1Define the field, target population and estimand affected by missingness.
- 2Separate absent records, blank fields, invalid values and failed joins.
- 3Profile missingness by source, time and observed segment with denominators.
- 4Ask source owners about collection, eligibility and system changes.
- 5State the assumption required by the proposed handling method.
- 6Test sensitivity to plausible alternative missing-value scenarios.
These steps generate evidence and expose assumptions. They do not guarantee that the missingness mechanism is identifiable from observed data.
Avoid repairs that erase uncertainty
Mean filling can make a column look complete while reducing observed variability and treating estimated values as known. Zero filling can invent behavior. Dropping incomplete rows can change the represented population.
Methods such as multiple imputation or weighting require an appropriate model, included variables and uncertainty treatment. They should be evaluated for the actual estimand rather than selected solely because they remove nulls.
Keep imputed values and indicators traceable, and report how conclusions change under plausible assumptions. For some operational reports, obtaining the missing source data is preferable to estimating it.
Exercise: remove x from the analyst's available dataset while keeping the same authored MAR_given_x process. Explain why the missingness assumption relative to available information changes, even though the data-collection code did not.
NeuraPath's Data Analytics with Generative AI course connects missing-value handling with statistical reasoning. A credible analysis states which assumptions make its repair defensible and which uncertainty remains.
Continue learning
This article is part of the Statistics for analytical decisions sequence. Use the neighbouring tasks when you need the prerequisite or the next application.
- Review the prerequisite or neighbouring task in Sequential peeking: why stopping at significance misleads.
- Continue with Regression coefficients: distinguish association from intervention.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI