-
Notifications
You must be signed in to change notification settings - Fork 0
/
Regresion-G3.Rmd
279 lines (185 loc) · 13.7 KB
/
Regresion-G3.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
---
title: "Regresión"
author: "Grupo G3 - Los panteras"
date: "`r Sys.Date()`"
output:
prettydoc::html_pretty:
theme: tactile
highlight: github
---
# Procesamiento de los datos
```{r warning=FALSE, message=FALSE}
library(dplyr)
library(ggplot2)
library(magrittr)
library(GGally)
library(tidyr)
covid_datos <- read.csv("Datasets/covid_datos.txt", sep=";", encoding = "UTF-8")
# Se genera una ultima columna al finalizar cada linea con ';' por lo que la eliminamos
covid_datos <- covid_datos[, 1:4]
# Para evitar problemas con los acentos en las columnas cambiamos el nombre de la primera
names(covid_datos)[1] <- "Fecha"
covid_datos$Fecha <- as.Date(covid_datos$Fecha, format='%d/%m/%Y')
# Los valores NA los convertimos a 0
indices <- which(is.na(covid_datos$Valor))
covid_datos$Valor[indices] = 0
```
Para poder trabajar mejor con el dataset, hemos añadido una columna por cada una de las medidas del dataset. Nuestro objetivo con este cambio es visualizar tanto con la función str() como con summary() todos los cuartiles e información estadística importante sobre los valores del covid-19 en dichas medidas.
```{r eval = FALSE}
c1 <- covid_datos[covid_datos$Medida == "Curados", ]
c1$Medida <- NULL
names(c1)[3] = "Curados"
c2 <- covid_datos[covid_datos$Medida == "Confirmados PCR", ]
c2$Medida <- NULL
names(c2)[3] = "Confirmados PCR"
c3 <- covid_datos[covid_datos$Medida == "UCI", ]
c3$Medida <- NULL
names(c3)[3] = "UCI"
c4 <- covid_datos[covid_datos$Medida == "Hospitalizados", ]
c4$Medida <- NULL
names(c4)[3] = "Hospitalizados"
c5 <- covid_datos[covid_datos$Medida == "Defunciones", ]
c5$Medida <- NULL
names(c5)[3] = "Defunciones"
c6 <- covid_datos[covid_datos$Medida == "Total confirmados (PCR+test)", ]
c6$Medida <- NULL
names(c6)[3] = "Total confirmados (PCR+test)"
covid_datos <- Reduce(merge, list(c1, c2, c3, c4, c5, c6))
covid_datos2 <- covid_datos # Guardamos el dataset con territorios por si hiciese falta
covid_datos <- covid_datos[,-2] # Quitamos territorio que es tipo factor para regresión
```
```{r}
# Hare uso de la funcion spread del paquete tidyr, para poder separar las filas de la columna Medida en varias columnas, y usando el valor de estas como value de la columna
covid_datos2 <- covid_datos %>% spread(key = Medida, value = Valor) %>% arrange(Territorio, desc(Fecha))
head(covid_datos2)
```
Una vez tenemos preparado el dataset, vamos a centrarnos en el analisis de Andalucía, por lo que hacemos un filtrado del dataset
```{r}
andalucia <- covid_datos2 %>% filter(Territorio == "Andalucía") %>% select(-Territorio)
```
# Análisis exploratorio
Ahora, tenemos 8 columnas en nuestro dataset, siendo 6 de ellas de tipo numeric (Confirmados PCR, Curados, UCI, Hospitalizados, Defunciones, Total confirmados (PCR+test)), otra de tipo "Date" (Fecha) y otra de tipo factor (Territorio).
La variable Andalucia creada adicionalmente, no posee la columna territorio pues se repetiria para cada fila.
```{r}
str(covid_datos2)
str(andalucia)
```
Observamos el número de filas y columnas:
```{r}
dim(andalucia)
```
La función summary() muestra la media, mediana, cuartiles, valor mínimo y valor máximo, para variables cuantitativas y la frecuencia absoluta para variables cualitativas.
Los cuartiles son valores que dividen una muestra de datos en cuatro partes iguales. Utilizando cuartiles puede evaluar rápidamente la dispersión y la tendencia central de un conjunto de datos, que son los pasos iniciales importantes para comprender sus datos.
La manera más simple de medir la dispersión es identificar los valores mayor y menor de un conjunto de datos. La diferencia entre los valores mínimo y máximo se denomina el rango (o recorrido) de las observaciones.
```{r}
summary(covid_datos2)
summary(andalucia)
```
Realizando un plot de los datos filtrados, podemos observar las relaciones entre las variables para poder establecer algun estudio de interes.
```{r}
plot(andalucia)
```
Una vez analizadas las graficas, podemos ver que en casi todas, cuando la variable Fecha esta implicada, las demas variables presentan un comportamiento similar, formando una campana de Gauss. Esto es lo esperado, pues a medida que avanzan los dias, se alcanza el pico de infectados, defunciones, etc, y posteriormente comienza la relajacion de la grafica de manera suave.
Ejecutando un ggpairs de Andalucia podemos observar facilmente relaciones existentes en los datos
```{r fig.height=10, fig.width= 10}
ggpairs(andalucia, progress = FALSE)
```
Como habiamos mencionado previamente, cuando las variable Fecha interviene, se generan campanas de Gauss para cada variable.
Por otra parte, podemos apreciar que todas las demás siguen una relación lineal positiva entre ellas: esto significa que ambas variables aumentan o disminuyen simultáneamente a un ritmo constante.
Esto tiene sentido, debido a que cuantos más positivos por PCR haya, mayor seran el numero de hospitalizaciones, ingresos en UCI, etc. Y a mayores ingresos en hospitales, el numero de curados y el numero de defunciones tambien se veran afectados.
No encontramos relaciones inversas o negativas entre las variables.
A continuación, vamos a mostar algunas relaciones entre variables:
```{r}
covid_datos2 %>%
ggplot(aes(x=`Confirmados PCR`, y=Defunciones)) +
geom_point() +
stat_smooth()
covid_datos2 %>%
ggplot(aes(x=UCI, y=Hospitalizados)) +
geom_point() +
stat_smooth()
```
# Modelos Lineales
Podemos aplicar las tecnicas vistas en clase para tener un mayor entendimiento de los datos
¿Hay efecto entre los contagios y los ingresos hospitalarios?
A simple vista podriamos afirmarlo, pero siempre hay que corroborar los datos.
```{r}
# Realizamos modelo de regresion ingresos-contagios
ingresos_contagios <- lm(Hospitalizados ~ `Confirmados PCR`, data = covid_datos2)
ingresos_contagios
# El modelo es -0.7797 (corte con el eje Y), 0.5166 (Los ingresos se incrementan en este porcentaje)
```
Hospitalizaciones = 0.7797 + 0.5166 * Confirmados_PCR
```{r}
# Ejecutar a la vez
plot(covid_datos2$`Confirmados PCR`, covid_datos2$Hospitalizados)
abline(ingresos_contagios)
# Usando ggplot
p <- covid_datos2 %>%
ggplot(aes(x = `Confirmados PCR`, y = Hospitalizados)) +
geom_point() +
stat_smooth(method = lm)
p
```
```{r}
summary(ingresos_contagios)
```
* La informacion de los residuos nos indica la calidad del ajuste realizado, como se ajusta nuestro modelo a los datos del dataset
* Analizando el resumen de ingresos_contagios, podemos ver que el valor de R2 es 0.9682, siendo un ajuste bastante cercano a 1, por lo que podriamos concluir que es un buen ajuste. 96.82% de la variabilidad de Hospitalizados viene reflejada por la variable Confirmados PCR.
* Observamos 723 grados de libertad posibles para estimar la variabilidad de los parametros y fiabilidad del ajuste.
* F-stadistico = 2.203e+04 --> Alejado de 1 indica buen ajuste
* p-value: < 2.2e-16 --> Al ser un valor tan bajo rechazamos H0 aceptando H1, es decir, que si hay modelo.
***
**Realizando plot del modelo**
```{r}
plot(ingresos_contagios)
```
* 1.-Residuals vs Fitted: representa los errores respecto los valores ajustados. Si la linea roja se acerca bastante al y=0 se podría apreciar que los errores serían bastante simétricos y que los residuos estarían linealmente distribuidos. Podría ser buen modelo.
`EN NUESTRO CASO:` Los residuos linealmente distribuidos, cerca del y = 0.
* 2.- Normal Q-Q: Gráfico Q-Q plot, compara mi modelo con una distribución normal. si mi modelo se acerca a la linea discontinua y=x, significa que mi modelo es muy bueno.Si los errores estan distribuidos normalmente debe dar una linea recta. Detecta outliers que se desvian de la recta y valores importantes.
`EN NUESTRO CASO:` Los residuos están practicamente distribuidos siguiendo una normal, la y = x. Tambien me detecta outliers, valores importantes usando la distancia de Cook. Pese a que los residuos se distribuyen en una especie de S, la mayoria se concentra siguiendo la normal.
* 3.- Scale-Location: Compara los valores ajustados con la raiz cuadrada de los residuos estandarizados. Residuos están distribuidos aleatoriamente o concentrado?, hay mucha dispersion de los errores (si fuera curva V los residuos no estarian distribuidos aleratoriamente).
`EN NUESTRO CASO:` Los residuos están distribuidos aleatoriamente - mucha dispersión de los errores. Aunque hay valores concentrados, no es observable ningun patron en concreto.
* 4.- Residuals vs Leverage: calcula los outliers y los valores importantes a partir de la distancia de Cook.
`EN NUESTRO CASO:` Vemos los calculos de la distancia de Cook. Nos indica que puntos tienen mayor influencia en la regresion.
## Modelo lineal parabólico
¿Representaría mejor los datos anteriormente mostrados un modelo parabólico? A simple vista, podemos ver que un modelo lineal representa bastante bien los datos, además hemos obtenido un $R^2$ bastante alto. No obstante, podemos probar con un modelo parabólico y visualizar cómo se ajustan los datos para este modelo.
```{r}
ic_parab <- lm(Hospitalizados~ `Confirmados PCR`+I(`Confirmados PCR`^2), data = covid_datos2)
ic_parab
# El modelo es Hospitalizados = -7.799e-02 + 4.799e-01*ConfirPCR + 7.375e-05*ConfirPCR^2
```
Una representación de los datos y el modelo sería:
```{r}
covid_datos2 %>%
ggplot(aes(x=`Confirmados PCR`+I(`Confirmados PCR`^2), y=Hospitalizados))+
geom_point()+
stat_smooth(method = lm)
```
Estudiaremos sus datos estadísticos y los analizaremos mediante:
```{r}
summary(ic_parab)
```
Analizaremos los datos:
Residuos: da información del modelo respecto a la dispersión de este. Para ser buen modelo debe estar.
Deben tener un promedio de cero. Los errores deben estar distribuidos uniformemente.
`EN NUESTRO CASO:` Los residuos tienen un promedio casi de cero por lo que podríamos presentarnos ante un buen modelo ante este indicador. En cuanto a la uniformidad de los errores vemos como su min (-31.778) y su max (64.474) indican algo de dispersión, aunque no significativamente. Comparando con el modelo lineal anterior, estos residuos están uniformemente mejores distribuídos. Además, el promedio está más cerca de 0.
Para el intercept y pendiente (slop): R compara sus términos con un modelo donde estos terminos son nulos, por lo que podemos ver la importancia de estos terminos y ver de los contrastes de hipotesis los términos t-value y Pr(>|t|) para explicar los resultados.
`EN NUESTRO CASO:` Vemos que nuestro intercept (punto de corte con eje y) no es significativo, al igual que en el modelo lineal anterior. Sin embargo, tenemos un signo bastante significativo para la comparativa entre modelos que estamos ejecutando. Esto es que, nos dicen que el término cuadrático de este modelo es muy significativo (***), por lo que este indicador podría decirnos que este modelo es mejor que el lineal anterior y que el término cuadrado es importante.
$R^2$ y $R^2$-Ajustado:
El $R^2$ representa qué porcentaje de los valores de salida quedan representados por los valores del modelo. Si es cercano a 1 indica que la regresíon ha explicado una gran proporción de la variabilidad en la salida. Un valor cercano a cero indica que el modelo es incorrecto o que el error es alto.
`EN NUESTRO CASO:` Tenemos un valor muy cercano a 1 (0.9692). Por lo que podemos afirmar que este modelo es muy bueno. en comparación con el modelo anterior (0.9682). Vemos que este modelo es minimamente mejor.
El valor de $R^2$-Ajustado indica el ajuste de $R^2$ respecto a los predictores usados. Si su valor es muy diferente al $R^2$ indica que el modelo está sobrecargado (overfitting).
`EN NUESTRO CASO:` Vemos que los valores son próximos por lo que no hay overfitting, es decir, el modelo no está sobrecargado.
**¿Hay modelo?**
F-estadístico: Si está muy cerca de 1, no hay relaciones de dependencia y no hay modelo (se acepta hipótesis nula). Si es superior a 1 se acepta la hipotesis alternativa.
`EN NUESTRO CASO:` Vemos como el F-Stadistico es muy superior a 1 por lo que aceptamos la hipótesis alternativa y afirmamos que el modelo es válido.
P-value: probabilidad de aceptar h1 como cierta y que sea falso. Si es menor al nivel de significación de Fisher rechazas H0, es decir, habría una relación de dependencia entre una variable del dataset y la variable de salida.
`EN NUESTRO CASO:` Vemos como el indice es muy inferior al nivel de significación de Fisher. Por lo que rechazamos la hipótesis nula y afirmamos que al menos una variable del dataset depende de la variable de salida.
**Plot del modelo**
```{r}
plot(ic_parab)
```
Vemos como los datos son muy parecidos en relación al modelo lineal expuesto anteriormente. Algo destacable sería la primera gráfica `Residuals vs Fitted` ya que vemos como en este caso, la línea se separa un poco más en comparación con la mostrada para el anterior modelo. Por lo que podemos decir, que los errores son menos simétricos en este modelo parabólico.
`Conclusión: ` Podemos ver como tanto el primer modelo lineal como el modelo parabólico representan muy bien los datos. Ambos dan un valor bastante alto del indicador $R^2$ y por tanto cualquiera de los dos modelos serían muy buenos representantes de este conjunto de datos. Por un lado, el modelo lineal primero es más sencillo de crear y de representar, y comparándolo con la mímina mejora que aportaría el parabólico, es posible que la mejor opción sea quedarse con el modelo lineal para simplificar los datos. Por otro lado, hemos visto que el término cuadrático es muy importante en su modelo, por lo que si nos quedamos con el modelo parabólico también sería muy buena opción.
Personalmente, nosotros nos decantaríamos por el primer modelo lineal, ya que vemos que se ajusta muy bien a los datos, su indice de acierto es muy alto y la mejora que aporta el modelo parabólico es mínima en comparación con lo que complicaría el modelo en cuanto a calculos se refiere.