Datos

  • Lugar: Parque Zonal Huáscar
  • Ubicación: Cruce de Av. 200 Millas y Av. Revolución en el distrito de Villa El Salvador, Lima - Perú
  • Latitud: -12.23
  • Longitud: -76.93
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:

  • Precipitación corregida (mm/day)
  • Temperatura °C a 2 metros
  • Humedad % Relativa a 2 metros

Lectura y Limpieza de datos

#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

Utilizando el paquete fda

Regresión Funcional Precipitación ~ Tempereratura

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"

Regresión Funcional Precipitación ~ Humedad

# 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"

Valores observados vs Valores predichos con fda

Precipitación~Temperatura

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.

Precipitación ~ Humedad

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.

Utilizando la libreria fda.usc

Regresión Funcional Precipitación ~ Temperatura

# 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"

Regresión Funcional Precipitación ~ Humedad

# 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"

Valores observados vs Valores predichos con fda.usc

Precipitación~Temperatura

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.

Precipitación ~ Humedad

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 fda-fda.usc

Precipitación - Temperatura

Comparación de modelos funcionales
Modelo R2 RMSE
fda (fRegress) 0.3071 0.4716
fda.usc (fregre.basis) 0.3045 0.4725

Precipitación - Humedad

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).