Trabajo realizado por Miguel Cabrera, 8 de septiembre del 2024.
A partir de los datos obtenidos de la Universidad de Hawái, Caldwell et all. (2015), se halló el aumento aunal del nivel del mar apartir de la tendencia lineal, se aplicó el test de Mann-Kendal y se estimó la pendiente de Sen. Además, se mostraron las respectivas gráficas de series de tiempo de los datos y se realizó una gráfica de anomalías del nivel medio del mar en la zona de estuio.
Resulta pertinente estudiar el aumento del nivel del mar porque, en ocasiones, representa una amenaza para las comunidades costeras y sus infraestructuras, también estos cambios afectan ciertos ecosistemas.Por lo tanto, entender estos cambios permite planificar estrategias de adaptación y mitigación para reducir los riesgos y proteger tanto a la población como al medio ambiente.
Los datos fueron extraidos de la página web de la universidad de Hawái: https://uhslc.soest.hawaii.edu/data/. La ubicación del sensor que tomó los datos se haya en La Libertad, Ecuador y se expresa por medio de las siguientes coordenadas, -2.20000; -80.91700. La ventana de tiempo que comprenden los datos es de 1949-09-02 a 2024-07-31.
#nstall.packages("zoo")
library(zoo) # Tratamiento de series de tiempo
library(tidyverse) # Ordenación de datos
library(TSstudio) # Gráfica de series de tiempo
library(trend) # Man Kendall
Se seleccionarán los datos de un periodo comprendido entre 2003 y 2023. Para ello se realizará su correspondiente tratamiento y limpieza en caso de ser necesario.
A continuación se cargan las librerías necesarias para trabajar con los datos implicados. Se asignan nombres a las variables y se selecciona la ventana de tiempo que implique 20 años.
## cargue de datos
datos = read_csv("datos_libertad.csv", col_names=FALSE, show_col_types = FALSE) %>%
rename(
año = X1,
mes = X2,
día = X3,
sst = X4
) %>%
filter(
año >= 2003 & año <= 2023
)
Al observar los datos se puede apreciar que existen muchos valores atípicos. Valores anómalos que representan fallos en le sistema durante periodos de ciertos meses. Todos estos datos tiene un valor predeterminado de -32767. Para ello se emplea la función del paquete zoo. Y por lo tanto se requiere convertir la serie en un objeto de tipo zoo de serie de tiempo.
## Formato Zoo de series de tiempo
datos_zoo =
tibble(
fecha = seq.Date(as.Date("2003-01-01"), by = "day", length.out = 7670),
sst = datos$sst
)
Para hacer la limpieza de valores erroneos, en primer lugar, se reemplazan los valores de -32767 por NA, después, se emplea la función na.approx del paquete Zoo para hacer una interpolación aproximando el valor del NA.
# Limpieza de valores atípicos
datos_clean <- datos_zoo %>%
mutate(sst = ifelse(sst == -32767, NA, sst)) %>%
mutate(sst = na.approx(sst, na.rm = FALSE)) # Interpolación
A continuación, se convierten los datos en a un formato ts, es decir, de serie de tiempo tipo TS para trabajar con el paquete TSstudio. Y posteriormente realizar el modelo.
#Conversión a ts
datos_ts = ts(datos_clean$sst, start = c(2003, 1), frequency = 365)
# Creación del data.frame
nivel_mar = data.frame(tiempo = time(datos_ts), sst =as.vector(datos_clean$sst))
head(nivel_mar)
## tiempo sst
## 1 2003.000 2449
## 2 2003.003 2448
## 3 2003.005 2433
## 4 2003.008 2421
## 5 2003.011 2401
## 6 2003.014 2387
ts_plot(datos_ts,
title= "Serie de tiempo de nivel del mar [diario]",
Ytitle= "Nivel del mar (cm)",
Xtitle = "Tiempo (años)")
Información estadística genérica de los datos de nivel del mar entre 2003 y 2023. Se debe tener en cuenta que la frecuencia de esta serie de tiempo es diaría.
summary(datos_ts)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2287 2428 2470 2476 2516 2783
Un modelo de lineal está dado por la ecuación:
\[y=mx+b\]
Donde y es la variable dependiente, x es la variable independiente, m es la pendiente y b el intercepto.
# Ajustar un modelo lineal
modelo_nivel_mar = lm(nivel_mar$sst ~ nivel_mar$tiempo)
# Datos del módeo lineal
summary(modelo_nivel_mar)
##
## Call:
## lm(formula = nivel_mar$sst ~ nivel_mar$tiempo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -197.191 -43.795 -6.388 35.801 297.989
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5277.6316 244.4791 -21.59 <2e-16 ***
## nivel_mar$tiempo 3.8507 0.1214 31.71 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 64.51 on 7668 degrees of freedom
## Multiple R-squared: 0.116, Adjusted R-squared: 0.1158
## F-statistic: 1006 on 1 and 7668 DF, p-value: < 2.2e-16
A partir de los datos, la ecuación de la recta sería:
\[NivelMar=−5277.63+3.85×tiempo\] Esto implica que el nivel del mar esta aumentando \(3.85 cm\) por año, aproximadamente.
## calculo de mankendal
mk.test(nivel_mar$sst)
##
## Mann-Kendall trend test
##
## data: nivel_mar$sst
## z = 30.694, n = 7670, p-value < 2.2e-16
## alternative hypothesis: true S is not equal to 0
## sample estimates:
## S varS tau
## 6.873219e+06 5.014399e+10 2.341701e-01
El p-valor es muy pequeño, lo que indica que la tendencia observada es estadísticamente significativa.Por otro lado, la prueba ha rechazado la hipótesis nula, en favor de la hipótesis alternativa. Lo que indica que sí existe una tendencia significativa en la serie temporal del nivel del mar. También, estadístico Z (30.694), es positivo, lo que sugiere una tendencia creciente.
El valor de tau es una medida de la fuerza de la tendencia. Un valor de 0.234 indica una tendencia positiva moderada. Cuanto más cerca esté el valor de τ de 1 o -1, más fuerte es la tendencia (1 sería una tendencia positiva perfecta, y -1 una tendencia negativa perfecta).
## Calculo de la pendiente de Sen
sens.slope(nivel_mar$sst)
##
## Sen's slope
##
## data: nivel_mar$sst
## z = 30.694, n = 7670, p-value < 2.2e-16
## alternative hypothesis: true z is not equal to 0
## 95 percent confidence interval:
## 0.009546539 0.010786262
## sample estimates:
## Sen's slope
## 0.01016613
El Estimador de la pendiente de Sen muestra una tendencia significativa y positiva en el nivel del mar, con una pendiente estimada de 0.01016613 unidades por unidad de tiempo. El intervalo de confianza al 95% está completamente por encima de 0, lo que confirma el aumento del nivel del mar.
No sé cómo se interpreta esto, la verdad, lo hice con chatGpt :0
Para conocer las anomalías del nivel medio del mar se agrupan los datos a partir del mes.
nivel_prom = datos_clean %>%
mutate(
day = day(ymd(fecha)),
mes = month(ymd(fecha), label = TRUE, abbr = TRUE),
year = year(ymd(fecha))
) %>%
select(year, mes, day, sst) %>%
group_by(year, mes) %>%
summarise(
mean_sst = mean(sst)
)
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
head(nivel_prom)
## # A tibble: 6 × 3
## # Groups: year [1]
## year mes mean_sst
## <dbl> <ord> <dbl>
## 1 2003 ene 2414.
## 2 2003 feb 2371.
## 3 2003 mar 2411.
## 4 2003 abr 2410.
## 5 2003 may 2451.
## 6 2003 jun 2391.
También se gráfica la serie de tiempo del nivel der mar mensual. Para ello se convierten los valores de nivel del mar en un objeto ts.
nivel_promedio = ts(nivel_prom$mean_sst, start = c(2003, 1), frequency = 12)
ts_plot(nivel_promedio,
title= "Serie de tiempo de nivel del mar [mensual]",
Ytitle= "Nivel del mar (cm)",
Xtitle = "Tiempo (años)")
Para conocer las anomalías se gráfica la descomposición de la serie de tiempo. En el gráfico subsiguiente se podrá ver la serie de tiempo, su componete de tendecia, el componente estacional y la aleatoriedad. Esta aleatoriedad de la serie de tiempo se puede interpretar como la anomalía de la misma.
ts_decompose(nivel_promedio)
Los valores anómalos también pueden ser apreciados por medio de una gráfica de box plot a nivel mensual.
nivel_prom %>%
ggplot(aes(x = factor(mes), y = mean_sst)) +
geom_boxplot(outlier.size = 1.5, outlier.shape = 21)+
theme_classic()
Caldwell, P. C., M. A. Merrifield, P. R. Thompson (2015), Sea level measured by tide gauges from global oceans — the Joint Archive for Sea Level holdings (NCEI Accession 0019568), Version 5.5, NOAA National Centers for Environmental Information, Dataset, doi:10.7289/V5V40S7W.