Cómo expandir el ajuste de regresión lineal al rango completo del eje x mientras se usa semilogyaxis

Cómo expandir el ajuste de regresión lineal al rango completo del eje x mientras se usa semilogyaxis

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 my bson su pendiente e intersección, respectivamente. Entonces, para trazar la línea, debes usar

\addplot {exp(\intercept+\slope*x)};

En lugar de utilizar un addplotcomando para determinar la pendiente y la intersección, puede realizar la regresión fuera de su axisentorno 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}

información relacionada