我知道我可以使用 PGFPlots 通过命令计算线性回归create col/linear regression
。
我有一组数据,前几个点呈曲线,但其余部分呈线性。我想找到一个线性回归,但是忽略前 n 个点从我的回归数据文件中。使用 PGFPlots 可以做到这一点吗?
此类数据的一个虚构示例为:
x y
0 0
1 15
2 25
3 28
4 30
5 31
6 32
7 33
8 34
9 35
10 36
曲线从 x = 4 开始呈线性。其图如下所示:
我能想到的一个(不太好的)解决方案是创建一个没有数据点的新数据集,然后对这个新数据集运行回归。
答案1
可以通过选项 忽略表格的前几行skip first n
。以下示例的第一个图显示了计算点 5 和最后一个点之间的面积的计算回归线。第二个图使用计算出的回归线参数绘制了整个范围内的线。
\begin{filecontents*}{\jobname-plot.dat}
x y
0 0
1 15
2 25
3 28
4 30
5 31
6 32
7 33
8 34
9 35
10 36
\end{filecontents*}
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[only marks, mark=*, blue]
table {\jobname-plot.dat};
\addplot[]
table[header=false,skip first n=5,
y={create col/linear regression},
] {\jobname-plot.dat};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}
\addplot[only marks, mark=*, blue]
table {\jobname-plot.dat};
\addplot[draw=none]
table[
header=false,
skip first n=5,
y={create col/linear regression},
] {\jobname-plot.dat};
\addplot[domain=0:10, red]
{\pgfplotstableregressiona*x + \pgfplotstableregressionb};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
这是一个使用 R 和嵌入在 LaTeX 文件中的 knitr 的解决方案。这假设您已安装 R 并了解如何运行 knitr 包。http://yihui.name/knitr/
\begin{filecontents}{data.txt}
x y
0 0
1 15
2 25
3 28
4 30
5 31
6 32
7 33
8 34
9 35
10 36
\end{filecontents}
\documentclass[10pt,letterpaper]{article}
\begin{document}
<<echo=FALSE,out.width="3in">>=
dd<-read.table("data.txt",skip=4,header=TRUE)
with(dd,plot(x,y,pch=16,main="Regression line with all the data points"))
model<-with(dd,lm(y~x))
abline(model)
x1<-with(dd,x[3:length(x)])
y1<-with(dd,y[3:length(x)])
newdd<-data.frame(x1,y1)
with(newdd,plot(x1,y1,pch=16,main="Regression line with first two points removed"))
model1<-with(newdd,lm(y1~x1))
abline(model1)
@
\end{document}