Visualização de dados longitudinais com resultado binário

8

Para dados longitudinais com resultado numérico, posso usar gráficos de espaguete para visualizar os dados. Por exemplo, algo assim (extraído do site Estatísticas da 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)

insira a descrição da imagem aqui

Mas e se meu resultado for binário 0 ou 1? Por exemplo, nos dados "ohio" em R, a variável binária "resp" indica a presença de uma doença respiratória:

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)

insira a descrição da imagem aqui

O gráfico de espaguete fornece uma boa figura, mas não é muito informativo e não me diz muito. Qual seria uma maneira adequada de visualizar esse tipo de dados? Talvez algo que inclua um valor de probabilidade no eixo y?

Emilia
fonte
1
Traçar a média da resposta versus a idade é onde eu começaria. O próximo nível pode estar mostrando as frações das transições 00, 01, 10, 11 em cada idade.
Nick Cox
Minha versão atual do R não possui os ohiodados (2.15) (pelo menos não como parte da base). Está em uma versão mais recente ou através de alguma outra biblioteca? Esta seria uma aplicação interessante para um mapa de calor com indivíduos no eixo Y e resultados no eixo X, depois plotar 1 respostas em preto e 0 respostas em branco. A classificação da matriz fornecerá uma visão geral de quão diferentes são os padrões predominantes.
Andy W
@ Andy eu tive que explorar ... acabou dentro do geepackpacote.
Penguin_Knight
Sim, desculpe por isso. Eu modifiquei minha postagem acima.
Emilia
consulte o artigo "Dinâmica de dados longitudinais multivariáveis" (especificamente para dados binários) doi: 10.1155 / 2014/901838.

Respostas:

14

Existem algumas maneiras de contornar isso.

Tremendo as variáveis ​​levemente para unir as linhas

Primeiro, como a idade e o resultado são bem discretos, podemos nos dar ao luxo de alterá-los levemente para mostrar algumas tendências. O truque é usar a transparência na cor da linha, para que seja mais fácil discernir a magnitude da sobreposição.

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

insira a descrição da imagem aqui

Ficando chique

Também é possível usar esse tipo de curva para mostrar o fluxo dos objetos. É como uma modificação do gráfico acima, mas usar a largura da linha para representar a frequência, em vez de sobrepor.

insira a descrição da imagem aqui

Mostre o destino de cada caso

Isso pode parecer contra-intuitivo, mas se você apresentar os casos de maneira sistemática, funcionará tão bem quanto contar a história agregada. Aqui, o resultado de cada caso é mostrado ao longo de uma linha de referência na cor cinza. Eu não adicionei uma legenda lá, mas usando o legendcomando pode ser adicionado facilmente. Azul é "resp = 0" e Vermelho é "resp = 1". O tempo (idade) está espalhado no eixo x. Seus dados são convenientemente ordenados por padrão de resultado, então não precisei fazer nada. Se eles não forem pré-selecionados, você teria que usar o comando como dcastno pacote reshape2para massagear os dados um pouco.

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

insira a descrição da imagem aqui

Tabulação

A visualização não é a única saída. Como só haveria, no máximo, 16 padrões diferentes, você também pode tabulá-los. Use +e -para criar padrões como + + + +e + - - -, em seguida, para cada um desses padrões, anexe as contagens e porcentagens. Isso pode mostrar as informações de maneira igualmente eficaz.

Penguin_Knight
fonte