Guides / missing data
Missing data: MCAR, MAR and MNAR
Every real dataset has gaps, and what you may do about them depends entirely on why they are there. This guide explains the three missingness mechanisms in plain terms, why the default of deleting incomplete rows is a decision rather than a neutral starting point, what multiple imputation can and cannot fix, and how to report any of it so a reviewer is satisfied.
Three descriptions of why data is missing. Missing completely at random means the gaps are unrelated to anything, observed or unobserved. Missing at random means the gaps are related to things you did measure, so they can be accounted for. Missing not at random means the gaps are related to the missing values themselves, which no standard method can fix from the data alone. The names are unhelpful, because missing at random does not mean random. It means explainable by what you have.
Definitions
The three mechanisms
| Mechanism | The gaps depend on | Example | Fixable? |
|---|---|---|---|
| MCAR completely at random | Nothing | A freezer fails and destroys a random batch of samples | Yes. Deletion is unbiased, just wasteful. |
| MAR at random | Things you measured | Younger patients skip the income question, and you recorded age | Yes, if the predictors are in your model. |
| MNAR not at random | The missing value itself | The highest earners decline to state income | Not from the data alone. |
MCAR is rare outside equipment failure and deliberate sampling. MAR is the working assumption behind most modern methods. MNAR is common in exactly the settings people most want to study: dropout from treatment, non-response on sensitive questions, and people who stop using an app because they recovered or deteriorated.
You can test whether data is MCAR, and Little's test does that. You cannot test MAR against MNAR, because distinguishing them requires the values you do not have. Any claim that data "was shown to be MAR" is at best a claim that it was not MCAR. The mechanism is an argument from how the data arose, not a result.
Consequences
Why the mechanism decides everything
The mechanism determines which methods stay valid, and the hierarchy is strict.
This is also where GEE differs sharply from mixed models. Standard GEE requires MCAR, a stronger assumption than the MAR that mixed models tolerate. In a study with dropout related to anything observed, that difference can decide which method is defensible.
The default
Complete-case analysis is a choice
Deleting rows with any missing value is what software does unless told otherwise, which is why it rarely gets described as a decision. It is one, and it has two costs.
The first is power. With ten variables each missing five per cent at random, around forty per cent of rows can disappear, and the loss compounds silently. The second is bias. Unless data is MCAR, the complete cases are a selected subgroup, and the analysis describes them rather than your sample.
There is a narrower case where complete-case analysis is fine even under MAR: when missingness depends only on variables that are already covariates in your model and the outcome is fully observed. That is a real exemption, worth knowing, and it is not the situation most people are in.
Worked example
How much complete-case analysis costs you
A study measures an outcome Y in two equally sized groups defined by X. Y is missing for some people, and how often depends on X.
| X | Share of sample | True mean of Y | P(Y missing) | Share of complete cases |
|---|---|---|---|---|
| 0 | 50% | 10.0 | 0.2 | 66.7% |
| 1 | 50% | 20.0 | 0.6 | 33.3% |
Missingness depends only on X, which you observed. That makes this missing at random, the condition most modern methods are built for.
Step 1. The answer you want
true mean of Y = (0.5 × 10.0) + (0.5 × 20.0) = 15.00
Step 2. What complete-case analysis gives you
Work out what fraction of the surviving records come from each group. Group X = 0 retains 80% of its half, so 0.40 of the original sample; group X = 1 retains 40% of its half, so 0.20. Together 0.60 of the sample survives.
complete-case mean = (0.40 × 10.0 + 0.20 × 20.0) / 0.60
= 8.0 / 0.60 = 13.33
Step 3. The damage
bias = 13.33 − 15.00 = −1.67
Two things happened at once. You lost 40% of your data, which costs precision. And the surviving records over-represent the low-Y group, which costs accuracy. The second is the serious one, because it shifts the answer rather than widening the interval, and nothing in the output flags it.
Step 4. What fixes it
Because missingness depends only on X, and X is observed, both multiple imputation and inverse probability weighting recover 15.00. Imputation does so by filling in Y from its relationship with X; weighting does so by up-weighting the under-represented group. Either works; neither would work if missingness depended on Y itself.
If you are fitting a regression of Y on X, missingness depends only on X, and X is in your model, then complete-case analysis is unbiased for the regression coefficients even under MAR. You lose precision, not accuracy. That exemption is real and worth knowing, and it does not extend to estimating the mean of Y, which is what went wrong above.
Options
What the methods actually do
| Method | What it does | Verdict |
|---|---|---|
| Complete-case | Drops any row with a gap | Valid under MCAR. Declare it, do not let it happen by default. |
| Mean substitution | Fills gaps with the column mean | Avoid. It shrinks variance and manufactures false precision. |
| Last observation carried forward | Repeats the previous value | Avoid. It assumes people froze at the moment they left. |
| Single regression imputation | Predicts each gap once | Better, but treats a guess as a known value. |
| Multiple imputation | Creates several completed datasets and pools results | The practical default under MAR. |
| Full information maximum likelihood | Uses all available data directly in estimation | Equivalent to MI under MAR, and simpler where available. |
| Inverse probability weighting | Upweights those resembling the missing | Useful, especially for dropout; needs a model of missingness. |
Mean substitution and last observation carried forward still appear in submitted papers. Both are now treated as red flags by reviewers, and the second was effectively retired from regulated trial work years ago.
In practice
Multiple imputation in practice
Multiple imputation fills the gaps several times over, with the variation between those versions carrying the uncertainty that single imputation throws away. Analyse each completed dataset, then pool using Rubin's rules, which combine the estimates and inflate the standard errors to reflect how much the imputations disagreed.
It lets you use the information you already hold without discarding partial records. If a variable is eighty per cent missing, multiple imputation will produce numbers and they will be mostly assumption. There is no threshold at which it becomes dishonest, but there is a point where you should say plainly how much of the result is carried by the imputation model.
The hard case
When it is not at random
If people left because of the thing you are measuring, no complete-data method recovers the truth. What you can do is show how much the conclusion depends on the assumption.
The usual approach is a delta-adjusted sensitivity analysis: impute under MAR, then shift the imputed values by a specified amount in the plausible direction, and repeat across a range of shifts. The output is not a corrected estimate. It is a statement of how large the departure from MAR would have to be before your conclusion changes. If the answer is "a small one", that is important for your reader to know.
In app and wearable research this is routine rather than exceptional. People stop logging for reasons tied to their symptoms, so the gaps are informative by construction, and the same filtering that produces self-selection at recruitment keeps operating throughout follow-up.
Doing it
In R, SPSS and Stata
R
mice is the standard package and handles the whole impute-analyse-pool cycle.
library(mice)
imp <- mice(df, m = 30, method = "pmm", seed = 123)
fit <- with(imp, lm(outcome ~ treatment + age))
summary(pool(fit))
Three details matter. m = 30 rather than the default 5, since a reasonable rule is at least as many imputations as the percentage of incomplete cases. Predictive mean matching keeps imputed values inside the observed range, which avoids impossible values. And pool() applies Rubin's rules, which is what inflates the standard errors to reflect the uncertainty in the imputation. Analysing a single completed dataset skips that entirely.
Inspect the result with densityplot(imp), comparing imputed against observed distributions.
SPSS
Multiple imputation is under Analyze, Multiple Imputation, Impute Missing Data Values.
MULTIPLE IMPUTATION outcome treatment age
/IMPUTE METHOD = AUTO NIMPUTATIONS = 30
/CONSTRAINTS outcome (MIN = 0)
/OUTFILE IMPUTATIONS = imputed.
SPSS then pools automatically when you run supported procedures on the imputed file, showing the pooled row at the bottom of the output. Not every procedure supports pooling, and where it does not SPSS silently reports each imputation separately, so check for the pooled row before reporting anything.
Stata
The mi suite declares the structure, imputes, then prefixes the analysis.
mi set wide
mi register imputed outcome
mi impute chained (pmm, knn(5)) outcome = treatment age, add(30)
mi estimate: regress outcome treatment age
mi estimate applies Rubin's rules and reports the fraction of missing information, which is worth reading: a high value means the result rests heavily on the imputation model rather than on observed data.
Leaving it out is the single most common error in applied multiple imputation and it biases associations towards zero. It feels circular and it is not: the imputation model and the analysis model do different jobs. The imputation model should be at least as rich as the analysis model, including any interactions you intend to fit.
Avoid these
Six mistakes that cost marks
| Mistake | Why it matters |
|---|---|
| Letting complete-case happen by default | Software drops incomplete rows silently. Under MAR this shifted a true mean of 15.00 to 13.33 while discarding 40% of the data. |
| Omitting the outcome from the imputation model | Biases the associations you then estimate towards zero. The commonest error in applied imputation. |
| Using five imputations | Old guidance. Use at least as many as the percentage of incomplete cases; imputations are cheap and instability is not. |
| Mean substitution or last observation carried forward | Both manufacture false precision. The second assumes people froze at the moment they left. |
| Claiming data "was shown to be MAR" | Nothing can distinguish MAR from MNAR. Little's test assesses MCAR only. The mechanism is argued, not demonstrated. |
| Ignoring structure when imputing | Clustered or repeated-measures data needs imputation that respects the grouping, or you flatten the structure the analysis depends on. |
Writing it up
How to report it
Item 12c of the STROBE statement asks for most of this directly, and it is among the items reviewers read first. Answering it properly in the methods removes an entire line of objection before it is raised.
Common questions
Frequently asked questions
What is the difference between MCAR, MAR and MNAR?
MCAR means the gaps are unrelated to anything. MAR means they are related to variables you measured. MNAR means they are related to the missing values themselves. The mechanism decides which methods stay valid: almost anything works under MCAR, likelihood methods and multiple imputation work under MAR, and nothing standard works under MNAR.
Can I test which mechanism applies?
Only partly. Little's test assesses MCAR. Nothing can distinguish MAR from MNAR, because doing so would require the values you do not have. The mechanism is argued from how the data arose, not demonstrated, and papers claiming data "was shown to be MAR" are overstating what is possible.
How much missing data is too much?
There is no valid threshold, and the once-common five or ten per cent rules have no basis. Five per cent missing not at random can do more damage than forty per cent missing completely at random. The mechanism matters more than the amount, though at very high levels you should say plainly how much of the result rests on the imputation model.
Is it acceptable to just delete incomplete rows?
Under MCAR, yes, at a cost in power. Under MAR it generally biases results, with one exception: when missingness depends only on variables already in your model and the outcome is fully observed. Either way it should be a stated decision rather than a software default you never noticed.
Should I include the outcome when imputing?
Yes. Omitting the outcome from the imputation model biases the associations you then estimate towards zero. It feels like circular reasoning and it is not: the imputation model and the analysis model have different jobs, and leaving the outcome out is the single most common error in applied multiple imputation.
How many imputations do I need?
More than the five often quoted from older guidance. A practical rule is at least as many imputations as the percentage of cases with any missing data, so thirty per cent incomplete suggests at least thirty imputations. Imputations are cheap; instability in your results is not.