Calcula esl Índice Estandarizado de Precipitación para distintas escalas. El
spi_indice
toma valores de precipitación mientras que el spei_indice
toma
valores del balance entre precipitación y evapotranspiración potencial.
Internamente hacen lo mismo; la única diferencia es la distribución teórica
usada por defecto para ajustar los datos.
Argumentos
- fecha
vector de fechas.
- precipitacion
vector de precipitacion.
- escalas
vector numérico con las escalas requeridas. La unidad de la escala está dada por el vector de fechas. Si
escalas = 6
y los datos son mensuales entonces el cálculo del indice se hará en escalas de 6 meses.- referencia
serie de precipitación para usar de referencia en el ajuste a la distribución teórica. Puede ser:
vector lógico o numérico que se usará para filtrar los datos de entrada.
un data frame con columna
fecha
yprecipitacion
. La funciónspi_referencia()
es un simple wrapper adata.frame()
que le pone el nombre correcto a las variables.
- distribucion
distribución usada para ajustar los datos.
- ...
argumentos pasados a SPEI::spi
- balance
balance entre precipitación y evapotranspiración potencial.
Valor
Un data.frame con columnas
fecha
(fecha)escala
(numérico) definidas en el argumento de entradaspi
ospei
(numérico)
Detalles
Estas funciones usan internamente a la función SPEI::spi pero tienen la ventaja de devolver el resultado como un data.frame que se puede usar de manera directa para el análisis de datos con dplyr.
Referencias
Vicente-Serrano, S. M., Beguería, S. and López-Moreno, J. I.: A multiscalar drought index sensitive to global warming: The standardized precipitation evapotranspiration index, J. Clim., 23(7), doi:10.1175/2009JCLI2909.1 , 2010.
R Package SPEI: Calculation of the Standardized Precipitation-Evapotranspiration Index
Ejemplos
library(dplyr)
# datos aleatorios
datos <- data.frame(fecha = seq(as.Date("1985-01-01"), as.Date("2015-12-01"), by = "1 month"))
set.seed(42)
datos$pp <- rgamma(nrow(datos), shape = 2, scale = 10)
with(datos, spi_indice(fecha, pp, escalas = 1:5)) %>%
slice_head(n = 10)
#> fecha escala spi
#> 1 1985-01-01 1 1.083697896
#> 2 1985-02-01 1 -1.019570097
#> 3 1985-03-01 1 -0.005701827
#> 4 1985-04-01 1 -1.364974042
#> 5 1985-05-01 1 -0.176312295
#> 6 1985-06-01 1 -0.582748565
#> 7 1985-07-01 1 1.883677464
#> 8 1985-08-01 1 -0.001867550
#> 9 1985-09-01 1 -1.007481944
#> 10 1985-10-01 1 -1.457246889
# Si entran nuevos datos y hay que calcular el spi nuevamente pero sin que
# cambien los valores viejos, hay que usar `referencia`
nuevos_datos <- data.frame(fecha = seq(as.Date("2016-01-01"),
as.Date("2017-12-01"), by = "1 month"))
nuevos_datos$pp <- rgamma(nrow(nuevos_datos), shape = 2, scale = 10)
nuevos_datos <- rbind(datos, nuevos_datos)
# Usando un vector lógico
with(nuevos_datos, spi_indice(fecha, pp, escalas = 1:5,
referencia = data.table::year(fecha) < 2016)) %>%
slice_head(n = 10)
#> fecha escala spi
#> 1 1985-01-01 1 1.083697896
#> 2 1985-02-01 1 -1.019570097
#> 3 1985-03-01 1 -0.005701827
#> 4 1985-04-01 1 -1.364974042
#> 5 1985-05-01 1 -0.176312295
#> 6 1985-06-01 1 -0.582748565
#> 7 1985-07-01 1 1.883677464
#> 8 1985-08-01 1 -0.001867550
#> 9 1985-09-01 1 -1.007481944
#> 10 1985-10-01 1 -1.457246889
# O un data.frame
with(nuevos_datos, spi_indice(fecha, pp, escalas = 1:5,
referencia = spi_referencia(datos$fecha, datos$pp))) %>%
slice_head(n = 10)
#> fecha escala spi
#> 1 1985-01-01 1 1.083697896
#> 2 1985-02-01 1 -1.019570097
#> 3 1985-03-01 1 -0.005701827
#> 4 1985-04-01 1 -1.364974042
#> 5 1985-05-01 1 -0.176312295
#> 6 1985-06-01 1 -0.582748565
#> 7 1985-07-01 1 1.883677464
#> 8 1985-08-01 1 -0.001867550
#> 9 1985-09-01 1 -1.007481944
#> 10 1985-10-01 1 -1.457246889