Skip to content
Statistical RethinkingStatistical Rethinking

14.4 Práctica

Los problemas de práctica del Capítulo 14 le piden ajustar modelos con error de medición y datos faltantes, y comparar los resultados con análisis ingenuos.

Practice

Problemas fáciles

14E1. ¿Qué es la dilución de la regresión? ¿Cómo afecta el error de medición en el predictor a la pendiente estimada?

14E2. ¿Cuáles son los tres tipos de datos faltantes (MCAR, MAR, MNAR)? ¿Cuál es el más fácil de manejar?

14E3. ¿Por qué la imputación por la media suele ser una mala idea?

14E4. ¿Por qué la imputación Bayesiana propaga la incertidumbre mejor que la imputación múltiple?

Problemas medios

14M1. Simule datos con error de medición en el predictor. Compare la pendiente ingenua con la pendiente verdadera. Muestre la atenuación.

# 14M1: Measurement error and attenuation
set.seed(42)
n <- 300
x_true <- runif(n, 0, 10)
y <- 1 + 0.6 * x_true + rnorm(n, 0, 1)

# Different levels of measurement error

for (sigma_x in c(0.5, 1.0, 2.0, 3.0)) {
x_obs <- x_true + rnorm(n, 0, sigma_x)
m <- lm(y ~ x_obs)
cat(sprintf(" sigma_x = %.1f: naive slope = %.3f (true = 0.600)\n",
sigma_x, coef(m)[2]))
}

cat("\n Larger measurement error -> more attenuation (slope closer to 0)\n")
Click Run to execute this code in your browser with WebR

14M2. Cree datos faltantes bajo MAR. Compare el análisis de casos completos con la imputación condicional.

# 14M2: MAR missing data — complete-case vs imputation
set.seed(42)
n <- 400
x <- runif(n, 0, 10)
y <- 2 + 0.5 * x + rnorm(n, 0, 1)

# MAR: x missing when y is high

miss_idx <- which(y > quantile(y, 0.75))
x_obs <- x
x_obs[miss_idx] <- NA

# Complete-case

d_cc <- data.frame(y = y, x = x_obs)[complete.cases(data.frame(y = y, x = x_obs)), ]
m_cc <- lm(y ~ x, data = d_cc)

# Conditional imputation (use y to predict missing x)

d_obs <- data.frame(y = y[!is.na(x_obs)], x = x_obs[!is.na(x_obs)])
m_imp <- lm(x ~ y, data = d_obs)
x_imputed <- ifelse(is.na(x_obs),
predict(m_imp, newdata = data.frame(y = y)),
x_obs)
m_full <- lm(y ~ x_imputed)

cat("MAR missing data comparison:\n")
cat(" True slope: 0.500\n")
cat(" Complete-case slope:", round(coef(m_cc)[2], 3), "(biased)\n")
cat(" Imputed slope:", round(coef(m_full)[2], 3), "(closer to true)\n")
cat(" N complete cases:", nrow(d_cc), "out of", n, "\n")
Click Run to execute this code in your browser with WebR

Problemas difíciles

14H1. Simule datos con error de medición tanto en el predictor como en el resultado. Ajuste un modelo que contemple ambos. ¿Cómo cambian los estimados?

# 14H1: Measurement error in both x and y
set.seed(42)
n <- 300
x_true <- runif(n, 0, 10)
y_true <- 1 + 0.5 * x_true

# Observed with error

x_obs <- x_true + rnorm(n, 0, 1.0)
y_obs <- y_true + rnorm(n, 0, 1.0)

# Naive model (ignores both errors)

m_naive <- lm(y_obs ~ x_obs)

# Corrected model (regression calibration for x)

reliability_x <- var(x_true) / var(x_obs)
x_corrected <- mean(x_obs) + reliability_x * (x_obs - mean(x_obs))
m_corrected <- lm(y_obs ~ x_corrected)

cat("Measurement error in both x and y:\n")
cat(" True slope: 0.500\n")
cat(" Naive slope:", round(coef(m_naive)[2], 3), "(attenuated)\n")
cat(" Corrected slope (x only):", round(coef(m_corrected)[2], 3), "\n")
cat("\n Error in y increases variance but does not bias slope.\n")
cat(" Error in x attenuates the slope.\n")
cat(" Full Bayesian model would handle both simultaneously.\n")
Click Run to execute this code in your browser with WebR

14H2. Cree datos con falta MNAR (la falta depende del valor no observado mismo). Muestre que incluso la imputación Bayesiana es sesgada sin un modelo explícito de la falta.

14H3. Ajuste un modelo que maneje simultáneamente el error de medición en el predictor y los datos faltantes. Compare con un análisis ingenuo que ignora ambos.