我使用这里绘制了一个散点图pgfplots
,并添加了一条线性回归线pgfplotstable
。
如您所见,在约 (2.5e-3,5.8) 处似乎有一个统计上显著的异常值 (距离最佳拟合线超过 2 个标准差)。
我该如何在图表上圈出这个值,或者以其他方式表明它是一个异常值?
理想情况下,我想pgfplotstable
计算线性回归的标准偏差,然后检查每个点是否单独为异常值。但是,如果无法做到这一点,我该如何手动圈出该点或更改该点上使用的符号?
编辑:MWE:
\documentclass{article}
\usepackage{filecontents}
\usepackage{tikz,pgfplots}
\usepackage{pgfplotstable}
\begin{filecontents}{GraphData.txt}
lnPa 1/T
6.5723 0.002304
6.7214 0.002273
6.7178 0.002273
6.7117 0.002278
6.7178 0.002278
6.6783 0.002283
6.6490 0.002288
6.6254 0.002294
6.6026 0.002299
6.5820 0.002304
6.5539 0.002309
6.4907 0.002320
6.4281 0.002331
6.3509 0.002347
6.2823 0.002364
6.2066 0.002381
6.1312 0.002381
6.0707 0.002404
6.0113 0.002421
5.8861 0.002445
5.8141 0.002506
5.7236 0.002475
5.6490 0.002494
5.5759 0.002506
5.5134 0.002519
5.3660 0.002545
5.2679 0.002571
5.1761 0.002584
5.0876 0.002597
5.0239 0.002611
4.9628 0.002625
4.8283 0.002646
4.7791 0.002660
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[legend pos=north east,anchor=west, xlabel={$T^{-1}/ K^{-1}$}, ylabel={$\ln P*_a$}]
\addplot table [only marks, x={1/T},y={lnPa}]{GraphData.txt};
\addplot [thick, red] table[x={1/T},
y={create col/linear regression={y={lnPa}}}
] % compute a linear regression from the input table
{GraphData.txt};
%\addlegendentry{$\dfrac{dy}{dx} = \pgfplotstableregressiona$}
%\addlegendentry{$y_{intercept} = \pgfplotstableregressionb$}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这里通过比较 y 方向上的线性回归距离与允许的最大值来自动搜索异常值。为此,使用 y 过滤器并绘制第三个图。
在序言中加载表格并不是真正必要的,但这样只需从文件中读取一次即可。
过滤器宏将允许的距离作为其参数。这样就很容易根据您的需要进行调整。(尝试 0.05,这也会突出显示其他异常值。)
结果如下:
代码:
\documentclass{article}
\usepackage{filecontents}
\usepackage{tikz,pgfplots}
\usepackage{pgfplotstable}
\begin{filecontents}{GraphData.txt}
lnPa 1/T
6.5723 0.002304
6.7214 0.002273
6.7178 0.002273
6.7117 0.002278
6.7178 0.002278
6.6783 0.002283
6.6490 0.002288
6.6254 0.002294
6.6026 0.002299
6.5820 0.002304
6.5539 0.002309
6.4907 0.002320
6.4281 0.002331
6.3509 0.002347
6.2823 0.002364
6.2066 0.002381
6.1312 0.002381
6.0707 0.002404
6.0113 0.002421
5.8861 0.002445
5.8141 0.002506
5.7236 0.002475
5.6490 0.002494
5.5759 0.002506
5.5134 0.002519
5.3660 0.002545
5.2679 0.002571
5.1761 0.002584
5.0876 0.002597
5.0239 0.002611
4.9628 0.002625
4.8283 0.002646
4.7791 0.002660
\end{filecontents}
% read table
\pgfplotstableread[]{GraphData.txt}\graphdata
% add column with linear regression
\pgfplotstablecreatecol[linear regression={x={1/T},y={lnPa}}]{linreg}{\graphdata}
% macro for y-filter
\newcommand*{\outlierfilter}[1]{%
% set the allowed distance in y-direction from parameter
\pgfmathsetmacro{\alloweddist}{#1}%
% store y-value
\pgfmathsetmacro{\ypoint}{\pgfmathresult}%
% get value from linear regression
\pgfplotstablegetelem{\coordindex}{[index]2}\of\graphdata
% and store it
\pgfmathsetmacro{\linregpoint}{\pgfplotsretval}%
% calculate the absolute distance from y to linear regression
\pgfmathsetmacro{\currdist}{abs(\ypoint - \linregpoint)}%
% check against the allowed distance and set \pgfmathresult accordingly
\pgfmathparse{ifthenelse(\currdist>\alloweddist,\ypoint,nan)}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[legend pos=north east,anchor=west, xlabel={$T^{-1}/ K^{-1}$}, ylabel={$\ln P*_a$}]
\addplot table [only marks, x={1/T},y={lnPa}]{\graphdata};
\addplot [thick, red] table[x={1/T},y={linreg}]{\graphdata};
\addplot [cyan,unbounded coords=jump,only marks,mark=o,mark size=4pt,
y filter/.code={\outlierfilter{0.1}}]
% set allowed distance here ---^^^
table[x={1/T},y={lnPa}]{\graphdata};
%\addlegendentry{$\dfrac{dy}{dx} = \pgfplotstableregressiona$}
%\addlegendentry{$y_{intercept} = \pgfplotstableregressionb$}
\end{axis}
\end{tikzpicture}
\end{document}