Capacitacion CELEC 2020 - Geoestadistica en R.
Daniela Ballari - dballari@uazuay.edu.ec - IERSE - Universidad del Azuay, Cuenca (Ecuador) Lorena Orellana - mlorellana@uazuay.edu.ec - IERSE - Universidad del Azuay, Cuenca (Ecuador)
1 Temario
Objetivo
Introducir a los participantes al ambiente de analisis de datos en R y RStudio, con especial enfasis en analisis geoestadistico para la variable precipitacion.
Contexto
Este curso se dicta en el contexto del CONVENIO DE COOPERACION INTERINSTITUCIONAL PARA LA CREACION DE UNA BASE DE DATOS GEOGRAFICA PARA LA GESTION Y ANALISIS DE INFORMACION ESPACIO-TEMPORAL PARA EL MANEJO DE ZONAS INESTABLES Y CUENCAS HIDROGRAFICAS DEL COMPLEJO PAUTE INTEGRAL, mantenido entre la Universidad del Azuay y CELEC EP - Hidropaute.
Temas
- Carga y exporacion de datos.
- IDW
- Kriging
Fecha del tutorial
Jueves 13 de febrero 2020. de 8hs a 18hs.
Descarga de datos
Vinculo a datos
Material introductorio puede ser consultado en http://pierreroudier.github.io/teaching/20171014-DSM-Masterclass-Hamilton/2017-09-28-simple-interpolation.html
Los acentos fueron omitidos para una adecuada compilacion en html.
2 Cargar datos shp
library(sf)
cuenca<- st_read("data/RioPaute.shp")# archivo shp de cuenca del Paute## Reading layer `RioPaute' from data source `C:\Users\Usuario\Documents\RESEARCH\2019\CELEC\Ejecucion\E16 capacitaciones\Curso 3C\data\RioPaute.shp' using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 2 fields
## geometry type: POLYGON
## dimension: XY
## bbox: xmin: 681758 ymin: 9637966 xmax: 803433.7 ymax: 9745363
## epsg (SRID): 32717
## proj4string: +proj=utm +zone=17 +south +datum=WGS84 +units=m +no_defs
summary(cuenca)# explorar contenido de datos## fid Id geometry
## Min. :1 Min. :0 POLYGON :1
## 1st Qu.:1 1st Qu.:0 epsg:32717 :0
## Median :1 Median :0 +proj=utm ...:0
## Mean :1 Mean :0
## 3rd Qu.:1 3rd Qu.:0
## Max. :1 Max. :0
plot(cuenca)prec<- st_read("data/prec2015_06.shp")# archivo shp## Reading layer `prec2015_06' from data source `C:\Users\Usuario\Documents\RESEARCH\2019\CELEC\Ejecucion\E16 capacitaciones\Curso 3C\data\prec2015_06.shp' using driver `ESRI Shapefile'
## Simple feature collection with 20 features and 1 field
## geometry type: POINT
## dimension: XY
## bbox: xmin: 696891 ymin: 9662396 xmax: 797962 ymax: 9738244
## epsg (SRID): 32717
## proj4string: +proj=utm +zone=17 +south +datum=WGS84 +units=m +no_defs
summary(prec)# explorar contenido de datos## prcptcn geometry
## Min. : 26.50 POINT :20
## 1st Qu.: 67.72 epsg:32717 : 0
## Median :139.00 +proj=utm ...: 0
## Mean :175.38
## 3rd Qu.:266.10
## Max. :461.20
plot(prec)3 Visualizacion
plot(st_geometry(cuenca), col="lightgrey")
plot(st_geometry(prec), pch=20,cex = 1, col="red",add=TRUE)library(sp)
PREC.plt1<- bubble(as(prec, "Spatial"), "prcptcn", col="black", pch=21, main="Precipitacion", sp.layout=list(list("sp.polygons", col="grey", fill="transparent", as(cuenca, "Spatial"))))
PREC.plt14 Cuadricula de interpolacion
library(raster)
r <- raster(extent(cuenca))
res(r)<- 1000
crs(r)<- "+init=epsg:32717"
r.sf <- st_as_sf(as(r, "SpatialPixelsDataFrame"))5 IDW
Inverso de la distancia: - 1. No hay una manera objetiva de seleccionar el peso (inverso o inveso cuadrado…). - 2. No hay una manera objetiva de seleccionar el radio de interpolacion.
En todos los casos, la distribucion no regular puede sobre-enfatizar areas (o lo contrario). La varianza puede ser estimada a partir de un conjunto de datos de validacion, especificamente reservado para ello.
5.1 Prediccion
library(gstat)
library(stars)
idw = krige(formula=prcptcn ~ 1, locations= prec, newdata=r.sf)## [inverse distance weighted interpolation]
idw.sp<- as(idw, "Spatial")
class(idw.sp)## [1] "SpatialPointsDataFrame"
## attr(,"package")
## [1] "sp"
gridded(idw.sp)<- TRUE
idw.r<- brick(idw.sp)5.2 Visualizacion
library(rasterVis)
levelplot(idw.r[[1]], margin=FALSE, main="idw")+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))idw.r.masked<- mask(idw.r,as(cuenca, "Spatial"))
levelplot(idw.r.masked[[1]], margin=FALSE, main="idw")+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))library(RColorBrewer)
levelPal <- colorRampPalette(brewer.pal(n = 9, 'Blues'))
levelplot(idw.r.masked[[1]], margin=FALSE, main="idw",col.regions = levelPal)+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))+ latticeExtra::layer(sp.points(as(prec, "Spatial"), pch=20, col='black'))5.3 IDW validacion cruzada
idw.cv<- krige.cv(formula=prcptcn ~ 1, locations= prec)
head(idw.cv)## Simple feature collection with 6 features and 6 fields
## geometry type: POINT
## dimension: XY
## bbox: xmin: 705090 ymin: 9662396 xmax: 797962 ymax: 9727551
## epsg (SRID): NA
## proj4string: NA
## var1.pred var1.var observed residual zscore fold geometry
## 1 89.89335 NA 102.80000 12.90664 NA 1 POINT (717092 9662396)
## 2 127.70690 NA 251.20000 123.49310 NA 2 POINT (745529 9662895)
## 3 241.61738 NA 461.20001 219.58262 NA 3 POINT (797962 9699430)
## 4 86.22249 NA 73.50001 -12.72247 NA 4 POINT (705090 9665080)
## 5 211.78507 NA 157.49997 -54.28510 NA 5 POINT (748262 9713142)
## 6 227.24650 NA 340.70025 113.45376 NA 6 POINT (765780 9727551)
library(Metrics)
(idw.mse<- mse(idw.cv$var1.pred, idw.cv$observed))## [1] 5852.184
(idw.rmse<- rmse(idw.cv$var1.pred, idw.cv$observed))## [1] 76.49957
(idw.cor<- cor(idw.cv$var1.pred, idw.cv$observed))## [1] 0.8251744
(idw.bias<- bias(idw.cv$var1.pred, idw.cv$observed))## [1] -16.51191
plot(idw.cv$var1.pred, idw.cv$observed)library(ggplot2)
ggplot(idw.cv, aes(observed, y = var1.pred, color = "red")) +
geom_abline(colour = "#CCCCCC", linetype = 2) +
geom_point(aes(y = var1.pred, col = "IDW")) +
geom_smooth(aes(y = var1.pred, col = "IDW"), method = lm, se = FALSE) +
xlab("observaciones")+
ylab("predicciones")6 Kriging
6.0.1 Exploracion de atributos - Univariado- Analisis EDA (Exploratory Data Analysis)
prec$prcptcn## [1] 102.80000 251.20000 461.20001 73.50001 157.49997 340.70025 36.09999
## [8] 264.20020 198.30017 75.19997 120.50000 91.20000 26.50000 32.70000
## [15] 271.80000 359.00000 246.80000 314.90000 50.40000 33.10000
sort(prec$prcptcn)## [1] 26.50000 32.70000 33.10000 36.09999 50.40000 73.50001 75.19997
## [8] 91.20000 102.80000 120.50000 157.49997 198.30017 246.80000 251.20000
## [15] 264.20020 271.80000 314.90000 340.70025 359.00000 461.20001
hist(prec$prcptcn, breaks = 16) #Distribuci昼㸳n no sim攼㸹trica, sesgada hacia la derechasummary(prec$prcptcn) # media mayor a la mediana (sesgada hacia la derecha, distribuci昼㸳n no-normal)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 26.50 67.72 139.00 175.38 266.10 461.20
#Al ser una distribuci昼㸳n no sim攼㸹trica, se aplica logaritmo para transformar
#los valores y obtener una distribuci昼㸳n simetrica (normal).
#Esto, adem攼㸱s, reduce los posibles outliers.
prec$log.prcptcn <- log10(prec$prcptcn)
hist(prec$log.prcptcn, breaks = 16)summary(prec$log.prcptcn)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.423 1.825 2.139 2.095 2.425 2.664
head(prec$log.prcptcn)## [1] 2.011993 2.400020 2.663889 1.866287 2.197280 2.532372
head(prec$log.prcptcn)## [1] 2.011993 2.400020 2.663889 1.866287 2.197280 2.532372
#Luego para transformar a los valores originales se utiliza antilog. antilog (x)=10^x
head(10^(prec$log.prcptcn))## [1] 102.80000 251.20000 461.20001 73.50001 157.49997 340.70025
6.1 Tendencias espaciales
PREC.plt1 #visualizar#Extraer coordenadas
prec$x<- st_coordinates(prec)[,1]
prec$y<- st_coordinates(prec)[,2]
#Graficos de Dispercion
plot(prec$x, prec$log.prcptcn)plot(prec$y, prec$log.prcptcn)#Regresion lineal
tendencia<- lm(log.prcptcn~x+y, prec)
summary(tendencia)##
## Call:
## lm(formula = log.prcptcn ~ x + y, data = prec)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.43634 -0.14576 0.06537 0.16496 0.35197
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.500226097 33.397991421 0.284 0.779498
## x 0.000012693 0.000002673 4.749 0.000186 ***
## y -0.000001736 0.000003573 -0.486 0.633228
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2447 on 17 degrees of freedom
## Multiple R-squared: 0.6643, Adjusted R-squared: 0.6248
## F-statistic: 16.82 on 2 and 17 DF, p-value: 0.00009354
tendencia.x<- lm(log.prcptcn~x, prec) #Trabajar con tendencia en x
summary(tendencia.x)##
## Call:
## lm(formula = log.prcptcn ~ x, data = prec)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.42893 -0.15221 0.05885 0.16619 0.32142
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.711589197 1.492181295 -4.498 0.000278 ***
## x 0.000011861 0.000002008 5.906 0.0000137 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2394 on 18 degrees of freedom
## Multiple R-squared: 0.6596, Adjusted R-squared: 0.6407
## F-statistic: 34.88 on 1 and 18 DF, p-value: 0.00001368
tendencia.y<- lm(log.prcptcn~y, prec)
summary(tendencia.y)##
## Call:
## lm(formula = log.prcptcn ~ y, data = prec)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.57278 -0.20402 -0.00725 0.27740 0.59027
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -86.441275347 39.421379944 -2.193 0.0417 *
## y 0.000009133 0.000004066 2.246 0.0375 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3627 on 18 degrees of freedom
## Multiple R-squared: 0.2189, Adjusted R-squared: 0.1755
## F-statistic: 5.044 on 1 and 18 DF, p-value: 0.0375
6.1.0.1 Prediccion de la tendencia espacial
r.sf$x<-st_coordinates(r.sf)[,1]
r.sf$y<-st_coordinates(r.sf)[,2]
r.sf$tendencia<- predict(tendencia.x,r.sf)
r.sf.tendencia<- as(r.sf, "Spatial")
gridded(r.sf.tendencia)<- TRUE
levelplot(brick(r.sf.tendencia)[[3]], margin=FALSE, main="Tendencia",col.regions = levelPal)+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))+ latticeExtra::layer(sp.points(as(prec, "Spatial"), pch=20, col='black'))6.2 Estructura espacial local: autocorrelacion
3 Pasos - variograma empirico - variograma teorico o inicial - ajuste de variograma
La dependencia espacial local significa que cuanto mas cerca esten los puntos en el espacio geografico, mas cerca tambien lo estan en el espacio de atributos. Esto se llama autocorrelacion. Los valores de un atributo pueden estar correlacionados con si mismos, y la fuerza de esta correlacion depende de la distancia de separacion entre puntos. Cada par de puntos, estara separado por una distancia en el espacio geografico y una semivarianza en el espacio de atributos.
alt text
#Calcule cuantos pares de puntos hay en el dataset
n <- length(prec$log.prcptcn)
n * (n - 1)/2## [1] 190
#calcule la distancia y semivarianza entre los dos puntos primeros puntos del dataset
st_distance(prec[1:2, ])[2,1]#distancia## 28441.38 [m]
0.5 * (prec$log.prcptcn[1] - prec$log.prcptcn[2])^2 # gamma semivarianza, unidades log(mm/mes)^2## [1] 0.07528229
6.2.0.1 Variograma empirico o experimental
Como la semivarianza y distancia se relacionan en toda el area de estudio?
Es a traves del Variograma empirico o experimental. Se define como la semivarianza media dividida para un rango de separacion determinado. Por el principio de estacionariedad, la estructura espacial es la misma en toda la zona de estudio.
Graficar el variograma experimental de las precipitaciones mesuales. Es decir la media de las semivarianzas, respecto de la distancia media (bin o lag). En este caso de 4.5Km, hasta una distancia maxima (cutoff) de 40km
6.2.0.2 Automap. Sin tendencia espacial
library(automap)
autovar=autofitVariogram(log.prcptcn ~ 1, as(prec, "Spatial"))
summary(autovar)## Experimental variogram:
## np dist gamma dir.hor dir.ver id
## 1 7 6432.642 0.03291035 0 0 var1
## 2 14 13716.274 0.03956771 0 0 var1
## 3 17 19150.251 0.06966989 0 0 var1
## 4 21 25460.118 0.10157339 0 0 var1
## 5 22 32506.573 0.09946560 0 0 var1
## 6 30 38802.994 0.15749881 0 0 var1
##
## Fitted variogram model:
## model psill range kappa
## 1 Nug 0.02684691 0.00 0
## 2 Ste 0.51458242 93707.44 2
## Sums of squares betw. var. model and sample var.[1] 0.00000000002105057
plot(autovar, pch=19, col="black")6.2.0.3 Automap. Con tendencia espacial
autovar=autofitVariogram(log.prcptcn ~ x, as(prec, "Spatial"), miscFitOptions = list(min.np.bin = 5, merge.small.bins = FALSE, cutoff=40000,width=4500))
summary(autovar)## Experimental variogram:
## np dist gamma dir.hor dir.ver id
## 1 1 2134.063 0.0001485358 0 0 var1
## 2 1 2806.454 0.0005027130 0 0 var1
## 3 1 5145.038 0.1025893775 0 0 var1
## 4 4 8735.734 0.0603181729 0 0 var1
## 5 14 13716.274 0.0369368034 0 0 var1
## 6 17 19150.251 0.0792982207 0 0 var1
## 7 21 25460.118 0.0661758891 0 0 var1
## 8 22 32506.573 0.0696067143 0 0 var1
## 9 30 38802.994 0.0657149505 0 0 var1
##
## Fitted variogram model:
## model psill range kappa
## 1 Nug 0.00000000 0.000 0
## 2 Ste 0.06199022 5178.708 10
## Sums of squares betw. var. model and sample var.[1] 0.0000000002688331
plot(autovar, pch=19, col="black")6.2.0.4 Variograma manual
6.2.0.4.1 Experimental
ve <- variogram(log.prcptcn ~ x, prec, cutoff=40000, width=4500)
# ve
plot(ve, plot.numbers = T, asp=1)variogram: genera la nube de variograma. log.prcptcn ~ 1: log.prcptcn es dependiente de si misma –> autocorrelacion. Por defecto (si no se especifica cutoff y with) el cutoff es 1/3 de la maxima distancia (diagonal del bbox). Esto es dividido en 15 clases igualmente espaciadas.
Cual es la evidencia de dependencia espacial local? np=numero de pares de puntos para cada una de las 15 clases, dist=distancia media, gamma=semivarianza media. A medida que la distancia aumenta, tambien lo hace la semivarianza, pero hasta una distancia determinada donde la semivarianza se estabiliza.
6.2.0.4.2 Teorico
Funcion que ajusta el variograma teorico. Hay diferentes tipos de funciones que pueden ser utiles:
show.vgms()Metodos para seleccionar el modelo que mejor ajusta al variograma teorico.
- 1- Conocer el proceso espacial que gobierna a la variable
- 2- Ajuste visual
- 3- Ajuste automatico y comparar la bondad del ajuste
Ajuste visual
- Range o rango: separacion o distancia entre pares de puntos en la cual ya no hay dependencia espacial. aprox 1500
- Nugget o pepita: semivarianza a la separacion de 0m. aprox 0
- Total-sill o meseta: semivarianza a la distancia del rango. aprox 0.065
- Partial-sill o meseta parcial: total sill - nugget. aprox 0.065
vgm genera el modelo de variograma
vt <- vgm(psill = 0.065, model = "Sph", range = 15000,nugget = 0.00)
vt## model psill range
## 1 Nug 0.000 0
## 2 Sph 0.065 15000
plot(ve, pl = T, model = vt)6.2.0.4.3 Ajuste automatico
La funcion fit.variogram: ajuta el modelo de variograma a un variograma empirico.
va <- fit.variogram(ve, vt)
va## model psill range
## 1 Nug 0.00000000 0.00
## 2 Sph 0.07445553 27251.84
plot(ve, pl = T, model = va)6.2.0.4.4 Generacion automatica del variograma inicial
vt.i <- vgm(nugget=0, model="Sph", range=sqrt(diff(as(prec,"Spatial")@bbox["coords.x1",])^2 +
diff(as(prec,"Spatial")@bbox["coords.x2",])^2)/4,
psill=var(prec$log.prcptcn))
#ajuste
va <- fit.variogram(ve, vt.i)
va## model psill range
## 1 Nug 0.00000000 0.00
## 2 Sph 0.07445686 27252.85
plot(ve, pl = T, model = va)# Regla general para determinar par攼㸱metros automaticamente
# Nugget = 0
# partial-sill = varianza total de los datos
# Range = 1/4 de la distancia maxima, diagonal del bounding box6.3 Interpolacion
kriging ordinario “ordinary” significa que - (1) la variable es modelada a partir de si misma; - (2) la media espacial no es conocida a priori, sino estimada de los datos y no existente tendencia espacial.
Kriging Universal significa que existe una tendencia espacial relacionada con las coordendas o la localizacion
Kriging con External Drif significa que se usan otros predictores ademas de las coordenadas.
El resultado de la prediccion proporciona: - prediction (var1.pred) - prediction variance (var1.var)
uk <- krige(formula=log.prcptcn ~ x, locations= prec, newdata=r.sf, model = va) ## [using universal kriging]
uk$pred <- 10^(uk$var1.pred)#volver a valores originales
str(uk)## Classes 'sf' and 'data.frame': 13054 obs. of 4 variables:
## $ var1.pred: num 1.5 1.51 1.52 1.53 1.54 ...
## $ var1.var : num 0.113 0.112 0.111 0.11 0.109 ...
## $ geometry :sfc_POINT of length 13054; first list element: 'XY' num 682258 9744863
## $ pred : num 31.6 32.3 33.1 33.9 34.8 ...
## - attr(*, "sf_column")= chr "geometry"
## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA
## ..- attr(*, "names")= chr "var1.pred" "var1.var" "pred"
uk.sp<- as(uk, "Spatial")
class(uk.sp)## [1] "SpatialPointsDataFrame"
## attr(,"package")
## [1] "sp"
gridded(uk.sp)<- TRUE
uk.r<- brick(uk.sp)6.3.0.1 Visualizacion
uk.r.masked<- mask(uk.r,as(cuenca, "Spatial"))
levelplot(uk.r.masked[[3]], margin=FALSE, main="uk",col.regions = levelPal)+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))+ latticeExtra::layer(sp.points(as(prec, "Spatial"), pch=20, col='black'))levelplot(uk.r.masked[[2]], margin=FALSE, main="uk - varianza")+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))+ latticeExtra::layer(sp.points(as(prec, "Spatial"), pch=20, col='white'))6.3.0.2 Validacion cruzada
uk.cv <- krige.cv(formula=log.prcptcn ~ x, locations= prec, model = va)
uk.cv[1:5,]## Simple feature collection with 5 features and 6 fields
## geometry type: POINT
## dimension: XY
## bbox: xmin: 705090 ymin: 9662396 xmax: 797962 ymax: 9713142
## epsg (SRID): NA
## proj4string: NA
## var1.pred var1.var observed residual zscore fold
## 1 1.849873 0.06799553 2.011993 0.16211994 0.62172204 1
## 2 2.133035 0.08164801 2.400020 0.26698508 0.93435987 2
## 3 2.729451 0.11842431 2.663889 -0.06556134 -0.19051421 3
## 4 1.789338 0.05699885 1.866287 0.07694940 0.32230881 4
## 5 2.186670 0.07514738 2.197280 0.01061078 0.03870707 5
## geometry
## 1 POINT (717092 9662396)
## 2 POINT (745529 9662895)
## 3 POINT (797962 9699430)
## 4 POINT (705090 9665080)
## 5 POINT (748262 9713142)
uk.cv$obs <- 10^(uk.cv$observed)
(uk.mse<-mse(10^(uk.cv$var1.pred), uk.cv$obs))## [1] 3402.075
(uk.rmse<-rmse(10^(uk.cv$var1.pred), uk.cv$obs))## [1] 58.32731
(uk.cor<-cor(10^(uk.cv$var1.pred), uk.cv$obs))## [1] 0.8993445
(uk.bias<-bias(10^(uk.cv$var1.pred), uk.cv$obs))## [1] -7.214766
plot(10^(uk.cv$var1.pred), uk.cv$obs)ggplot(uk.cv, aes(obs, y = var1.pred, color = "red")) +
geom_abline(colour = "#CCCCCC", linetype = 2) +
geom_point(aes(y = 10^var1.pred, col = "UK")) +
geom_smooth(aes(y = 10^var1.pred, col = "UK"), method = lm, se = FALSE) +
xlab("observaciones")+
ylab("predicciones")7 Resumen de metodos Kriging
7.0.1 Media constante
- simple kriging = media conocida
- ordinary kriging = media desconocida
- indicator krigning = datos categoricos / above - under threshold
7.0.2 Tendencia en la media
- co-kriging = covariables, solo disponible en ciertos puntos
- universal kriging = tendencia en funcion de las coordenadas, covariables en todos los puntos de prediccion. deterministic part is modeled as a function of coordinates -kriging with external drift= tendencia en funcion de covariables, covariables en todos los puntos de prediccion. both components are predicted simultaneously.
- Regresion kriging = se maneja por separado la componente deterministica y estocastica. the deterministic (regression) and stochastic (kriging) predictions are done separately
8 Comparacion de resultados
levelplot(brick(idw.r.masked[[1]], uk.r.masked[[3]]), margin=FALSE,col.regions = levelPal)+ latticeExtra::layer(sp.polygons(as(cuenca, "Spatial"), col='black'))+ latticeExtra::layer(sp.points(as(prec, "Spatial"), pch=20, col='black'))cv.comparacion<-data.frame(rbind(cbind(idw.mse, uk.mse),
cbind(idw.rmse, uk.rmse),
cbind(idw.cor, uk.cor),
cbind(idw.bias, uk.bias)))
rownames(cv.comparacion)<-c("mse", "rmse", "cor", "bias")
colnames(cv.comparacion)<-c("idw", "uk")
cv.comparacion## idw uk
## mse 5852.1843828 3402.0749367
## rmse 76.4995711 58.3273087
## cor 0.8251744 0.8993445
## bias -16.5119097 -7.2147655