您如何可视化 3 个分类变量之间的关系?

机器算法验证 r 数据可视化 分类数据
2022-02-04 16:09:28

我有一个包含三个分类变量的数据集,我想在一个图中可视化所有三个变量之间的关系。有任何想法吗?

目前我正在使用以下三个图表: 在此处输入图像描述

每个图表都针对基线抑郁水平(轻度、中度、重度)。然后在每个图表中,我查看治疗(0,1)和抑郁改善(无、中度、显着)之间的关系。

这 3 张图可以查看 3 向关系,但是有没有一种已知的方法可以用一张图做到这一点?

4个回答

这是一个尝试以图形方式表示的有趣数据集,部分原因是它不是真正的分类。这两个 3-level 因素都是序数,并且它们之间可能存在相互作用(大概,a 更难mild baseline拥有substantial improvement- 或者可能substantial improvement意味着每个不同的东西baseline)。

对于多个变量,通常没有一个视图可以显示您可能关心的所有功能。有些因素会比其他因素更容易比较。我认为您的原始观点很好,尼克考克斯的建议会更好:删除重复的图例并使用序数色标。

如果您对查看处理之间的差异最感兴趣,您可以通过使用堆叠面积图而不是堆叠条来强调变化。

在此处输入图像描述

我通常对堆叠持谨慎态度,因为中间值更难读取,但它确实加强了这些数据的固定和性质。如果相关的话,它可以很容易地阅读 sum moderate+ substantial我已经颠倒了improvement级别的顺序,以便频率越高越好。

没有堆叠,等效的是斜率图。

在此处输入图像描述

阅读每个级别更容易,但更难理解相互作用。您必须记住,第三行直接依赖于其他两行。

鉴于数据的序数性质,将值转换为数字分数可能会有所帮助,就像李克特数据improvement通常所做的那样。例如,然后,您可以以连续的比例绘制该变量。缺点是您必须找到一个合理的评分(例如,0、1 和 5 可能是更真实的表示)。none=0moderate=1substantial=2

在此处输入图像描述

Colophon:这些图是使用软件包JMP(我帮助开发)中的 Graph Builder 功能制作的。尽管是交互式制作的,但没有颜色自定义的脚本,例如,用于区域图的脚本是:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);

首先,这是我从提供的数据图表中读取的数据,供那些希望玩的人使用(如果您愿意,可以进行实验)。NB 差一个错误当然是可能的,严重错误也是如此。

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

这是对原始设计的改造。原始数据的一个细节使事情变得简单:每个预测变量组合中的人数相同,因此绘制频率和绘制百分比是相同的。在这里,我们不是堆叠(细分、分段)条形图,而是在双向条形图或表格图设计中分离出条形。

图形中的许多细节就是这样,细节。图表中的几个小弱点可能会破坏其有效性,而一些小的改进也会有所帮助。

在此处输入图像描述

拼写出来:

  1. 这里不需要三个面板,它们重复轴、图例和文本。

  2. 传说总是诅咒和祝福,迫使读者在心理上“来回走动”(或记住传说,不是吸引人的东西,无论它多么容易)。栏旁边的信息性文字更容易理解。

  3. 水果沙拉颜色编码是可有可无的。这似乎也很武断:“实质性”的改进很重要,但我发现即使是强烈的黄色也是一种柔和的颜色。但是当我们有文字来解释时,我们不需要颜色。

  4. 尽管有些人会因为违反数字和表格之间的区别而惊恐地尖叫,但我们也可以显示频率。能够思考“这个类别中有 4 个人”会很有帮助。

  5. 这里向垂直轴上的传统响应绘图致敬,就像在原版中一样。

尽管如此,很难在这些数据中看到很多结构。在这种情况下,也很难在 (a) 没有太多结构的数据和 (b) 图形设计的弱点之间分担责任,这些弱点不仅可以识别预测效应,还可以识别可能的交互。治疗似乎不如基线条件重要。但是,如果基线是“温和的”,那么“实质性”改进的空间有多大?当心理健康数据的研究肯定不是专长时,我会停下来停止自欺欺人,特别是如果数据被证明是假的。但如果它们是真实的,我们可以使用更大的样本量。(我们通常这么说,但你去吧。)

编辑如果需要,该图可能自然会因序数配色方案而变得复杂:

在此处输入图像描述

记录一下:这些图表使用了 Stata 代码,包括我自己的程序,tabplot可以使用ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 

我喜欢对这样的数据使用 2 级 x 轴。因此,单个图表的 x 轴类别可能是:

  • 治疗=0,基线=轻度
  • 治疗=0,基线=中度
  • 治疗=0,基线=严重
  • 治疗=1,基线=轻度
  • 治疗=1,基线=中度
  • 治疗=1,基线=严重

...按类别[无/中等/实质性]直方图条具有相同的计数。

马赛克图不是专门为此设计的吗?

在 R 中就像

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

每个分类变量都到达正方形的一个边缘,该边缘由其标签细分。(因此,如果您仅将每个边细分为一个级别,则最多可以表示 4 个分类变量。恕我直言,超过 3 个会变得混乱且难以解释)。矩形的大小与频率成正比。这是马赛克图背后的主要思想,在这个答案和 Paweł Kleka 的答案中是相同的。

不同之处在于用于此类绘图的特定 R 包提供的那些矩形和“精美”的布局。正如您从 Paweł Kleka 的回答中看到的那样,graphics包将上边缘细分为 2 个级别,而不是使用右边缘。我使用vcd带有默认选项的包,因此颜色表示变量之间的关联程度。灰色表示数据与变量独立性一致(您不能拒绝该假设)。蓝色表示“严重”基线与“0”和“1”治疗的“显着”改善之间存在正相关。(惊喜,惊喜!我将其翻译如下:如果您患有严重的抑郁症,无论您是否接受治疗,您都可能会明显好转。

可以根据自己的需要调整情节,例如,请参见此处该软件包还有几个小插曲,谷歌“vcd 马赛克示例”(就像我刚刚做的那样)。一开始引用的维基百科文章也解释了如何构建这种类型的情节和背后的直觉。

在此处输入图像描述

当您将我的图片与 Paweł Kleka 的答案中的图片进行比较时,没关系,“治疗”在每张图片的左边缘。您可以通过更改我的代码的最后一行来轻松更改边缘位置,并根据您的需要调整布局。通常的做法是最重要的变量或标签数量最少的变量在左边。您还可以通过使 R 中的相应因子变量有序并调整其​​水平来更改标签的顺序(例如,在右边缘的顺序是“非中等实质性”) 。