Visualización de datos longitudinales con resultado binario.

8

Para datos longitudinales con un resultado numérico, puedo usar diagramas de espagueti para visualizar los datos. Por ejemplo, algo como esto (tomado del sitio de estadísticas de UCLA):

tolerance<-read.table("http://www.ats.ucla.edu/stat/r/faq/tolpp.csv",sep=",", header=T)
head(tolerance, n=10)
interaction.plot(tolerance$time, tolerance$id, tolerance$tolerance, 
                 xlab="time", ylab="Tolerance",  legend=F)

ingrese la descripción de la imagen aquí

¿Pero qué pasa si mi resultado es binario 0 o 1? Por ejemplo, en los datos de "ohio" en R, la variable binaria "resp" indica la presencia de una enfermedad respiratoria:

library(geepack)
ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)
      resp  id age smoke
 2049    1 512  -2     1
 2050    0 512  -1     1
 2051    0 512   0     1
 2052    0 512   1     1
 2053    1 513  -2     1
 2054    0 513  -1     1
 2055    0 513   0     1
 2056    1 513   1     1
 2057    1 514  -2     1
 2058    0 514  -1     1
 2059    0 514   0     1
 2060    1 514   1     1

interaction.plot(ohio2$age+9, ohio2$id, ohio2$resp, 
                 xlab="age", ylab="Wheeze status", legend=F)

ingrese la descripción de la imagen aquí

La trama de espagueti da una buena figura, pero no es muy informativa y no me dice mucho. ¿Cuál sería una forma adecuada de visualizar este tipo de datos? ¿Quizás algo que incluye un valor de probabilidad en el eje y?

Emilia
fuente
1
Trazar el promedio de la respuesta frente a la edad es donde comenzaría. El siguiente nivel podría mostrar las fracciones de las transiciones 00, 01, 10, 11 a cada edad.
Nick Cox
Mi versión actual de R no tiene los ohiodatos (2.15) (al menos no como parte de la base). ¿Está en una versión más nueva o a través de alguna otra biblioteca? Esta sería una aplicación interesante para un mapa de calor con individuos en el eje Y y resultados en el eje X, luego trazar 1 respuestas como negras y 0 respuestas como blancas. La clasificación de la matriz proporcionará una visión general de la prevalencia de los diferentes patrones.
Andy W
@Andy tuve que explorar ... resultó que está dentro del geepackpaquete.
Penguin_Knight
Sí, perdón por eso. Modifiqué mi publicación anterior.
Emilia
consulte el artículo "Dinámica de datos longitudinales multivariables" (específicamente para datos binarios) doi: 10.1155 / 2014/901838.

Respuestas:

14

Hay bastantes formas de solucionarlo.

Agitando ligeramente las variables para difuminar las líneas

Primero, dado que tanto la edad como el resultado son muy discretos, podemos permitirnos un poco de inquietud para mostrar algunas tendencias. El truco consiste en utilizar la transparencia en el color de la línea para que sea más fácil discernir la magnitud de la superposición.

library(geepack)
set.seed(6277)

ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)

jitteredResp <- ohio2$resp + rnorm(100,0,0.02)   # $
jitteredAge  <- ohio2$age+9 + rnorm(100,0,0.02)  # $
age          <- ohio2$age+9                      # $
id           <- ohio2$id                         # $
wheeze       <- ohio2$resp                       # $

#### Variation 1 ####
plot(jitteredAge, jitteredResp, type="n", axes=F,
     xlab="Age to the nearest year, jittered",
     ylab="Wheeze status, jittered")
for (i in id){
  par(new=T)
  lines(age[id==i], jitteredResp[id==i], col="#FF000008", lwd=2)
}
axis(side=1, at=seq(7,10))
axis(side=2, at=c(0,1),  label=c("No", "Yes"))

ingrese la descripción de la imagen aquí

Ponerse elegante

También es posible utilizar este tipo de curvas para mostrar el flujo de los sujetos. Es como una modificación del gráfico anterior, pero usar el ancho de la línea para representar la frecuencia en lugar de superponerse.

ingrese la descripción de la imagen aquí

Muestra el destino de cada caso.

Esto puede sonar contra intuitivo, pero si presenta los casos de manera sistemática, funciona igual de bien para contar la historia agregada. Aquí el resultado de cada caso se muestra a lo largo de una línea de referencia de color gris. No legendagregué una leyenda allí, pero usando el comando se puede agregar con bastante facilidad. El azul es "resp = 0" y el rojo es "resp = 1". El tiempo (edad) se extiende en el eje x. Sus datos se clasifican convenientemente según el patrón de resultados, por lo que no tuve que hacer nada. Si no están clasificados previamente, tendría que usar el comando como dcasten el paquete reshape2para masajear un poco los datos.

#### Variation 2 ####
my.col             <- vector()
my.col[wheeze ==1] <- "#D7191C"
my.col[wheeze ==0] <- "#2C7BB6"

plot(age, id, type="n", frame=F, xlab="Age, year", ylab="", axes=F, xlim=c(7,10))
abline(h=id, col="#CCCCCC")
axis(side=1, at=seq(7,10))
mtext(side=2, line=1, "Individual cases")
points(age, id, col=my.col, pch=16)

ingrese la descripción de la imagen aquí

Tabulación

La visualización no es la única salida. Como solo habría, como máximo, 16 patrones diferentes, también puede tabularlos. Use +y -para crear patrones como + + + +y + - - -, y luego para cada uno de estos patrones, adjunte los recuentos y porcentajes. Esto puede mostrar la información con la misma eficacia.

Penguin_Knight
fuente