Data-Visualization

用二進制結果可視化縱向數據

  • November 13, 2013

對於具有數值結果的縱向數據,我可以使用意大利麵條圖來可視化數據。例如這樣的事情(取自 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)

在此處輸入圖像描述

但是如果我的結果是二進制 0 或 1 怎麼辦?例如,在 R 中的“ohio”數據中,二進制“resp”變量表示存在呼吸道疾病:

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)

在此處輸入圖像描述

意大利麵條情節給出了一個不錯的數字,但信息量不是很大,也沒有告訴我太多。什麼是可視化此類數據的合適方法?也許在 y 軸上包含概率值的東西?

有很多方法可以解決它。

輕輕抖動變量以將線條分開

首先,由於年齡和結果都非常離散,我們可以稍微抖動它們以顯示一些趨勢。訣竅是在線條顏色中使用透明度,以便更容易辨別重疊的大小。

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

在此處輸入圖像描述

變得花哨

也可以使用這種曲線來顯示對象的流動。這就像對上圖的修改,但使用線的寬度來表示頻率,而不是使用重疊。

在此處輸入圖像描述

顯示每個案件的命運

這聽起來可能違反直覺,但是如果您以系統的方式列出案例,那麼講述匯總的故事同樣有效。在這裡,每個案例的結果都沿灰色參考線顯示。我沒有在那裡添加圖例,但是使用legend命令可以很容易地添加它。藍色是“resp = 0”,紅色是“resp = 1”。時間(年齡)分佈在 x 軸上。您的數據可以方便地按結果模式進行排序,所以我不需要做任何事情。如果它們沒有預先排序,則必須使用dcastreshape2中的命令來稍微處理一下數據。

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

在此處輸入圖像描述

製表

可視化並不是唯一的出路。由於最多只有 16 種不同的模式,因此您也可以將它們製成表格。使用+-創建類似+ + + +和的模式+ - - -,然後為這些模式中的每一個附加計數和百分比。這可以同樣有效地顯示信息。

引用自:https://stats.stackexchange.com/questions/76429

comments powered by Disqus