Modelos

Autor/a

Mario Camacho

Fecha de publicación

23 marzo 2026

Resumen
Work in progress

Stakeholder: Jose L Merino Rivas Centro: Hospital del Henares
Fecha última modificación: 23 marzo 2026

Data modelos

Ejemplo

# A tibble: 7 × 7
     id Aleatorización Mes      `Pauta (código)` Ferritina cambio_ferritina_t0
  <dbl> <fct>          <ord>    <fct>                <dbl>               <dbl>
1     1 Ferinject      0 meses  <NA>                   414                   0
2     1 Ferinject      2 meses  1                      418                   4
3     1 Ferinject      4 meses  1                      308                -106
4     1 Ferinject      6 meses  <NA>                   215                -199
5     1 Ferinject      8 meses  <NA>                   183                -231
6     1 Ferinject      10 meses <NA>                   216                -198
7     1 Ferinject      12 meses <NA>                   193                -221
# ℹ 1 more variable: cambio_ferritina_tmenos1 <dbl>

Distribución de la variable respuesta

NO ES NECESARIA NINGUNA SUPOSICIÓN SOBRE LA DISTRIBUCIÓN DE LA VARIABLE RESPUESTA, es simple curiosidad.

Efecto no-lineal del factor tiempo

Data: mutate(filter(df, Vivo == 1), Mes = as.numeric(Mes))
Models:
fits$grado_1: cambio_ferritina_t0 ~ Aleatorización + poly(Mes, g, raw = TRUE) + (1 | id)
fits$grado_2: cambio_ferritina_t0 ~ Aleatorización + poly(Mes, g, raw = TRUE) + (1 | id)
fits$grado_3: cambio_ferritina_t0 ~ Aleatorización + poly(Mes, g, raw = TRUE) + (1 | id)
fits$grado_4: cambio_ferritina_t0 ~ Aleatorización + poly(Mes, g, raw = TRUE) + (1 | id)
             npar    AIC    BIC  logLik -2*log(L)  Chisq Df Pr(>Chisq)
fits$grado_1    5 5095.7 5115.4 -2542.8    5085.7                     
fits$grado_2    6 5096.1 5119.8 -2542.0    5084.1 1.6097  1     0.2045
fits$grado_3    7 5097.9 5125.5 -2541.9    5083.9 0.2048  1     0.6509
fits$grado_4    8 5099.8 5131.4 -2541.9    5083.8 0.0480  1     0.8265

--- Interpretación ---

Modelo recomendado: grado_1
grado_1 vs grado_2 : el modelo complejo grado_2 NO mejora significativamente respecto a grado_1 (p = 0.2045 )
grado_2 vs grado_3 : el modelo complejo grado_3 NO mejora significativamente respecto a grado_2 (p = 0.6509 )
grado_3 vs grado_4 : el modelo complejo grado_4 NO mejora significativamente respecto a grado_3 (p = 0.8265 )
Implicación clínica

No se observa evidencia estadística, según el test de razón de verosimilitudes, de que añadir términos de curvatura mejore el ajuste del modelo. Por tanto, la evolución de la ferritina es compatible con una relación aproximadamente lineal en el tiempo. La curvatura aparente podría deberse a variabilidad individual (capturada por (1 | id)) o a ruido

Ferritina (continua)

Modelo de intersección aleatoria

Intersección aleatoria por sujeto.

Varios niveles sin datos observados.

, , Pauta (código) = 1

   Aleatorización
Mes Venofer Ferinject
  0       0         0
  1       0        20
  2       0        20
  3       1        19
  4       0        15
  5       0        15
  6       0        12

, , Pauta (código) = 3

   Aleatorización
Mes Venofer Ferinject
  0       0         0
  1      17         3
  2      18         1
  3       8         1
  4       8         1
  5      13         1
  6      14         1

, , Pauta (código) = 4

   Aleatorización
Mes Venofer Ferinject
  0       0         0
  1       1         2
  2       0         1
  3       0         0
  4       0         0
  5       0         0
  6       0         0

, , Pauta (código) = 2

   Aleatorización
Mes Venofer Ferinject
  0       0         0
  1       0         0
  2       1         0
  3       0         1
  4       1         4
  5       0         5
  6       0         5

, , Pauta (código) = NA

   Aleatorización
Mes Venofer Ferinject
  0      30        34
  1      12         9
  2      11         9
  3      18         9
  4      17         9
  5      12         7
  6       9         9
  • Muchos cruces de niveles sin observaciones
  • La pauta es la misma independientemente del hierro
  • Me interesa el tipo de hierro: no quiero triple interacción.
NO QUIERO: \(HD + Mes * Aleatorización * \text{Pauta (código)} + (1 \mid id)\)
SÍ QUIERO: \(HD + Mes + Aleatorización + \text{Pauta (código)} + Mes \cdot Aleatorización + (1 \mid id)\)
m1 <- lmer(
  log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes*Aleatorización + (1 | id),
  data = data_m1,
  REML = TRUE
)
# Este modelo no puede usar datos del Control 2 porque cambio vs t0 y cambio vs t-1 es lo mismo
# data_m1_m2a <- data_m1 |> filter(!Mes%in%c(0,2)) # para temas de funciones posteriores
# Antes usaba el factor fijo cambio_log_ferritina_tmenos1 pero no tiene sentido porque para eso le he tenido que medir el nivel de ferritina
m2a <- lmer(
  cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + Mes*Aleatorización + (1 | id),
  data = data_m1,
  REML = TRUE
)
# Si meto también el log(ferritina_previa), me pasaría igual que en el modelo anterior, no sería válido para el Control 2
m2b <- lmer(
  cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes*Aleatorización + (1 | id),
  data = data_m1,
  REML = TRUE
)
# Para mí este modelo es el que menos sentido quiere. El factor tiempo (siendo lineal) pierde sentido si siempre voy a predecir el cambio respecto al t-1, metiendo el t (y aún más si también hubiera metido la ferritina_previa)
m3 <- lmer(
  cambio_log_ferritina_tmenos1 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes*Aleatorización + (1 | id),
  data = data_m1,
  REML = TRUE
)
boundary (singular) fit: see help('isSingular')

boundary (singular) fit: la varianza entre sujetos del m3 es prácticamente 0, es decir, la pendiente aleatoria no aporta información. Planteo el modelo m3 pero sin la pendiente aleatoria.

m3 <- lm(
  cambio_log_ferritina_tmenos1 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes*Aleatorización,
  data = data_m1
)

Comparación de modelos.

Comparo únicamente los modelos con intersección aleatoria:
- m1 (precedir la log-ferritina)
- m2a (predecir el cambio de la log-ferritina respecto al valor basal usando el cambio_log_ferritina_tmenos1).
- m2b (predecir el cambio de la log-ferritina respecto al valor basal usando la log_ferritina_basal).

La no normalidad de los residuos causa: coeficientes insesgados + intervalos de confianza y p-valores posiblemente no ser fiables + predicciones para valores extremos potencialmente imprecisas.

Warning: Non-normality of residuals detected (p < .001).

Warning: Non-normality of residuals detected (p = 0.010).

Warning: Non-normality of residuals detected (p = 0.019).
## [1] "4"  "16" "19" "20" "26" "38" "53" "59" "64"
## [1] "4"  "26" "53" "64"
## [1] "4"  "19" "20" "26" "53" "64"
Advertencia

Quito el outlier id_paciente=c(26,53,64), validarlo con Jose Luis.

m1 <- lmer(
  log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes*Aleatorización + (1 | id),
  data = data_m2,
  REML = TRUE
)
# Este modelo no puede usar datos del Control 2 porque cambio vs t0 y cambio vs t-1 es lo mismo
# data_m2_m2a <- data_m2 |> filter(!Mes%in%c(0,2)) # para temas de funciones posteriores
m2a <- lmer(
  cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + Mes*Aleatorización + (1 | id),
  data = data_m2,
  REML = TRUE
)
# Si meto también el log(ferritina_previa), me pasaría igual que en el modelo anterior, no sería válido para el Control 2
m2b <- lmer(
  cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes*Aleatorización + (1 | id),
  data = data_m2,
  REML = TRUE
)

Warning: Non-normality of residuals detected (p < .001).

Warning: Non-normality of residuals detected (p = 0.011).

Warning: Non-normality of residuals detected (p = 0.027).

Resultados

Importante

Los modelos m1 y m2a cumple con la hipótesis de normalidad de los errores.

ICC: medida de correlación de las observaciones pertenecientes al mismo conjunto / varianza entre los conjuntos partido por la varianza total / porcentaje de la variabilidad residual debida a diferencias entre sujetos.

ICC alto (es lo que me gustaría): - mucha variabilidad entre sujetos
- poca variabilidad dentro del sujeto
- las observaciones del mismo sujeto se parecen mucho

ICC bajo:
- poca variabilidad entre sujetos
- mucha variabilidad dentro del sujeto
- medir varias veces al mismo sujeto aporta poca información extra

  • ICC > 0.20: fuerte dependencia intra-sujeto -> modelo mixto imprescidible
  • ICC 0.05–0.20: moderada dependencia intra-sujeto -> modelo mixto recomendable
  • ICC < 0.05: poca dependencia intra-sujeto -> poca ganancia por agrupar

Modelo m1

Observaciones no incluidas en el modelo debido a valores faltantes en las covariables incluidas.

   log_Ferritina               HD              Mes   Aleatorización 
              13                0                0                0 
  Pauta (código) ferritina_previa               id 
             190               67                0 
Linear mixed model fit by REML ['lmerMod']
Formula: log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` +  
    log(ferritina_previa) + Mes * Aleatorización + (1 | id)
   Data: data_m2
REML criterion at convergence: 247.1297
Random effects:
 Groups   Name        Std.Dev.
 id       (Intercept) 0.1409  
 Residual             0.4237  
Number of obs: 187, groups:  id, 53
Fixed Effects:
                (Intercept)                          HD1  
                    2.32393                      0.03308  
                        Mes      AleatorizaciónFerinject  
                   -0.01445                     -0.37645  
          `Pauta (código)`3            `Pauta (código)`4  
                   -0.30262                     -0.14999  
          `Pauta (código)`2        log(ferritina_previa)  
                   -0.11614                      0.69174  
Mes:AleatorizaciónFerinject  
                   -0.01899  

 ============================================================ 
            DIAGNÓSTICO COMPLETO DEL MODELO
============================================================ 

1. PRUEBAS DE NORMALIDAD DE RESIDUOS:
   Shapiro-Wilk: W = 0.9695, p-valor = 0.0004
   Kolmogorov-Smirnov: D = 0.0646, p-valor = 0.4166
   ⚠ Los residuos NO son normales (p < 0.05) - pero modelos mixtos son robustos

2. HOMOCEDASTICIDAD:
   Test de heterocedasticidad: p = 0.0028
   ⚠ Evidencia de heterocedasticidad

##                                   2.5 %     97.5 %
## .sig01                               NA         NA
## .sigma                               NA         NA
## (Intercept)                  1.56223240 3.08562088
## HD1                         -0.23280012 0.29895561
## Mes                         -0.06741331 0.03851590
## AleatorizaciónFerinject     -0.81530851 0.06240570
## `Pauta (código)`3           -0.68711977 0.08187821
## `Pauta (código)`4           -0.67920670 0.37922370
## `Pauta (código)`2           -0.42552444 0.19325423
## log(ferritina_previa)        0.59068853 0.79278705
## Mes:AleatorizaciónFerinject -0.09246684 0.05447954
=== ANÁLISIS DEL ICC ===
ICC calculado: 0.100
Clasificación: Bajo

COMPONENTES DE VARIANZA:
- Varianza entre sujetos: 0.0198 (10.0%)
- Varianza intra-sujeto: 0.1795 (90.0%)
- Varianza total: 0.1993

CONCLUSIONES CLÍNICAS Y ESTADÍSTICAS:
- ICC BAJO-MODERADO: Observaciones relativamente independientes
- Evaluar si efecto aleatorio es necesario

RECOMENDACIONES:
• Tamaño medio del cluster: 3.5 obs/paciente
• Nº óptimo de mediciones/paciente: 18.1
• Mejor: MENOS pacientes, MÁS mediciones por paciente
$ICC
[1] 0.09957298

$Interpretacion_varianza
[1] "Dependencia intra-sujeto moderada: modelo mixto recomendable"
$emmeans
 Aleatorización emmean    SE   df lower.CL upper.CL
 Venofer          6.29 0.164 85.0     5.96     6.62
 Ferinject        5.85 0.114 99.4     5.62     6.08

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast            estimate  SE   df t.ratio p.value
 Venofer - Ferinject     0.44 0.2 90.5   2.202  0.0302

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 
Implicación clínica

El modelo explicativo m1 evalúa el nivel de log-ferritina en función de los efectos fijos de HD (indica si el paciente recibe más de dos sesiones de hemodiálisis por semana), mes, aleatorización, pauta, la log-ferritina del control previo, y la interacción entre mes y aleatorización. Además, incorpora un efecto aleatorio para id para tener en cuenta la variabilidad entre pacientes: cada paciente (id) tiene su propio valor basal de log_Ferritina y la evolución temporal (efecto de Mes) es la misma para todos los pacientes. En este modelo, a medida que aumenta el tiempo, la diferencia en el efecto de cada rama de aleatorización es constante.

Mes = 0:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.376 0.226 138.3   1.668  0.0975

Mes = 1:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.395 0.210 119.1   1.879  0.0627

Mes = 2:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.414 0.201 102.5   2.059  0.0420

Mes = 3:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.433 0.199  92.3   2.178  0.0319

Mes = 4:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.452 0.204  89.6   2.220  0.0289

Mes = 5:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.471 0.215  93.4   2.191  0.0309

Mes = 6:
 contrast            estimate    SE    df t.ratio p.value
 Venofer - Ferinject    0.490 0.232 101.9   2.112  0.0371

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 
$id

Modelo m2a

Observaciones no incluidas en el modelo debido a valores faltantes en las covariables incluidas.

cambio_log_ferritina_t0                      HD                     Mes 
                     19                       0                       0 
         Aleatorización          Pauta (código)                      id 
                      0                     190                       0 
Linear mixed model fit by REML ['lmerMod']
Formula: 
cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` +  
    Mes * Aleatorización + (1 | id)
   Data: data_m2
REML criterion at convergence: 283.3216
Random effects:
 Groups   Name        Std.Dev.
 id       (Intercept) 0.5755  
 Residual             0.3732  
Number of obs: 184, groups:  id, 52
Fixed Effects:
                (Intercept)                          HD1  
                    0.08366                      0.34071  
                        Mes      AleatorizaciónFerinject  
                    0.03904                     -0.07256  
          `Pauta (código)`3            `Pauta (código)`4  
                   -0.02888                     -0.12265  
          `Pauta (código)`2  Mes:AleatorizaciónFerinject  
                   -0.33967                     -0.04519  

 ============================================================ 
            DIAGNÓSTICO COMPLETO DEL MODELO
============================================================ 

1. PRUEBAS DE NORMALIDAD DE RESIDUOS:
   Shapiro-Wilk: W = 0.9763, p-valor = 0.0032
   Kolmogorov-Smirnov: D = 0.0605, p-valor = 0.5103
   ⚠ Los residuos NO son normales (p < 0.05) - pero modelos mixtos son robustos

2. HOMOCEDASTICIDAD:
   Test de heterocedasticidad: p = 0.2462
   ✓ Varianza constante (homocedasticidad) aceptable

##                                   2.5 %      97.5 %
## .sig01                               NA          NA
## .sigma                               NA          NA
## (Intercept)                 -0.52681063  0.69413568
## HD1                         -0.30268620  0.98410969
## Mes                         -0.01305544  0.09112677
## AleatorizaciónFerinject     -0.69019776  0.54507122
## `Pauta (código)`3           -0.57590633  0.51813652
## `Pauta (código)`4           -0.64772232  0.40241763
## `Pauta (código)`2           -0.66254262 -0.01680737
## Mes:AleatorizaciónFerinject -0.11921601  0.02883509
=== ANÁLISIS DEL ICC ===
ICC calculado: 0.704
Clasificación: Muy fuerte

COMPONENTES DE VARIANZA:
- Varianza entre sujetos: 0.3312 (70.4%)
- Varianza intra-sujeto: 0.1393 (29.6%)
- Varianza total: 0.4705

CONCLUSIONES CLÍNICAS Y ESTADÍSTICAS:
- ICC MUY ALTO: Mediciones fuertemente correlacionadas dentro de paciente
- Modelo mixto es CRUCIAL
- Variabilidad dominada por diferencias entre pacientes

RECOMENDACIONES:
• Tamaño medio del cluster: 3.5 obs/paciente
• Nº óptimo de mediciones/paciente: 0.8
• Mejor: MÁS pacientes, MENOS mediciones por paciente
$ICC
[1] 0.7039641

$Interpretacion_varianza
[1] "Dependencia intra-sujeto alta: modelo mixto imprescindible"
$emmeans
 Aleatorización emmean    SE   df lower.CL upper.CL
 Venofer        0.2615 0.278 90.0   -0.290    0.813
 Ferinject      0.0381 0.192 71.9   -0.345    0.421

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast            estimate   SE  df t.ratio p.value
 Venofer - Ferinject    0.223 0.31 124   0.721  0.4722

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 

El modelo explicativo m1: r evalúa el cambio de log-ferritina respecto al control en el mes 0 en función de los efectos fijos de HD (indica si el paciente recibe más de dos sesiones de hemodiálisis por semana), mes, aleatorización, pauta, la log-ferritina del control previo, y la interacción entre mes y aleatorización. Además, incorpora un efecto aleatorio para id para tener en cuenta la variabilidad entre pacientes: cada paciente (id) tiene su propio valor basal de log_Ferritina y la evolución temporal (efecto de Mes) es la misma para todos los pacientes. En este modelo, a medida que aumenta el tiempo, la diferencia en el efecto de cada rama de aleatorización es mayor aunque no llega a ser una diferencia significativa.

Mes = 0:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.0726 0.317 137   0.229  0.8194

Mes = 1:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.1178 0.310 129   0.380  0.7044

Mes = 2:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.1629 0.307 125   0.532  0.5960

Mes = 3:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.2081 0.308 124   0.675  0.5007

Mes = 4:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.2533 0.314 126   0.806  0.4218

Mes = 5:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.2985 0.325 132   0.919  0.3598

Mes = 6:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.3437 0.339 140   1.013  0.3128

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 

La falta de significación en las comparaciones punto a punto puede deberse a:
- Bajo poder estadístico para detectar diferencias en puntos específicos
- Alta variabilidad entre sujetos
- El efecto acumulativo necesita más tiempo para ser detectable

Pendiente aleatoria (Mes | id)

¿El tiempo debe ser factor aleatorio? ¿Hay variabilidad entre sujetos en la evolución temporal?

Nota

Para predecir la log-ferritina es suficiente con el modelo de intersección aleatoria, no es necesario incluir pendiente aleatoria por mes.

Data: data_m2
Models:
m1_0: log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes * Aleatorización + (1 | id)
m1_1: log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes * Aleatorización + ((1 | id) + (0 + Mes | id))
     npar    AIC    BIC  logLik -2*log(L) Chisq Df Pr(>Chisq)
m1_0   11 238.86 274.40 -108.43    216.86                    
m1_1   12 240.86 279.63 -108.43    216.86     0  1          1
 Groups   Name        Std.Dev.
 id       (Intercept) 0.059935
 id.1     Mes         0.000000
 Residual             0.428045
Nota

Para predecir el cambio de la log-ferritina respecto al basal usando el cambio_log_ferritina_tmenos1 es mejor el modelo con pendiente (Mes) e intersección aleatoria (id).

Data: data_m2
Models:
m2_0: cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + Mes * Aleatorización + (1 | id)
m2_1: cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + Mes * Aleatorización + ((1 | id) + (0 + Mes | id))
     npar    AIC    BIC  logLik -2*log(L) Chisq Df Pr(>Chisq)
m2_0   10 283.49 315.64 -131.75    263.49                    
m2_1   11 285.48 320.85 -131.74    263.48 0.008  1     0.9288
 Groups   Name        Std.Dev.
 id       (Intercept) 0.55061 
 id.1     Mes         0.01461 
 Residual             0.36625 
Nota

Para predecir el cambio de la log-ferritina respecto al basal usando la log_ferritina_basal es suficiente con el modelo de intersección aleatoria, no es necesario incluir pendiente aleatoria por mes.

Data: data_m2
Models:
m2_0: cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes * Aleatorización + (1 | id)
m2_1: cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` + log_ferritina_basal + Mes * Aleatorización + (1 + Mes | id)
     npar    AIC    BIC  logLik -2*log(L)  Chisq Df Pr(>Chisq)
m2_0   11 268.48 303.85 -123.24    246.48                     
m2_1   13 271.11 312.90 -122.56    245.11 1.3706  2     0.5039
 Groups   Name        Std.Dev. Corr  
 id       (Intercept) 0.372178       
          Mes         0.024016 1.000 
 Residual             0.366515       

Warning: Non-normality of residuals detected (p = 0.007).

Resultados

Importante

El modelo m2a cumple con la hipótesis de normalidad de los errores.

Modelo m2a_tRandom

Observaciones no incluidas en el modelo debido a valores faltantes en las covariables incluidas.

cambio_log_ferritina_t0                      HD                     Mes 
                     19                       0                       0 
         Aleatorización          Pauta (código)                      id 
                      0                     190                       0 
Linear mixed model fit by REML ['lmerMod']
Formula: 
cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` +  
    Mes * Aleatorización + ((1 | id) + (0 + Mes | id))
   Data: data_m2
REML criterion at convergence: 283.2177
Random effects:
 Groups   Name        Std.Dev.
 id       (Intercept) 0.56828 
 id.1     Mes         0.02891 
 Residual             0.36982 
Number of obs: 184, groups:  id, 52
Fixed Effects:
                (Intercept)                          HD1  
                    0.10999                      0.31888  
                        Mes      AleatorizaciónFerinject  
                    0.03921                     -0.09157  
          `Pauta (código)`3            `Pauta (código)`4  
                   -0.05317                     -0.13748  
          `Pauta (código)`2  Mes:AleatorizaciónFerinject  
                   -0.35576                     -0.04502  

 ============================================================ 
            DIAGNÓSTICO COMPLETO DEL MODELO
============================================================ 

1. PRUEBAS DE NORMALIDAD DE RESIDUOS:
   Shapiro-Wilk: W = 0.9745, p-valor = 0.0019
   Kolmogorov-Smirnov: D = 0.0602, p-valor = 0.5169
   ⚠ Los residuos NO son normales (p < 0.05) - pero modelos mixtos son robustos

2. HOMOCEDASTICIDAD:
   Test de heterocedasticidad: p = 0.2459
   ✓ Varianza constante (homocedasticidad) aceptable

##                                   2.5 %      97.5 %
## .sig01                               NA          NA
## .sig02                               NA          NA
## .sigma                               NA          NA
## (Intercept)                 -0.50006210  0.72004302
## HD1                         -0.32432000  0.96207446
## Mes                         -0.01446534  0.09289467
## AleatorizaciónFerinject     -0.70773977  0.52459232
## `Pauta (código)`3           -0.60109315  0.49474668
## `Pauta (código)`4           -0.66315368  0.38819632
## `Pauta (código)`2           -0.68341882 -0.02810407
## Mes:AleatorizaciónFerinject -0.12127178  0.03122524
=== ANÁLISIS DEL ICC ===
ICC calculado: 0.702
Clasificación: Muy fuerte

COMPONENTES DE VARIANZA:
- Varianza entre sujetos: 0.3229 (70.2%)
- Varianza intra-sujeto: 0.1368 (29.8%)
- Varianza total: 0.4597

CONCLUSIONES CLÍNICAS Y ESTADÍSTICAS:
- ICC MUY ALTO: Mediciones fuertemente correlacionadas dentro de paciente
- Modelo mixto es CRUCIAL
- Variabilidad dominada por diferencias entre pacientes

RECOMENDACIONES:
• Tamaño medio del cluster: 3.5 obs/paciente
• Nº óptimo de mediciones/paciente: 0.8
• Mejor: MÁS pacientes, MENOS mediciones por paciente
$ICC
[1] 0.7024931

$Interpretacion_varianza
[1] "Dependencia intra-sujeto alta: modelo mixto imprescindible"
$emmeans
 Aleatorización emmean    SE   df lower.CL upper.CL
 Venofer        0.2637 0.281 90.0   -0.294    0.821
 Ferinject      0.0219 0.195 71.6   -0.367    0.410

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject    0.242 0.313 123   0.772  0.4415

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 

A medida que aumenta el tiempo, la diferencia en el efecto de cada rama de aleatorización es mayor aunque no llega a ser una diferencia significativa.

Mes = 0:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.0916 0.319 134   0.287  0.7748

Mes = 1:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.1366 0.312 127   0.438  0.6621

Mes = 2:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.1816 0.309 123   0.588  0.5578

Mes = 3:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.2266 0.311 123   0.728  0.4680

Mes = 4:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.2717 0.318 123   0.853  0.3952

Mes = 5:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.3167 0.330 121   0.959  0.3393

Mes = 6:
 contrast            estimate    SE  df t.ratio p.value
 Venofer - Ferinject   0.3617 0.346 114   1.046  0.2980

Results are averaged over the levels of: HD, Pauta (código) 
Degrees-of-freedom method: kenward-roger 

La falta de significación en las comparaciones punto a punto puede deberse a:
- Bajo poder estadístico para detectar diferencias en puntos específicos
- Alta variabilidad entre sujetos
- El efecto acumulativo necesita más tiempo para ser detectable

Cada id tiene su intercepto propio (nivel inicial de cambio_log_ferritina_t0). Y también tiene su pendiente propia para Mes, que indica cómo cambia la variable con el tiempo para ese paciente.

Pendiente aleatoria (pauta | id) NO TERMINADO

¿La pauta debe ser factor aleatorio? ¿Hay variabilidad entre sujetos en la pauta?

Nota

Para predecir la log-ferritina es suficiente con el modelo de intersección aleatoria, no es necesario incluir pendiente aleatoria por pauta.

Data: data_m2
Models:
m1_0: log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes * Aleatorización + (1 | id)
m1_1: log_Ferritina ~ HD + Mes + Aleatorización + `Pauta (código)` + log(ferritina_previa) + Mes * `Pauta (código)` + (1 + Mes | id)
     npar    AIC    BIC  logLik -2*log(L)  Chisq Df Pr(>Chisq)
m1_0   11 238.86 274.40 -108.43    216.86                     
m1_1   15 244.00 292.46 -107.00    214.00 2.8635  4     0.5809
 Groups   Name        Std.Dev.  Corr   
 id       (Intercept) 0.1250834        
          Mes         0.0093161 -1.000 
 Residual             0.4188477        
Nota

Para predecir el cambio de la log-ferritina respecto al basal es mejor el modelo con pendiente (Aleatorización) e intersección aleatoria (id).

 Groups   Name        Std.Dev. Corr  
 id       (Intercept) 0.360859       
          Mes         0.078994 0.521 
 Residual             0.238450       
## Linear mixed model fit by maximum likelihood  ['lmerMod']
## Formula: 
## cambio_log_ferritina_t0 ~ HD + Mes + Aleatorización + `Pauta (código)` +  
##     cambio_log_ferritina_tmenos1 + Mes * `Pauta (código)` +  
##     (1 + Mes | id)
##    Data: data_m2
## 
##       AIC       BIC    logLik -2*log(L)  df.resid 
##     184.2     232.2     -77.1     154.2       167 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.24518 -0.53526  0.01708  0.47837  2.94968 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr 
##  id       (Intercept) 0.13022  0.36086       
##           Mes         0.00624  0.07899  0.52 
##  Residual             0.05686  0.23845       
## Number of obs: 182, groups:  id, 52
## 
## Fixed effects:
##                               Estimate Std. Error t value
## (Intercept)                  -0.044818   0.226187  -0.198
## HD1                           0.075921   0.247660   0.307
## Mes                           0.002399   0.026243   0.091
## AleatorizaciónFerinject       0.030433   0.220666   0.138
## `Pauta (código)`3            -0.041301   0.209248  -0.197
## `Pauta (código)`4             0.179546   0.522674   0.344
## `Pauta (código)`2            -1.966494   0.443242  -4.437
## cambio_log_ferritina_tmenos1  0.540388   0.043543  12.410
## Mes:`Pauta (código)`3         0.063534   0.036248   1.753
## Mes:`Pauta (código)`4        -0.227261   0.349672  -0.650
## Mes:`Pauta (código)`2         0.336527   0.092369   3.643
## 
## Correlation of Fixed Effects:
##             (Intr) HD1    Mes    AltrzF `P()`3 `P()`4 `P()`2 cm___1 M:`P()`3
## HD1         -0.100                                                          
## Mes         -0.232  0.014                                                   
## AltrzcnFrnj -0.887 -0.090  0.122                                            
## `Pat(cdg)`3 -0.903  0.109  0.247  0.778                                     
## `Pat(cdg)`4 -0.336  0.042  0.064  0.289  0.341                              
## `Pat(cdg)`2 -0.027 -0.070  0.025  0.009  0.022  0.011                       
## cmb_lg_fr_1 -0.122 -0.020  0.042  0.080  0.075  0.054  0.139                
## Ms:`P(cd)`3  0.198 -0.010 -0.723 -0.122 -0.280 -0.033 -0.012  0.011         
## Ms:`P(cd)`4  0.231 -0.014  0.001 -0.220 -0.233 -0.940 -0.007 -0.043 -0.010  
## Ms:`P(cd)`2  0.042  0.103 -0.139 -0.011 -0.038 -0.014 -0.952 -0.116  0.096  
##             M:`P()`4
## HD1                 
## Mes                 
## AltrzcnFrnj         
## `Pat(cdg)`3         
## `Pat(cdg)`4         
## `Pat(cdg)`2         
## cmb_lg_fr_1         
## Ms:`P(cd)`3         
## Ms:`P(cd)`4         
## Ms:`P(cd)`2  0.003

Warning: Non-normality of residuals detected (p = 0.025).
Nota

El modelo m1:

##                                   2.5 %     97.5 %
## .sig01                               NA         NA
## .sigma                               NA         NA
## (Intercept)                  1.56223240 3.08562088
## HD1                         -0.23280012 0.29895561
## Mes                         -0.06741331 0.03851590
## AleatorizaciónFerinject     -0.81530851 0.06240570
## `Pauta (código)`3           -0.68711977 0.08187821
## `Pauta (código)`4           -0.67920670 0.37922370
## `Pauta (código)`2           -0.42552444 0.19325423
## log(ferritina_previa)        0.59068853 0.79278705
## Mes:AleatorizaciónFerinject -0.09246684 0.05447954
Nota

El modelo m2_pautaRandom:

##                                    2.5 %      97.5 %
## .sig01                                NA          NA
## .sig02                                NA          NA
## .sig03                                NA          NA
## .sigma                                NA          NA
## (Intercept)                  -0.49670870  0.42608892
## HD1                          -0.41622113  0.61005373
## Mes                          -0.05070311  0.05724154
## AleatorizaciónFerinject      -0.43590637  0.46733137
## `Pauta (código)`3            -0.47788556  0.37458272
## `Pauta (código)`4            -0.91469666  1.21137190
## `Pauta (código)`2            -2.86323710 -1.08599779
## cambio_log_ferritina_tmenos1  0.44781064  0.62281932
## Mes:`Pauta (código)`3        -0.01165050  0.13761348
## Mes:`Pauta (código)`4        -0.92163260  0.50139122
## Mes:`Pauta (código)`2         0.15214222  0.52326602

Ferritina (Valores óptimos)

# Overdispersion test

 dispersion ratio = 0.988
          p-value = 0.864
# Check for Multicollinearity

Low Correlation

                  Term  VIF    VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
                    HD 1.16 [1.05,  1.47]     1.08      0.86     [0.68, 0.95]
                   Mes 2.09 [1.75,  2.60]     1.45      0.48     [0.39, 0.57]
 log(ferritina_previa) 1.13 [1.03,  1.46]     1.06      0.89     [0.68, 0.97]

Moderate Correlation

               Term  VIF    VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
     Aleatorización 8.38 [6.59, 10.75]     2.89      0.12     [0.09, 0.15]
     Pauta (código) 5.73 [4.55,  7.32]     2.39      0.17     [0.14, 0.22]
 Mes:Aleatorización 6.31 [4.99,  8.06]     2.51      0.16     [0.12, 0.20]