forked from joanby/r-basic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTema10.Rmd
333 lines (210 loc) · 11.5 KB
/
Tema10.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
---
title: Tema 10 - Introducción a la regresión lineal
author: "Juan Gabriel Gomila & María Santos"
output:
ioslides_presentation:
widescreen: true
css: JB_style.css
logo: Imgs/LogoCurso.png
fig_height: 4
fig_width: 8
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, comment = NA)
```
## Introducción
Seguramente, en algún momento de vuestra vida ya sea hojeando un libro de matemáticas, curioseando artículos científicos... habréis visto una línea recta o algún otro tipo de curva en un gráfico que se ajusta a las observaciones representadas por medio de puntos en el plano.
En general, la situación es la siguiente: supongamos que tenemos una serie de puntos en el plano cartesiano $\mathbb{R}^2$, de la forma
$$(x_1,y_1),\ \dots,\ (x_n,y_n)$$
que representan las observaciones de dos variables numéricas. Digamos que $x$ es la edad e $y$ el peso de $n$ estudiantes.
## Introducción
Nuestro objetivo: describir la relación entre la <l class = "definition">variable independiente</l>, $x$, y la <l class = "definition">variable dependiente</l>, $y$, a partir de estas observaciones.
Para ello, lo que haremos será buscar una función $y=f(x)$ cuya gráfica se aproxime lo máximo posible a nuestros pares ordenados $(x_i,y_i)_{i=1,\dots,n}$.
Esta función nos dará un modelo matemático de cómo se comportan estas observaciones, lo cual nos permitirá entender mejor los mecanismos que relacionan las variables estudiadas o incluso, nos dará la oportunidad de hacer prediccciones sobre futuras observaciones.
## Introducción
La primera opción es la más fácil. Consiste en estudiar si los puntos $(x_i,y_i)_{i=1,\dots,n}$ satisfacen una relación lineal de la forma
$$y = ax +b$$
con $a,b\in\mathbb{R}$.
En este caso, se busca la recta $y = ax +b$ que mejor aproxime los puntos dados imponiendo que la suma de los cuadrados de las diferencias entre los valores $y_i$ y sus aproximaciones $\tilde{y}_i=ax_i+b$ sea mínima. Es decir, que
$$\sum_{i=1}^n(y_i-\tilde{y}_i)^2$$ sea mínima
## Introducción
El objetivo de este tema no es otro más que enseñaros como hacer uso de R para obtener esta recta de regresión.
Veremos también cómo se puede evaluar numéricamente si esta recta se ajusta bien a las observaciones dadas.
Para ello, introduciremos algunas funciones de R y haremos uso de transformaciones logarítmicas para tratar casos en los que los puntos dados se aproximen mejor mediante una función exponencial o potencial.
# Calculando rectas de regresión
## Planteamiento del problema
Como ya hemos dicho, el objetivo de este tema es estudiar si existe relación lineal entre las variables dependiente e independiente.
Por lo general, cuando tenemos una serie de observaciones emparejadas, $(x_i,y_i)_{i=1,\dots,n}$, la forma natural de almacenarlas en R es mediante una tabla de datos. Y la que más conocemos nostros es el data frame.
Como recordaréis de temas anteriores, la ventaja de trabajar con este tipo de organización de datos es que luego se pueden hacer muchas cosas.
## Ejemplo 1
<div class = "example">
**Ejemplo 1**
En este ejemplo, nosotros haremos uso del siguiente data frame:
</div>
```{r}
body = read.table("../data/bodyfat.txt", header = TRUE)
head(body,3)
```
## Ejemplo 1
<div class = "example">
Más concretamente, trabajaremos con las variables `fat` y `weight`.
</div>
```{r}
body2 = body[,c(2,4)]
names(body2) = c("Grasa","Peso")
str(body2)
head(body2,3)
```
## Representación gráfica
Al analizar datos, siempre es recomendable empezar con una representación gráfica que nos permita hacernos a la idea de lo que tenemos.
Esto se consigue haciendo uso de la función `plot`, que ya hemos estudiado en detalle en lecciones anteriores. No obstante, para lo que necesitamos en este tema nos conformamos con un gráfico básico de estos puntos que nos muestre su distribución.
## Ejemplo 1
```{r}
plot(body2)
```
## Calculando la recta de regresión
Para calcular la <l class = "definition">recta de regresión</l> con R de la familia de puntos $(x_i,y_i)_{i=1,\dots,n}$, si `x` es el vector $(x_i)_{i=1,\dots,n}$ e `y` es el vector $(y_i)_{i=1,\dots,n}$, entonces, su recta de regresión se calcula mediante la instrucción
<div class = "aligncenter">
`lm(y~x)`
</div>
Cuidado con la sintaxis: primero va el vector de las variables dependientes y, seguidamente después de una tilde `~`, va el vector de las variables independientes.
Esto se debe a que R toma el significado de la tilde como "en función de". Es decir, la interpretación de `lm(y~x)` en R es "la recta de regresión de $y$ en función de $x$".
## Calculando la recta de regresión
Si los vectores `y` y `x` son, en este orden, la primera y la segunda columna de un data frame de dos variables, entonces es suficiente aplicar la función `lm` al data frame.
En general, si `x` e `y` son dos variables de un data frame, para calcular la recta de regresión de `y` en función de `x` podemos usar la instrucción
<div class = "aligncenter">
`lm(y~x, data = data fame)`
</div>
## Ejemplo 1
```{r}
lm(body2$Peso~body2$Grasa) #Opción 1
lm(Peso~Grasa, data = body2) #Opción 2
```
## Ejemplo 1
<div class = "example">
Como podéis observar, las dos formas de llamar a la función dan exactamente lo mismo. Ninguna es mejor que la otra.
El resultado obtenido en ambos casos significa que la recta de regresión para nuestros datos es
$$y = 2.151x+137.738$$
Ahora, podemos superponer esta recta a nuestro gráfico anterior haciendo uso de la función `abline()`.
</div>
## Ejemplo 1
```{r}
plot(body2)
abline(lm(Peso~Grasa, data = body2), col = "purple")
```
## Observación
Hay que tener en cuenta que el análisis llevado a cabo hasta el momento de los pares de valores $(x_i,y_i)_{i=1,\dots,n}$ ha sido puramente descriptivo.
Es decir, hemos mostrado que estos datos son consistentes con una función lineal, pero no hemos demostrado que la variable dependiente sea función aproximadamente lineal de la variable dependiente. Esto último necesitaría una demostración matemática, o bien un argumento biológico, pero no basta con una simple comprobación numérica.
## Haciendo predicciones
Eso sí, podemos utilizar todo lo hecho hasta ahora para predecir valores $\tilde{y}_i$ en función de los $x_i$ resolviendo una simple ecuación lineal
## Coeficiente de determinación
El <l class = "definition">coeficiente de determinación</l>, $R^2$, nos es útil para evaluar numéricamente si la relación lineal obtenida es significativa o no.
No explicaremos de momento como se define. Eso lo dejamos para curiosidad del usuario. Por el momento, es suficiente con saber que este coeficiente se encuentra en el intervalo $[0,1]$. Si $R^2$ es mayor a 0.9, consideraremos que el ajuste es bueno. De lo contrario, no.
## La función summary
La función `summary` aplicada a `lm` nos muestra los contenidos de este objeto. Entre ellos encontramos `Multiple R-squared`, que no es ni más ni menos que el coeficiente de determinación, $R^2$.
Para facilitarnos las cosas y ahorrarnos información que, de momento, no nos resulta de interés, podemos aplicar `summary(lm(...))$r.squared`
## Ejemplo 1
```{r}
summary(lm(Peso~Grasa, data = body2))
```
## Ejemplo 1
```{r}
summary(lm(Peso~Grasa, data = body2))$r.squared
```
<div class = "example">
En este caso, hemos obtenido un coeficiente de determinación de 0.3751, cosa que confirma que la recta de regresión no aproxima nada bien nuestros datos.
</div>
# Rectas de regresión y transformaciones logarítmicas
## Transformaciones logarítmicas
No siempre encontraremos dependencias lineales. A veces nos encontraremos otro tipo de dependencias, como por ejemplo pontencias o exponenciales.
Estas se pueden transformar a lineales mediante un <l class = "definition">cambio de escala</l>
## Escalas logarítmicas
Por lo general, es habitual encontrarnos gráficos con sus ejes en <l class = "definition">escala lineal</l>. Es decir, las marcas en los ejes están igualmente espaciadas.
A veces, es conveniente dibujar alguno de los ejes en <l class = "definition">escala logarítmica</l>, de modo que la misma distancia entre las marcas significa el mismo cociente entre sus valores. En otras palabras, un eje en escala logarítmica representa el [logaritmo](https://es.wikipedia.org/wiki/Logaritmo) de sus valores en escala lineal.
Diremos que un gráfico está en <l class = "definition">escala semilogarítmica</l> cuando su eje de abcisas está en escala lineal y, el de ordenadas, en escala logarítmica.
Diremos que un gráfico está en <l class = "definition">escala doble logarítmica</l> cuando ambos ejes están en escala logarítmica.
## Interpretación gráfica
Si al representar unos puntos $(x_i, y_i)_{i=1,\dots,n}$ en escala semilogarítmica observamos que siguen aproximadamente una recta, esto querrá decir que los valores $\log(y)$ siguen una ley aproximadamente lineal en los valores $x$, y, por lo tanto, que $y$ sigue una <l class = "definition">ley aproximadamente exponencial</l> en $x$.
En efecto, si $\log(y) = ax + b$, entonces,
$$y = 10^{\log(y)} = 10^{ax+b} = 10^{ax}\cdot 10^b = \alpha^x\beta$$
con $\alpha = 10^a$ y $\beta = 10^b$
## Interpretación gráfica
Si al representar unos puntos $(x_i, y_i)_{i=1,\dots,n}$ en escala doble logarítmica observamos que siguen aproximadamente una recta, esto querrá decir que los valores $\log(y)$ siguen una ley aproximadamente lineal en los valores $\log(x)$, y, por lo tanto, que $y$ sigue una <l class = "definition">ley aproximadamente potencial</l> en $x$.
En efecto, si $\log(y) = a\log(x) + b$, entonces, por propiedades de logaritmos
$$y = 10^{\log(y)} = 10^{a\log(x)+b}= (10^{\log(x)})^a\cdot 10^b = x^{a}\beta$$
con $\beta = 10^b$
## Ejemplo 2
<div class = "example">
**Ejemplo 2**
En este caso trabajaremos no con un data frame, sino directamente con los dos vectores siguientes:
</div>
```{r}
dep = c(1.2,3.6,12,36)
ind = c(20,35,61,82)
```
```{r, eval = FALSE}
plot(ind,dep, main = "Escala lineal")
plot(ind,dep, log = "y", main = "Escala semilogarítmica")
```
## Ejemplo 2
```{r, echo = FALSE}
par(mfrow = c(1,2))
plot(ind,dep, main = "Escala lineal")
plot(ind,dep, log = "y", main = "Escala semilogarítmica")
par(mfrow = c(1,1))
```
## Ejemplo 2
```{r}
lm(log10(dep)~ind)
summary(lm(log10(dep)~ind))$r.squared
```
## Ejemplo 2{.example}
Lo que acabamos de obtener es que
$$\log(dep) = 0.023\cdot ind - 0.33$$
es una buena aproximación de nuestros datos.
Con lo cual
$$dep = 10^{0.023\cdot ind}\cdot10^{-0.33} = `r round(10^(0.023),3)`^{ind}\cdot `r round(10^(-0.33),3)`$$
## Ejemplo 2
```{r}
plot(ind,dep, main = "Curva de regresión")
curve(1.054^x*0.468, add = TRUE, col = "purple")
```
## Ejemplo 3
<div class = "example">
**Ejemplo 3**
En este caso trabajaremos con el siguiente data frame:
</div>
```{r}
tiempo = 1:10
gramos = c(0.097,0.709,2.698,6.928,15.242,29.944,52.902,83.903,120.612,161.711)
d.f = data.frame(tiempo,gramos)
```
```{r,eval = FALSE}
plot(d.f)
plot(d.f, log = "y")
plot(d.f, log = "xy")
```
## Ejemplo 3
```{r, echo = FALSE,fig.width=10}
par(mfrow= c(1,3))
plot(d.f)
plot(d.f, log = "y")
plot(d.f, log = "xy")
par(mfrow= c(1,1))
```
## Ejemplo 3
```{r}
lm(log10(gramos)~log10(tiempo), data = d.f)
summary(lm(log10(gramos)~log10(tiempo), data = d.f))$r.squared
```
## Ejemplo 3{.example}
Lo que acabamos de obtener es que
$$\log(gramos) = 3.298\cdot \log(tiempo) - 1.093$$
es una buena aproximación de nuestros datos.
Con lo cual
$$gramos = 10^{3.298\cdot\log(tiempo)}\cdot10^{-1.093} = tiempo^{3.298}\cdot `r round(10^(-1.093),3)`$$
## Ejemplo 3
```{r}
plot(d.f, main = "Curva de regresión")
curve(x^(3.298)*0.081, add=TRUE, col = "purple")
```