用二进制结果可视化纵向数据

机器算法验证 数据可视化 重复测量 二进制数据 面板数据
2022-03-23 16:42:06

对于具有数值结果的纵向数据,我可以使用意大利面条图来可视化数据。例如这样的事情(取自 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 轴上包含概率值的东西?

1个回答

有很多方法可以解决它。

轻轻抖动变量以将线条分开

首先,由于年龄和结果都非常离散,我们可以稍微抖动它们以显示一些趋势。诀窍是在线条颜色中使用透明度,以便更容易辨别重叠的大小。

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 种不同的模式,因此您也可以将它们制成表格。使用+-创建类似+ + + +和的模式+ - - -,然后为这些模式中的每一个附加计数和百分比。这可以同样有效地显示信息。