2 votos

¿Análisis de datos ordinales de pacientes en 3 puntos temporales (regresión ordinal frente a suma de rangos de Wilcoxin)?

Estoy llevando a cabo un estudio de una serie de pacientes con una enfermedad, y utilizando una escala ordinal de evaluación del estado funcional en 3 momentos diferentes.

En este ejemplo podemos decir que tengo 100 pacientes, y cada uno de ellos se mide en los tres puntos temporales (sin necesidad de imputación).

Véase la representación gráfica del cambio en las frecuencias de cada uno de estos 6 valores ordinales a lo largo de los tres puntos temporales (el grupo superior no tiene pacientes con puntuación ordinal 3,5,6):

enter image description here

Quiero comparar la diferencia global entre el punto temporal 1 y el punto temporal 2, el punto temporal 1 y el punto temporal 3, y el punto temporal 2 y el punto temporal 3 para ver si los cambios observados son significativos.

Además, si hay una forma de determinar los cambios entre los niveles ordinales específicos, también puede ser útil.

Estoy planeando hacer el análisis en R, pero me gustaría asegurarme de que estoy utilizando la prueba adecuada. ¿Sería apropiada alguna forma de regresión ordinal? ¿O es mejor alguna versión de la suma de rangos de Wilcoxin para este paradigma de estudio?

Gracias por su ayuda.

* ACTUALIZACIÓN CON CONJUNTO DE DATOS

Todavía he estado trabajando para analizar esto de la mejor manera.

El código de mi conjunto de datos figura a continuación como referencia:

mrsstat <-tibble(
  Patient = c(1:21),
  pMRS = c(0, 0,    0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  2,  0),
  dMRS = c(4, 2,    2,  4,  3,  6,  4,  1,  5,  0,  3,  0,  6,  1,  5,  3,  3,  1,  3,  4,  3),
  fMRS = c(1, 2,    2,  3,  2,  6,  3,  1,  2,  0,  3,  0,  6,  1,  5,  2,  0,  1,  3,  4,  0))

mrsstat<- mrsstat %>% 
  pivot_longer(cols = c("pMRS", "dMRS", "fMRS"), names_to = "timepoint") %>% 
  mutate(timepoint = factor(timepoint, 
                            levels= c("fMRS", 
                                      "dMRS",
                                      "pMRS")),
         value=  factor(value, levels = c("0", "1","2","3","4","5","6")),
         Patient= factor(Patient, levels = c(1:21)))

> mrsstat
# A tibble: 63 × 3
   Patient timepoint value
   <fct>   <fct>     <fct>
 1 1       pMRS      0    
 2 1       dMRS      4    
 3 1       fMRS      1    
 4 2       pMRS      0    
 5 2       dMRS      2    
 6 2       fMRS      2    
 7 3       pMRS      0    
 8 3       dMRS      2    
 9 3       fMRS      2    
10 4       pMRS      0    
# … with 53 more rows

Intenté hacer un análisis de regresión ordinal con métodos utilizando el paquete ordinal et al. en R como se describe aquí:

Regresión ordinal bidireccional con CLM

No estoy seguro de que esto sea factible con mi conjunto de datos, ya que cada paciente tiene sólo 1 registro de la puntuación del resultado funcional (variable etiquetada "valor") en cada punto de tiempo, por lo que cuando se intenta llegar a un análisis ANOVA de los datos como se ve en el enlace anterior para la regresión ordinal de dos vías, no funcionará ya que obviamente no hay varianza con una medida por paciente por punto de tiempo.

Sigo pensando que debería haber alguna prueba para evaluar los cambios de significación entre las proporciones de "valor" entre los 3 puntos temporales y para las comparaciones múltiples entre los grupos ordinales de "valor".

3voto

Sal Mangiafico Puntos 26

Meta comentario 1: Este hilo trata esencialmente sobre el uso del ordinal en R, no sobre estadística propiamente dicha.

Meta comentario 2: Este post es en respuesta a la discusión bajo el post original, así como la respuesta publicada por @XFrost .

@XFrost , suena como que usted está tratando de utilizar el resumen() funcionar de formas para las que no está realmente diseñado. En su lugar, puede utilizar la función anova( ) y emmeans paquete para obtener la información que creo que estás buscando.

Por cierto, ya que antes ha citado mi página web, observaré que el ejemplo correspondiente para el clmm modelo está aquí: rcompanion.org/handbook/G_08.html (Como siempre, con la advertencia de que lo he escrito yo).

Para continuar el análisis en la respuesta de @XFrost :

A p -valor del efecto de punto de tiempo puede determinarse con el anova() función:

    model.null = clmm(value ~ 1 + (1|Patient), data = mrsstat)

    anova(model, model.null)

       ### Likelihood ratio tests of cumulative link models:
       ###
       ###            no.par    AIC   logLik LR.stat df Pr(>Chisq)    
       ### model.null      7 233.74 -109.870                          
       ### model           9 200.27  -91.135  37.472  2  7.296e-09 ***

Y las comparaciones por pares de punto de tiempo puede determinarse con el emmeans paquete:

    library(emmeans)

    marginal = emmeans(model, ~ timepoint)

    pairs(marginal, adjust="tukey")

    ### contrast    estimate    SE  df z.ratio p.value
    ###      pMRS - dMRS    -4.81 1.029 Inf  -4.672  <.0001
    ###      pMRS - fMRS    -3.75 0.931 Inf  -4.031  0.0002
    ###      dMRS - fMRS     1.06 0.584 Inf   1.808  0.1668
    ###     
    ###     P value adjustment: tukey method for comparing a family 
    ###      of 3 estimates

0voto

Don Briggs Puntos 370

Así que he seguido estudiando este tema basándome en los comentarios de @FrankHarrell y @COOLSerdash.

Configuré el análisis de datos intentando utilizar un enfoque de Modelo Mixto de Enlace Acumulativo para analizar.

El código de abajo en R es lo que he conseguido hasta ahora utilizando el conjunto de datos anterior:

mrsstat <-tibble(
  Patient = c(1:21),
  pMRS = c(0, 0,    0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  2,  0),
  dMRS = c(4, 2,    2,  4,  3,  6,  4,  1,  5,  0,  3,  0,  6,  1,  5,  3,  3,  1,  3,  4,  3),
  fMRS = c(1, 2,    2,  3,  2,  6,  3,  1,  2,  0,  3,  0,  6,  1,  5,  2,  0,  1,  3,  4,  0))

mrsstat<- mrsstat %>% 
  pivot_longer(cols = c("pMRS", "dMRS", "fMRS"), names_to = "timepoint") %>% 
  mutate(timepoint = factor(timepoint, 
                            levels= c("pMRS", 
                                      "dMRS",
                                      "fMRS")),
         value=  factor(value, levels = c("0", "1","2","3","4","5","6")),
         Patient= factor(Patient, levels = c(1:21)))

mrs_numeric <- mrsstat %>% 
  mutate(value= as.integer(value))

Summarize(value ~ Patient, 
          data= mrs_numeric, digits=3)

Sum= Summarize(value ~ Patient + timepoint, 
          data= mrs_numeric, digits=3)

model <- clmm(value~timepoint + (1|Patient), data = mrsstat)
summary(model)

lo que da como resultado:

Cumulative Link Mixed Model fitted with the Laplace approximation

formula: value ~ timepoint + (1 | Patient)
data:    mrsstat

 link  threshold nobs logLik AIC    niter     max.grad cond.H 
 logit flexible  63   -91.13 200.27 476(1772) 5.03e-06 1.9e+02

Random effects:
 Groups  Name        Variance Std.Dev.
 Patient (Intercept) 2.374    1.541   
Number of groups:  Patient 21 

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
timepointdMRS    4.809      1.029   4.672 2.98e-06 ***
timepointfMRS    3.753      0.931   4.031 5.56e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Threshold coefficients:
    Estimate Std. Error z value
0|1   1.8433     0.7538   2.445
1|2   3.1043     0.8823   3.519
2|3   4.1262     0.9839   4.194
3|4   5.5329     1.1465   4.826
4|5   6.6601     1.2936   5.149
5|6   7.4873     1.4107   5.307

Si cambio la referencia (primer punto temporal) para que sea "fMRS" en lugar de "pMRS", el mismo planteamiento da lo siguiente:

Cumulative Link Mixed Model fitted with the Laplace approximation

formula: value ~ timepoint + (1 | Patient)
data:    mrsstat

 link  threshold nobs logLik AIC    niter     max.grad cond.H 
 logit flexible  63   -91.13 200.27 448(1671) 5.04e-06 4.9e+01

Random effects:
 Groups  Name        Variance Std.Dev.
 Patient (Intercept) 2.374    1.541   
Number of groups:  Patient 21 

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
timepointdMRS   1.0564     0.5842   1.808   0.0706 .  
timepointpMRS  -3.7528     0.9310  -4.031 5.56e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Threshold coefficients:
    Estimate Std. Error z value
0|1  -1.9095     0.6643  -2.874
1|2  -0.6485     0.5744  -1.129
2|3   0.3734     0.5692   0.656
3|4   1.7801     0.6638   2.682
4|5   2.9073     0.7934   3.664
5|6   3.7345     0.9149   4.082

que, por lo que puedo deducir, indica que "pMRS" es significativamente diferente de "dMRS" (p<2,98e-06) y "fMRS" (5,56e-05), mientras que "dMRS" y "fMRS" no son significativamente diferentes (p= 0,0706).

Aún no está claro si es posible realizar comparaciones múltiples entre los puntos temporales para cada puntuación, o si este enfoque aborda adecuadamente la cuestión (es decir, que el resumen compara los puntos temporales con una única referencia sin comparar posiblemente todo el grupo).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X