计算并在图表中显示平方和

计算并在图表中显示平方和

使用一些普通的旧 Metapost 代码,我可以创建一个线性回归的基本图。问题是:我可以用 TikZ 等工具创建一个图形,它允许我为回归线指定几个点坐标(黑色)和两个点(或线性模型的系数),然后自动

  • 画出红线
  • 绘制绿点
  • 在图中显示计算出的平方和

直接在 LaTeX 中执行此操作可以方便地显示回归线的参数如何影响平方差的总和。

在此处输入图片描述

答案1

以下是基于数据工具包裹:

\documentclass{article}
\usepackage{datatool}
\usepackage{dataplot}

\begin{document}

% define data set (could also be read from csv file)
\DTLnewdb{mydata}
\DTLnewrow{mydata}%
\DTLnewdbentry{mydata}{x}{1}%
\DTLnewdbentry{mydata}{y}{2.3}%
\DTLnewrow{mydata}%
\DTLnewdbentry{mydata}{x}{2}%
\DTLnewdbentry{mydata}{y}{3.4}%
\DTLnewrow{mydata}%
\DTLnewdbentry{mydata}{x}{3}%
\DTLnewdbentry{mydata}{y}{4.1}%


% calculate extra columns 
\DTLforeach{mydata}{%
  \valx=x,%
  \valy=y}{%
  \DTLmul{\result}{\valx}{\valx}%
  \DTLappendtorow{xx}{\result}%
  \DTLmul{\result}{\valx}{\valy}%
  \DTLappendtorow{xy}{\result}%
}

% calculate required averages                 
\DTLmeanforcolumn{mydata}{x}{\mx}
\DTLmeanforcolumn{mydata}{y}{\my}
\DTLmeanforcolumn{mydata}{xx}{\mxx}
\DTLmeanforcolumn{mydata}{xy}{\mxy}
\DTLvarianceforcolumn{mydata}{x}{\vx}

% calculate slope
\DTLmul{\tmpa}{\mx}{\my}
\DTLsub{\tmpb}{\mxy}{\tmpa}
\DTLdiv{\fita}{\tmpb}{\vx}
\DTLround{\fitar}{\fita}{3}

% calculate intercept
\DTLmul{\tmpa}{\mxx}{\my}
\DTLmul{\tmpb}{\mxy}{\mx}
\DTLsub{\tmpc}{\tmpa}{\tmpb}
\DTLdiv{\fitb}{\tmpc}{\vx}
\DTLround{\fitbr}{\fitb}{3}


% prepare data for line
\DTLminforcolumn{mydata}{x}{\minx}
\DTLmaxforcolumn{mydata}{x}{\maxx}
\DTLmul{\tmpa}{\minx}{\fita}
\DTLadd{\tmpb}{\tmpa}{\fitb}
\DTLmul{\tmpa}{\maxx}{\fita}
\DTLadd{\tmpc}{\tmpa}{\fitb}


\renewcommand*{\DTLplotatendtikz}{%
  \draw (\minx,\tmpb) -- (\maxx,\tmpc);
}

\begin{figure}[htbp]
\centering
\DTLplot{mydata}{x=x,y=y,width=3in,height=3in}
\caption{The fit function is $\fitar\ x + \fitbr$}
\end{figure}

\end{document}

答案2

这不是一个完整的答案,因为我无法以清晰的方式绘制连接线。

我原本想根据误差符号使用误差线,但方向开关不适合。我可能会用foreach或类似的东西再次讨论这个问题。如果您有更好的主意,请告诉我。

您可以使用 做几乎所有其他的事情pgfplots。这是回归条目和累计平方和的表格。

\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.7}
\pgfplotstableread{%Input some data
x y
0.2 0.3
0.4 0.7
0.6 0.4
0.8 1.2
1.0 0.6
1.2 0.5
1.4 0.8
1.6 0.1
1.8 0.7
2.0 0.1 
}\mytable

% create the `regression' column:
\pgfplotstablecreatecol[linear regression]{reg}{\mytable}
% create the sos column
\pgfplotstablecreatecol[
create col/assign/.code={%
\ifx\pgfmathaccuma\pgfutil@empty
  \let\pgfmathaccuma=0
\fi
\getthisrow{y}\yentry
\getthisrow{reg}\rentry
    \pgfmathparse{\pgfmathaccuma + (abs(\yentry-\rentry))^2}
        \let\pgfmathaccuma=\pgfmathresult
    \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult
}
]{sos}{\mytable}

\begin{document}

%Typeset the table
\pgfplotstabletypeset{\mytable}
%
\hspace{1cm}
% Draw the graph
\begin{tikzpicture}[baseline=(current bounding box.center)]
\begin{axis}[
axis y line=left,
axis x line=bottom,
xmin=0,xmax=1.2,
ymin=0]
\addplot[only marks,mark size=1pt] table {\mytable};
\addplot[mark=*,mark size=1pt,mark options={green},draw=blue,] table[x=x,y=reg] {\mytable};

\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容