Module 5: When OLS Fails

Omitted Variable Bias & Measurement Error

Author

Austin Tucker

Published

July 23, 2026

1 Endogeneity

Consider a population model:

\[ y_i = \beta_0 + \beta_1 x_{1i} + u_i \]

where \(y \in Y\), \(x_1 \in X_1\), and \(u\) is the error term.

The independent variable \(x_1\) is endogenous if \(\text{Cov}(x_1, u) \neq 0\). Put another way, \(x_1\) is endogenous if it is correlated with the error term.

1.1 Why does it matter?

Endogeneity in \(x_1\) leads to violations of the zero conditional mean assumption: if \(\text{Cov}(x_1, u) \neq 0\), then \(E[u \mid x_1] \neq 0\). The expected value of the error differs across levels of \(x_1\). An OLS model with endogenous independent variables is neither unbiased nor consistent — the expected value of \(\hat{\beta}_1\) will not equal the population \(\beta_1\), regardless of how large our sample becomes.

1.2 Sources of endogeneity

There are three principal sources:

  1. Omitted Variable Bias (OVB)
  2. Measurement Error (ME)
  3. Simultaneity / Reverse Causality

This module focuses on the first two. We will explore each through theory and interactive simulation.

2 Omitted Variable Bias: Theory

2.1 The true vs. misspecified model

Suppose the true population model is:

\[ y_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + u_i \]

The population model tells us that \(Y\) is a function of both \(X_1\) and \(X_2\). To estimate unbiased parameters, we need to observe and include both.

The correct specification is:

\[ E[y \mid x_1, x_2] = \hat{\beta}_0 + \hat{\beta}_1 x_1 + \hat{\beta}_2 x_2 \qquad \text{(long regression)} \]

But suppose we fail to record \(X_2\) and estimate only:

\[ E[y \mid x_1] = \hat{\alpha}_0 + \hat{\alpha}_1 x_1 \qquad \text{(short regression)} \]

How well does \(\hat{\alpha}_1\) approximate \(\hat{\beta}_1\)?

2.2 The OVB formula

OVB occurs when the omitted variable is correlated with both the dependent variable and the included independent variable(s). The short regression coefficient relates to the long regression coefficient by:

\[ \alpha_1 = \frac{\text{Cov}(y, x_1)}{\text{Var}(x_1)} = \beta_1 + \beta_2 \cdot \delta \]

where \(\delta\) is the coefficient from regressing \(x_2\) on \(x_1\). The term \(\beta_2 \cdot \delta\) is the omitted variable bias.

NoteWhen does OVB vanish?

\(\hat{\alpha}_1 = \hat{\beta}_1\) under either of two conditions:

  • (a) \(x_1\) and \(x_2\) are uncorrelated (\(\delta = 0\)), or
  • (b) \(x_2\) has no effect on \(y\) conditional on \(x_1\) (\(\beta_2 = 0\))

2.3 Direction of OVB

OVB can be positive or negative. The direction depends on the signs of \(\beta_2\) and \(\delta\):

Table 1: Directions of OVB
True \(\beta_1\) Sign of OVB (\(\beta_2 \cdot \delta\)) Effect on \(\hat{\alpha}_1\)
\(+\) \(+\) Overestimates magnitude — \(\hat{\alpha}_1\) too large
\(-\) \(+\) Underestimates magnitude — \(\hat{\alpha}_1\) closer to zero
\(+\) \(-\) Underestimates magnitude — \(\hat{\alpha}_1\) closer to zero
\(-\) \(-\) Overestimates magnitude — \(\hat{\alpha}_1\) too negative

A positive bias means the estimate is higher on the number line, not necessarily larger in magnitude.

3 OVB: Exercises

We use a simulated population where birth weight (dbwt) depends on gestational length (gl) and pre-pregnancy BMI (bmi). The true DGP is:

\[ \text{dbwt}_i = -1500 + 150 \cdot \text{gl}_i - 0.8 \cdot \text{bmi}_i + u_i \]

3.1 Exercise 1: Long regression (the correct model)

Draw a random sample of 1,000 observations and fit the correctly specified OLS model of birth weight on gestational length and BMI.

NoteHint 1

The dependent variable is dbwt. The two independent variables are gl and bmi.

NoteHint 2

The formula should be: dbwt ~ gl + bmi

TipSolution
set.seed(123456789) data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ] mod_long <- lm(dbwt ~ gl + bmi, data = data_sample) summary(mod_long)
set.seed(123456789)
data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ]

mod_long <- lm(dbwt ~ gl + bmi, data = data_sample)
summary(mod_long)

Are the coefficient estimates close to the true population parameters (\(\beta_0 = -1500\), \(\beta_1 = 150\), \(\beta_2 = -0.8\))? What might cause them to differ?

Discussion: The estimates should be close but not exact. Sampling variability means any single sample will produce estimates that deviate from the true values. Unbiasedness is a property in expectation — the average across many samples converges to the truth.

3.2 Exercise 2: Short regression (omitting gestational length)

Using the same sample, fit an OLS model of birth weight on BMI only, omitting gestational length.

NoteHint 1

You are regressing dbwt on bmi only — do not include gl.

NoteHint 2

The formula should be: dbwt ~ bmi

TipSolution
set.seed(123456789) data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ] mod_short <- lm(dbwt ~ bmi, data = data_sample) summary(mod_short)
set.seed(123456789)
data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ]

mod_short <- lm(dbwt ~ bmi, data = data_sample)
summary(mod_short)

Is the estimated coefficient on BMI different from what you found in Exercise 1? Which direction did it shift, and why?

Discussion: The coefficient on BMI should be much more negative in the short regression (around \(-75\) to \(-80\)) compared to the long regression (around \(-0.8\)). This is because the short regression attributes the effect of gestational length to BMI. Since BMI negatively affects gl (\(\delta = -0.5\)) and gl positively affects dbwt (\(\beta_2 = 150\)), the OVB is \(150 \times (-0.5) = -75\), which gets added to the true BMI coefficient.

3.3 Exercise 3: Calculate the OVB

Using the long regression results, compute the expected OVB and compare it to the actual difference between the short and long regression coefficients on BMI.

NoteHint 1

beta_2 is the coefficient on gl in the long regression. Extract it with coef(mod_long)["gl"].

NoteHint 2

The expected OVB is beta_2 * delta. You already computed delta from the auxiliary regression.

TipSolution
set.seed(123456789) data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ] mod_long <- lm(dbwt ~ gl + bmi, data = data_sample) mod_short <- lm(dbwt ~ bmi, data = data_sample) # Extract beta_2 (coefficient on gl from the long regression) beta_2 <- coef(mod_long)["gl"] # Extract delta (coefficient on bmi from regressing gl on bmi) aux_reg <- lm(gl ~ bmi, data = data_sample) delta <- coef(aux_reg)["bmi"] # Calculate expected OVB expected_ovb <- beta_2 * delta # Compare with actual difference actual_ovb <- coef(mod_short)["bmi"] - coef(mod_long)["bmi"] cat("Expected OVB (beta_2 * delta):", round(expected_ovb, 2), "\n") cat("Actual OVB (alpha_1 - beta_1):", round(actual_ovb, 2), "\n")
set.seed(123456789)
data_sample <- pop[sample(nrow(pop), 1000, replace = FALSE), ]

mod_long  <- lm(dbwt ~ gl + bmi, data = data_sample)
mod_short <- lm(dbwt ~ bmi, data = data_sample)

# Extract beta_2 (coefficient on gl from the long regression)
beta_2 <- coef(mod_long)["gl"]

# Extract delta (coefficient on bmi from regressing gl on bmi)
aux_reg <- lm(gl ~ bmi, data = data_sample)
delta <- coef(aux_reg)["bmi"]

# Calculate expected OVB
expected_ovb <- beta_2 * delta

# Compare with actual difference
actual_ovb <- coef(mod_short)["bmi"] - coef(mod_long)["bmi"]

cat("Expected OVB (beta_2 * delta):", round(expected_ovb, 2), "\n")
cat("Actual OVB (alpha_1 - beta_1):", round(actual_ovb, 2), "\n")

Do the expected and actual OVB agree? Should they agree exactly?

Discussion: The expected OVB (\(\hat{\beta}_2 \cdot \hat{\delta}\)) and the actual difference (\(\hat{\alpha}_1 - \hat{\beta}_1\)) should agree exactly within a sample. This is not an approximation — it is an algebraic identity (the Frisch-Waugh-Lovell theorem guarantees this decomposition holds in any given sample).

3.4 Exercise 4: Predict the direction of OVB

Before looking at the results, reason through the direction of the OVB from omitting gestational length.

Fill in the sign of each component as "positive" or "negative":

NoteHint 1

Think about the DGP. Gestational length has a coefficient of \(+150\) on birth weight. What sign is that?

NoteHint 2

BMI enters the gestational length equation as \(-0.5 \cdot \text{bmi}\). So \(\delta\) is negative. A positive times a negative gives…

TipSolution
# Sign of beta_2: effect of gestational length on birth weight sign_beta2 <- "positive" # Sign of delta: effect of bmi on gestational length sign_delta <- "negative" # Sign of OVB = beta_2 * delta sign_ovb <- "negative" cat("beta_2 (gl -> dbwt):", sign_beta2, "\n") cat("delta (bmi -> gl):", sign_delta, "\n") cat("OVB = beta_2 * delta:", sign_ovb, "\n\n") # Verify your reasoning if (sign_beta2 == "positive" & sign_delta == "negative" & sign_ovb == "negative") { cat("Correct! Longer gestation increases birth weight (positive beta_2),\n") cat("but higher BMI reduces gestational length (negative delta),\n") cat("so the OVB is negative: the short regression overestimates\n") cat("the negative effect of BMI on birth weight.\n") } else { cat("Check your reasoning against the DGP:\n") cat(" gl enters dbwt with coefficient +150 (positive)\n") cat(" bmi enters gl with coefficient -0.5 (negative)\n") }

# Sign of beta_2: effect of gestational length on birth weight
sign_beta2 <- "positive"

# Sign of delta: effect of bmi on gestational length
sign_delta <- "negative"

# Sign of OVB = beta_2 * delta
sign_ovb <- "negative"

cat("beta_2 (gl -> dbwt):", sign_beta2, "\n")
cat("delta  (bmi -> gl):", sign_delta, "\n")
cat("OVB = beta_2 * delta:", sign_ovb, "\n\n")

# Verify your reasoning
if (sign_beta2 == "positive" & sign_delta == "negative" & sign_ovb == "negative") {
  cat("Correct! Longer gestation increases birth weight (positive beta_2),\n")
  cat("but higher BMI reduces gestational length (negative delta),\n")
  cat("so the OVB is negative: the short regression overestimates\n")
  cat("the negative effect of BMI on birth weight.\n")
} else {
  cat("Check your reasoning against the DGP:\n")
  cat("  gl enters dbwt with coefficient +150 (positive)\n")
  cat("  bmi enters gl with coefficient -0.5 (negative)\n")
}

3.5 Exercise 5: Sampling distribution of the biased estimator

Draw 200 random samples of 1,000 observations each. In each sample, fit the short regression (omitting gl). Plot the sampling distribution of \(\hat{\alpha}_1\) on BMI and compare the mean to the true \(\beta_2 = -0.8\).

NoteHint 1

The short regression formula is dbwt ~ bmi (omitting gl). Extract the coefficient with coef(mod)["bmi"].

NoteHint 2

Complete the three blanks:

  • lm(dbwt ~ bmi, ...)
  • coef(mod)["bmi"]
TipSolution
beta1hat <- numeric(200) for (i in 1:200) { samp <- pop[sample(nrow(pop), 1000, replace = FALSE), ] mod <- lm(dbwt ~ bmi, data = samp) beta1hat[i] <- coef(mod)["bmi"] } cat("Mean of sampling distribution:", round(mean(beta1hat), 2), "\n") cat("True beta on bmi: -0.80\n") cat("Expected biased value: ", round(-0.8 + 150 * (-0.5), 2), "\n") ggplot(data.frame(estimate = beta1hat), aes(x = estimate)) + geom_histogram(aes(y = after_stat(density)), bins = 30, fill = slate_blue, color = "white", alpha = 0.8) + geom_vline(xintercept = mean(beta1hat), color = terracotta, linewidth = 1, linetype = "solid") + geom_vline(xintercept = -0.8, color = sage, linewidth = 1, linetype = "dashed") + labs( title = "Sampling Distribution of BMI Coefficient (gl omitted)", subtitle = "Terracotta = sample mean | Sage dashed = true value (-0.8)", x = "Estimated coefficient on BMI", y = "Density" ) + theme_house()

beta1hat <- numeric(200)

for (i in 1:200) {
  samp <- pop[sample(nrow(pop), 1000, replace = FALSE), ]
  mod  <- lm(dbwt ~ bmi, data = samp)
  beta1hat[i] <- coef(mod)["bmi"]
}

cat("Mean of sampling distribution:", round(mean(beta1hat), 2), "\n")
cat("True beta on bmi:             -0.80\n")
cat("Expected biased value:       ", round(-0.8 + 150 * (-0.5), 2), "\n")

ggplot(data.frame(estimate = beta1hat), aes(x = estimate)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30, fill = slate_blue, color = "white", alpha = 0.8) +
  geom_vline(xintercept = mean(beta1hat), color = terracotta,
             linewidth = 1, linetype = "solid") +
  geom_vline(xintercept = -0.8, color = sage,
             linewidth = 1, linetype = "dashed") +
  labs(
    title = "Sampling Distribution of BMI Coefficient (gl omitted)",
    subtitle = "Terracotta = sample mean | Sage dashed = true value (-0.8)",
    x = "Estimated coefficient on BMI",
    y = "Density"
  ) +
  theme_house()

The sampling distribution should be centered around \(-75.8\) (i.e., \(-0.8 + 150 \times (-0.5)\)), far from the true value of \(-0.8\). What does this tell you about the estimator?

Discussion: The estimator is biased — no matter how many times we sample, the average does not converge to the true parameter. The estimator is also inconsistent: even as the sample size increases toward \(N = 10{,}000\), the bias persists because it is a property of the model specification, not sampling variability.

4 Measurement Error: Theory

Measurement error applies to all types of variables. We focus on the classical “errors-in-variables” model and distinguish ME that affects the independent variable versus the dependent variable.

4.1 Classical ME in the independent variable

Take a single-variable population model:

\[ y_i = \beta_0 + \beta_1 x_{1i} + u_i \]

Suppose we measure \(x_1\) with error: \(\tilde{x}_1 = x_1 + \varepsilon\)

Classical ME assumptions:

  1. \(E[\varepsilon] = 0\)
  2. \(\text{Cov}(y, \varepsilon) = 0\)
  3. \(\text{Cov}(x_1, \varepsilon) = 0\)
  4. \(\text{Cov}(u, \varepsilon) = 0\)

Substituting into the population model:

\[ y_i = \beta_0 + \beta_1(\tilde{x}_1 - \varepsilon) + u_i = \beta_0 + \beta_1 \tilde{x}_1 + (u_i - \beta_1 \varepsilon) \]

Since \(\text{Cov}(\tilde{x}_1, \varepsilon) \neq 0\) by construction, the new residual \((u_i - \beta_1 \varepsilon)\) is correlated with \(\tilde{x}_1\). This produces attenuation bias:

\[ \hat{\beta}_1 = \beta_1 \cdot \frac{\text{Var}(x)}{\text{Var}(x + \varepsilon)} \]

Since \(\text{Var}(x + \varepsilon) > \text{Var}(x)\), we multiply \(\beta_1\) by a factor less than 1, biasing the estimate toward zero.

4.2 Classical ME in the dependent variable

If instead \(\tilde{y} = y + \varepsilon\) with \(\text{Cov}(x, \varepsilon) = 0\):

\[ \tilde{y}_i = \beta_0 + \beta_1 x_{1i} + (u_i + \varepsilon_i) \]

The estimate \(\hat{\beta}_1\) remains unbiased and consistent. However, \(\text{Var}(u + \varepsilon) > \text{Var}(u)\), so standard errors increase — we lose precision but not accuracy.

ImportantKey distinction
  • ME in X \(\rightarrow\) attenuation bias (coefficient biased toward zero)
  • ME in Y \(\rightarrow\) no bias, but larger standard errors (loss of precision)

This asymmetry is one of the most important results in applied econometrics.

5 ME: Exercises

5.1 Exercise 6: Measurement error in the independent variable

Draw a sample of 1,000 observations. Create a mismeasured gestational length variable by adding classical ME with mean 0 and standard deviation 3. Fit OLS of birth weight on the mismeasured gl and (correctly measured) BMI.

NoteHint 1

Classical ME has mean 0 and some standard deviation. Here sd = 3. The noisy variable is gl + me_noise.

NoteHint 2
  • rnorm(1000, mean = 0, sd = 3)
  • data_me$gl + me_noise
  • Regress on gl_me (not gl)
TipSolution
set.seed(987654321) data_me <- pop[sample(nrow(pop), 1000, replace = FALSE), ] # Create measurement error and noisy gl me_noise <- rnorm(1000, mean = 0, sd = 3) data_me$gl_me <- data_me$gl + me_noise # Fit OLS with mismeasured gl mod_me <- lm(dbwt ~ gl_me + bmi, data = data_me) summary(mod_me)
set.seed(987654321)
data_me <- pop[sample(nrow(pop), 1000, replace = FALSE), ]

# Create measurement error and noisy gl
me_noise      <- rnorm(1000, mean = 0, sd = 3)
data_me$gl_me <- data_me$gl + me_noise

# Fit OLS with mismeasured gl
mod_me <- lm(dbwt ~ gl_me + bmi, data = data_me)
summary(mod_me)

Is the coefficient on gestational length attenuated compared to the true value of 150? What about the BMI coefficient?

Discussion: The coefficient on gl_me should be smaller in magnitude than 150 (attenuated toward zero). The BMI coefficient may shift because the attenuation in gl gets partially absorbed by bmi. Keep in mind that attenuation is a property in expectation — a single sample may not show it clearly.

5.2 Exercise 7: Measurement error in the dependent variable

Now suppose you measured gestational length correctly but the instrument for measuring birth weight introduces random error with mean 0 and standard deviation 200. Create the mismeasured outcome and fit OLS.

NoteHint 1

The mismeasured outcome is dbwt + me_y_noise. The regression should use dbwt_me as the dependent variable.

NoteHint 2
  • data_me$dbwt + me_y_noise
  • lm(dbwt_me ~ gl + bmi, ...)
TipSolution
set.seed(987654321) data_me <- pop[sample(nrow(pop), 1000, replace = FALSE), ] # Create mismeasured birth weight me_y_noise <- rnorm(1000, mean = 0, sd = 200) data_me$dbwt_me <- data_me$dbwt + me_y_noise # Fit OLS with mismeasured outcome mod_me_y <- lm(dbwt_me ~ gl + bmi, data = data_me) summary(mod_me_y)
set.seed(987654321)
data_me <- pop[sample(nrow(pop), 1000, replace = FALSE), ]

# Create mismeasured birth weight
me_y_noise      <- rnorm(1000, mean = 0, sd = 200)
data_me$dbwt_me <- data_me$dbwt + me_y_noise

# Fit OLS with mismeasured outcome
mod_me_y <- lm(dbwt_me ~ gl + bmi, data = data_me)
summary(mod_me_y)

Are the point estimates biased? Compare the standard errors to what you got in Exercise 1.

Discussion: The coefficient estimates should be close to the true values (150 and \(-0.8\)) — ME in \(Y\) does not cause bias. However, the standard errors should be noticeably larger because the residual variance increased by \(\text{Var}(\varepsilon) = 200^2 = 40{,}000\). This is the precision cost of measurement error in the outcome.

5.3 Exercise 8: Attenuation bias sampling distribution

Demonstrate attenuation bias by fitting the OLS model with mismeasured gl across 200 random samples. Plot the sampling distribution and verify that the mean is attenuated toward zero.

NoteHint 1

Inside the loop, regress dbwt on the noisy variable gl_noisy (not gl), plus bmi.

NoteHint 2
  • lm(dbwt ~ gl_noisy + bmi, data = samp)
  • coef(mod)["gl_noisy"]
TipSolution
beta_gl_me <- numeric(200) for (i in 1:200) { samp <- pop[sample(nrow(pop), 1000, replace = FALSE), ] samp$gl_noisy <- samp$gl + rnorm(1000, mean = 0, sd = 3) mod <- lm(dbwt ~ gl_noisy + bmi, data = samp) beta_gl_me[i] <- coef(mod)["gl_noisy"] } cat("Mean of sampling distribution:", round(mean(beta_gl_me), 2), "\n") cat("True beta on gl: 150.00\n") # Attenuation factor: Var(gl) / Var(gl + noise) gl_var <- var(pop$gl) noise_var <- 9 # sd = 3, so var = 9 cat("Expected attenuation factor: ", round(gl_var / (gl_var + noise_var), 3), "\n") cat("Expected attenuated coef: ", round(150 * gl_var / (gl_var + noise_var), 2), "\n") ggplot(data.frame(estimate = beta_gl_me), aes(x = estimate)) + geom_histogram(aes(y = after_stat(density)), bins = 30, fill = sage, color = "white", alpha = 0.8) + geom_vline(xintercept = mean(beta_gl_me), color = terracotta, linewidth = 1, linetype = "solid") + geom_vline(xintercept = 150, color = slate_blue, linewidth = 1, linetype = "dashed") + labs( title = "Sampling Distribution of GL Coefficient (ME in X)", subtitle = "Terracotta = sample mean | Slate dashed = true value (150)", x = "Estimated coefficient on gestational length", y = "Density" ) + theme_house()

beta_gl_me <- numeric(200)

for (i in 1:200) {
  samp <- pop[sample(nrow(pop), 1000, replace = FALSE), ]
  samp$gl_noisy <- samp$gl + rnorm(1000, mean = 0, sd = 3)

  mod <- lm(dbwt ~ gl_noisy + bmi, data = samp)
  beta_gl_me[i] <- coef(mod)["gl_noisy"]
}

cat("Mean of sampling distribution:", round(mean(beta_gl_me), 2), "\n")
cat("True beta on gl:              150.00\n")

# Attenuation factor: Var(gl) / Var(gl + noise)
gl_var    <- var(pop$gl)
noise_var <- 9  # sd = 3, so var = 9
cat("Expected attenuation factor: ", round(gl_var / (gl_var + noise_var), 3), "\n")
cat("Expected attenuated coef:    ", round(150 * gl_var / (gl_var + noise_var), 2), "\n")

ggplot(data.frame(estimate = beta_gl_me), aes(x = estimate)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30, fill = sage, color = "white", alpha = 0.8) +
  geom_vline(xintercept = mean(beta_gl_me), color = terracotta,
             linewidth = 1, linetype = "solid") +
  geom_vline(xintercept = 150, color = slate_blue,
             linewidth = 1, linetype = "dashed") +
  labs(
    title = "Sampling Distribution of GL Coefficient (ME in X)",
    subtitle = "Terracotta = sample mean | Slate dashed = true value (150)",
    x = "Estimated coefficient on gestational length",
    y = "Density"
  ) +
  theme_house()

How does the attenuation factor \(\frac{\text{Var}(x)}{\text{Var}(x + \varepsilon)}\) relate to the mean of the sampling distribution?

Discussion: The theoretical attenuation factor tells us exactly how much the coefficient will shrink. With \(\text{Var}(\text{gl}) \approx 6.5\) and \(\text{Var}(\varepsilon) = 9\), the factor is roughly \(6.5 / 15.5 \approx 0.42\), yielding an expected coefficient of \(150 \times 0.42 \approx 63\). The sampling distribution should be centered near this value — far from the true 150. More noise (larger \(\text{Var}(\varepsilon)\)) means more attenuation.

6 Extensions & Summary

6.1 Visualizing attenuation

The plot below shows how increasing measurement error in \(X\) attenuates the fitted slope, while ME in \(Y\) leaves the slope unchanged but increases scatter.

6.2 Multi-variable OVB (optional)

When multiple variables are omitted, the bias generalizes. If the true model includes \(x_1, x_2, \ldots, x_K\) but we only include \(x_1\):

\[ \text{Bias}(\hat{\beta}_1) = \sum_{k=2}^{K} \beta_k \cdot \delta_k \]

where \(\delta_k\) is the coefficient from regressing \(x_k\) on \(x_1\). Each omitted variable contributes independently to the total bias.

6.3 Non-classical ME (optional)

If measurement error is correlated with the true variable (\(\text{Cov}(x, \varepsilon) \neq 0\)), the bias takes the form:

\[ \text{plim} \; \hat{\beta}_1 = \beta_1 \cdot \frac{\text{Var}(x) + \text{Cov}(\varepsilon, x)}{\text{Var}(x + \varepsilon)} \]

This does not automatically imply attenuation. Depending on \(\text{Cov}(\varepsilon, x)\), the estimate could be amplified rather than attenuated. Example: shorter men over-reporting their height in NHANES produces non-classical ME where the error is negatively correlated with the true value.

6.4 Summary

Table 2: Summary of OVB and Measurement Error effects on OLS
Problem Bias in \(\hat{\beta}_1\)? Direction Consistency? Precision?
OVB Yes \(\beta_2 \cdot \delta\) (either direction) Inconsistent Unchanged
ME in X (classical) Yes Toward zero (attenuation) Inconsistent Unchanged
ME in Y (classical) No Consistent Reduced (larger SEs)
TipWhat comes next?

The problems identified here — endogeneity from omitted variables and measurement error — motivate the identification strategies we study in the remainder of the course: instrumental variables (Module 9), regression discontinuity (Module 10), and difference-in-differences (Module 11). Each provides a way to obtain consistent estimates when OLS fails.

References

  • Angrist, Joshua D., and Jorn-Steffen Pischke. 2009. Mostly Harmless Econometrics: An Empiricist’s Companion. Princeton University Press.
  • Wooldridge, Jeffrey M. 2020. Introductory Econometrics: A Modern Approach. 7th ed. Cengage Learning.
  • Pischke, Steve. 2007. “Lecture Notes on Measurement Error.” London School of Economics.
  • Cunningham, Scott. 2021. Causal Inference: The Mixtape. Yale University Press.