La variabilidad climática en una cuenca hidrográfica es un tema de gran importancia debido a su impacto en la gestión del agua, la agricultura, la biodiversidad y la seguridad alimentaria de las poblaciones que dependen de los recursos hídricos de esa región. Las cuencas hidrográficas son áreas geográficas naturales donde todas las aguas superficiales y subterráneas fluyen hacia un mismo punto de salida, ya sea un río principal, un lago o un océano. Esta característica hace que sean sistemas sensibles a los cambios climáticos.
La variabilidad climática se refiere a las fluctuaciones naturales en los patrones del clima a lo largo del tiempo y el espacio. Estas fluctuaciones pueden manifestarse en cambios en la temperatura, precipitación, humedad, vientos y otros parámetros climáticos. En una cuenca hidrográfica, la variabilidad climática puede influir en la cantidad, distribución y temporalidad de las precipitaciones, así como en la evaporación y la disponibilidad de agua superficial y subterránea.
Los cambios en el clima pueden ser causados por factores naturales, como variaciones en la actividad solar, oscilaciones climáticas naturales como El Niño y La Niña, y fenómenos atmosféricos como el cambio en la circulación atmosférica. Sin embargo, en las últimas décadas, la actividad humana, especialmente la emisión de gases de efecto invernadero, ha contribuido significativamente al calentamiento global y al cambio climático, exacerbando la variabilidad climática y generando impactos más pronunciados en las cuencas hidrográficas.
Dar click en la palabra INFORME para poder obtener mas información del informe.
A partir del año 1980 hasta el 2014 se han producido 10 eventos cálidos del Niño, empezando en abril/82 hasta junio/83, septiembre/86 hasta febrero/88, junio/91 hasta julio/92, octubre/94 hasta marzo/95, mayo/97 hasta mayo/98, junio/02 hasta febrero/03, julio/04 hasta abril/05, septiembre/06 hasta enero/07, jul abril/2010, noviembre/14 hasta diciembre/14, y siete eventos fríos de La Niña que ocurrieron en octubre/84 hasta junio/85, mayo/88 hasta mayo/89, agosto/95 hasta marzo/96, julio/98 hasta febrero/01, agosto/07 hasta junio/08, julio/10 hasta abril/11, agosto/11 hasta febrero/12.
El primer paso es la instalación de las librerías utilizando el comando install.packages() esto es fundamental para el desarrollo de nuestro código. Ya que se necesitan algunos paquetes como caret, randomforest, lubridate, ggplot2. Sin estas librerías el codigo no va a correr.
A continuación las librerías que vamos a utilizar en el código.
install.packages(“lubridate”)
install.packages(“dplR”)
install.packages(“tidyr”)
install.packages(“ggplot2”)
install.packages(“caret”)
install.packages(“randomforest”)
install.packages(“zoo”)
Ahora tenemos que llamar a los paquetes instalados con el comando library(), y dentro de los parentesis escribir los paquetes que solicitamos anteriormente.
library(lubridate)
library(dplyr)
library(tidyr)
library(ggplot2)
library(caret)
library(randomForest)
library(zoo)
Los datos obtenidos se descargaron de la página web Datos Abiertos, esta es una página anexada al INAHMI.
Vamos a realizar un análisis previo de nuestros datos para visualizar el comportamiento en serie de tiempo.
Ahora tenemos que hacer la carga de nuestros datos los cuales se encuentran en formato csv (texto delimitado por comas), es recomendado tener en este formato ya que R lo reconoce sin necesidad de agregar una libreria adicional.
setwd("~/ING AMBIENTAL/INFORMATICA23-24/Proyecto")
temp <- read.csv("Temp_Final.csv", sep = ",", dec = ".", header = T)
Una serie de tiempo es una secuencia de datos u observaciones medidos en determinados momentos, en intervalos iguales y ordenados cronológicamente.
El análisis de series de tiempo se refiere al proceso de analizar los datos disponibles para descubrir el patrón o la tendencia en los datos. Permite extraer y modelar las relaciones entre datos a lo largo del tiempo.
temp_ts <- ts(temp$Temperatura, frequency = 12, start = c(1975,1))
plot(temp_ts, main = "Serie de Tiempo de Temperatura 1975-2019", xlab = "Años", ylab = "Temperatura (°C)")
Utilizaremos el comando decompose() el cual desagrega la serie de tiempo en los componentes: tendencia, estacional, cíclico y aleatorio.
temp_ts_descomp <- decompose(temp_ts)
Es el patrón subyacente en los datos a lo largo del tiempo. No es necesariamente lineal.
plot(temp_ts_descomp$trend, main = "Tendencia de Temperatura", col = "blue", ylab = "Temperatura (°C)")
Cuando una serie esta influenciada por factores estacionales de periodo fijo como el día, mes, trimestre, año, etc.
plot(temp_ts_descomp$seasonal, main = "Estacionalidad de Temperatura", col = "red", ylab = "Temperatura (°C)")
Parte inexplicable de los datos medidos.
plot(temp_ts_descomp$random, main = "Irregularidad de Temperatura", col = "green", ylab = "Temperatura (°C)")
En este apartado del código de R, creamos las variables de las fechas en las que se tomaron los datos según el INAHMI como podemos oberservar en nuestro código la primera fecha que se tomaron datos de temperatura están en “date_inicial” y la última fecha que se reportaron datos es “date_final”.
Ademas podemos notar que tenemos dos variables adicionales “fecha_final” la cual nos indica el mes siguiente a la última toma de datos reportados por el INAHMI y “fecha_pred” es la fecha de predicción que fijamos para un año.
fecha_final <- as.Date("2019-07-01")
fecha_pred <- as.Date("2020-07-01")
date_inicial <- as.Date("1975-01-01")
date_final <- as.Date("2019-06-01")
Fecha <- as.Date(seq(from = date_inicial, to = date_final, by="month"))
Los dataframes son una clase de objetos especial en R. Normalmente, cuando se realiza un estudio estadístico sobre los sujetos u objetos de una muestra, la información se organiza precisamente en un dataframe: una hoja de datos, en los que cada fila corresponde a un sujeto y cada columna a una variable. La estructura de un data.frame es muy similar a la de una matriz. La diferencia es que una matriz sólo admite valores numéricos, mientras que en un dataframe podemos incluir también datos alfanuméricos.
temp <- as.data.frame(temp)
head(temp, n = 60)
## Fecha Temperatura
## 1 01/01/1975 13.5
## 2 01/02/1975 12.8
## 3 01/03/1975 13.3
## 4 01/04/1975 13.7
## 5 01/05/1975 13.5
## 6 01/06/1975 13.5
## 7 01/07/1975 12.3
## 8 01/08/1975 13.1
## 9 01/09/1975 13.1
## 10 01/10/1975 12.8
## 11 01/11/1975 12.6
## 12 01/12/1975 12.7
## 13 01/01/1976 12.9
## 14 01/02/1976 13.0
## 15 01/03/1976 13.5
## 16 01/04/1976 13.7
## 17 01/05/1976 13.8
## 18 01/06/1976 13.6
## 19 01/07/1976 14.2
## 20 01/08/1976 14.0
## 21 01/09/1976 14.8
## 22 01/10/1976 13.6
## 23 01/11/1976 13.8
## 24 01/12/1976 13.8
## 25 01/01/1977 14.4
## 26 01/02/1977 13.9
## 27 01/03/1977 15.0
## 28 01/04/1977 14.2
## 29 01/05/1977 14.2
## 30 01/06/1977 13.7
## 31 01/07/1977 14.8
## 32 01/08/1977 14.5
## 33 01/09/1977 15.0
## 34 01/10/1977 14.3
## 35 01/11/1977 14.5
## 36 01/12/1977 15.7
## 37 01/01/1978 14.4
## 38 01/02/1978 15.4
## 39 01/03/1978 14.4
## 40 01/04/1978 14.2
## 41 01/05/1978 14.6
## 42 01/06/1978 14.6
## 43 01/07/1978 14.4
## 44 01/08/1978 15.0
## 45 01/09/1978 14.4
## 46 01/10/1978 14.4
## 47 01/11/1978 15.2
## 48 01/12/1978 14.2
## 49 01/01/1979 14.4
## 50 01/02/1979 14.7
## 51 01/03/1979 14.2
## 52 01/04/1979 14.8
## 53 01/05/1979 14.5
## 54 01/06/1979 14.7
## 55 01/07/1979 14.9
## 56 01/08/1979 14.8
## 57 01/09/1979 14.2
## 58 01/10/1979 14.7
## 59 01/11/1979 14.5
## 60 01/12/1979 14.7
Posterior a eso empleamos el comando cbind() para combinar las dos columnas en un nuevo marco de datos. Combinamos la columna de temperaturas con una secuencia de fechas para formar un nuevo marco de datos.
temp <- as.data.frame(cbind(temp$Temperatura, Fecha))
Renombramos las columnas del marco de datos a ‘Temperatura’ y ‘Fecha’.
names(temp) <- c("Temperatura", "Fecha")
Después convertimos la columna de ‘Fecha’ a objetos de fecha en R empleando el comando as.Date(). Esto nos asegura que los datos de esta columna sean tratados como fechas.
temp$Fecha <- as.Date(temp$Fecha)
En resumen, hasta esta parte, el código toma un objeto de datos llamado ‘temp’, lo convierte en un marco de datos que solicita R, combina la columna de temperatura con una secuencia de fechas, renombramos las columnas y aseguramos que la columna de fechas este en el formato adecuados para su manipulación como fechas.
Creamos un nuevo data frame para los datos que vamos a predecir. Con este paso se crea una secuencia de fechas predichas desde la ‘fecha_final’ hasta ‘fecha_pred’ en intervalos mensuales.
fecha_predic <- as.Date(seq(from = fecha_final, to = (fecha_pred), by = "month"))
Inicializamos un vector ‘Temperatura’ con los valores ‘NA’ y combinamos este vector con el vector de fechas predichas para crear un nuevo marco de datos denominado ‘fecha_predic’. Y también convertimos la columna ‘fecha_predic’ a un formato fecha y renombramos las columnas a ‘Temperatura’ y ‘Fecha’.
Temperatura <- as.numeric(NA)
fecha_predic <- as.data.frame(cbind(Temperatura, fecha_predic))
fecha_predic$fecha_predic <- as.Date(fecha_predic$fecha_predic)
names(fecha_predic) <- c("Temperatura", "Fecha")
Combinamos los datos originales ‘temp’ con las fechas predichas ‘fecha_predic’ empleando el comando rbind(), el cual añade las filas al marco de datos ‘temp’.
temp <- rbind(temp, fecha_predic)
Duplicamos la columna fechas para no perder los datos en el proceso de modelamiento y también separamos esta columna en ‘Año’, ‘Mes’, ‘Dia’.
temp$Fecha_dup <- temp$Fecha
temp <- temp %>% separate(Fecha, c("Año", "Mes", "Dia"))
En el siguiente código convertimos cada una de las columnas ‘Año’, ‘Mes’, ‘Dia’ en carácter numérico.
temp$Año <- as.numeric(temp$Año)
temp$Mes <- as.numeric(temp$Mes)
temp$Dia <- as.numeric(temp$Dia)
Establecemos la semilla (‘seed’) para que los resultados sean reproducibles en el futuro. Esto quiere decir que, si se ejecuta el código varias veces, se obtendrá los mismos resultados en cada ejecución, siempre y cuando se use la misma semilla.
Empleamos la función ‘createDataPartition’ del paquete ‘caret’ para crear un índice que indica que observaciones se incluirá en el conjunto de entrenamiento. Se filtran las observaciones y se elimina las filas con los valores faltantes en la columna ‘Temperatura’
set.seed(1996)
train <- createDataPartition(na.omit(subset(temp, temp$Fecha_dup < fecha_final))$Temperatura
, p = 0.7, list = F)
El valor ‘p=0.7’ nos indica que se van a emplear el 70% de los datos como conjunto de entrenamiento. También especificamos que queremos un vector de índice en lugar de una lista con el subcomando ‘list = FALSE’.
Empleamos el índice ‘train’ para seleccionar las observaciones correspondiste al conjunto de prueba utilizado la notación del subconjunto (‘temp[-train,]’). Combinamos estas observaciones con las que tienen ‘Fecha_dup’ mayor o igual a ‘fecha_final’ empleando ‘rbind’.
test <- rbind(temp[-train,] , subset(temp, temp$Fecha_dup >= fecha_final))
En conclusión, en esta parte se crea un conjunto de entrenamiento y test. El conjunto de entrenamiento incluye datos hasta la fecha final, mientras que el conjunto de prueba incluye datos desde la fecha final hacia adelante. Cabe recalcar que en el conjunto de entrenamiento se selecciona el 70% de las observaciones.
Este algoritmo construye múltiples arboles de clasificación aleatorios dependiendo de los datos con los que se está trabajando. En los pasos anteriores se prepararon todos los conjuntos de datos adecuadamente para que se pueda realizar los procesos correspondientes. Además de definió el número de árboles que se van han construir a través del argumento “ntree”
mod_rf <- randomForest(Temperatura ~ Fecha_dup, data = temp[train,],
type = "regression", ntree = 500)
Creamos las diferentes variables donde se van a almacenar los resultados de los procesos dependiendo de los índices que se establecieron como parámetros del modelamiento, con lo que tenemos una variable de resultado para la predicción y otra donde se almacenaran la combinación de los datos resultantes de la predicción.
pred_rf <- predict(mod_rf, test)
datos_rf <- cbind(pred_rf, test)
Luego de esto vamos a determinar el porcentaje de error que se obtiene en la modelación realizada con lo cual podemos establecer si está dentro del rango aceptable. Esto nos garantiza que los datos que se han obtenido sean tratados como datos confiables para determinar predicciones futuras aplicando esta metodología y basado en el análisis de que se ha venido realizando en la toma y tratamiento de datos.
error_abs_rf <-RMSE(datos_rf$Temperatura, datos_rf$pred_rf, na.rm = T)
error_por_rf <- error_abs_rf / datos_rf[datos_rf$Fecha_dup == max(na.omit(datos_rf)$Fecha_dup), ]$Temperatura
error_por_rf*100
## [1] 3.628301
MAE(datos_rf$Temperatura, datos_rf$pred_rf, na.rm = T)
## [1] 0.4414555
Finalmente se va a dibujar el modelo que se obtuvo como resultado del proceso realizado, en el cual se incluyen el comportamiento real líneas en negro y el modelo calculado líneas en rojo, así como el título de la estación que hemos tomado como referencia para la ejecución del modelamiento.
ggplot() + geom_line(data = datos_rf, aes(x = Fecha_dup, y = Temperatura), color = "black") +
geom_line(data = datos_rf, aes(x = Fecha_dup, y = pred_rf), color = "red") +
ggtitle("Modelo de Predicción para Temperatura Estacion Iñaquito ")
## Warning: Removed 26 rows containing missing values (`geom_line()`).
Ademas adjuntamos la tabla de los resultados para nuestro modelo y los datos originales.
names(datos_rf) <- c("Temperatura Modelo", "Temperatura", "Año", "Mes", "Día", "Fecha")
head(datos_rf, n = 60)
## Temperatura Modelo Temperatura Año Mes Día Fecha
## 1 13.43692 13.5 1975 1 1 1975-01-01
## 2 13.43692 12.8 1975 2 1 1975-02-01
## 3 13.43692 13.3 1975 3 1 1975-03-01
## 5 13.43692 13.5 1975 5 1 1975-05-01
## 20 14.28072 14.0 1976 8 1 1976-08-01
## 23 13.91197 13.8 1976 11 1 1976-11-01
## 32 14.49319 14.5 1977 8 1 1977-08-01
## 33 14.62774 15.0 1977 9 1 1977-09-01
## 35 15.10986 14.5 1977 11 1 1977-11-01
## 39 14.98644 14.4 1978 3 1 1978-03-01
## 40 14.74163 14.2 1978 4 1 1978-04-01
## 42 14.60976 14.6 1978 6 1 1978-06-01
## 49 14.39974 14.4 1979 1 1 1979-01-01
## 59 14.61820 14.5 1979 11 1 1979-11-01
## 62 15.13674 13.8 1980 2 1 1980-02-01
## 64 15.19141 14.7 1980 4 1 1980-04-01
## 65 15.20081 15.2 1980 5 1 1980-05-01
## 70 15.37153 14.8 1980 10 1 1980-10-01
## 71 15.31963 14.0 1980 11 1 1980-11-01
## 72 14.79745 14.3 1980 12 1 1980-12-01
## 73 14.58581 14.6 1981 1 1 1981-01-01
## 75 14.56820 14.5 1981 3 1 1981-03-01
## 78 14.43167 14.5 1981 6 1 1981-06-01
## 80 14.51902 14.8 1981 8 1 1981-08-01
## 83 14.85515 14.2 1981 11 1 1981-11-01
## 84 14.38721 14.8 1981 12 1 1981-12-01
## 89 14.60565 14.4 1982 5 1 1982-05-01
## 94 14.95426 14.0 1982 10 1 1982-10-01
## 103 14.91448 14.9 1983 7 1 1983-07-01
## 104 14.88402 15.3 1983 8 1 1983-08-01
## 108 14.46551 13.5 1983 12 1 1983-12-01
## 111 13.34742 14.1 1984 3 1 1984-03-01
## 114 13.87431 14.0 1984 6 1 1984-06-01
## 118 14.06019 13.9 1984 10 1 1984-10-01
## 119 14.32078 13.7 1984 11 1 1984-11-01
## 124 14.13371 14.1 1985 4 1 1985-04-01
## 128 13.62885 13.3 1985 8 1 1985-08-01
## 131 13.58681 13.2 1985 11 1 1985-11-01
## 138 14.88382 15.0 1986 6 1 1986-06-01
## 141 14.98001 15.3 1986 9 1 1986-09-01
## 142 14.86136 14.3 1986 10 1 1986-10-01
## 145 15.14127 15.1 1987 1 1 1987-01-01
## 153 15.06085 15.2 1987 9 1 1987-09-01
## 161 14.38180 14.6 1988 5 1 1988-05-01
## 163 14.28816 14.2 1988 7 1 1988-07-01
## 166 14.21512 14.0 1988 10 1 1988-10-01
## 168 13.91160 13.2 1988 12 1 1988-12-01
## 171 13.90957 13.0 1989 3 1 1989-03-01
## 172 14.13955 14.5 1989 4 1 1989-04-01
## 178 14.91661 14.4 1989 10 1 1989-10-01
## 183 14.63241 15.3 1990 3 1 1990-03-01
## 186 14.90800 15.5 1990 6 1 1990-06-01
## 189 15.36049 15.6 1990 9 1 1990-09-01
## 190 15.21517 14.0 1990 10 1 1990-10-01
## 192 15.15899 14.9 1990 12 1 1990-12-01
## 195 15.18462 14.6 1991 3 1 1991-03-01
## 196 15.11567 14.7 1991 4 1 1991-04-01
## 198 15.12156 15.6 1991 6 1 1991-06-01
## 199 15.08033 15.0 1991 7 1 1991-07-01
## 200 15.11168 15.0 1991 8 1 1991-08-01
Los datos obtenidos se descargaron de la página web Datos Abiertos, esta es una página anexada al INAHMI.
Vamos a realizar un análisis previo de nuestros datos para visualizar el comportamiento en serie de tiempo.
Ahora tenemos que hacer la carga de nuestros datos los cuales se encuentran en formato csv (texto delimitado por comas), es recomendado tener en este formato ya que R lo reconoce sin necesidad de agregar una libreria adicional.
setwd("~/ING AMBIENTAL/INFORMATICA23-24/Proyecto")
preci <- read.csv("Preci_Final.csv", sep = ",", dec = ".", header = T)
Una serie de tiempo es una secuencia de datos u observaciones medidos en determinados momentos, en intervalos iguales y ordenados cronológicamente.
El análisis de series de tiempo se refiere al proceso de analizar los datos disponibles para descubrir el patrón o la tendencia en los datos. Permite extraer y modelar las relaciones entre datos a lo largo del tiempo.
preci_ts <- ts(preci$Parque.Bicentenario, frequency = 12, start = c(1975,1))
plot(preci_ts, main = "Serie de Tiempo de Precipitación 1975-2019", xlab = "Años", ylab = "Precipitación (mm)")
Utilizaremos el comando decompose() el cual desagrega la serie de tiempo en los componentes: tendencia, estacional, cíclico y aleatorio.
preci_ts_descomp <- decompose(preci_ts)
Es el patrón subyacente en los datos a lo largo del tiempo. No es necesariamente lineal.
plot(preci_ts_descomp$trend, main = "Tendencia Precipitación", col = "blue", ylab = "Precipitación (mm)")
Cuando una serie esta influenciada por factores estacionales de periodo fijo como el día, mes, trimestre, año, etc.
plot(preci_ts_descomp$seasonal, main = "Estacionalidad Precipitación", col = "red", ylab = "Precipitación (mm)")
Parte inexplicable de los datos medidos.
plot(preci_ts_descomp$random, main = "Irregularidad Precipitación", col = "green", ylab = "Precipitación (mm)")
Los dataframes son una clase de objetos especial en R. Normalmente, cuando se realiza un estudio estadístico sobre los sujetos u objetos de una muestra, la información se organiza precisamente en un dataframe: una hoja de datos, en los que cada fila corresponde a un sujeto y cada columna a una variable. La estructura de un data.frame es muy similar a la de una matriz. La diferencia es que una matriz solo admite valores numéricos, mientras que en un dataframe podemos incluir también datos alfanuméricos.
preci <- as.data.frame(preci)
head(preci, n = 60)
## Fecha Parque.Bicentenario
## 1 ene-75 63.5
## 2 feb-75 208.2
## 3 mar-75 206.1
## 4 abr-75 119.7
## 5 may-75 160.1
## 6 jun-75 50.1
## 7 jul-75 134.7
## 8 ago-75 46.4
## 9 sep-75 44.5
## 10 oct-75 157.8
## 11 nov-75 95.3
## 12 dic-75 51.3
## 13 ene-76 74.2
## 14 feb-76 84.6
## 15 mar-76 153.0
## 16 abr-76 92.8
## 17 may-76 122.3
## 18 jun-76 30.2
## 19 jul-76 1.4
## 20 ago-76 1.4
## 21 sep-76 41.2
## 22 oct-76 80.3
## 23 nov-76 90.2
## 24 dic-76 130.4
## 25 ene-77 70.6
## 26 feb-77 33.1
## 27 mar-77 142.6
## 28 abr-77 87.2
## 29 may-77 73.8
## 30 jun-77 50.5
## 31 jul-77 9.5
## 32 ago-77 18.2
## 33 sep-77 119.6
## 34 oct-77 107.2
## 35 nov-77 19.4
## 36 dic-77 117.5
## 37 ene-78 58.8
## 38 feb-78 80.0
## 39 mar-78 81.6
## 40 abr-78 115.5
## 41 may-78 75.5
## 42 jun-78 13.5
## 43 jul-78 72.6
## 44 ago-78 3.2
## 45 sep-78 118.8
## 46 oct-78 21.3
## 47 nov-78 75.5
## 48 dic-78 91.1
## 49 ene-79 51.8
## 50 feb-79 43.1
## 51 mar-79 119.0
## 52 abr-79 131.4
## 53 may-79 169.5
## 54 jun-79 74.8
## 55 jul-79 9.3
## 56 ago-79 76.0
## 57 sep-79 154.8
## 58 oct-79 46.5
## 59 nov-79 51.5
## 60 dic-79 3.5
Renombramos las columnas del marco de datos a ‘Fecha’ y ‘Precipitación’.
names(preci) <- c("Fecha", "Precipitacion")
Posterior a eso empleamos el comando cbind() para combinar las dos columnas en un nuevo marco de datos. Combinamos la columna de temperaturas con una secuencia de fechas para formar un nuevo marco de datos.
preci <- as.data.frame(cbind(Fecha, preci$Precipitacion))
Después convertimos la columna de ‘Fecha’ a objetos de fecha en R empleando el comando as.Date(). Esto nos asegura que los datos de esta columna sean tratados como fechas.
preci$Fecha <- as.Date(preci$Fecha)
names(preci) <- c("Fecha", "Precipitacion")
En resumen, hasta esta parte, el código toma un objeto de datos llamado ‘preci’, lo convierte en un marco de datos que solicita R, combina la columna de precipitación con una secuencia de fechas, renombramos las columnas y aseguramos que la columna de fechas este en el formato adecuados para su manipulación como fechas.
Creamos un nuevo data frame para los datos que vamos a predecir. Con este paso se crea una secuencia de fechas predichas desde la ‘fecha_final’ hasta ‘fecha_pred’ en intervalos mensuales.
fecha_predic_preci <- as.Date(seq(from = fecha_final, to = (fecha_pred), by = "month"))
Inicializamos un vector ‘Precipitación’ con los valores ‘NA’ y combinamos este vector con el vector de fechas predichas para crear un nuevo marco de datos denominado ‘fecha_predic_preci’. Y también convertimos la columna ‘fecha_predic_preci’ a un formato fecha y renombramos las columnas a ‘Fecha’ y ‘Precipitación’.
Precipitacion <- as.numeric(NA)
fecha_predic_preci <- as.data.frame(cbind(fecha_predic_preci, Precipitacion))
fecha_predic_preci$fecha_predic_preci <- as.Date(fecha_predic_preci$fecha_predic_preci)
names(fecha_predic_preci) <- c("Fecha", "Precipitacion")
Combinamos los datos originales ‘preci’ con las fechas predichas ‘fecha_predic_preci’ empleando el comando rbind(), el cual añade las filas al marco de datos ‘temp’.
preci <- rbind(preci, fecha_predic_preci)
Duplicamos la columna fechas para no perder los datos en el proceso de modelamiento y también separamos esta columna en ‘Año’, ‘Mes’, ‘Dia’.
preci$Fecha_dup_preci <- preci$Fecha
preci <- preci %>% separate(Fecha, c("Año", "Mes", "Dia"))
En el siguiente código convertimos cada una de las columnas ‘Año’, ‘Mes’, ‘Dia’ en carácter numérico.
preci$Año <- as.numeric(preci$Año)
preci$Mes <- as.numeric(preci$Mes)
preci$Dia <- as.numeric(preci$Dia)
Establecemos la semilla (‘seed’) para que los resultados sean reproducibles en el futuro. Esto quiere decir que, si se ejecuta el código varias veces, se obtendrá los mismos resultados en cada ejecución, siempre y cuando se use la misma semilla.
Empleamos la función ‘createDataPartition’ del paquete ‘caret’ para crear un índice que indica que observaciones se incluirá en el conjunto de entrenamiento. Se filtran las observaciones y se elimina las filas con los valores faltantes en la columna ‘Temperatura’
set.seed(1997)
train_preci <- createDataPartition(na.omit(subset(preci, preci$Fecha_dup_preci < fecha_final))$Precipitacion
, p = 0.7, list = F)
El valor ‘p=0.7’ nos indica que se van a emplear el 70% de los datos como conjunto de entrenamiento. También especificamos que queremos un vector de índice en lugar de una lista con el subcomando ‘list = FALSE’.
Empleamos el índice ‘train_preci’ para seleccionar las observaciones correspondiste al conjunto de prueba utilizado la notación del subconjunto (‘preci[-train_preci,]’). Combinamos estas observaciones con las que tienen ‘Fecha_dup’ mayor o igual a ‘fecha_final’ empleando ‘rbind’.
test_preci <- rbind(preci[-train_preci,] , subset(preci, preci$Fecha_dup_preci >= fecha_final))
En conclusión, en esta parte se crea un conjunto de entrenamiento y test. El conjunto de entrenamiento incluye datos hasta la fecha final, mientras que el conjunto de prueba incluye datos desde la fecha final hacia adelante. Cabe recalcar que en el conjunto de entrenamiento se selecciona el 70% de las observaciones.
Este algoritmo construye múltiples arboles de clasificación aleatorios dependiendo de los datos con los que se está trabajando. En los pasos anteriores se prepararon todos los conjuntos de datos adecuadamente para que se pueda realizar los procesos correspondientes. Además de definió el número de árboles que se van han construir a través del argumento “ntree”
mod_rf_preci <- randomForest(Precipitacion ~ Fecha_dup_preci, data = preci[train_preci,],
type = "regression", ntree = 500)
Creamos las diferentes variables donde se van a almacenar los resultados de los procesos dependiendo de los índices que se establecieron como parámetros del modelamiento, con lo que tenemos una variable de resultado para la predicción y otra donde se almacenaran la combinación de los datos resultantes de la predicción.
pred_rf_preci <- predict(mod_rf_preci, test_preci)
datos_rf_preci <- cbind(pred_rf_preci, test_preci)
Luego de esto vamos a determinar el porcentaje de error que se obtiene en la modelación realizada con lo cual podemos establecer si está dentro del rango aceptable. Esto nos garantiza que los datos que se han obtenido sean tratados como datos confiables para determinar predicciones futuras aplicando esta metodología y basado en el análisis de que se ha venido realizando en la toma y tratamiento de datos.
error_abs_rf_preci <-RMSE(datos_rf_preci$Precipitacion, datos_rf_preci$pred_rf_preci, na.rm = T)
error_por_rf_preci <- error_abs_rf / datos_rf_preci[datos_rf_preci$Fecha_dup_preci == max(na.omit(datos_rf_preci)$Fecha_dup_preci), ]$Precipitacion
error_por_rf_preci*100
## [1] 1.578414
MAE(datos_rf_preci$Precipitacion, datos_rf_preci$pred_rf_preci, na.rm = T)
## [1] 52.16783
Finalmente se va a dibujar el modelo que se obtuvo como resultado del proceso realizado, en el cual se incluyen el comportamiento real líneas en negro y el modelo calculado líneas en ojo, así como el título de la estación que hemos tomado como referencia para la ejecución del modelamiento.
ggplot() + geom_line(data = datos_rf_preci, aes(x = Fecha_dup_preci, y = Precipitacion), color = "black") +
geom_line(data = datos_rf_preci, aes(x = Fecha_dup_preci, y = pred_rf_preci), color = "red") +
ggtitle("Modelo de Predicción para Precipitación Estacion Iñaquito ")
## Warning: Removed 26 rows containing missing values (`geom_line()`).
Ademas adjuntamos la tabla de los resultados para nuestro modelo y los datos originales.
names(datos_rf_preci) <- c("Precipitación Modelo", "Año", "Mes", "Día", "Temperatura", "Fecha")
head(datos_rf_preci, n = 60)
## Precipitación Modelo Año Mes Día Temperatura Fecha
## 3 149.81929 1975 3 1 206.1 1975-03-01
## 5 125.95345 1975 5 1 160.1 1975-05-01
## 6 109.70603 1975 6 1 50.1 1975-06-01
## 7 93.75725 1975 7 1 134.7 1975-07-01
## 9 108.77626 1975 9 1 44.5 1975-09-01
## 16 120.73962 1976 4 1 92.8 1976-04-01
## 19 35.68571 1976 7 1 1.4 1976-07-01
## 28 82.09567 1977 4 1 87.2 1977-04-01
## 31 53.28928 1977 7 1 9.5 1977-07-01
## 33 87.03775 1977 9 1 119.6 1977-09-01
## 35 97.15377 1977 11 1 19.4 1977-11-01
## 37 99.45419 1978 1 1 58.8 1978-01-01
## 43 27.87031 1978 7 1 72.6 1978-07-01
## 47 48.54095 1978 11 1 75.5 1978-11-01
## 48 50.58497 1978 12 1 91.1 1978-12-01
## 51 71.29668 1979 3 1 119.0 1979-03-01
## 56 66.50665 1979 8 1 76.0 1979-08-01
## 58 94.71189 1979 10 1 46.5 1979-10-01
## 63 155.47727 1980 3 1 70.8 1980-03-01
## 73 103.69579 1981 1 1 9.6 1981-01-01
## 76 114.69064 1981 4 1 200.8 1981-04-01
## 77 106.66433 1981 5 1 57.6 1981-05-01
## 78 53.12203 1981 6 1 25.6 1981-06-01
## 81 77.68581 1981 9 1 38.6 1981-09-01
## 85 92.44637 1982 1 1 140.9 1982-01-01
## 87 102.23483 1982 3 1 103.6 1982-03-01
## 92 47.93057 1982 8 1 2.7 1982-08-01
## 93 157.62051 1982 9 1 66.6 1982-09-01
## 97 171.94073 1983 1 1 95.7 1983-01-01
## 105 78.86136 1983 9 1 11.1 1983-09-01
## 109 179.81056 1984 1 1 72.5 1984-01-01
## 112 90.84725 1984 4 1 217.0 1984-04-01
## 115 60.04512 1984 7 1 10.2 1984-07-01
## 119 70.38415 1984 11 1 95.8 1984-11-01
## 121 50.14988 1985 1 1 57.9 1985-01-01
## 125 80.51916 1985 5 1 107.2 1985-05-01
## 127 58.93307 1985 7 1 30.1 1985-07-01
## 129 73.43896 1985 9 1 138.9 1985-09-01
## 130 75.52750 1985 10 1 62.2 1985-10-01
## 131 117.73697 1985 11 1 113.6 1985-11-01
## 135 100.06586 1986 3 1 153.3 1986-03-01
## 136 95.24826 1986 4 1 154.8 1986-04-01
## 138 74.16615 1986 6 1 14.0 1986-06-01
## 139 47.67612 1986 7 1 239.2 1986-07-01
## 142 52.28243 1986 10 1 86.8 1986-10-01
## 145 74.90899 1987 1 1 70.0 1987-01-01
## 147 77.57010 1987 3 1 116.2 1987-03-01
## 148 92.53818 1987 4 1 136.3 1987-04-01
## 155 41.60427 1987 11 1 8.0 1987-11-01
## 157 43.85722 1988 1 1 75.1 1988-01-01
## 160 85.88414 1988 4 1 297.8 1988-04-01
## 163 92.67992 1988 7 1 44.8 1988-07-01
## 170 118.38577 1989 2 1 113.0 1989-02-01
## 173 108.48726 1989 5 1 65.4 1989-05-01
## 175 73.45616 1989 7 1 20.1 1989-07-01
## 177 124.90910 1989 9 1 108.8 1989-09-01
## 181 70.64632 1990 1 1 46.6 1990-01-01
## 188 40.84400 1990 8 1 37.1 1990-08-01
## 189 140.12862 1990 9 1 27.3 1990-09-01
## 191 158.56849 1990 11 1 39.9 1990-11-01
Aqui podemos digirirnos a nuestras aplicaciones desde cualquier ordenador.En este caso realizamos dos apps:
Temperatura APP
Precipitación app
Este es nuestro Repositorio, aqui pueden observar todos los datos que se utilizaron para el desarrollo de nuestro proyecto. Además compartimos el codigo fuente de la base de nuestra página subida a RPubs.