Calcula el Índice Estandarizado de Precipitación para distintas escalas. Las
funciones spi_indice y spei_indice 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.
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 = 6y 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 - fechay- precipitacion. La función- spi_referencia()es un simple wrapper a- data.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 entrada
- spio- spei(numérico)
Detalles
La función spi_indice toma valores de precipitación mientras que 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.
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)
data(NH0358)
datos_mensuales <- NH0358 %>%
  group_by(fecha = lubridate::round_date(fecha, "month")) %>%
  reframe(precip = mean(precip, na.rm = TRUE),
          etp = mean(etp, na.rm = TRUE))
# Para escalas de 1 a 12 meses
datos_mensuales %>%
  reframe(spi_indice(fecha, precip, escalas = 1:12)) %>%
  slice_head(n = 10)
#> # A tibble: 10 × 3
#>    fecha      escala    spi
#>    <date>      <dbl>  <dbl>
#>  1 1951-01-01      1 -0.831
#>  2 1951-02-01      1  0.384
#>  3 1951-03-01      1  0.192
#>  4 1951-04-01      1 -0.567
#>  5 1951-05-01      1  1.80 
#>  6 1951-06-01      1 -1.07 
#>  7 1951-07-01      1 -0.636
#>  8 1951-08-01      1  0.549
#>  9 1951-09-01      1 -0.439
#> 10 1951-10-01      1 -1.07 
# Si tenemos nuevos datos y hay que calcular el spi nuevamente pero sin que
# cambien los valores previos, hay que usar `referencia`, por ejemplo usando
# los datos desde el comienzo de la seria hasta 2016
# Usando un vector lógico
datos_mensuales %>%
  reframe(spi_indice(fecha, precip, escalas = 1:12,
                     referencia = data.table::year(fecha) < 2016)) %>%
  slice_head(n = 10)
#> # A tibble: 10 × 3
#>    fecha      escala    spi
#>    <date>      <dbl>  <dbl>
#>  1 1951-01-01      1 -0.818
#>  2 1951-02-01      1  0.340
#>  3 1951-03-01      1  0.208
#>  4 1951-04-01      1 -0.609
#>  5 1951-05-01      1  1.86 
#>  6 1951-06-01      1 -1.10 
#>  7 1951-07-01      1 -0.601
#>  8 1951-08-01      1  0.532
#>  9 1951-09-01      1 -0.427
#> 10 1951-10-01      1 -1.04 
# O un data.frame
datos_2016 <- datos_mensuales %>%
 filter(data.table::year(fecha) < 2016)
datos_mensuales %>%
reframe(spi_indice(fecha, precip, escalas = 1:12,
                   referencia = spi_referencia(datos_2016$fecha, datos_2016$precip))) %>%
  slice_head(n = 10)
#> # A tibble: 10 × 3
#>    fecha      escala    spi
#>    <date>      <dbl>  <dbl>
#>  1 1951-01-01      1 -0.818
#>  2 1951-02-01      1  0.340
#>  3 1951-03-01      1  0.208
#>  4 1951-04-01      1 -0.609
#>  5 1951-05-01      1  1.86 
#>  6 1951-06-01      1 -1.10 
#>  7 1951-07-01      1 -0.601
#>  8 1951-08-01      1  0.532
#>  9 1951-09-01      1 -0.427
#> 10 1951-10-01      1 -1.04 
