Missing Data — MCAR, MAR, MNAR, Imputation
Statistics
Understanding Why Data Is Missing and How to Handle It
The mechanism generating missing values — MCAR, MAR, or MNAR — determines which methods produce valid inferences. Naive deletion can bias results, while principled approaches preserve information and validity.
-
Clinical Research — Handle patient dropout that may be related to outcomes
-
Survey Analysis — Address item nonresponse that varies across demographic groups
-
Social Science — Deal with attrition in longitudinal panel studies
How data goes missing matters as much as how much is missing.
Missing data is ubiquitous in real-world research. Understanding the mechanism that generates missing values is critical for choosing appropriate handling methods.
Types of Missingness
MCAR — Missing Completely at Random
Missingness is completely unrelated to any data (observed or missing). Like data?? being lost in the mail.
MAR — Missing at Random
Missingness depends on observed data but not on the missing values themselves.
MNAR — Missing Not at Random
Missingness depends on the unobserved values themselves. The hardest mechanism to handle.
Comparison
| Mechanism | Missingness depends on | Example |
|-----------|----------------------|---------|
| MCAR | Nothing | Data entry errors; random equipment failure |
| MAR | Observed variables only | Young people skip income questions |
| MNAR | Missing values themselves | Depressed people don't report depression |
Handling Missing Data
Listwise Deletion
Delete any row with missing values.
| Pros | Cons |
|------|------|
| Simple; unbiased under MCAR | Loses data; reduces power |
| | Biased under MAR and MNAR |
Mean Imputation
Replace missing values with the observed mean.
Multiple Imputation
Multiple Imputation: Rubin's Rules
Predictive Mean Matching (PMM)
The most popular imputation method. For each missing value:
-
Fit a regression predicting the variable from other variables
-
Find observed values with similar predicted values
-
Use the observed value as the imputation
Python Implementation
import numpy as np
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer, SimpleImputer
import matplotlib.pyplot as plt
np.random.seed(42)
# Simulate data with missing values
n = 500
X1 = np.random.randn(n)
X2 = 0.7 * X1 + np.random.randn(n) * 0.5
X3 = 0.3 * X1 + 0.4 * X2 + np.random.randn(n) * 0.8
# MAR: X1 missing depends on X2
missing_prob = 1 / (1 + np.exp(-(-1 + 0.5*X2)))
R = np.random.binomial(1, missing_prob)
X1_obs = X1.copy()
X1_obs[R == 1] = np.nan
df = pd.DataFrame({'X1': X1_obs, 'X2': X2, 'X3': X3})
print(f"Missing in X1: {df['X1'].isna().sum()} ({df['X1'].isna().mean():.1%})")
# Listwise deletion
complete = df.dropna()
print(f"\nListwise deletion: n={len(complete)}")
print(f"X1 mean (complete): {complete['X1'].mean():.3f} (true: {X1.mean():.3f})")
# Multiple Imputation
mice = IterativeImputer(random_state=42, max_iter=10)
imputed = pd.DataFrame(mice.fit_transform(df), columns=df.columns)
print(f"\nMICE imputation:")
print(f"X1 mean (imputed): {imputed['X1'].mean():.3f} (true: {X1.mean():.3f})")
# Visualize
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].hist(X1, bins=30, alpha=0.5, label='True')
axes[0].hist(complete['X1'], bins=30, alpha=0.5, label='Listwise')
axes[0].legend()
axes[0].set_title('Listwise Deletion')
axes[1].hist(X1, bins=30, alpha=0.5, label='True')
axes[1].hist(imputed['X1'], bins=30, alpha=0.5, label='MICE')
axes[1].legend()
axes[1].set_title('Multiple Imputation')
plt.tight_layout()
plt.show()
Worked Example
Key Takeaways
Related Topics
-
See Multiple Imputation for detailed MI methods
-
See Propensity Score Matching for handling selection bias
-
See Causal Inference for related topics