library(leaflet)
# Coordenadas:
lat <- -12.23 # Latitud
lng <- -76.93 # Longitud
# Mapa
leaflet() %>%
addTiles() %>% # Agregar mapa base
addMarkers(lng = lng, lat = lat, popup = "Parque Huáscar")Parámetros a estudiar:
#Lectura
library(readr)
datos <- read_csv("DatosTPH.csv", skip = 11)
#head(datos[,2:14])
#Limpieza
# Temperatura
temperatura<-datos[43:63,-c(1,15)]
años <- temperatura[[1]]
# Matriz con solo los valores numéricos
Temp <- as.matrix(temperatura[, -1]) # Excluyendo la columna "años"
# Pasando años de numeric a characte
rownames(Temp) <-as.character(años)
# Precipitación
precipitacion<-datos[1:21,-c(1,15)]
Precip<-as.matrix(precipitacion[, -1])
row.names(Precip)<-as.character(años)
# Humedad
humedad<-datos[22:42,-c(1,15)]
Hum<-as.matrix(humedad[, -1])
row.names(Hum)<-as.character(años)
head(Temp)## JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
## 2000 18.14 19.05 19.32 19.04 17.48 16.53 16.40 16.97 16.79 17.65 17.07 18.50
## 2001 18.73 19.72 19.86 19.33 17.51 16.71 16.54 17.04 16.61 17.07 17.20 18.11
## 2002 18.93 19.92 20.60 19.06 18.94 16.81 16.32 17.14 17.51 17.97 18.28 19.22
## 2003 19.74 20.31 20.04 19.20 18.28 16.97 16.61 16.88 17.20 17.65 18.22 18.73
## 2004 19.22 19.96 20.13 19.00 17.66 16.82 16.14 16.60 17.35 17.46 17.99 18.42
## 2005 19.57 19.86 19.82 19.84 17.81 17.00 16.52 16.74 16.92 16.74 17.33 17.79
head(Hum)## JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
## 2000 80.94 76.31 73.95 73.44 69.98 68.09 65.26 65.24 63.90 65.39 63.64 73.42
## 2001 78.40 78.30 75.72 71.51 68.79 66.75 65.08 60.01 63.25 65.10 69.25 67.30
## 2002 72.26 76.30 75.53 74.24 69.78 67.28 64.64 61.53 62.55 65.94 68.73 71.25
## 2003 74.45 76.95 74.57 68.95 67.90 67.68 67.08 62.26 61.09 64.54 66.99 75.67
## 2004 77.20 77.09 73.75 72.35 64.03 63.65 65.71 62.22 66.46 66.30 69.69 76.07
## 2005 76.19 74.96 74.62 69.45 67.27 64.96 62.85 62.22 60.96 64.27 65.77 74.29
head(Precip)## JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
## 2000 0.46 0.14 0.13 0.02 0.03 0.04 0.03 0.03 0.02 0.03 0.02 0.05
## 2001 0.09 0.22 0.09 0.02 0.31 0.02 0.05 0.07 0.03 0.07 0.08 0.07
## 2002 0.04 0.14 0.06 0.01 0.03 0.04 0.05 0.02 0.03 0.03 0.03 0.04
## 2003 0.04 0.07 0.05 0.03 0.02 0.00 0.01 0.04 0.02 0.01 0.04 0.07
## 2004 0.05 0.04 0.06 0.01 0.01 0.02 0.05 0.02 0.01 0.02 0.24 0.36
## 2005 0.04 0.05 0.05 0.01 0.00 0.00 0.00 0.01 0.02 0.03 0.01 0.10
library(fda)
# Base spline para X (Temp)
nbasis <- 5
basis <- create.bspline.basis(rangeval = c(1, 12), nbasis = nbasis)
# Suavizar cada curva
fdX <- Data2fd(argvals = 1:12, y = t(Temp), basisobj = basis)
# Visualizar algunas curvas
plot(fdX, main = "Curvas suavizadas (fda) - Temperatura")## [1] "done"
# Regresión funcional
# Definir Y
Y<- apply(Precip,1,sum)
# Usamos fRegress
freg <- fRegress(Y ~ fdX)
# Ver coeficiente funcional estimado
plot(freg$betaestlist$fdX$fd, main = "Coeficiente funcional beta(t) Precipitación ~ Temperatura")## [1] "done"
# Precipitación~Humedad
fdXh <- Data2fd(argvals = 1:12, y = t(Hum), basisobj = basis)
plot(fdXh, main = "Curvas suavizadas (fda) - Humedad")## [1] "done"
fregh <- fRegress(Y ~ fdXh)
plot(fregh$betaestlist$fdXh$fd, main = "Coeficiente funcional beta(t) Precipitación ~ Humedad")## [1] "done"
pred <- predict(freg)
summary(Y)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.2500 0.3800 0.5200 0.7881 1.0000 2.3400
xy <- data.frame(Y,pred)
head(xy)## Y pred
## 2000 1.00 0.8094460
## 2001 1.12 0.6450941
## 2002 0.52 1.3524143
## 2003 0.40 0.8912054
## 2004 0.89 0.8474308
## 2005 0.32 0.4428412
plot(años,xy$Y,pch=19, col="blue",main = "Valores Observados vs Predichos
Precipitación ~ Temperatura 2000-2020") #valores observados
lines(años,Y)
points(años,pred,col="red",pch=19) #Valores predichos
lines(años,pred,col="red") El modelo logra seguir la forma general de la serie temporal.
Desfase o subestimación en picos extremos: En años con valores muy altos (como 2017), el modelo subestima ligeramente. Esto es común cuando hay valores atípicos o extremos que no son bien explicados solo por la temperatura.
Para la mayoría de los años, especialmente entre 2002 y 2014, las predicciones están muy cercanas a los datos observados, lo que sugiere un ajuste sólido en condiciones normales.
El modelo proporciona una aproximación razonable de la precipitación anual a partir de las curvas funcionales de temperatura.
predh <- predict(fregh)
summary(Y)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.2500 0.3800 0.5200 0.7881 1.0000 2.3400
xyh <- data.frame(Y,predh)
head(xyh)## Y predh
## 2000 1.00 1.1029673
## 2001 1.12 1.5529531
## 2002 0.52 0.7159475
## 2003 0.40 0.2585973
## 2004 0.89 0.2472301
## 2005 0.32 0.5072911
plot(años,xyh$Y,pch=19, col="blue",lwd = 1,
main = "Valores Observados vs Predichos
Precipitación ~ Humedad 2000-2020") #valores observados
lines(años,Y)
points(años,predh,col="green",pch=19) #Valores predichos
lines(años,predh,col="green") El modelo predice razonablemente bien las tendencias generales, especialmente en los años donde hay cambios más suaves.
Años como 2001, 2015 y 2018 muestran diferencias notables entre lo observado y lo predicho.
El pico fuerte en 2018 observado no es replicado completamente por el modelo.
El modelo parece capturar mejor los valores bajos y medianos de precipitación, pero subestima o sobreestima algunos picos extremos.
# Temperatura
library(fda.usc)
# Convertir a objeto fdata
fX <- fdata(Temp, argvals = 1:12, rangeval = c(1, 12))
# Visualizar curvas
plot(fX, main = "Curvas funcionales (fda.usc) - Temperatura")# Regresión funcional (predictor funcional, respuesta escalar)
Y<- apply(Precip,1,sum)
res.lm <- fregre.basis(fX,Y)
# Coeficiente funcional estimado
plot(res.lm$beta.est, main = "Coeficiente funcional estimado (fda.usc) Precipitación ~ Temperatura")## [1] "done"
# Humedad ~ Precipitación
fXh <- fdata(Hum, argvals = 1:12, rangeval = c(1, 12))
plot(fXh, main = "Curvas funcionales (fda.usc) - Humedad")resh.lm <- fregre.basis(fXh,Y)
plot(resh.lm$beta.est, main = "Coeficiente funcional estimado (fda.usc) Precipitación ~ Humedad")## [1] "done"
pred1<- predict(res.lm)
xy1<- data.frame(Y,pred1)
head(xy1)## Y pred1
## 2000 1.00 0.8799519
## 2001 1.12 0.6048134
## 2002 0.52 1.3351951
## 2003 0.40 0.8078598
## 2004 0.89 0.8735903
## 2005 0.32 0.5222743
plot(años,xy1$Y,pch=19, main = "Valores Observados vs Predichos
Precipitación ~ Temperatura 2000-2020")
lines(años,Y)
points(años,pred1,col="red",pch=19)
lines(años,pred1,col="red") El modelo logra capturar de forma aceptable la tendencia general de los datos. Las formas de las curvas coinciden en muchos puntos, lo que sugiere que la tempe ratura mensual sí tiene una relación funcional con la precipitación anual.
En años donde la precipitación fue muy alta (como 2016 o 2018), el modelo subestima los valores reales. Esto sugiere que en esos años ocurrieron eventos atípicos (ej. fenómenos climáticos extremos) que no están bien representados solo con la temperatura mensual.
Para años con valores de precipitación en rangos más comunes, el modelo parece ajustarse bastante bien, lo cual indica una buena capacidad predictiva en situaciones regulares.
pred1.2<- predict(resh.lm)
xy1.2<- data.frame(Y,pred1.2)
head(xy1.2)## Y pred1.2
## 2000 1.00 1.4057628
## 2001 1.12 1.0757098
## 2002 0.52 0.7570630
## 2003 0.40 0.4621104
## 2004 0.89 0.5041852
## 2005 0.32 0.6619419
plot(años,xy1.2$Y,pch=19, main = "Valores Observados vs Predichos
Precipitación ~ Humedad 2000-2020")
lines(años,Y)
points(años,pred1.2,col="green",pch=19)
lines(años,pred1.2,col="green")Entre 2000 y 2010, los valores predichos (rojo) se ajustan mejor a los valores observados (negro) que en el gráfico anterior con fda.
El modelo ya no sobreestima tanto como antes en 2018, aunque todavía hay una diferencia.
En 2015 y 2016, el modelo ahora predice mucho más cerca de los valores observados, lo que indica una mejora en la captura de los picos y cambios abruptos.
| Comparación de modelos funcionales | ||
| Modelo | R2 | RMSE |
|---|---|---|
| fda (fRegress) | 0.3071 | 0.4716 |
| fda.usc (fregre.basis) | 0.3045 | 0.4725 |
| Comparación de modelos funcionales H | ||
| Modelo | R2 | RMSE |
|---|---|---|
| fda (fRegress) | 0.4912 | 0.4041 |
| fda.usc (fregre.basis) | 0.3570 | 0.4543 |
En los dos casos Precipitación ~ Humedad y Precipitación ~ Temperatura
El modelo de fda explica más varianza en la variable de respuesta (mayor R²).
También comete menos error de predicción promedio (menor RMSE).