Última actualización: 03 junio 2020

Se seleccionaron 20 estaciones pluviométricas en el período 2009-2015. Los resultados de la validación cruzada por el inverso de la distancia y por estación se presenta en la siguiente tabla:

xval = readRDS("~/R_projects/SWAT_calibration_ETmodis/resultados/lluvia/xval_stat_2009_2015.RDS")
kable(xval, 
      caption = "Resultados de la validación cruzada por estación") %>%
  kable_styling(c("striped", "bordered")) %>%
  scroll_box(width = "500px", height = "200px")
Resultados de la validación cruzada por estación
LONG LAT R2 bias
555.1414 6192.219 0.7483360 7.2
679.2517 6240.584 0.7974294 2.0
624.5276 6225.934 0.8983122 -3.4
640.1441 6221.278 0.6936884 -4.4
703.2663 6196.823 0.7309147 5.3
574.7237 6227.569 0.7997958 1.2
688.7492 6207.114 0.7420913 -9.5
678.7503 6166.258 0.5853925 7.3
624.6739 6237.023 0.9090250 6.9
603.3835 6232.843 0.7511607 -1.6
555.2201 6205.526 0.7914942 -8.2
640.7830 6202.411 0.7601499 -3.9
635.9476 6250.177 0.6974879 -8.5
599.4565 6210.705 0.8100673 -1.7
613.3242 6214.984 0.8630032 2.1
572.7154 6206.515 0.7911782 4.7
661.8142 6194.305 0.7848626 -1.4
660.9903 6199.866 0.7713468 3.6
670.1499 6248.517 0.7781998 -2.2
584.5107 6187.563 0.5573270 3.4




El rango de valores del coeficiente R2 es de 0.56-0.91 y del sesgo porcentual es de -9.5-7.3.

El código utilizado para la interpolacion por inverso de la distancia, validación cruzada y la puesta en formato SWAT2012 se presenta a continuación.

rm(list = ls())
library(raster)
library(gstat)

# Sistema de coordenadas
utm = CRS("+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
utkm = CRS("+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=km +no_defs")
dec = CRS("+init=epsg:4326")

# Coordenadas de estaciones (se dejan 4 estaciones por fuera, producen valores raros en la xval)
xy <- readRDS("~/R_projects/SWAT_calibration_ETmodis/data/precip_coord.RDS")
xy = SpatialPoints(xy[3:2], proj4string = dec)
xy = spTransform(xy, utkm)
ccc = !round(data.frame(xy)[,1],4) %in% c(668.5702, 567.6990, 568.8778, 614.0563)
xy = xy[ccc]
p <- readRDS("~/R_projects/SWAT_calibration_ETmodis/data/precip_SL_1981_2016.RDS")
p = p[p$date>=as.Date("2009-01-01"),]
p = data.frame(date=p$date, p[,2:29][,ccc])

# Objetivo a interpolar -> Subcuencas nivel 5.
subs1 <- readRDS("~/R_projects/SWAT_calibration_ETmodis/shapefiles_RDS/subs1.RDS")

# Primera parte. Interpolacion y validación cruzada
p_idw = data.frame(date = c(), x=c(), y=c(), var1.pred=c())
idw_cv = data.frame(var1.pred = c(), observed=c(), LONG=c(), LAT=c())
for(t in 1:nrow(p)){
  xyz = data.frame(data.frame(xy), 
                   data.frame(z=as.numeric(p[t, 2:ncol(p)])))[,c("LONG","LAT", "z")]
  xyz = na.omit(xyz)
  xyz = SpatialPointsDataFrame(xyz[,c("LONG","LAT")], data.frame(z = xyz$z), 
                               proj4string = utkm)
  if(all(xyz$z==0)){
    p_idw = rbind(p_idw, data.frame(date = p$date[t], x=coordinates(subs1)[,1], 
                                    y=coordinates(subs1)[,2], var1.pred=0))
  }else{
    # IDW
    p2 = data.frame(krige(z~1,xyz,newdata=subs1, nmax=3))[,c(1,2,3)]
    p_idw = rbind(p_idw, data.frame(date=p$date[t], p2))    
    cv2 = data.frame(krige.cv(z~1,xyz, nmax=3))[,c(1,3,7,8)]
    idw_cv = rbind(idw_cv,data.frame(date=p$date[t],cv2))
    print(round(t/nrow(p)*100,3))
  }
}

saveRDS(idw_cv,"~/R_projects/SWAT_calibration_ETmodis/resultados/idw_cv_2009_2015.RDS")

#Salida gráfica
library(ggplot2)
library(tidyverse)
library(hydroGOF)

xval_stat = idw_cv %>%
  group_by(LONG) %>%
  mutate(bias=pbias(var1.pred, observed), R2=cor(var1.pred, observed)^2)
xval_stat=unique(xval_stat[,c("LONG", "LAT", "R2", "bias")])
xval_stat %>%
  ggplot(aes(x=LONG, y=bias)) + geom_point() 


xval_stat %>%
  ggplot(aes(x=LONG, y=R2)) + geom_point() +
  geom_vline(xintercept = xval_stat$LONG[22])


abline(v=c(xval_stat$LONG[14],xval_stat$LONG[22]))


saveRDS(xval_stat,
        "~/R_projects/SWAT_calibration_ETmodis/resultados/lluvia/xval_stat_2009_2015.RDS")


# Archivo pcp
xy_sb = coordinates(subs1)
i=1
p_sub = p_idw[p_idw$x==xy_sb[i,1],c("date","var1.pred")]
for(i in 2:nrow(xy_sb)){
  p_sub = cbind(p_sub,p_idw[p_idw$x==xy_sb[i,1],c("var1.pred")])
}
colnames(p_sub) = c("date", paste0("p",1:41))
coordinates(spTransform(subs1,dec))[,2]


Station = paste0("p",1:41)
Lati = coordinates(spTransform(subs1,dec))[,2]
Long = coordinates(spTransform(subs1,dec))[,1]
Elev = rep(50,length(Lati))


library(stringr)
jday =  as.numeric(p_sub$date + 1 - as.Date(paste0(format(p_sub$date,"%Y"),"-01-01")))
jday = str_pad(jday,width=3, pad="0")
jday = paste0(format(p_sub$date, "%Y"),jday)

p_sub = p_sub[,-1]
p_sub = round(p_sub,1)

p_sub2 = format(p_sub[,1], digits = 1)
p_sub2 = str_replace_all(p_sub2, " ", "0")
p_sub3 = cbind(p_sub2)
for(i in 2:ncol(p_sub)){
  p_sub2 = format(p_sub[,i], digits = 1)
  p_sub2 = str_replace_all(p_sub2, " ", "0")
  p_sub3 = cbind(p_sub3,p_sub2)
}

p_out = cbind(jday, p_sub3)

Lati = format(round(Lati,1),nsmall=1)
Long = format(round(Long,1),nsmall=1)



p2w = rbind(paste0("Station  ", paste(Station, collapse = ","), collapse = ""),
            paste0("Lati   ", paste(Lati, collapse = ""), collapse = ""),
            paste0("Long   ", paste(Long, collapse = ""), collapse = ""),
            paste0("Elev      ", paste(Elev, collapse = "   "), collapse = ""),
            t(t(apply(p_out,1,function(x){paste0(x, collapse = "")}))))

write.table(p2w,"~/R_projects/SWAT_calibration_ETmodis/resultados/lluvia/p2_2009_2016.txt", 
            quote = FALSE, sep = "", row.names = FALSE, col.names = FALSE)
 




A work by Rafael Navas