Memvisualisasikan data longitudinal dengan hasil biner

8

Untuk data longitudinal dengan hasil numerik, saya bisa menggunakan plot spageti untuk memvisualisasikan data. Misalnya sesuatu seperti ini (diambil dari situs Statistik 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)

masukkan deskripsi gambar di sini

Tetapi bagaimana jika hasil saya adalah biner 0 atau 1? Misalnya, dalam data "ohio" di R, variabel "resp" biner menunjukkan adanya penyakit pernapasan:

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)

masukkan deskripsi gambar di sini

Plot spageti memberikan angka yang bagus, tetapi tidak terlalu informatif dan tidak banyak memberi tahu saya. Apa cara yang cocok untuk memvisualisasikan data semacam ini? Mungkin sesuatu yang mencakup nilai probabilitas pada sumbu y?

Emilia
sumber
1
Merencanakan rata-rata respons versus usia adalah tempat saya mulai. Tingkat selanjutnya mungkin menunjukkan fraksi transisi 00, 01, 10, 11 pada setiap usia.
Nick Cox
Versi R saya saat ini tidak memiliki ohiodata (2.15) (setidaknya bukan sebagai bagian dari basis). Apakah itu dalam versi yang lebih baru atau melalui perpustakaan lain? Ini akan menjadi aplikasi yang menarik untuk peta panas dengan individu pada sumbu Y dan hasil pada sumbu X, kemudian plot 1 tanggapan sebagai hitam dan 0 tanggapan sebagai putih. Menyortir matriks kemudian akan memberikan gambaran tentang bagaimana pola yang berbeda lazim.
Andy W
@Andy saya harus melihat-lihat ... ternyata ada di dalam geepackpaket.
Penguin_Knight
Ya, maaf soal itu. Saya memodifikasi posting saya di atas.
Emilia
silakan lihat artikel "Dynamics from Multivariable Longitudinal Data" (khusus untuk data biner) doi: 10.1155 / 2014/901838.

Jawaban:

14

Ada beberapa cara untuk mengatasinya.

Menggeser variabel secara ringan untuk mengaburkan garis

Pertama, karena baik usia dan hasilnya terpisah dengan baik, kita bisa sedikit jitter mereka untuk menunjukkan beberapa tren. Caranya adalah dengan menggunakan transparansi dalam warna garis sehingga lebih mudah untuk membedakan besarnya tumpang tindih.

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

masukkan deskripsi gambar di sini

Menjadi mewah

Mungkin juga menggunakan kurva semacam ini untuk menunjukkan aliran subjek. Ini seperti modifikasi dari grafik di atas, tetapi menggunakan lebar garis untuk mewakili frekuensi daripada menggunakan tumpang tindih.

masukkan deskripsi gambar di sini

Tunjukkan nasib setiap kasus

Ini mungkin terdengar kontra-intuisi, tetapi jika Anda meletakkan kasus secara sistematis, itu berfungsi dengan baik untuk menceritakan kisah yang dikumpulkan. Di sini hasil setiap kasus ditampilkan di sepanjang garis referensi warna abu-abu. Saya tidak menambahkan legenda di sana tetapi menggunakan legendperintah itu dapat ditambahkan dengan mudah. Biru adalah "resp = 0" dan Merah adalah "resp = 1". Waktu (usia) tersebar pada sumbu x. Data Anda dengan mudah didahului oleh pola hasil, jadi saya tidak perlu melakukan apa pun. Jika tidak diprogram, Anda harus menggunakan perintah seperti dcastpada paket reshape2untuk memijat sedikit data.

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

masukkan deskripsi gambar di sini

Tabulasi

Visualisasi bukan satu-satunya jalan keluar. Karena hanya akan ada, paling banyak, 16 pola yang berbeda, Anda juga dapat membuat tabulasi. Gunakan +dan -untuk membuat pola seperti + + + +dan + - - -, dan kemudian untuk masing-masing pola ini, lampirkan jumlah dan persentase. Ini dapat menunjukkan informasi yang sama efektifnya.

Penguin_Knight
sumber