Taller Unidad 4 – Variables instrumentales (VI) y AM

Paso 1. Paquetes ————————

pkgs <- c("AER", "ggplot2", "lmtest", "sandwich", "car")
to_install <- pkgs[!pkgs %in% rownames(installed.packages())]
if (length(to_install) > 0) install.packages(to_install)
library(AER)       # estimar modelos de variables instrumentales (2ls,hace mínimos cuadrados en dos etapas)
## Warning: package 'AER' was built under R version 4.5.3
## Cargando paquete requerido: car
## Warning: package 'car' was built under R version 4.5.2
## Cargando paquete requerido: carData
## Warning: package 'carData' was built under R version 4.5.2
## Cargando paquete requerido: lmtest
## Warning: package 'lmtest' was built under R version 4.5.2
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.5.2
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Cargando paquete requerido: sandwich
## Warning: package 'sandwich' was built under R version 4.5.2
## Cargando paquete requerido: survival
## Warning: package 'survival' was built under R version 4.5.3
library(ggplot2)   # gráficos
## Warning: package 'ggplot2' was built under R version 4.5.3
library(lmtest)    # coeftest
library(sandwich)  # vcovHC (errores robustos)
library(car)       # linearHypothesis (F del instrumento)

Paso 2. Importar dataset

library(readr)
## Warning: package 'readr' was built under R version 4.5.2
Datos_variables_instrumentales <- read_csv("~/variables_instrumentales/Datos variables instrumentales.csv")
## Rows: 500 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): Z_instrument, U_confounder, X_exposure, Y_outcome
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(Datos_variables_instrumentales)
data <- Datos_variables_instrumentales

Revisar estructura y resumen

str(data)
## spc_tbl_ [500 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Z_instrument: num [1:500] 0 1 1 1 0 0 0 1 1 1 ...
##  $ U_confounder: num [1:500] 0.342 1.876 0.95 -0.577 -0.898 ...
##  $ X_exposure  : num [1:500] 0.789 1.566 1.961 1.563 0.281 ...
##  $ Y_outcome   : num [1:500] 2.5561 5.1298 3.2405 0.6024 -0.0109 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Z_instrument = col_double(),
##   ..   U_confounder = col_double(),
##   ..   X_exposure = col_double(),
##   ..   Y_outcome = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

Son 500 observaciones, 4 columnas (z: instrumento; U: confusor; X: exposicioón; Y: desenlace)

summary(data)
##   Z_instrument    U_confounder        X_exposure        Y_outcome      
##  Min.   :0.000   Min.   :-2.69689   Min.   :-3.4496   Min.   :-6.4624  
##  1st Qu.:0.000   1st Qu.:-0.65094   1st Qu.:-0.3036   1st Qu.:-0.8173  
##  Median :1.000   Median :-0.03272   Median : 0.4747   Median : 0.5691  
##  Mean   :0.518   Mean   : 0.00762   Mean   : 0.4917   Mean   : 0.6693  
##  3rd Qu.:1.000   3rd Qu.: 0.66133   3rd Qu.: 1.3553   3rd Qu.: 2.3007  
##  Max.   :1.000   Max.   : 3.07888   Max.   : 4.2392   Max.   : 7.3744
head(data)
## # A tibble: 6 × 4
##   Z_instrument U_confounder X_exposure Y_outcome
##          <dbl>        <dbl>      <dbl>     <dbl>
## 1            0        0.342      0.789    2.56  
## 2            1        1.88       1.57     5.13  
## 3            1        0.950      1.96     3.24  
## 4            1       -0.577      1.56     0.602 
## 5            0       -0.898      0.281   -0.0109
## 6            0        0.492      0.802    0.728

Paso 3. Modelo convencional (sin VI): Y ~ X

*Modelo de Asociación Cruda entre exposición y desenlace. (Estimado sesgado)

modelo_ols <- lm(Y_outcome ~ X_exposure, data = data)
summary(modelo_ols)
## 
## Call:
## lm(formula = Y_outcome ~ X_exposure, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6425 -0.7493 -0.0450  0.8069  4.3720 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.08841    0.05875  -1.505    0.133    
## X_exposure   1.54105    0.04280  36.005   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.226 on 498 degrees of freedom
## Multiple R-squared:  0.7225, Adjusted R-squared:  0.7219 
## F-statistic:  1296 on 1 and 498 DF,  p-value: < 2.2e-16

*Coeficiente de X_exposure = 1.541 Por cada unidad que aumenta la exposición, el desenlace aumenta en promedio 1.54 unidades. La asociación es positiva y muy fuerte: error estándar pequeño (0.043), t = 36 (el efecto estimado es 36 veces más grande que la incertidumbre que tengo sobre él), p < 2e-16.

*El Intercepto = −0.088 Es el valor esperado de Y cuando X vale cero. No es significativo (p = 0.133), lo cual tiene sentido porque los datos están simulados centrados en cero.

  • R² = 0.7225 La exposición explica el 72% de la varianza del desenlace. Es altísimo para datos reales — señal típica de simulación. El R² ajustado (0.7219) casi no baja porque solo hay un predictor.

*F = 1296, p < 2.2e-16 No aporta información adicional.

# Errores estándar robustos (HC3)
coeftest(modelo_ols, vcov = vcovHC(modelo_ols, type = "HC3"))
## 
## t test of coefficients:
## 
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.088411   0.059460 -1.4869   0.1377    
## X_exposure   1.541046   0.045363 33.9714   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coefci(modelo_ols,   vcov = vcovHC(modelo_ols, type = "HC3"))
##                  2.5 %     97.5 %
## (Intercept) -0.2052334 0.02841183
## X_exposure   1.4519200 1.63017289

El estimado puntual es idéntico: 1.541046. Los errores robustos nunca cambian el coeficiente, solo su incertidumbre.

El error estándar, de 0.04280 a 0.045363. Subió apenas un 6%, y el t bajó de 36.0 a 33.97. Un cambio así de pequeño indica que la heterocedasticidad es mínima o nula. La varianza de los residuales es bastante constante a lo largo de X.

con 95% de confianza, la asociación observada entre exposición y desenlace está entre 1.45 y 1.63 unidades de Y por unidad de X, la asociación es inequívoca.

# Intervalos de confianza robustos
coefci(modelo_ols, vcov = vcovHC(modelo_ols, type = "HC3"))
##                  2.5 %     97.5 %
## (Intercept) -0.2052334 0.02841183
## X_exposure   1.4519200 1.63017289

Este estimado de 1.541 no es el efecto causal de X sobre Y: es la asociación cruda, que mezcla el efecto real con la contribución del confusor U_confounder. La precisión del estimado (t alto, intervalo estrecho) no protege del sesgo. Sirve como punto de comparación para el estimado por variables instrumentales del paso siguiente.

Paso 4. Primera etapa (Relevancia): X ~ Z

Modelo primera etapa: Ajusto la regresión lineal. La exposición exoplicada por el instrumento.

modelo_1a <- lm(X_exposure ~ Z_instrument, data = data)
summary(modelo_1a)
## 
## Call:
## lm(formula = X_exposure ~ Z_instrument, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.4139 -0.7442 -0.0137  0.7535  3.2568 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -0.03569    0.07591  -0.470    0.638    
## Z_instrument  1.01809    0.10548   9.652   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.178 on 498 degrees of freedom
## Multiple R-squared:  0.1576, Adjusted R-squared:  0.1559 
## F-statistic: 93.17 on 1 and 498 DF,  p-value: < 2.2e-16

*Coeficiente de Z_instrument = 1.018

Como Z es binaria, quienes portan el instrumento tienen en promedio 1.02 unidades más de exposición. p < 2e-16.

*Intercepto = −0.036

Exposición promedio del grupo sin instrumento. No significativo (p = 0.638)

*R² = 0.1576

El instrumento explica el 15.8% de la variación de la exposición. El otro 84% viene de otras fuentes, incluido el confusor. Ese 15.8% es exactamente la porción “limpia” de X sobre la que se va a construir el estimado de VI.

*F = 93.17 Supera el umbral de 10, así que el instrumento es fuerte y el supuesto de relevancia se cumple.

R² de primera etapa

summary(modelo_1a)$r.squared
## [1] 0.1576015

Explicado en el modelo en el anterior chnk: Ese 15.76% es la porción de X que el método de VI va a usar para estimar el efecto causal.

El F del instrumento

linearHypothesis(modelo_1a, "Z_instrument = 0")
## 
## Linear hypothesis test:
## Z_instrument = 0
## 
## Model 1: restricted model
## Model 2: X_exposure ~ Z_instrument
## 
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    499 821.03                                  
## 2    498 691.63  1     129.4 93.169 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

F = 93.169, p < 2.2e-16: confirma que el instrumento tiene fuerza suficiente para estimar el efecto causal sin caer en el sesgo de instrumentos débiles.

El instrumento es fuerte. Supera el umbral de 10. Compara dos modelos:

  • Modelo 1 (restringido): sin el instrumento. Suma de cuadrados residual = 821.03.
  • Modelo 2 (completo): con el instrumento. RSS = 691.63.

La diferencia, 129.4, es la variación de la exposición que el instrumento logra explicar.

Versión robusta

linearHypothesis(modelo_1a, "Z_instrument = 0",
                 vcov = vcovHC(modelo_1a, type = "HC3"))
## 
## Linear hypothesis test:
## Z_instrument = 0
## 
## Model 1: restricted model
## Model 2: X_exposure ~ Z_instrument
## 
## Note: Coefficient covariance matrix supplied.
## 
##   Res.Df Df      F    Pr(>F)    
## 1    499                        
## 2    498  1 93.226 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El F robusto (93.23) coincide con el clásico (93.17), lo que descarta heterocedasticidad relevante en la primera etapa.

Paso 5:

La correlación de pearson entre 2 vectores

cor(data$Z_instrument, data$U_confounder, use = "complete.obs")
## [1] 0.05110517

r = 0.051

Prácticamente cero. El instrumento y el confusor no comparten información relevante. Fuertemente asociado con la exposición, desconectado del confusor.

La prueba formal de correlación

cor.test(data$Z_instrument, data$U_confounder)
## 
##  Pearson's product-moment correlation
## 
## data:  data$Z_instrument and data$U_confounder
## t = 1.142, df = 498, p-value = 0.254
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.03675011  0.13817653
## sample estimates:
##        cor 
## 0.05110517

La correlación entre instrumento y confusor fue 0.051 (IC 95%: −0.037 a 0.138; p = 0.254), compatible con independencia. El intervalo estrecho e incluye el cero, descarta que el resultado se deba a falta de poder.

Medias por grupo

Tapply: parte una variable en grupos y le aplica una función a cada uno.

toma U_confounder, la divíde según los valores de Z_instrument, y calcula la media de cada grupo.

tapply(data$U_confounder, data$Z_instrument, mean)
##           0           1 
## -0.04568022  0.05721567
t.test(U_confounder ~ Z_instrument, data = data)
## 
##  Welch Two Sample t-test
## 
## data:  U_confounder by Z_instrument
## t = -1.1445, df = 497.95, p-value = 0.253
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -0.27953436  0.07374258
## sample estimates:
## mean in group 0 mean in group 1 
##     -0.04568022      0.05721567

Las medias del confusor son prácticamente iguales en ambos grupos: −0.046 en Z=0 y 0.057 en Z=1. Una diferencia de apenas 0.10 unidades.

p = 0.253, no significativo, y el intervalo de confianza de la diferencia va de −0.280 a 0.074, incluyendo el cero. Los grupos están balanceados.

Visualización mediante boxplot

ggplot(data, aes(x = as.factor(Z_instrument), y = U_confounder,
                 fill = as.factor(Z_instrument))) +
  geom_jitter(width = 0.12, alpha = 0.25, color = "grey40", size = 1.4) +
  geom_boxplot(alpha = 0.75, width = 0.45, outlier.shape = NA,
               color = "grey25") +
  stat_summary(fun = mean, geom = "point", shape = 23,
               size = 3, fill = "white", color = "grey25") +
  scale_fill_manual(values = c("0" = "#9FE1CB", "1" = "#1D9E75")) +
  scale_x_discrete(labels = c("0" = "Sin instrumento (Z = 0)",
                              "1" = "Con instrumento (Z = 1)")) +
  labs(x = NULL, y = "U (confusor no medido)",
       title = "Chequeo de independencia",
       subtitle = "Distribución del confusor según el nivel del instrumento",
       caption = "Diferencia de medias: p = 0.253. El rombo blanco marca la media.") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold", size = 15),
        plot.subtitle = element_text(color = "grey35", margin = margin(b = 12)),
        plot.caption = element_text(color = "grey45", hjust = 0, margin = margin(t = 12)),
        panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        axis.title.y = element_text(margin = margin(r = 10)))

Las medianas casi coinciden con el cero y los rangos intercuartílicos se solapan casi por completo. Los rombos blancos (las medias) están prácticamente al mismo nivel. La forma de las dos nubes de puntos es equivalente: misma dispersión, mismo rango.

El confusor se distribuye de forma equivalente entre los dos niveles del instrumento, sin desplazamiento aparente de medianas ni de medias. El gráfico respalda visualmente lo que muestran la correlación (r = 0.051) y la prueba de diferencia de medias (p = 0.253): el supuesto de independencia se cumple.

(Este chequeo solo es posible porque el confusor está observado en la simulación. En un estudio real el confusor no medido es invisible por definición; ahí el supuesto se defiende argumentando la asignación aleatoria del genotipo en la meiosis y verificando el balance de las covariables que sí se midieron.)

Paso 6

Modelo variables instrumentales

modelo_vi <- ivreg(Y_outcome ~ X_exposure | Z_instrument, data = data)
summary(modelo_vi, diagnostics = TRUE)
## 
## Call:
## ivreg(formula = Y_outcome ~ X_exposure | Z_instrument, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.62709 -0.77876 -0.03278  0.81706  4.07471 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.0004388  0.0776312   0.006    0.995    
## X_exposure  1.3603422  0.1097272  12.397   <2e-16 ***
## 
## Diagnostic tests:
##                  df1 df2 statistic p-value    
## Weak instruments   1 498     93.17  <2e-16 ***
## Wu-Hausman         1 497      3.35  0.0678 .  
## Sargan             0  NA        NA      NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.248 on 498 degrees of freedom
## Multiple R-Squared: 0.7125,  Adjusted R-squared: 0.7119 
## Wald test: 153.7 on 1 and 498 DF,  p-value: < 2.2e-16

Coeficiente de X_exposure = 1.360

Este es el estimado causal por variables instrumentales. Bajó desde 1.541 (OLS), lo que significa que la regresión ingenua estaba sobreestimando el efecto en aproximadamente 0.18 unidades. Esa diferencia es el sesgo por confusión.

Error estándar 0.110, contra 0.043 en OLS. el modelo solo usa el 15.8% de la variación de X que proviene del instrumento, así que gana validez y pierde precisión. Aun así, con t = 12.4 y p < 2e-16, el efecto sigue siendo inequívoco.

El estimado por variables instrumentales fue 1.360 (EE 0.110; p < 2e-16), inferior al de la regresión convencional (1.541). La diferencia refleja el sesgo por confusión que la OLS no puede corregir. El instrumento resultó fuerte (F = 93.17) y la prueba de Wu-Hausman fue limítrofe (p = 0.068).

Errores robustos

coeftest(modelo_vi, vcov = vcovHC(modelo_vi, type = "HC1"))
## 
## t test of coefficients:
## 
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.00043876 0.07709445  0.0057   0.9955    
## X_exposure  1.36034221 0.10967456 12.4034   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coefci(modelo_vi,   vcov = vcovHC(modelo_vi, type = "HC1"))
##                  2.5 %    97.5 %
## (Intercept) -0.1510317 0.1519092
## X_exposure   1.1448603 1.5758241

El error estándar pasó de 0.109727 a 0.109675 bajó un 0.05%, es decir, NO hay heterocedasticidad en el modelo de VI.

El intervalo de confianza robusto: 1.145 a 1.576, con el intervalo de la OLS 1.452 a 1.630.

El estimado por variables instrumentales fue 1.360 (IC 95% robusto: 1.145 a 1.576), frente a 1.541 (IC 95%: 1.452 a 1.630) obtenido por regresión convencional. El estimado de Variables Instrumentales es menor porque descarta la porción de la exposición contaminada por el confusor, mientras que la OLS la incluye y por eso sobreestima el efecto.

El intervalo de Variables Instrumentales es aproximadamente el doble de ancho, reflejo de que el método utiliza únicamente la variación de la exposición explicada por el instrumento (15.8%). Este es el intercambio del método: se sacrifica precisión para ganar validez causal.

Ambos intervalos se solapan y el estimado de la OLS queda contenido dentro del intervalo de VI. Esto indica que, si bien la corrección va en la dirección esperada, la diferencia entre ambos métodos no alcanza significancia estadística en esta muestra. Es consistente con la prueba de Wu-Hausman limítrofe (p = 0.068), que evalúa precisamente si ambos estimados difieren y arrojó un resultado en el límite del umbral convencional.

Comparación

beta_ols   <- coef(modelo_ols)["X_exposure"]
beta_vi    <- coef(modelo_vi)["X_exposure"]
beta_ideal <- coef(lm(Y_outcome ~ X_exposure + U_confounder, data = data))["X_exposure"]

data.frame(
  metodo   = c("OLS (sesgado)", "VI / 2SLS", "Ajustado por U (referencia)"),
  estimado = round(c(beta_ols, beta_vi, beta_ideal), 4)
)
##                        metodo estimado
## 1               OLS (sesgado)   1.5410
## 2                   VI / 2SLS   1.3603
## 3 Ajustado por U (referencia)   1.2020

La comparación de los tres estimados muestra que la regresión convencional sobreestimó el efecto causal (1.541 frente al valor de referencia de 1.202), mientras que el estimado por variables instrumentales (1.360) se aproximó al valor verdadero, eliminando cerca de la mitad del sesgo. El valor de referencia quedó contenido dentro del intervalo de confianza del estimado por VI (1.145 a 1.576), lo que confirma que el método recuperó el efecto causal dentro de su margen de incertidumbre, sin necesidad de haber medido el confusor.

Paso 7. Comparación de resultados

cat("Convencional (coef. X):", coef(modelo_ols)["X_exposure"], "\n")
## Convencional (coef. X): 1.541046
cat("VI / 2SLS (coef. X):",    coef(modelo_vi)["X_exposure"], "\n")
## VI / 2SLS (coef. X): 1.360342

Paso 8. Visualización

ggplot(data, aes(x = X_exposure, y = Y_outcome,
                 color = as.factor(Z_instrument))) +
  geom_point(alpha = 0.5, size = 1.6) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
  scale_color_manual(values = c("0" = "#9FE1CB", "1" = "blue"),
                     labels = c("0" = "Sin instrumento (Z = 0)",
                                "1" = "Con instrumento (Z = 1)")) +
  labs(x = "X (exposición)", y = "Y (desenlace)",
       title = "Relación exposición – desenlace\npor nivel del instrumento",
       subtitle = "Los dos grupos ocupan zonas distintas del eje X",
       color = NULL) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "top",
        plot.title = element_text(face = "bold", size = 15),
        plot.subtitle = element_text(color = "grey35", margin = margin(b = 12)),
        panel.grid.minor = element_blank())
## `geom_smooth()` using formula = 'y ~ x'

El grupo con instrumento (azul) está desplazado hacia la derecha respecto al grupo sin instrumento (verde). Esa separación horizontal es la primera etapa hecha imagen: es el coeficiente de 1.018 que se calculo en el paso 4.

Las dos rectas tienen pendientes muy parecidas y casi se superponen significa que la relación entre exposición y desenlace es la misma en ambos grupos, y que el instrumento no está modificando el efecto, solo la posición en el eje X.

Paso 9. Discusión

Relevancia: Funciona el instrumento ?

Lo primero que había que confirmar era que el instrumento realmente mueve la exposición. Si no lo hiciera, no habría nada sobre lo cual construir el análisis.

Y sí la mueve: quienes tienen el instrumento presentan en promedio 1.02 unidades más de exposición que quienes no lo tienen. El estadístico F dio 93.17, muy por encima del umbral de 10 que se usa como referencia, así que el instrumento es fuerte.

Esto importa más de lo que parece. El método de variables instrumentales funciona quedándose únicamente con la porción de la exposición que proviene del instrumento, porque esa es la parte libre del confusor. Si el instrumento fuera débil, esa porción sería tan pequeña que el cálculo terminaría dominado por la contaminación residual, y el estimado se acercaría cada vez más al 1.541 de la regresión convencional, que es justamente el valor sesgado del que estaba tratando de escapar. Habría corrido el modelo, obtenido un número aparentemente sofisticado, y estaría reportando el mismo sesgo de siempre sin darme cuenta. Con un F de 93 estoy lejos de ese escenario.

El R² de primera etapa fue de 0.158, es decir, el instrumento explica el 15.8% de la variación de la exposición. Parece poco, pero no descalifica nada: lo que valida un instrumento es la fuerza de la asociación, no cuánta varianza explica. Eso sí, ese 15.8% anticipa algo que aparecería más adelante: como el método solo trabaja con esa fracción y descarta el 84% restante, el estimado final iba a salir menos preciso.

Independencia: el instrumento está limpio?

El segundo supuesto exige que el instrumento no guarde relación con el confusor. Aquí la lógica se invierte respecto a lo que se espera habitualmente de una prueba estadística: lo deseable es que no haya asociación, de modo que un p-valor grande constituye la buena noticia.

La correlación entre ambos fue de 0.051, prácticamente cero, con un p de 0.254. Las medias del confusor también resultaron equivalentes entre los dos grupos del instrumento (−0.046 y 0.057, p = 0.253), y el gráfico de cajas lo confirma visualmente: las dos distribuciones están a la misma altura, con medianas y rangos casi idénticos.

Un aspecto que merece atención es el intervalo de confianza, que va de −0.037 a 0.138. Contiene el cero y es estrecho, lo cual permite descartar que el resultado se deba a falta de poder. Esa distinción no es menor: un p-valor grande puede significar dos cosas muy distintas, que no existe asociación o que no había forma de detectarla. Con 500 observaciones y un intervalo tan angosto, la segunda explicación queda descartada.

Si este supuesto fallara, la consecuencia sería seria. La porción de exposición que aporta el instrumento —esa misma que el método utiliza como material limpio— vendría contaminada de entrada, y el estimado por VI terminaría igual de sesgado que el convencional, con el agravante de aparentar un rigor metodológico que no tendría.

Conviene señalar, sin embargo, que esta verificación solo fue posible porque el confusor está incluido en el dataset simulado. En un estudio real resulta imposible: un confusor no medido es invisible por definición, y no puede correrse una correlación contra una variable que no se tiene. Allí el supuesto se defiende de otra forma, argumentando que el genotipo se asigna al azar en la meiosis, antes de que cualquier factor social o conductual pueda influir, y verificando el balance de las covariables que sí se midieron

Restricción de exclusión: el supuesto que no se puede probar

Este exige que el instrumento afecte al desenlace únicamente pasando por la exposición, sin ninguna vía alternativa. A diferencia de los dos anteriores, no existe forma de comprobarlo con los datos disponibles: solo puede argumentarse.

Cuando la variante genética influye sobre el desenlace por un camino distinto al de la exposición lo que se conoce como pleiotropía horizontal, el instrumento deja de ser válido, y ninguna prueba estadística lo delata de manera concluyente.

En un estudio de aleatorización mendeliana, el argumento se apoya sobre todo en la biología. Se requiere conocer qué gen es la variante, qué proteína codifica y en qué vías participa. Una variante con función bien caracterizada y limitada al metabolismo de la exposición ofrece un argumento mucho más sólido que una variante intergénica de función desconocida.

Las estrategias disponibles serían las siguientes:

  • Emplear varias variantes independientes y verificar si producen estimados concordantes. Si una se aparta de las demás, es candidata a tener pleiotropía. Esto además habilitaría la prueba de Sargan, que en este modelo apareció como NA precisamente por tratarse de un solo instrumento para una sola exposición.

*Aplicar MR-Egger, cuyo intercepto estima la pleiotropía direccional promedio: un intercepto distinto de cero señala el problema.

*Recurrir a métodos robustos como la mediana ponderada o MR-PRESSO, que mantienen validez aun cuando una fracción de los instrumentos sea inválida.

*Consultar GWAS o PheWAS para determinar si la variante se asocia con otros fenotipos, lo que revelaría vías alternativas.

*Realizar análisis de falsación con desenlaces negativos, es decir, resultados que la exposición no debería afectar. Una asociación en ese terreno indicaría que el instrumento actúa por otro camino.

Todas estas estrategias comparten una limitación: aumentan o disminuyen la plausibilidad del supuesto, pero ninguna lo demuestra. La restricción de exclusión sigue siendo, en última instancia, un juicio sustentado en conocimiento biológico y no en evidencia estadística.