pgfplots 生成不正确的箱线图

pgfplots 生成不正确的箱线图

在尝试使用 pgfplots 重现一些箱线图(并自动分析样本)时,我注意到在某些情况下我从 Matlab 获得了不同的图。我保留了所有默认设置,这意味着在两种情况下,异常值和晶须的阈值应该相同。(默认情况下,异常值的阈值为和,q1-1.5*(q3-q1)其中q3+1.5*(q3-q1)q1分别q3是第 25 和第 75 个百分位数)。但是,Matlab 和 pgfplots 生成的图具有不同的晶须和异常值位置。

来自 pgfplots 的绘图:

来自 pgfplots 的箱线图

Matlab 绘图: Matlab 的箱线图

以下是我用来生成这些图的代码和数据文件:

乳胶:

\documentclass{minimal}
\usepackage{pgfplots}
\usepgfplotslibrary{statistics}
\pgfplotsset{compat=1.8}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    boxplot/draw direction = y,
    xmin = -2,
    xmax = 4]
    \addplot+[boxplot] table[y=Var1]{testdata.txt};
  \end{axis}
\end{tikzpicture}
\end{document}

矩阵:

T=readtable('testdata.txt','delimiter','\t');
boxplot(T{:,:})

数据文件:

Var1
0
1
2
3
4
5
3
10
14
-9

知道为什么它们会生成不同的图吗?哪一个是正确的?

答案1

至少有两个不同的因素可能导致 Matlab 和 pgfplots 生成的箱线图出现差异。

1.<=>=(Matlab) 与<>(pgfplots)

须状值和异常值的定义有所不同。

来自 pgfplots 手册(我强调了关键事实):

下须是最小的数据值,即比大下四分位数−1.5·IQR

上须是最大的数据值,即小于上四分位数+1.5 · IQR

摘自 Matlab 手册(重点添加):

如果点属于以下情况,则将其视为异常值:比大Q3+W*(Q3-Q1) 或 小于Q1-W*(Q3-Q1),其中 Q1 和 Q3 分别是第 25 和第 75 百分位数。如果数据呈正态分布,则默认值 1.5 对应于大约 +/- 2.7 sigma 和 99.3 覆盖率。 绘制的须延伸至相邻值,即非异常值的最极端数据值

2. 计算框限/四分位数的不同方法

很容易说框限是第一和第三四分位数(又称第 25 和第 75 百分位数,又称概率为 0.25 和 0.75 的分位数),然后就这样了。唉,计算分位数的方法有很多。不必过多赘述,quantile()R 中有不少于 9 种不同的方法变体。对于示例数据集,这些方法为数字对(第 25 和第 75 百分位数)提供了 7 个独特的结果。这些是:

  • 0 和 5
  • 0.5 和 4.5
  • 0.75 和 6.25
  • 0.9166667 和 5.4166667
  • 0.9375 和 5.3125
  • 1 和 5
  • 1.25 和 4.75

Matlab 发现框限值为 1 和 5。根据 @Jake(参见评论),pgfplots 中的限值是 1.5 和 4.5,这也可以通过查看原始海报所附的图片来大致确认。请注意,这对应于分位数的另一种定义。pgfplots 手册,修订版 1.11(2014/08/04),对分位数的计算有以下说明:

pgfplots 手册,关于分位数

我不确定这如何将示例数据集的四分位数映射到1.54.5。我们有 x1=-9、x2=0、x3=1、x4=2、x5=x6=3、x7=4、x8=5、x9=10 和 x10=14。按照 pgfplots 手册中的公式,我们得到下四分位数0.5*(x2+x3)=0.5*(0+1)=0.5上四分位数0.5*(x7+x8)=0.5*(4+5)=4.5使用 pgfplots 手册中提供的公式的一个后果是,为了计算小分位数,需要不存在的值 x0。

如何与示例数据配合使用

假设我上面写的内容是正确的并且一切都按文档所述进行,我们可以从 Matlab 和 pgfplots 的角度来研究示例数据的箱线图。

矩阵

假设四分位数为 1 和 5,四分位数间距 (IQR) 为 4。现在 1.5*IQR 为 6。第三四分位数 + 1.5*IQR 为 11。数据值 14 大于该值,这使其成为异常值。但是,10 不是异常值。因此上须延伸到 10。

pgf图

假设四分位数为 1.5 和 4.5,四分位数间距 (IQR) 为 3。现在 1.5*IQR 为 4.5。第三四分位数 + 1.5*IQR 为 9。数据值 14 大于该值,这使其成为异常值。10 也是异常值。5 是最大的数字,不是异常值。因此,上须延伸到 5。

结论

我无法确定哪种箱线图计算方法更好或更正确。我可以添加另一个数据点:对于示例数据,boxplot()R 给出的结果与 Matlab 相同。

还应注意,由于计算机算法的局限性和晶须位置的离散性,使用相同公式的不同实现也可能根据数据集产生不同的结果。

相关内容