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
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
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.
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 \]