CASO EXPONENCIAL

Suponer que trabajas con estos datos

set.seed(2019) 
x = runif(100, 5, 10)  # generar datos
logy = log(5)+ .7*x  + rnorm(100, sd = .5)
y = exp(logy)
plot(x, y)

y que decides ajustar a una curva exponencial. Para aplicar las técnicas de regresión lineal necesitas trasformar los datos de forma que se asemejen a una recta, es decir, transformar tus datos para aplicarles el modelo lineal.

En otras palabra, se trata de buscar una transformación (cambio de variable) que transforme

\[y = b_0*e^{b_1*x} \]

en la expresión de una recta. Como \(x\) está en el exponente, y la base es el número \(e\), se aplica el logaritmo neperiano a ambos lados de la igualdad

\[\ln(y) = \ln(b_0*e^{b_1*x})= \ln(b_0)+\ln(e^{b_1*x})= \ln(b_0)+b_1*x\]

Si llamamos

\[xt = x,\qquad yt=\ln y\]

tenemos

\[yt = \ln(b_0)+b_1*xt\]

recuerda que \(\ln(b_0)\) es un número.

Lo que sugiere esta transformación es que al representar \((x, \ln(y))\) los datos tendrán una forma apropiada para aplicar regresión lineal (en R, el logaritmo neperiano se calcula con la función log()). Efectivamente, al representar \(x\) y \(\ln(y)\)

plot(x, log(y))

la forma de los datos parece corresponder a un modelo lineal. De hecho, al calcular el modelo lineal

(lmXY = lm(log(y) ~ x))
## 
## Call:
## lm(formula = log(y) ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      1.3873       0.7243

el “Intercept” obtenido es, en términos del modelo exponencial, \(\ln b_0\) (¡mira arriba!), porque el cambio de variable sólo afecta a este coeficiente de la expresión de la exponencial Para recuperar \(b_0\) deber calcular la exponencial de

lmXY$coefficients[1]
## (Intercept) 
##    1.387264

que vale

(b0 = exp(lmXY$coefficients[1]))
## (Intercept) 
##    4.003881

CASO POTENCIAL

En este caso trabajas con los datos

set.seed(20)
x = runif(100, 6, 10)  # generar datos
logy = log(3) + 0.9 * x  + rnorm(100, mean = 0, sd = .5)
y = exp(logy)
plot(x, y)

y que en este caso decides ajustar a una curva potencial.

La estrategia es similar al caso anterior, solo que ahora el cambio de variable debe transformar \[y = b_0*x^{b_1} \]

en la expresión de una recta. Como \(x\) está elevado a cierta potencia (\(b_1\)), podemos usar logaritmos (lo usual es que sea el neperiano) para “bajar” el exponente:

\[\ln(y) = \ln(b_0*x^{b_1})= \ln(b_0)+b_1\ln x\]

Si llamamos \(yt=\ln y\) y \(xt = \ln x\) tenemos

\[yt = \ln(b_0)+b_1*xt\] recuerda que \(\ln(b_0)\) es un número.

Ahora hemos hecho un doble cambio de variable, y esto nos indica que

plot(log(x), log(y))

observa que ahora se representa \((\ln(x),\ln(y))\) (¡pero en R el logaritmo neperiano se denota por log()!). Al intentar detarminar los coeficientes del modelo lineal a partir de los datos transformados sucede algo parecido al caso exponencial:

(lmXY = lm(log(y) ~ log(x)))
## 
## Call:
## lm(formula = log(y) ~ log(x))
## 
## Coefficients:
## (Intercept)       log(x)  
##      -7.280        7.564

donce, de nuevo, el “Intercept” obtenido es \(\ln b_0\) (desde el punto de vista del modelo potencial). De nuevo, el cambio de variable sólo afecta a este coeficiente de la expresión inicial. Para recuperar \(b_0\) deber calcular la exponencial de

lmXY$coefficients[1]
## (Intercept) 
##    -7.28044

que vale

(b0 = exp(lmXY$coefficients[1]))
##  (Intercept) 
## 0.0006888821

CASO LOGARITMICO

Si la nube de puntos tiene una forma que recuerda a un logaritmo,

set.seed(2021) # generar datos
x = runif(100, 1, 25)
y = 4 + 3*log(x) + rnorm(100, sd = .5)
plot(x, y)

la curva que los aproxima debe tener la expresión

\[y = b_0 + b_1\ln x \]

y basta con hacer \(w = \ln x\) para tener la expresión de una recta. Efectivamente, si representas \((\ln x, y)\) en lugar de \((x,y)\) tienes una nube de puntos de aspecto lineal

plot(log(x), y)

y podrías construir el correspondiente modelo lineal

lm(y ~ log(x))
## 
## Call:
## lm(formula = y ~ log(x))
## 
## Coefficients:
## (Intercept)       log(x)  
##       3.990        2.955

que proporciona directamente los coeficientes \(b_0\) y \(b_1\), porque el cambio de variable no les afecta.

CASO HIPERBOLICO: CURVA DE MICHAELIS-MENTEN

Si la nube de puntos tiene una forma que recuerda a una hipérbola (a falta de más información acerca del fenómeno asociado a la medición de datos, la nube de puntos se asemeja a la del logaritmo pero parece haber una asíntota horizontal),

set.seed(2017)
x = runif(20, 0.1, 10)
y =  15*x/(1+3*x)  +rnorm(20, 0, .3)
plot(x, y)

la curva que los aproxima debe tener la expresión

\[y = \frac{b_0 x}{1+ b_1 x} \]

En este caso el cambio de variable prescrito es el llamado “doble recíproco”; hay que sustituir \(u = 1/x\) y \(w = 1/y\). Es decir, donde hay una \(x\) se pone \(1/u\) y donde hay una \(y\) se sustituye por \(1/w\): \[\frac{1}{w} = \frac{b_0 \frac{1}{u}}{1+ b_1 \frac{1}{u}} \]

Primero se puede operar el denominador:

\[\frac{b_0 \frac{1}{u}}{1+ b_1 \frac{1}{u}} = \frac{b_0 \frac{1}{u}}{\frac{u}{u}+ b_1 \frac{1}{u}}= \frac{b_0 \frac{1}{u}}{\frac{u+ b_1 }{u}} \]

y, a continuación, se simplifican las us de los denominadores:

\[\frac{b_0 \frac{1}{u}}{\frac{u+ b_1 }{u}}= \frac{b_0}{u+b_1} \]

es decir,

\[\frac{1}{yt} = \frac{b_0}{u+b_1} \]

Se multiplica todo por \(w\) \[1 = \frac{b_0}{u+b_1}w \] ahora se multiplica todo por \(u+b_1\) \[u+b_1 = b_0w\] y, finalmente, se divide todo entre \(b_0\) para obtener la expresión de una recta \[w = \frac{b_1}{b_0}+\frac{1}{b_0}u\] de término independiente \(b_1/b_0\) y pendiente \(1/b_0\).

Todos estos cálculos indican que al representar \((1/x,\,1/y)\) la nube de puntos resultante debería linealizarse

plot(1/x, 1/y)

Al calcular los coeficientes de la recta de regresión que ajusta los datos transformados

x_inv = 1/x
y_inv = 1/y
(lmXY = lm(y_inv ~ x_inv))
## 
## Call:
## lm(formula = y_inv ~ x_inv)
## 
## Coefficients:
## (Intercept)        x_inv  
##     0.19287      0.08438

se tiene que \(1/b_0=0.08438\) y \(b_1/b_0 = 0.1929\).

Por tanto, \[b_0=1/0.08438 = 11.85\] y, por otro lado \[b_1 = b_0 0.1929 = 11.85*0.1929= 2.286 \]