Visualisation des données longitudinales avec résultat binaire

8

Pour les données longitudinales avec un résultat numérique, je peux utiliser des tracés de spaghetti pour visualiser les données. Par exemple quelque chose comme ça (tiré du site UCLA Stats):

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)

entrez la description de l'image ici

Mais que se passe-t-il si mon résultat est binaire 0 ou 1? Par exemple, dans les données "ohio" de R, la variable binaire "resp" indique la présence d'une maladie respiratoire:

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)

entrez la description de l'image ici

L'intrigue des spaghettis donne une belle figure, mais n'est pas très informative et ne me dit pas grand-chose. Quelle serait une manière appropriée de visualiser ce type de données? Peut-être quelque chose qui inclut une valeur de probabilité sur l'axe des y?

Emilia
la source
1
Tracer la moyenne de la réponse en fonction de l'âge est le point de départ. Le niveau suivant pourrait montrer les fractions de transitions 00, 01, 10, 11 à chaque âge.
Nick Cox
Ma version actuelle de R n'a pas les ohiodonnées (2.15) (du moins pas dans le cadre de la base). Est-ce dans une version plus récente ou via une autre bibliothèque? Ce serait une application intéressante pour une carte thermique avec des individus sur l'axe Y et des résultats sur l'axe X, puis tracer 1 réponses en noir et 0 réponses en blanc. Le tri de la matrice donnera alors un aperçu de la prévalence des différents modèles.
Andy W
@Andy, j'ai dû faire le tour ... il s'est avéré que c'était à l'intérieur du geepackcolis.
Penguin_Knight
Oui, désolé. J'ai modifié ma publication ci-dessus.
Emilia
veuillez consulter l'article "Dynamics from Multivariable Longitudinal Data" (spécifiquement pour les données binaires) doi: 10.1155 / 2014/901838.

Réponses:

14

Il existe plusieurs façons de contourner ce problème.

Agiter légèrement les variables pour étaler les lignes

Tout d'abord, étant donné que l'âge et le résultat sont bien distincts, nous pouvons nous permettre de les agiter légèrement afin de montrer certaines tendances. L'astuce consiste à utiliser la transparence dans la couleur de la ligne afin qu'il soit plus facile de discerner l'ampleur du chevauchement.

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"))

entrez la description de l'image ici

Être chic

Il est également possible d'utiliser ce type de courbes pour montrer le flux des sujets. C'est comme une modification du graphique ci-dessus, mais en utilisant la largeur de la ligne pour représenter la fréquence plutôt qu'en utilisant le chevauchement.

entrez la description de l'image ici

Montrez le sort de chaque cas

Cela peut sembler contre-intuitif, mais si vous exposez les cas de manière systématique, cela fonctionne tout aussi bien pour raconter l'histoire agrégée. Ici, le résultat de chaque cas est affiché le long d'une ligne de référence de couleur grise. Je n'y ai pas ajouté de légende, mais en utilisant la legendcommande, elle peut être ajoutée assez facilement. Le bleu est "resp = 0" et le rouge est "resp = 1". Le temps (âge) est réparti sur l'axe des x. Vos données sont commodément triées par modèle de résultat, donc je n'ai rien eu à faire. S'ils ne sont pas pré-triés, vous devrez utiliser la commande comme dcastdans le package reshape2pour masser un peu les données.

#### 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)

entrez la description de l'image ici

Tabulation

La visualisation n'est pas la seule issue. Puisqu'il n'y aurait, au maximum, que 16 modèles différents, vous pouvez également les tabuler. Utilisez +et -pour créer des modèles comme + + + +et + - - -, puis pour chacun de ces modèles, associez les nombres et le pourcentage. Cela peut montrer les informations de manière tout aussi efficace.

Penguin_Knight
la source