用平均值、标准差、最小值和最大值绘制汇总统计?

机器算法验证 r 数据可视化 箱形图
2022-03-10 23:13:14

我来自经济学背景,通常在该学科中,变量的汇总统计数据以表格形式报告。但是,我希望绘制它们。

我可以修改一个箱形图,让它显示平均值、标准差、最小值和最大值,但我不希望这样做,因为箱形图传统上用于显示中位数以及 Q1 和 Q3。

我所有的变量都有不同的尺度。如果有人能提出一种有意义的方式来绘制这些汇总统计数据,那就太好了。我可以使用 R 或 Stata。

2个回答

Tukey 的箱线图具有通用性是有原因的,它可以应用于来自不同分布的数据,从高斯分布到泊松分布等。当数据偏离时,中值、MAD(中值绝对偏差)或 IQR(四分位距)是更稳健的度量常态。但是,均值和 SD 更容易出现异常值,应根据基础分布对其进行解释。下面的解决方案更适用于正态或对数正态数据。您可以在此处浏览精选的稳健措施,并此处探索 WRS R 包

# simulating dataset
set.seed(12)
d1 <- rnorm(100, sd=30)
d2 <- rnorm(100, sd=10)
d <- data.frame(value=c(d1,d2), condition=rep(c("A","B"),each=100))

# function to produce summary statistics (mean and +/- sd), as required for ggplot2
data_summary <- function(x) {
   mu <- mean(x)
   sigma1 <- mu-sd(x)
   sigma2 <- mu+sd(x)
   return(c(y=mu,ymin=sigma1,ymax=sigma2))
}

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_crossbar(stat="summary", fun.y=data_summary, fun.ymax=max, fun.ymin=min)

此外,通过向上面的代码添加+ geom_jitter()+ geom_point(),您可以同时可视化原始数据值。


感谢@Roland 指出小提琴情节它在可视化概率密度和汇总统计的同时具有优势:

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_violin() + stat_summary(fun.data=data_summary)

这两个示例如下所示。

在此处输入图像描述

有无数种可能性。

我见过的一个避免与箱线图混淆的选项(假设您有可用的中位数或原始数据)是绘制箱线图并添加一个标记平均值的符号(希望有一个图例来明确这一点)。提到了这个版本的箱线图,它为平均值添加了一个标记,例如在 Frigge et al (1989) [1] 中:

显示均值的箱线图也已标记

左图显示一个 + 符号作为平均标记,右图在边缘使用三角形,改编自 Doane & Tracy 的梁和支点图 [2] 的平均标记。

另请参阅此 SO 帖子

如果您没有(或真的不想显示)中位数,则需要一个新图,然后将其与箱线图在视觉上区别开来。

也许是这样的:

在此处输入图像描述

...它使用不同的符号为每个样本绘制最小值、最大值、平均值和平均值 $\pm$ sd,然后绘制一个矩形,或者更好,如下所示:

在此处输入图像描述

...它使用不同的符号为每个样本绘制最小值、最大值、平均值和平均值$\pm$ sd,然后画一条线(实际上目前它实际上是一个和以前一样的矩形,但画得很窄;它应该改为画一条线)

如果您的数字在非常不同的尺度上,但都是正数,您可能会考虑使用日志,或者您可能会使用不同(但明确标记)的比例进行小倍数

代码(目前不是特别“好”的代码,但目前这只是探索想法,它不是编写好的 R 代码的教程):

fivenum.ms=function(x) {r=range(x);m=mean(x);s=sd(x);c(r[1],m-s,m,m+s,r[2])}
eps=.015

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-1.2*eps,fivenum.ms(A)[2],1+1.4*eps,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-1.2*eps,fivenum.ms(B)[2],2+1.4*eps,fivenum.ms(B)[4],lwd=2,col=4,den=0)

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-eps/9,fivenum.ms(A)[2],1+eps/3,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-eps/9,fivenum.ms(B)[2],2+eps/3,fivenum.ms(B)[4],lwd=2,col=4,den=0)

[1] Frigge, M.、DC Hoaglin 和 B. Iglewicz (1989),
“箱线图的一些实现”。
美国统计学家43(2 月):50-54。

[2] Doane DP 和 RL Tracy (2000),
“使用光束和支点显示探索数据”
美国统计学家54 (4):289–290,11 月