3  Modelos Multinivel: estructuras más complejas

Este capítulo amplía la regresión multinivel básica permitiendo que interceptos y pendientes varíen por grupo y abordando estructuras no anidadas (p. ej., individuos clasificados por demografía y por estado simultáneamente). Se muestra cómo interpretar modelos del tipo \(y_{i}=\alpha_{j[i]}+\beta_{j[i]}x_{i}+\cdots\) como interacciones entre el índice de grupo y predictores individuales, y cómo incluir predictores a nivel de grupo (p. ej., uranio del suelo) e interacciones con \(x\). Se presentan ajustes en R con lmer() y se discute la extracción/interpretación de efectos fijos y aleatorios.

3.1 Interceptos y pendientes que varían por grupo

Siguiente paso: permitir que más de un coeficiente varíe por grupo. Ejemplo (radón) con un predictor individual \(x\) (indicador de primer piso), sin uranio a nivel condado:

\[ \begin{aligned} y_{i} &\sim \mathrm{N}\!\left(\alpha_{j[i]}+\beta_{j[i]}x_{i},\,\sigma_{y}^{2}\right), \quad i=1,\ldots,n \\ \binom{\alpha_{j}}{\beta_{j}} &\sim \mathrm{N}\!\left( \binom{\mu_{\alpha}}{\mu_{\beta}}, \begin{pmatrix} \sigma_{\alpha}^{2} & \rho\,\sigma_{\alpha}\sigma_{\beta} \\ \rho\,\sigma_{\alpha}\sigma_{\beta} & \sigma_{\beta}^{2} \end{pmatrix} \right), \quad j=1,\ldots,J. \end{aligned} \]

3.1.1 Código en R: ajuste con pendientes e interceptos variables

# Carga y preparación de datos de radón (Minnesota)
radon <- read_delim("../ARM_Data/radon/srrs2.dat", trim_ws = TRUE)
Rows: 12777 Columns: 25
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (11): state, state2, zip, basement, rep, wave, starttm, stoptm, startdt,...
dbl (13): idnum, stfips, region, typebldg, floor, room, stratum, activity, p...
lgl  (1): windoor

ℹ 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.
radon_data <- radon %>%
  filter(state == "MN") %>%                             # mantener observaciones de Minnesota
  mutate(
    radon = activity,                                   # nivel de radón (escala original)
    log_radon = log(if_else(activity == 0, 0.1, activity)), # escala log (evitar log(0))
    floor = floor,                                      # 0 = sótano, 1 = primer piso (según datos)
    county_name = as.vector(county)                     # nombre de condado
  ) %>%
  group_by(county_name) %>%
  mutate(county = cur_group_id()) %>%                   # id numérico de condado
  ungroup()

M3 <- lmer(log_radon ~ floor + (1 + floor | county_name),data = radon_data)
summary(M3) #ver display(M3)
Linear mixed model fit by REML ['lmerMod']
Formula: log_radon ~ floor + (1 + floor | county_name)
   Data: radon_data

REML criterion at convergence: 2168.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.4044 -0.6224  0.0138  0.6123  3.5682 

Random effects:
 Groups      Name        Variance Std.Dev. Corr 
 county_name (Intercept) 0.1216   0.3487        
             floor       0.1181   0.3436   -0.34
 Residual                0.5567   0.7462        
Number of obs: 919, groups:  county_name, 85

Fixed effects:
            Estimate Std. Error t value
(Intercept)  1.46277    0.05387  27.155
floor       -0.68110    0.08758  -7.777

Correlation of Fixed Effects:
      (Intr)
floor -0.381

Salida (resumen, según el texto):

  • \(\hat{\sigma}_{y}=0.75\), \(\hat{\sigma}_{\alpha}=0.35\), \(\hat{\sigma}_{\beta}=0.34\), correlación entre interceptos y pendientes \(\rho=-0.34\).
  • Efectos fijos aproximados: \((\text{Intercepto})=1.46\), \(x=-0.68\).
  • #obs: 919; grupos (county): 85; deviance = 2161.1.

3.1.2 Extracción de coeficientes y efectos

# Coeficientes por grupo (intercepto y pendiente por condado)
coef(M3)
$county_name
                  (Intercept)      floor
AITKIN              1.1445374 -0.5406207
ANOKA               0.9333795 -0.7708213
BECKER              1.4716909 -0.6688831
BELTRAMI            1.5354352 -0.7525548
BENTON              1.4270378 -0.6206707
BIG STONE           1.4826560 -0.6877094
BLUE EARTH          1.8193569 -0.4747510
BROWN               1.6907731 -0.6975067
CARLTON             1.1009452 -0.3737238
CARVER              1.5486981 -0.7798789
CASS                1.4305980 -0.6704024
CHIPPEWA            1.5874792 -0.7225586
CHISAGO             1.2222709 -0.6011427
CLAY                1.8899918 -0.8523356
CLEARWATER          1.3899110 -0.6572603
COOK                1.2202158 -0.6004595
COTTONWOOD          1.4454876 -0.8303451
CROW WING           1.1520967 -0.4461587
DAKOTA              1.3528648 -0.7689663
DODGE               1.5963770 -0.7255167
DOUGLAS             1.6303462 -0.6711922
FARIBAULT           0.9838000 -0.5534327
FILLMORE            1.4251552 -0.6433250
FREEBORN            1.8866532 -0.7698507
GOODHUE             1.7755309 -0.4800817
HENNEPIN            1.3728482 -0.7795581
HOUSTON             1.6119010 -0.6494601
HUBBARD             1.3158404 -0.6245548
ISANTI              1.3017630 -0.6275704
ITASCA              1.0836029 -0.5550416
JACKSON             1.7539207 -0.7778932
KANABEC             1.3571755 -0.6459926
KANDIYOHI           1.7420982 -0.7739627
KITTSON             1.5252202 -0.7357339
KOOCHICHING         1.0025697 -0.5187405
LAC QUI PARLE       1.8378184 -0.5854593
LAKE                0.7403795 -0.4468006
LAKE OF THE WOODS   1.6076009 -0.6245387
LE SUEUR            1.5857055 -0.6315858
LINCOLN             1.8608339 -0.7809497
LYON                1.7548745 -0.6271587
MAHNOMEN            1.4445249 -0.6750325
MARSHALL            1.7927831 -1.2154962
MARTIN              1.2486205 -0.8205943
MCLEOD              1.3719931 -0.7996969
MEEKER              1.3332400 -0.6380351
MILLE LACS          1.3702210 -0.8738622
MORRISON            1.2304052 -0.5291715
MOWER               1.6879021 -0.9616760
MURRAY              1.6474618 -0.7425002
NICOLLET            1.7901980 -0.7899538
NOBLES              1.6467949 -0.7422785
NORMAN              1.3852914 -0.6964618
OLMSTED             1.3672813 -0.8943441
OTTER TAIL          1.5140918 -0.5872235
PENNINGTON          1.3964786 -0.8462473
PINE                1.0629037 -0.6007468
PIPESTONE           1.6207514 -0.6432155
POLK                1.6173371 -0.8030919
POPE                1.4070242 -0.6625652
RAMSEY              1.1523640 -0.3268897
REDWOOD             1.6388650 -0.4025473
RENVILLE            1.4853052 -0.5365443
RICE                1.7406288 -0.7879782
ROCK                1.4130217 -0.6645591
ROSEAU              1.5666045 -0.6262481
SCOTT               1.6076623 -0.3977852
SHERBURNE           1.2257138 -0.6022873
SIBLEY              1.3600489 -0.6469479
ST LOUIS            0.8704024 -0.5624332
STEARNS             1.5069070 -0.8132549
STEELE              1.5431111 -0.7078081
STEVENS             1.5627787 -0.7143468
SWIFT               1.2409644 -0.6073575
TODD                1.5060425 -0.5402654
TRAVERSE            1.7166251 -0.7475265
WABASHA             1.7159670 -0.9005904
WADENA              1.3929212 -0.7485168
WASECA              1.0802843 -0.6538698
WASHINGTON          1.3599359 -0.8384260
WATONWAN            1.8441158 -0.5360212
WILKIN              1.6002883 -0.7268171
WINONA              1.6942333 -1.1510829
WRIGHT              1.5991188 -0.7327214
YELLOW MEDICINE     1.3787939 -0.6531798

attr(,"class")
[1] "coef.mer"
# Efectos fijos (promedio poblacional)
fixef(M3)
(Intercept)       floor 
  1.4627700  -0.6810982 
# Efectos aleatorios por grupo (desviaciones respecto a los fijos)
ranef(M3)
$county_name
                   (Intercept)        floor
AITKIN            -0.318232574  0.140477472
ANOKA             -0.529390508 -0.089723142
BECKER             0.008920884  0.012215066
BELTRAMI           0.072665214 -0.071456546
BENTON            -0.035732220  0.060427482
BIG STONE          0.019886022 -0.006611238
BLUE EARTH         0.356586900  0.206347166
BROWN              0.228003136 -0.016408455
CARLTON           -0.361824810  0.307374369
CARVER             0.085928148 -0.098780654
CASS              -0.032171954  0.010695776
CHIPPEWA           0.124709250 -0.041460405
CHISAGO           -0.240499081  0.079955490
CLAY               0.427221811 -0.171237421
CLEARWATER        -0.072858995  0.023837950
COOK              -0.242554178  0.080638721
COTTONWOOD        -0.017282337 -0.149246867
CROW WING         -0.310673285  0.234939499
DAKOTA            -0.109905152 -0.087868051
DODGE              0.133607011 -0.044418524
DOUGLAS            0.167576187  0.009906052
FARIBAULT         -0.478970028  0.127665509
FILLMORE          -0.037614777  0.037773171
FREEBORN           0.423883205 -0.088752460
GOODHUE            0.312760891  0.201016553
HENNEPIN          -0.089921767 -0.098459919
HOUSTON            0.149130988  0.031638080
HUBBARD           -0.146929604  0.056543411
ISANTI            -0.161006984  0.053527823
ITASCA            -0.379167083  0.126056573
JACKSON            0.291150750 -0.096794968
KANABEC           -0.105594517  0.035105587
KANDIYOHI          0.279328200 -0.092864485
KITTSON            0.062450180 -0.054635699
KOOCHICHING       -0.460200251  0.162357665
LAC QUI PARLE      0.375048463  0.095638863
LAKE              -0.722390471  0.234297565
LAKE OF THE WOODS  0.144830961  0.056559526
LE SUEUR           0.122935501  0.049512431
LINCOLN            0.398063912 -0.099851487
LYON               0.292104503  0.053939495
MAHNOMEN          -0.018245119  0.006065709
MARSHALL           0.330013065 -0.534397979
MARTIN            -0.214149453 -0.139496073
MCLEOD            -0.090776853 -0.118598649
MEEKER            -0.129529940  0.043063075
MILLE LACS        -0.092549003 -0.192764015
MORRISON          -0.232364758  0.151926746
MOWER              0.225132064 -0.280577780
MURRAY             0.184691854 -0.061402013
NICOLLET           0.327428052 -0.108855594
NOBLES             0.184024898 -0.061180279
NORMAN            -0.077478569 -0.015363624
OLMSTED           -0.095488733 -0.213245855
OTTER TAIL         0.051321775  0.093874661
PENNINGTON        -0.066291386 -0.165149083
PINE              -0.399866317  0.080351384
PIPESTONE          0.157981371  0.037882694
POLK               0.154567111 -0.121993718
POPE              -0.055745785  0.018533050
RAMSEY            -0.310405984  0.354208548
REDWOOD            0.176094967  0.278550868
RENVILLE           0.022535250  0.144553906
RICE               0.277858824 -0.106880029
ROCK              -0.049748285  0.016539142
ROSEAU             0.103834511  0.054850150
SCOTT              0.144892268  0.283313032
SHERBURNE         -0.237056219  0.078810888
SIBLEY            -0.102721135  0.034150312
ST LOUIS          -0.592367589  0.118665015
STEARNS            0.044137041 -0.132156733
STEELE             0.080341090 -0.026709920
STEVENS            0.100008742 -0.033248560
SWIFT             -0.221805609  0.073740723
TODD               0.043272512  0.140832783
TRAVERSE           0.253855106 -0.066428305
WABASHA            0.253196998 -0.219492220
WADENA            -0.069848799 -0.067418559
WASECA            -0.382485680  0.027228436
WASHINGTON        -0.102834072 -0.157327767
WATONWAN           0.381345824  0.145077015
WILKIN             0.137518358 -0.045718876
WINONA             0.231463335 -0.469984698
WRIGHT             0.136348773 -0.051623170
YELLOW MEDICINE   -0.083976046  0.027918385

with conditional variances for "county_name" 

Interpretación: la línea estimada para el condado \(j\) es \(y=\alpha_{j}+\beta_{j}x\), con

  • \(\alpha_{j}=\mu_{\alpha}+\text{ranef}_{j}^{(\text{Intercept})}\),
  • \(\beta_{j}=\mu_{\beta}+\text{ranef}_{j}^{(x)}\).

3.1.3 Inclusión de predictores de nivel de grupo e interacciones

Extensión: introducir un predictor de nivel de grupo \(u_{j}\) (uranio del suelo) y permitir que afecte tanto interceptos como pendientes:

\[ \binom{\alpha_{j}}{\beta_{j}} \sim \mathrm{N}\!\left( \binom{\gamma_{0}^{\alpha}+\gamma_{1}^{\alpha} u_{j}}{\gamma_{0}^{\beta}+\gamma_{1}^{\beta} u_{j}}, \begin{pmatrix} \sigma_{\alpha}^{2} & \rho\,\sigma_{\alpha}\sigma_{\beta} \\ \rho\,\sigma_{\alpha}\sigma_{\beta} & \sigma_{\beta}^{2} \end{pmatrix} \right), \quad j=1,\ldots,J. \]

En lmer(), esto se implementa incluyendo \(u\) a nivel individual y la interacción \(floor{:}u\):

cty <- read_delim('../ARM_Data/radon/cty.dat',trim_ws = TRUE)
Rows: 3194 Columns: 7
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (4): stfips, ctfips, st, cty
dbl (3): lon, lat, Uppm

ℹ 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.
radon_data <- radon_data %>% mutate(fips = stfips * 1000 + cntyfips)

# Obtener el FIPS a nivel de EE.UU.
usa.fips <- 1000 * as.numeric(cty$stfips) + as.numeric(cty$ctfips)

# Encontrar las filas correspondientes a los condados únicos en Minnesota
usa.rows <- match(unique(radon_data$fips), usa.fips)

uranium <- cty[usa.rows, "Uppm"]
u <- log(uranium)

county_u_data <- data.frame(
  county_name = unique(radon_data$county_name),
  u = u
)

radon_data <- radon_data %>%
  left_join(county_u_data, by = "county_name") %>% 
  rename(u = Uppm)
# Supóngase u.full = u[county], donde u es el vector a nivel condado
M4 <- lmer(log_radon ~ floor + u + floor:u + (1 + floor | county_name), data = radon_data)
boundary (singular) fit: see help('isSingular')
summary(M4)
Linear mixed model fit by REML ['lmerMod']
Formula: log_radon ~ floor + u + floor:u + (1 + floor | county_name)
   Data: radon_data

REML criterion at convergence: 2132.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2770 -0.6057  0.0507  0.6288  3.4495 

Random effects:
 Groups      Name        Variance Std.Dev. Corr
 county_name (Intercept) 0.0000   0.0000       
             floor       0.1392   0.3731    NaN
 Residual                0.5735   0.7573       
Number of obs: 919, groups:  county_name, 85

Fixed effects:
            Estimate Std. Error t value
(Intercept)  1.44407    0.02926  49.353
floor       -0.64131    0.08915  -7.194
u            0.84628    0.07476  11.320
floor:u     -0.41582    0.23894  -1.740

Correlation of Fixed Effects:
        (Intr) floor  u     
floor   -0.328              
u        0.354 -0.116       
floor:u -0.111  0.155 -0.313
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')

Interpretación de parámetros: los coeficientes fijos corresponden a \(\gamma_{0}^{\alpha}\) (Intercepto), \(\gamma_{0}^{\beta}\) (coef. de \(x\)), \(\gamma_{1}^{\alpha}\) (coef. de \(u\)), \(\gamma_{1}^{\beta}\) (coef. de \(floor\:u\)).

3.1.4 Coeficientes por grupo y efectos fijos/aleatorios

# Coeficientes por condado (filas) para (Intercepto), x, u.full, x:u.full
coef(M4)
$county_name
                  (Intercept)      floor         u    floor:u
AITKIN               1.444075 -0.5861689 0.8462757 -0.4158211
ANOKA                1.444075 -0.9559927 0.8462757 -0.4158211
BECKER               1.444075 -0.6121327 0.8462757 -0.4158211
BELTRAMI             1.444075 -0.5562792 0.8462757 -0.4158211
BENTON               1.444075 -0.5781298 0.8462757 -0.4158211
BIG STONE            1.444075 -0.6413080 0.8462757 -0.4158211
BLUE EARTH           1.444075 -0.2199211 0.8462757 -0.4158211
BROWN                1.444075 -0.5664540 0.8462757 -0.4158211
CARLTON              1.444075 -0.4336684 0.8462757 -0.4158211
CARVER               1.444075 -0.7254792 0.8462757 -0.4158211
CASS                 1.444075 -0.6413080 0.8462757 -0.4158211
CHIPPEWA             1.444075 -0.6413080 0.8462757 -0.4158211
CHISAGO              1.444075 -0.6413080 0.8462757 -0.4158211
CLAY                 1.444075 -0.6176347 0.8462757 -0.4158211
CLEARWATER           1.444075 -0.6561362 0.8462757 -0.4158211
COOK                 1.444075 -0.6413080 0.8462757 -0.4158211
COTTONWOOD           1.444075 -0.8978009 0.8462757 -0.4158211
CROW WING            1.444075 -0.4688231 0.8462757 -0.4158211
DAKOTA               1.444075 -0.8255417 0.8462757 -0.4158211
DODGE                1.444075 -0.6413080 0.8462757 -0.4158211
DOUGLAS              1.444075 -0.5556504 0.8462757 -0.4158211
FARIBAULT            1.444075 -0.7716674 0.8462757 -0.4158211
FILLMORE             1.444075 -0.6540193 0.8462757 -0.4158211
FREEBORN             1.444075 -0.5248526 0.8462757 -0.4158211
GOODHUE              1.444075 -0.2427398 0.8462757 -0.4158211
HENNEPIN             1.444075 -0.8086558 0.8462757 -0.4158211
HOUSTON              1.444075 -0.5893367 0.8462757 -0.4158211
HUBBARD              1.444075 -0.6098704 0.8462757 -0.4158211
ISANTI               1.444075 -0.6413080 0.8462757 -0.4158211
ITASCA               1.444075 -0.6413080 0.8462757 -0.4158211
JACKSON              1.444075 -0.6413080 0.8462757 -0.4158211
KANABEC              1.444075 -0.6413080 0.8462757 -0.4158211
KANDIYOHI            1.444075 -0.6413080 0.8462757 -0.4158211
KITTSON              1.444075 -0.6740056 0.8462757 -0.4158211
KOOCHICHING          1.444075 -0.6052950 0.8462757 -0.4158211
LAC QUI PARLE        1.444075 -0.3506347 0.8462757 -0.4158211
LAKE                 1.444075 -0.6887137 0.8462757 -0.4158211
LAKE OF THE WOODS    1.444075 -0.3954318 0.8462757 -0.4158211
LE SUEUR             1.444075 -0.5341494 0.8462757 -0.4158211
LINCOLN              1.444075 -0.5908193 0.8462757 -0.4158211
LYON                 1.444075 -0.4540227 0.8462757 -0.4158211
MAHNOMEN             1.444075 -0.6413080 0.8462757 -0.4158211
MARSHALL             1.444075 -1.0159851 0.8462757 -0.4158211
MARTIN               1.444075 -0.9474428 0.8462757 -0.4158211
MCLEOD               1.444075 -0.8821270 0.8462757 -0.4158211
MEEKER               1.444075 -0.6413080 0.8462757 -0.4158211
MILLE LACS           1.444075 -0.9158359 0.8462757 -0.4158211
MORRISON             1.444075 -0.5756836 0.8462757 -0.4158211
MOWER                1.444075 -0.8819252 0.8462757 -0.4158211
MURRAY               1.444075 -0.6413080 0.8462757 -0.4158211
NICOLLET             1.444075 -0.6413080 0.8462757 -0.4158211
NOBLES               1.444075 -0.6413080 0.8462757 -0.4158211
NORMAN               1.444075 -0.7286044 0.8462757 -0.4158211
OLMSTED              1.444075 -1.0075022 0.8462757 -0.4158211
OTTER TAIL           1.444075 -0.4689650 0.8462757 -0.4158211
PENNINGTON           1.444075 -0.8761968 0.8462757 -0.4158211
PINE                 1.444075 -0.7487671 0.8462757 -0.4158211
PIPESTONE            1.444075 -0.5534448 0.8462757 -0.4158211
POLK                 1.444075 -0.7363896 0.8462757 -0.4158211
POPE                 1.444075 -0.6413080 0.8462757 -0.4158211
RAMSEY               1.444075 -0.3683014 0.8462757 -0.4158211
REDWOOD              1.444075 -0.2370473 0.8462757 -0.4158211
RENVILLE             1.444075 -0.4867532 0.8462757 -0.4158211
RICE                 1.444075 -0.6433469 0.8462757 -0.4158211
ROCK                 1.444075 -0.6413080 0.8462757 -0.4158211
ROSEAU               1.444075 -0.4509974 0.8462757 -0.4158211
SCOTT                1.444075 -0.2368922 0.8462757 -0.4158211
SHERBURNE            1.444075 -0.6413080 0.8462757 -0.4158211
SIBLEY               1.444075 -0.6413080 0.8462757 -0.4158211
ST LOUIS             1.444075 -0.8930052 0.8462757 -0.4158211
STEARNS              1.444075 -0.7967385 0.8462757 -0.4158211
STEELE               1.444075 -0.6413080 0.8462757 -0.4158211
STEVENS              1.444075 -0.6413080 0.8462757 -0.4158211
SWIFT                1.444075 -0.6413080 0.8462757 -0.4158211
TODD                 1.444075 -0.4441947 0.8462757 -0.4158211
TRAVERSE             1.444075 -0.6319808 0.8462757 -0.4158211
WABASHA              1.444075 -0.7921107 0.8462757 -0.4158211
WADENA               1.444075 -0.6773395 0.8462757 -0.4158211
WASECA               1.444075 -0.8365475 0.8462757 -0.4158211
WASHINGTON           1.444075 -0.8724554 0.8462757 -0.4158211
WATONWAN             1.444075 -0.2655412 0.8462757 -0.4158211
WILKIN               1.444075 -0.6413080 0.8462757 -0.4158211
WINONA               1.444075 -1.1284808 0.8462757 -0.4158211
WRIGHT               1.444075 -0.6278513 0.8462757 -0.4158211
YELLOW MEDICINE      1.444075 -0.6413080 0.8462757 -0.4158211

attr(,"class")
[1] "coef.mer"
# Efectos fijos promedio
fixef(M4)
(Intercept)       floor           u     floor:u 
  1.4440747  -0.6413080   0.8462757  -0.4158211 
# Efectos aleatorios por condado en (Intercepto) y x
ranef(M4)
$county_name
                  (Intercept)        floor
AITKIN                      0  0.055139162
ANOKA                       0 -0.314684718
BECKER                      0  0.029175313
BELTRAMI                    0  0.085028824
BENTON                      0  0.063178258
BIG STONE                   0  0.000000000
BLUE EARTH                  0  0.421386890
BROWN                       0  0.074853969
CARLTON                     0  0.207639616
CARVER                      0 -0.084171171
CASS                        0  0.000000000
CHIPPEWA                    0  0.000000000
CHISAGO                     0  0.000000000
CLAY                        0  0.023673273
CLEARWATER                  0 -0.014828170
COOK                        0  0.000000000
COTTONWOOD                  0 -0.256492884
CROW WING                   0  0.172484933
DAKOTA                      0 -0.184233642
DODGE                       0  0.000000000
DOUGLAS                     0  0.085657656
FARIBAULT                   0 -0.130359390
FILLMORE                    0 -0.012711249
FREEBORN                    0  0.116455394
GOODHUE                     0  0.398568204
HENNEPIN                    0 -0.167347834
HOUSTON                     0  0.051971277
HUBBARD                     0  0.031437565
ISANTI                      0  0.000000000
ITASCA                      0  0.000000000
JACKSON                     0  0.000000000
KANABEC                     0  0.000000000
KANDIYOHI                   0  0.000000000
KITTSON                     0 -0.032697578
KOOCHICHING                 0  0.036012969
LAC QUI PARLE               0  0.290673290
LAKE                        0 -0.047405686
LAKE OF THE WOODS           0  0.245876238
LE SUEUR                    0  0.107158617
LINCOLN                     0  0.050488676
LYON                        0  0.187285350
MAHNOMEN                    0  0.000000000
MARSHALL                    0 -0.374677135
MARTIN                      0 -0.306134829
MCLEOD                      0 -0.240818966
MEEKER                      0  0.000000000
MILLE LACS                  0 -0.274527905
MORRISON                    0  0.065624417
MOWER                       0 -0.240617161
MURRAY                      0  0.000000000
NICOLLET                    0  0.000000000
NOBLES                      0  0.000000000
NORMAN                      0 -0.087296405
OLMSTED                     0 -0.366194184
OTTER TAIL                  0  0.172343023
PENNINGTON                  0 -0.234888776
PINE                        0 -0.107459085
PIPESTONE                   0  0.087863261
POLK                        0 -0.095081543
POPE                        0  0.000000000
RAMSEY                      0  0.273006641
REDWOOD                     0  0.404260674
RENVILLE                    0  0.154554776
RICE                        0 -0.002038909
ROCK                        0  0.000000000
ROSEAU                      0  0.190310619
SCOTT                       0  0.404415825
SHERBURNE                   0  0.000000000
SIBLEY                      0  0.000000000
ST LOUIS                    0 -0.251697206
STEARNS                     0 -0.155430480
STEELE                      0  0.000000000
STEVENS                     0  0.000000000
SWIFT                       0  0.000000000
TODD                        0  0.197113289
TRAVERSE                    0  0.009327209
WABASHA                     0 -0.150802666
WADENA                      0 -0.036031487
WASECA                      0 -0.195239440
WASHINGTON                  0 -0.231147389
WATONWAN                    0  0.375766801
WILKIN                      0  0.000000000
WINONA                      0 -0.487172809
WRIGHT                      0  0.013456688
YELLOW MEDICINE             0  0.000000000

with conditional variances for "county_name" 

Los coeficientes para el intercepto y \(floor\) varían por grupo (como se especificó); los de u y floor:u son fijos (porque u es constante dentro de condado).

3.1.5 De la salida de lmer a interceptos y pendientes por grupo

La recta ajustada en el condado \(j\) se expresa como

\[ y_i=\alpha_j+\beta_j x_i \quad\text{con}\quad \alpha_j=\gamma_{0}^{\alpha}+\gamma_{1}^{\alpha}u_j+\eta_j^{\alpha},\;\; \beta_j=\gamma_{0}^{\beta}+\gamma_{1}^{\beta}u_j+\eta_j^{\beta}. \]

Cálculo a partir de coef(M4) (ilustrativo, asumiendo vector \(u\) a nivel condado):

# Supóngase u es un vector (longitud J) con el uranio por condado en el mismo orden
a.hat.M4 <- coef(M4)$county[, 1] + coef(M4)$county[, 3] * u
b.hat.M4 <- coef(M4)$county[, 2] + coef(M4)$county[, 4] * u
tibble(alpha_hat = a.hat.M4, beta_hat = b.hat.M4) %>% head()
# A tibble: 6 × 2
  alpha_hat$Uppm beta_hat$Uppm
           <dbl>         <dbl>
1          0.861        -0.300
2          0.727        -0.604
3          1.35         -0.565
4          0.942        -0.310
5          1.32         -0.519
6          1.77         -0.802

3.1.6 Pendientes variables como interacciones

Sustituyendo \(\alpha_{j}\) y \(\beta_{j}\) en \(y_{i}\) se obtiene:

\[ \begin{aligned} y_{i} &=\big[\gamma_{0}^{\alpha}+\gamma_{1}^{\alpha}u_{j[i]}+\eta_{j[i]}^{\alpha}\big] +\big[\gamma_{0}^{\beta}+\gamma_{1}^{\beta}u_{j[i]}+\eta_{j[i]}^{\beta}\big]x_{i} +\epsilon_{i} \\[4pt] &=a+b\,v_i+c_{j[i]}+d\,x_i+e\,v_i x_i+f_{j[i]}x_i+\epsilon_i, \end{aligned} \]

donde \(v_i=u_{j[i]}\). Interpretaciones equivalentes:

  • Modelo con intercepto y pendiente variables y cuatro predictores individuales \((1, v_i, x_i, v_i x_i)\) con efectos centrados en cero.
  • Regresión con \(4+2J\) predictores (constante, \(v_i\), \(x_i\), \(v_i x_i\), indicadores de grupo y sus interacciones con \(x\)).
  • Regresión con cuatro predictores y tres términos de error.
  • Modelo multinivel original con un predictor de nivel de grupo.

Estas expresiones alternativas ayudan a conectar la formulación jerárquica con la implementación computacional e interpretación de interacciones y variación entre grupos.

3.2 Modelos no anidados

Este apartado aborda los modelos multinivel no anidados, en los cuales los individuos pueden pertenecer simultáneamente a múltiples estructuras de agrupamiento. Se presentan tres ejemplos representativos: (1) un experimento psicológico con pilotos en simuladores de vuelo (tratamientos y aeropuertos), (2) una regresión de ingresos que considera etnicidad, edad y estatura, y (3) un diseño experimental de cuadrado latino aplicado a cultivos.

3.2.1 Ejemplo 1: experimento psicológico con dos factores de agrupación

En el primer ejemplo (pilotos en simuladores de vuelo), los datos corresponden a un experimento psicológico en el que se evaluó el desempeño de pilotos entrenados en simuladores. Características principales:

  • Número de observaciones: \(n = 40\).

  • Factores de agrupamiento no anidados:

    • Tratamientos (group): \(J = 5\) condiciones experimentales distintas de entrenamiento.
    • Escenarios (scenario): \(K = 8\) aeropuertos distintos en los que se probó a los pilotos.
  • Variable de respuesta (\(y\)):

    • Tasa de éxito (proporción de aterrizajes exitosos o de recuperaciones correctas en el simulador).

    • Construida como:

      \[ y = \frac{\text{número de éxitos}}{\text{número de intentos}} \]

      en cada combinación tratamiento × aeropuerto.

  • Variables en bruto en el archivo original (pilots.dat):

    • group: identificador de la condición de tratamiento asignada.
    • scenario: identificador del aeropuerto en el simulador.
    • recovered: indicador de éxito del intento (\(1 =\) éxito, \(0 =\) fallo, NA si falta el dato).
  • Estructura del dataset procesado:

    • Cada fila representa una combinación única de grupo × escenario.
    • Para cada celda se contabilizan los éxitos y fallos, y a partir de ello se calcula la proporción \(y\).
    • Esto da lugar a una matriz de tamaño \(8 \times 5\) (o sea, \(K \times J\)), donde cada celda resume el desempeño promedio de los pilotos en ese tratamiento y aeropuerto.

Modelo no anidado con \(J=5\) tratamientos y \(K=8\) aeropuertos (\(n=40\) observaciones):

\[ \begin{aligned} y_{i} &\sim \mathrm{N}\!\left(\mu+\gamma_{j[i]}+\delta_{k[i]}, \sigma_{y}^{2}\right), \quad i=1,\ldots,n \\ \gamma_{j} &\sim \mathrm{N}(0,\sigma_{\gamma}^{2}), \quad j=1,\ldots,J \\ \delta_{k} &\sim \mathrm{N}(0,\sigma_{\delta}^{2}), \quad k=1,\ldots,K. \end{aligned} \]

Donde \(\gamma_{j}\) es el efecto de tratamiento y \(\delta_{k}\) el efecto de aeropuerto.

Objetivo del bloque: Cargar y preparar los datos del experimento de pilotos (identificadores de grupo y escenario).

pilots <- read_delim('../ARM_Data/pilots/pilots.dat')

pilots <- pilots %>% 
  mutate(group    = as.factor(group), 
         scenario = as.factor(scenario),
         recovered = ifelse(is.na(recovered), NA, as.numeric(recovered)))

Objetivo del bloque: Agregar a nivel celda (grupo-escenario) para obtener la tasa de éxito \(y\) y garantizar unicidad.

result <- pilots %>%
  group_by(group, scenario) %>%
  summarize(
    successes = sum(recovered == 1, na.rm = TRUE),
    failures  = sum(recovered == 0, na.rm = TRUE),
    .groups   = "drop"
  ) %>%
  mutate(y = successes / (successes + failures)) %>%
  distinct(group, scenario, .keep_all = TRUE)

Objetivo del bloque: Reordenar filas/columnas por promedio y visualizar un mapa de calor de tasas de éxito.

# Matriz ancho para ordenar por promedios
y_mat <- result %>%
  pivot_wider(names_from = group, values_from = y, values_fill = 0, id_cols = scenario) %>%
  column_to_rownames("scenario")

sort_group    <- order(apply(y_mat, 2, mean, na.rm = TRUE))
sort_scenario <- order(apply(y_mat, 1, mean, na.rm = TRUE))

# Reetiquetar factores según ordenación
result <- result %>%
  mutate(
    group_id_new    = factor(group,    levels = colnames(y_mat)[sort_group]),
    scenario_id_new = factor(scenario, levels = rownames(y_mat)[sort_scenario])
  )

# Mapa de calor
ggplot(result, aes(x = group_id_new, y = scenario_id_new, fill = y)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "blue", high = "red", name = "Success Rate") +
  labs(
    title = "Success Rate by Group and Scenario",
    x = "Group",
    y = "Scenario"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.text.y = element_text(angle = 45, vjust = 1)
  )

Objetivo del bloque: Ajustar un modelo no anidado con dos términos aleatorios (tratamiento y aeropuerto) vía lmer().

M1 <- lmer(y ~ 1 + (1 | group) + (1 | scenario), data = result)
boundary (singular) fit: see help('isSingular')
display(M1)  # muestra coeficientes fijos y desviaciones estándar por nivel
lmer(formula = y ~ 1 + (1 | group) + (1 | scenario), data = result)
coef.est  coef.se 
    0.44     0.12 

Error terms:
 Groups   Name        Std.Dev.
 scenario (Intercept) 0.32    
 group    (Intercept) 0.00    
 Residual             0.22    
---
number of obs: 40, groups: scenario, 8; group, 5
AIC = 20.3, DIC = 7.3
deviance = 9.8 

Objetivo del bloque: Ajustar un modelo equivalente con nlme::lme() (estructura alternativa de aleatoriedad).

M1_nlme <- nlme::lme(y ~ 1, random = ~ 1 | group / scenario, data = result)
summary(M1_nlme)
Linear mixed-effects model fit by REML
  Data: result 
       AIC      BIC    logLik
  45.53959 52.19384 -18.76979

Random effects:
 Formula: ~1 | group
         (Intercept)
StdDev: 7.146626e-06

 Formula: ~1 | scenario %in% group
        (Intercept)    Residual
StdDev:   0.3734507 0.001986792

Fixed effects:  y ~ 1 
                Value  Std.Error DF  t-value p-value
(Intercept) 0.4418155 0.05904858 35 7.482237       0

Standardized Within-Group Residuals:
         Min           Q1          Med           Q3          Max 
-0.006293823 -0.004513152 -0.001248589  0.005916490  0.007951542 

Number of Observations: 40
Number of Groups: 
              group scenario %in% group 
                  5                  40 

Notas de interpretación: En un ajuste de este tipo, es común que la variación entre aeropuertos sea sustancial en comparación con la variación entre tratamientos, lo que se refleja en las desviaciones estándar estimadas a cada nivel.


3.2.2 Ejemplo 2: regresión de ingresos en etnicidad, edad y estatura

3.2.2.1 Descripción del dataset de ingresos y altura

  • Unidad de análisis: Individuos encuestados en EE.UU.
  • Tamaño aproximado: varios miles de observaciones (dependiendo de los filtros aplicados).

Variables principales en el dataset (heights.dta):

  • earn: ingresos anuales (variable continua, en dólares).
  • height: estatura en pulgadas.
  • sex: sexo del individuo (1 = mujer, 2 = hombre).
  • race: categoría racial (1 = blanca, 2 = negra, otros valores para otras categorías).
  • hisp: indicador de origen hispano (1 = sí, 0 = no).
  • ed: nivel educativo alcanzado (categórico/ordinal).
  • yearbn: año de nacimiento.

Variables derivadas en el preprocesamiento:

  • age: edad aproximada del individuo, calculada como $90 - $.

  • age_category: edad agrupada en tres categorías:

    • 1 = joven (<35 años),
    • 2 = mediana edad (35–49 años),
    • 3 = mayor (50+ años).
  • eth: etnicidad en 4 categorías, combinando race y hisp:

    1. Negra,
    2. Hispana,
    3. Blanca,
    4. Otras.
  • male: indicador de sexo (1 = hombre, 0 = mujer).

  • y: logaritmo de los ingresos (log(earn)), usado como respuesta en la regresión.

  • x: estatura, a veces centrada en la media (x.centered) para mejorar la interpretación del modelo.

El dataset permite explorar cómo los ingresos dependen de:

  • Características individuales: estatura, edad, sexo.
  • Factores de grupo: etnicidad, edad categórica, e interacciones etnicidad × edad.

Modelo multinivel para ingresos logarítmicos \(y_{i}\) con estatura centrada \(z_{i}\):

\[ y_{i} \sim \mathrm{N}\!\left(\alpha_{j[i],k[i]}+\beta_{j[i],k[i]} z_{i}, \sigma_{y}^{2}\right), \quad i=1,\ldots,n. \]

Descomposición de interceptos y pendientes por etnicidad (\(j\)) y edad (\(k\)):

\[ \binom{\alpha_{j,k}}{\beta_{j,k}} = \binom{\mu_{0}}{\mu_{1}} + \binom{\gamma^{\text{eth}}_{0j}}{\gamma^{\text{eth}}_{1j}} + \binom{\gamma^{\text{age}}_{0k}}{\gamma^{\text{age}}_{1k}} + \binom{\gamma^{\text{eth}\times\text{age}}_{0jk}}{\gamma^{\text{eth}\times\text{age}}_{1jk}}. \]

Estructuras jerárquicas para variación por bloques:

\[ \begin{aligned} \binom{\gamma^{\text{eth}}_{0j}}{\gamma^{\text{eth}}_{1j}} &\sim \mathrm{N}\!\left(\binom{0}{0},\Sigma^{\text{eth}}\right), \\ \binom{\gamma^{\text{age}}_{0k}}{\gamma^{\text{age}}_{1k}} &\sim \mathrm{N}\!\left(\binom{0}{0},\Sigma^{\text{age}}\right), \\ \binom{\gamma^{\text{eth}\times\text{age}}_{0jk}}{\gamma^{\text{eth}\times\text{age}}_{1jk}} &\sim \mathrm{N}\!\left(\binom{0}{0},\Sigma^{\text{eth}\times\text{age}}\right). \end{aligned} \]

Objetivo del bloque: Cargar datos de ingresos/estatura y construir variables de agrupamiento y de interés.

library(haven)
heights <- read_dta("../ARM_Data/earnings/heights.dta")

Objetivo del bloque: Depurar y crear variables (edad, etnicidad, indicador masculino) y filtrar casos válidos.

heights <- heights %>%
  mutate(
    age = 90 - yearbn,
    age = ifelse(age < 18, NA, age),
    age_category = case_when(
      age < 35 ~ 1,
      age < 50 ~ 2,
      TRUE ~ 3
    ),
    eth = case_when(
      race == 2 ~ 1,
      hisp == 1 ~ 2,
      race == 1 ~ 3,
      TRUE ~ 4
    ),
    male = 2 - sex
  )

heights_clean <- heights %>%
  filter(!is.na(earn) & !is.na(height) & !is.na(sex) & earn > 0 & yearbn > 25) %>%
  dplyr::select(earn, height, sex, race, hisp, ed, age, age_category, eth, male)

Objetivo del bloque: Preparar variables finales (log-ingresos, altura, centrados) y dimensiones por grupos.

set.seed(123)
heights_clean <- heights_clean %>%
  mutate(
    height_jitter_add = runif(n(), -.2, .2),
    y = log(earn),
    x = height
  )

y      <- heights_clean$y
x      <- heights_clean$x
age    <- heights_clean$age_category
n      <- nrow(heights_clean)
n_age  <- 3
n_eth  <- 4

Objetivo del bloque: Ajustar un modelo con intercepto y pendiente aleatorios por etnicidad.

M1 <- lmer(y ~ x + (1 + x | eth), data = heights_clean)
boundary (singular) fit: see help('isSingular')
display(M1)
lmer(formula = y ~ x + (1 + x | eth), data = heights_clean)
            coef.est coef.se
(Intercept) 7.27     1.10   
x           0.04     0.02   

Error terms:
 Groups   Name        Std.Dev. Corr  
 eth      (Intercept) 1.55           
          x           0.02     -1.00 
 Residual             0.90           
---
number of obs: 1062, groups: eth, 4
AIC = 2823.3, DIC = 2788.6
deviance = 2800.0 

Objetivo del bloque: Ajustar el modelo análogo con nlme (estructura alternativa de covarianza).

M1_nlme <- nlme::lme(
  fixed  = y ~ x, 
  random = ~ x | eth, 
  data   = heights_clean
)
summary(M1_nlme)
Linear mixed-effects model fit by REML
  Data: heights_clean 
       AIC      BIC    logLik
  2823.787 2853.583 -1405.893

Random effects:
 Formula: ~x | eth
 Structure: General positive-definite, Log-Cholesky parametrization
            StdDev     Corr  
(Intercept) 1.77599145 (Intr)
x           0.02742268 -1    
Residual    0.90300309       

Fixed effects:  y ~ x 
               Value Std.Error   DF  t-value p-value
(Intercept) 7.380834 1.2082771 1057 6.108560  0.0000
x           0.034270 0.0185317 1057 1.849284  0.0647
 Correlation: 
  (Intr)
x -0.999

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-4.9284272 -0.4286750  0.1752600  0.6456474  2.6066249 

Number of Observations: 1062
Number of Groups: 4 

Objetivo del bloque: Centrar la estatura para reducir la correlación entre intercepto y pendiente aleatorios.

x.centered <- x - mean(x)

M2 <- lmer(y ~ x.centered + (1 + x.centered | eth), data = heights_clean)
boundary (singular) fit: see help('isSingular')
display(M2)
lmer(formula = y ~ x.centered + (1 + x.centered | eth), data = heights_clean)
            coef.est coef.se
(Intercept) 9.68     0.05   
x.centered  0.03     0.02   

Error terms:
 Groups   Name        Std.Dev. Corr 
 eth      (Intercept) 0.07          
          x.centered  0.03     1.00 
 Residual             0.90          
---
number of obs: 1062, groups: eth, 4
AIC = 2823.3, DIC = 2788.6
deviance = 2800.0 

Objetivo del bloque: Extender el modelo para incluir efectos por edad y por la interacción etnicidad×edad.

M3 <- lmer(
  y ~ x.centered + 
    (1 + x.centered | eth) + 
    (1 + x.centered | age) +  
    (1 + x.centered | eth:age),
  data = heights_clean
)
boundary (singular) fit: see help('isSingular')
display(M3)
lmer(formula = y ~ x.centered + (1 + x.centered | eth) + (1 + 
    x.centered | age) + (1 + x.centered | eth:age), data = heights_clean)
            coef.est coef.se
(Intercept) 9.69     0.07   
x.centered  0.05     0.02   

Error terms:
 Groups   Name        Std.Dev. Corr  
 eth:age  (Intercept) 0.00           
          x.centered  0.00     -0.90 
 age      (Intercept) 0.42           
          x.centered  0.02     0.76  
 eth      (Intercept) 0.04           
          x.centered  0.02     1.00  
 Residual             0.81           
---
number of obs: 1059, groups: eth:age, 136; age, 47; eth, 4
AIC = 2697.1, DIC = 2652.6
deviance = 2662.9 

Notas de interpretación: Los errores residuales pueden ser grandes respecto a las variaciones a nivel de grupo, lo que limita la precisión predictiva a nivel individual. Las varianzas de interceptos y pendientes por bloques (etnicidad, edad e interacción) cuantifican la heterogeneidad sistemática entre grupos.


3.2.3 Ejemplo 3: diseño de cuadrado latino \(5 \times 5\)

3.2.3.1 Descripción del dataset

  • Unidad experimental: una parcela agrícola de mijo.

  • Diseño: un cuadrado latino \(5 \times 5\), es decir:

    • 25 parcelas dispuestas en una cuadrícula de 5 filas × 5 columnas.
    • Se prueban 5 tratamientos distintos (por ejemplo, fertilizantes o métodos de cultivo).
    • Cada tratamiento aparece exactamente una vez en cada fila y en cada columna.

Variables principales:

  1. row (fila)

    • Índice de la fila en la cuadrícula (1–5).
    • Representa una posible fuente de variación sistemática (e.g., gradiente de suelo en dirección norte–sur).
  2. column (columna)

    • Índice de la columna en la cuadrícula (1–5).
    • Otra fuente potencial de variación sistemática (e.g., condiciones de riego en dirección este–oeste).
  3. treatment (tratamiento)

    • Uno de los 5 tratamientos experimentales, asignado de manera que cada uno aparezca una vez por fila y por columna.
    • Estos tratamientos están ordenados (lo que permite modelar un posible efecto lineal).
  4. yield (rendimiento)

    • Producción de mijo observada en cada parcela (variable continua).
    • Es la variable de respuesta del experimento.

Ejemplo de datos:

Fila Columna Tratamiento Rendimiento
1 1 B 257
1 2 E 230
1 3 A 279
1 4 C 287
1 5 D 202
5 5 B 259

En total, hay 25 observaciones (5×5).


3.2.4 Modelo multinivel planteado (ecuación 13.10):

El rendimiento se modela considerando efectos de fila, columna y tratamiento:

\[ \begin{aligned} y_{i} &\sim \mathrm{N}\!\left(\mu + \beta^{\text{row}}_{j[i]} + \beta^{\text{column}}_{k[i]} + \beta^{\text{treat}}_{l[i]}, \, \sigma_y^2 \right), \quad i=1,\ldots,25 \\ \beta^{\text{row}}_{j} &\sim \mathrm{N}\!\left(\gamma^{\text{row}}\cdot (j-3), \, \sigma^2_{\beta\text{ row}} \right), \quad j=1,\ldots,5 \\ \beta^{\text{column}}_{k} &\sim \mathrm{N}\!\left(\gamma^{\text{column}}\cdot (k-3), \, \sigma^2_{\beta\text{ column}} \right), \quad k=1,\ldots,5 \\ \beta^{\text{treat}}_{l} &\sim \mathrm{N}\!\left(\gamma^{\text{treat}}\cdot (l-3), \, \sigma^2_{\beta\text{ treat}} \right), \quad l=1,\ldots,5 \end{aligned} \]

Interpretación de las variables del modelo

  • \(\mu\): media global de los rendimientos.
  • \(\beta^{\text{row}}_j\): efecto de la fila \(j\).
  • \(\beta^{\text{column}}_k\): efecto de la columna \(k\).
  • \(\beta^{\text{treat}}_l\): efecto del tratamiento \(l\).
  • \(\gamma^{\text{row}}, \gamma^{\text{column}}, \gamma^{\text{treat}}\): tendencias lineales asociadas a cada dimensión.
  • \(\sigma_y\): variación residual (dentro de las parcelas).

El cuadrado latino permite controlar simultáneamente dos fuentes de variación sistemática (filas y columnas), para así evaluar el efecto de los tratamientos con mayor precisión.

En el modelo multinivel, además de estimar efectos independientes por fila, columna y tratamiento, se pueden incorporar predictores ordenados (lineales) para captar tendencias sistemáticas dentro de cada dimensión.

El centrado (restar 3) facilita interpretar \(\mu\) como media global y a las \(\gamma\) como tendencias lineales por fila, columna y tratamiento. Este ejemplo ilustra cómo, en modelos no anidados, es posible incorporar predictores a nivel de grupo (tendencias) junto con efectos aleatorios por cada factor, sin forzar una elección estricta entre un ajuste lineal y efectos específicos por nivel.

# Mini-ejemplo en R: Cuadrado latino 5x5 (millet) y modelo multinivel
# ---------------------------------------------------------------
# Carga de paquetes
library(tidyverse)
library(lme4)
library(broom.mixed)

# 1) Ingresar los datos (tabla de la Figura 13.11)
#   Cada celda: Tratamiento (A–E) y rendimiento (yield)
latin_raw <- tribble(
  ~row, ~col, ~treat, ~yield,
   1,     1,   "B",     257,
   1,     2,   "E",     230,
   1,     3,   "A",     279,
   1,     4,   "C",     287,
   1,     5,   "D",     202,
   2,     1,   "D",     245,
   2,     2,   "A",     283,
   2,     3,   "E",     245,
   2,     4,   "B",     280,
   2,     5,   "C",     260,
   3,     1,   "E",     182,
   3,     2,   "B",     252,
   3,     3,   "C",     280,
   3,     4,   "D",     246,
   3,     5,   "A",     250,
   4,     1,   "A",     203,
   4,     2,   "C",     204,
   4,     3,   "D",     227,
   4,     4,   "E",     193,
   4,     5,   "B",     259,
   5,     1,   "C",     231,
   5,     2,   "D",     271,
   5,     3,   "B",     266,
   5,     4,   "A",     334,
   5,     5,   "E",     338
)

latin <- latin_raw %>%
  mutate(
    row = factor(row),
    col = factor(col),
    treat = factor(treat, levels = c("A","B","C","D","E")),
    # Predictores lineales (centrados) para tendencias por fila/columna/tratamiento
    row_c = as.integer(row) - 3,
    col_c = as.integer(col) - 3,
    trt_c = as.integer(treat) - 3
  )

# 2) Exploración rápida
latin %>% 
  summarise(
    n = n(),
    mean_yield = mean(yield),
    sd_yield = sd(yield)
  )
# A tibble: 1 × 3
      n mean_yield sd_yield
  <int>      <dbl>    <dbl>
1    25       252.     39.0
# 3) Visualización tipo “heatmap” (rendimiento por celda)
ggplot(latin, aes(x = col, y = row, fill = yield)) +
  geom_tile(color = "white") +
  scale_fill_viridis_c() +
  labs(title = "Cuadrado latino 5x5: rendimiento por parcela",
       x = "Columna", y = "Fila", fill = "Rendimiento") +
  coord_equal() +
  theme_minimal()

# 4) Modelo multinivel aproximando (13.10):
#    - Efectos fijos: tendencias lineales por fila, columna y tratamiento (row_c, col_c, trt_c)
#    - Efectos aleatorios: variación adicional por fila, columna y tratamiento
m_ls <- lmer(
  yield ~ 1 + row_c + col_c + trt_c + 
    (1 | row) + (1 | col) + (1 | treat),
  data = latin
)
boundary (singular) fit: see help('isSingular')
summary(m_ls)
Linear mixed model fit by REML ['lmerMod']
Formula: yield ~ 1 + row_c + col_c + trt_c + (1 | row) + (1 | col) + (1 |  
    treat)
   Data: latin

REML criterion at convergence: 220

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0728 -0.6932  0.2392  0.4600  1.9111 

Random effects:
 Groups   Name        Variance Std.Dev.
 row      (Intercept) 719.9    26.83   
 col      (Intercept)   0.0     0.00   
 treat    (Intercept)   0.0     0.00   
 Residual             797.9    28.25   
Number of obs: 25, groups:  row, 5; col, 5; treat, 5

Fixed effects:
            Estimate Std. Error t value
(Intercept)  252.160     13.263  19.013
row_c          2.860      9.378   0.305
col_c          9.640      3.995   2.413
trt_c         -8.900      3.995  -2.228

Correlation of Fixed Effects:
      (Intr) row_c col_c
row_c 0.000             
col_c 0.000  0.000      
trt_c 0.000  0.000 0.000
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
# 5) Coeficientes fijos (interpretación de tendencias)
fixef(m_ls)
(Intercept)       row_c       col_c       trt_c 
     252.16        2.86        9.64       -8.90 
# 6) Varianzas por nivel (resumen de incertidumbre a nivel fila/columna/tratamiento y residual)
VarCorr(m_ls)
 Groups   Name        Std.Dev.
 row      (Intercept) 26.831  
 col      (Intercept)  0.000  
 treat    (Intercept)  0.000  
 Residual             28.248  
# 7) Efectos aleatorios estimados (desviaciones respecto a la tendencia)
ranef_ls <- ranef(m_ls, condVar = TRUE)

# 8) Graficar efectos por nivel (con intervalos aproximados)
#    a) Filas
# 1) Extraer efectos aleatorios
ranef_list <- ranef(m_ls)

# 2) Convertir a tibble para filas
ranef_row <- ranef_list$row %>%
  rownames_to_column("grp") %>%
  as_tibble() %>%
  rename(est = `(Intercept)`)

# 3) Graficar efectos aleatorios de Fila
ggplot(ranef_row, aes(x = grp, y = est)) +
  geom_hline(yintercept = 0, linetype = 2) +
  geom_point(size = 3, color = "blue") +
  labs(title = "Efectos aleatorios por Fila (desvío del intercepto)",
       x = "Fila", y = "Efecto aleatorio") +
  theme_minimal()

#    b) Columnas
# Columnas
ranef_col <- ranef_list$col %>%
  rownames_to_column("grp") %>%
  as_tibble() %>%
  rename(est = `(Intercept)`)

ggplot(ranef_col, aes(x = grp, y = est)) +
  geom_hline(yintercept = 0, linetype = 2) +
  geom_point(size = 3, color = "darkgreen") +
  labs(title = "Efectos aleatorios por Columna (desvío del intercepto)",
       x = "Columna", y = "Efecto aleatorio") +
  theme_minimal()

# Tratamientos
ranef_trt <- ranef_list$treat %>%
  rownames_to_column("grp") %>%
  as_tibble() %>%
  rename(est = `(Intercept)`)

ggplot(ranef_trt, aes(x = grp, y = est)) +
  geom_hline(yintercept = 0, linetype = 2) +
  geom_point(size = 3, color = "red") +
  labs(title = "Efectos aleatorios por Tratamiento (desvío del intercepto)",
       x = "Tratamiento", y = "Efecto aleatorio") +
  theme_minimal()

# 9) Predicciones por celda (para diagnóstico rápido)
latin %>%
  mutate(pred = predict(m_ls)) %>%
  ggplot(aes(x = yield, y = pred)) +
  geom_abline(slope = 1, intercept = 0, linetype = 2) +
  geom_point() +
  labs(title = "Observado vs. Predicción",
       x = "Rendimiento observado", y = "Predicción") +
  theme_minimal()

3.3 Modelos clásicos para coeficientes de regresión

En esta sección se abordan estrategias para seleccionar, transformar y combinar predictores en modelos de regresión multinivel. Se discute cómo los modelos multinivel pueden extender los modelos clásicos, aprovechando información estructurada en diferentes niveles para mejorar las estimaciones y reducir la complejidad en problemas con gran número de predictores. También se exploran transformaciones lineales y combinaciones ponderadas de variables, conectándolas con el análisis factorial.

En un modelo multinivel, cada coeficiente tiene asociado un modelo con media y desviación estándar, lo cual generaliza la regresión clásica:

  • Si un predictor está “incluido”: equivale a \(\sigma_{\alpha}=\infty\), es decir, se estima directamente por mínimos cuadrados.
  • Si un predictor está “excluido”: equivale a \(\sigma_{\alpha}=0\), y el coeficiente se fija en cero.

De este modo, la regresión clásica puede verse como un caso particular de los modelos multinivel.

3.3.1 Modelos multinivel como alternativa a la selección de predictores

Los modelos multinivel permiten combinar múltiples entradas de manera más eficiente.

Ejemplo: Witte et al. (1994) ajustaron una regresión logística para predecir incidencia de cáncer en un estudio de 362 personas con consumo reportado de 87 alimentos.

Modelo propuesto:

\[ \begin{align*} \Pr(y_{i}=1) &= \operatorname{logit}^{-1}\left(X_{i}^{0}\beta^{0}+X_{i}B_{j[i]}\right), \quad i=1,\ldots,362 \\ B_{j} &\sim \mathrm{N}(Z_{j}\gamma,\sigma_{\beta}^{2}), \quad j=1,\ldots,87 \tag{13.11} \end{align*} \]

Donde:

  • \(X\): matriz \(362 \times 87\) de consumo de alimentos.
  • \(X^{0}\): matriz \(362 \times 6\) de controles.
  • \(Z\): matriz \(87 \times 36\) que describe nutrientes por alimento.

Esto reduce efectivamente los predictores de 87 a 35 nutrientes.

3.3.2 Transformación y combinación lineal de predictores

Otro caso corresponde a los modelos de predicción electoral en EE.UU. donde se cuenta con múltiples predictores económicos nacionales.

En lugar de elegir uno solo, se pueden combinar cinco predictores estandarizados \(X_{(j)}\):

Promedio simple

\[ x_{i}^{\text{avg}} = \frac{1}{5}\sum_{j=1}^{5} X_{ij}, \quad i=1,\ldots,n \]

Modelo de regresión:

\[ y_{i} = \alpha + \beta x_{i}^{\text{avg}} + \cdots \]

Promedio ponderado

De forma más flexible:

\[ x_{i}^{\text{w.avg}} = \frac{1}{5}\sum_{j=1}^{5}\gamma_{j}X_{ij}, \quad i=1,\ldots,n \]

Modelo:

\[ \begin{aligned} y_{i} &= \alpha + \beta x_{i}^{\text{w.avg}} + \cdots \\ &= \alpha + \frac{1}{5}\gamma_{1}\beta X_{i1} + \cdots + \frac{1}{5}\gamma_{5}\beta X_{i5} + \cdots \end{aligned} \]

Con:

\[ \gamma_{j} \sim \mathrm{N}(1,\sigma_{\gamma}^{2}), \quad j=1,\ldots,5 \]

Interpretaciones:

  • \(\sigma_{\gamma}=0\): todos los \(\gamma_{j}=1\) (pooling completo).
  • \(\sigma_{\gamma}=\infty\): sin pooling, cada predictor tiene su propio coeficiente.
  • \(0<\sigma_{\gamma}<\infty\): pooling parcial.

3.3.3 Conexión con el análisis factorial

La combinación de múltiples predictores puede entenderse como una construcción de factores.

Ejemplo de modelo de predicción electoral:

\[ y_{st} = \beta^{(0)}X_{st}^{(0)} + \alpha_{1}\sum_{j=1}^{5}\beta_{j}^{(1)}X_{jt}^{(1)} + \alpha_{2}\gamma_{t} + \alpha_{3}\delta_{r[s],t} + \epsilon_{st} \]

Más generalmente, para \(K\) lotes de predictores:

\[ y = X^{(0)}\beta^{(0)} + \beta_{1}x^{\text{w.avg},1} + \cdots + \beta_{K}x^{\text{w.avg},K} + \cdots \]

Donde cada lote \(k\) combina \(J_{k}\) predictores:

\[ x_{i}^{\text{w.avg},k} = \frac{1}{J_{k}}\sum_{j=1}^{J_{k}}\gamma_{jk}x_{i}^{jk}, \quad i=1,\ldots,n \]

Y los pesos relativos siguen:

\[ \gamma_{jk} \sim \mathrm{N}(1,\sigma_{\gamma k}^{2}), \quad j=1,\ldots,J_{k} \]

De este modo:

  • \(x^{\text{w\.avg},k}\) es un factor combinado,
  • \(\beta_{k}\) mide la importancia de dicho factor,
  • \(\gamma_{jk}\) indica la relevancia relativa de cada predictor dentro del lote.