Ya que me preguntaron en otro post:
Línea de tendencia o línea de mejor ajuste en pgfplots
Para hacer esta pregunta explícitamente, ahora lo hago:
¿Cómo puedo expandir el ajuste de regresión lineal, generado con, por ejemplo (¡tenga en cuenta el eje de semilogía!):
\documentclass[fontsize=12pt,openright,oneside,DIV11,a4paper,numbers=noenddot,headsepline,parskip=half]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[cmex10]{amsmath}
\usepackage{dsfont}
% SIUnitx package
\usepackage{siunitx}
\DeclareSIUnit{\dBm}{dBm}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.3}
\begin{document}
\begin{tikzpicture}
\begin{semilogyaxis}[
legend style={font=\footnotesize},
legend pos=north east,
legend cell align=left,
/pgf/number format/.cd,
use comma,
xlabel=x,
ylabel=y,
ymin=,
ymax=,
xmin=0,
xmax=10,
]
\addplot+[only marks,color=black, mark=square*,mark options={fill=black}] table[x=x,y=y] {measurement1.txt};
\addlegendentry{measurement1};
% Here I would like to plot the linear regression for the whole x-axis range, not only for the x-values in measurement1.txt
\addplot+[solid,thick,color=black, no marks] table[y={create col/linear regression={y}}] {measurement1.txt};
\addlegendentry{linearregression1};
\end{semilogyaxis}
\end{tikzpicture}
\end{document}
¿Al rango completo del eje x (por ejemplo, de 0 a 10 y tengo puntos de medición que van de 2 a 8 únicamente)? Traza solo los valores de x para los puntos de datos en medición1.txt. Sí, podría extraer la pendiente e interceptar usando
\xdef\slope{\pgfplotstableregressiona}
\xdef\yintercept{\pgfplotstableregressionb}
\addplot+[solid,thick,color=black, no marks,domain=0:-10] (x,\slope*x+\yintercept);
pero si uso semilogyaxis, la línea ya no será recta (¡por supuesto que no!). Aunque la regresión lineal generada en el entorno del eje es lineal perfecta (pero no abarca todo el rango del eje x...).
Respuesta1
La ecuación de la recta de regresión para datos transformados logarítmicamente es
Y=exp(b+m*X)
donde m
y b
son su pendiente e intersección, respectivamente. Entonces, para trazar la línea, debes usar
\addplot {exp(\intercept+\slope*x)};
En lugar de utilizar un addplot
comando para determinar la pendiente y la intersección, puede realizar la regresión fuera de su axis
entorno utilizando \pgfplotstablecreatecol[linear regression={ymode=log}]{<col name>}{<data table>}
. Tenga en cuenta que en ese caso, debe configurar explícitamente ymode=log
. Dentro de semilogyaxis
, esto se hace automáticamente.
Aquí tienes un ejemplo completo:
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\pgfplotstableread{
1 2.3
2 3.4
3 9
4 17
5 30
6 70
7 120
8 250
9 650
}\datatable
\pgfplotstablecreatecol[linear regression={ymode=log}]{regression}{\datatable}
\xdef\slope{\pgfplotstableregressiona} % save the slope parameter
\xdef\intercept{\pgfplotstableregressionb} % save the intercept parameter
\begin{tikzpicture}
\begin{axis}[
ymode=log,
xmin=0,xmax=10
]
\addplot [only marks, red] table {\datatable}; % plot the data
\addplot [no markers, domain=0:10] {exp(\intercept+\slope*x)};
\end{axis}
\end{tikzpicture}
\end{document}