![pgfplots 生成不正确的箱线图](https://linux22.com/image/297663/pgfplots%20%E7%94%9F%E6%88%90%E4%B8%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%AE%B1%E7%BA%BF%E5%9B%BE.png)
在尝试使用 pgfplots 重现一些箱线图(并自动分析样本)时,我注意到在某些情况下我从 Matlab 获得了不同的图。我保留了所有默认设置,这意味着在两种情况下,异常值和晶须的阈值应该相同。(默认情况下,异常值的阈值为和,q1-1.5*(q3-q1)
其中q3+1.5*(q3-q1)
和q1
分别q3
是第 25 和第 75 个百分位数)。但是,Matlab 和 pgfplots 生成的图具有不同的晶须和异常值位置。
来自 pgfplots 的绘图:
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),对分位数的计算有以下说明:
我不确定这如何将示例数据集的四分位数映射到1.5和4.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 相同。
还应注意,由于计算机算法的局限性和晶须位置的离散性,使用相同公式的不同实现也可能根据数据集产生不同的结果。