Objetivo de la practica. Introducir los metodos de geoestadistica multivariada utilizando el conjunto de datos de “Meuse”.
Esta practica se basa en el documento: “An introduction to geostatistics with R/gstat” de D G Rossiter, Cornell University, School of Integrative Plant Science, Crop and Soil Sciences Section. Febr, 2022. http://www.css.cornell.edu/faculty/dgr2/_static/files/R_PDF/gs_intro_sf.pdf
Otros materiales del mismo autor: http://www.css.cornell.edu/faculty/dgr2/tutorials/index.html
Hengl, T. (2009). A practical guide to geostatistical mapping. http://spatial-analyst.net/book/system/files/Hengl_2009_GEOSTATe2c1w.pdf
Media constante
simple kriging = media conocida
ordinary kriging = media desconocida
indicator krigning = datos categoricos / above - under threshold<
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
Conjunto de datos “Meuse” de polucion del suelo con muestras de concentracion de metales pesados (paquete sp). Meuse esta previamente cargado en R, de modo que solo lo llamamos con data()
library(sp)
library(gstat)
library(sf)## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_FileGDB.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_FileGDB.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_MSSQLSpatial.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_MSSQLSpatial.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_OCI.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_OCI.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_PG.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_PG.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_FileGDB.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_FileGDB.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_MSSQLSpatial.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_MSSQLSpatial.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_OCI.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_OCI.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_PG.dll
## 126: No se puede encontrar el módulo especificado.
## Warning in CPL_gdal_init(): GDAL Error 1: Can't load requested DLL: C:\Program Files\GeoDa Software\ogr_PG.dll
## 126: No se puede encontrar el módulo especificado.
## Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1
data(meuse)
str(meuse) #estructura de datos meuse. Algunas variables son continuas y otras clasificadas (factors)## 'data.frame': 155 obs. of 14 variables:
## $ x : num 181072 181025 181165 181298 181307 ...
## $ y : num 333611 333558 333537 333484 333330 ...
## $ cadmium: num 11.7 8.6 6.5 2.6 2.8 3 3.2 2.8 2.4 1.6 ...
## $ copper : num 85 81 68 81 48 61 31 29 37 24 ...
## $ lead : num 299 277 199 116 117 137 132 150 133 80 ...
## $ zinc : num 1022 1141 640 257 269 ...
## $ elev : num 7.91 6.98 7.8 7.66 7.48 ...
## $ dist : num 0.00136 0.01222 0.10303 0.19009 0.27709 ...
## $ om : num 13.6 14 13 8 8.7 7.8 9.2 9.5 10.6 6.3 ...
## $ ffreq : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ soil : Factor w/ 3 levels "1","2","3": 1 1 1 2 2 2 2 1 1 2 ...
## $ lime : Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
## $ landuse: Factor w/ 15 levels "Aa","Ab","Ag",..: 4 4 4 11 4 11 4 2 2 15 ...
## $ dist.m : num 50 30 150 270 380 470 240 120 240 420 ...
meuse.sf <- st_as_sf(meuse, coords = c("x","y"))
st_crs(meuse.sf) <- 28992Univariado- Analisis EDA (Exploratory Data Analysis)
meuse.sf$zinc## [1] 1022 1141 640 257 269 281 346 406 347 183 189 251 1096 504 326
## [16] 1032 606 711 735 1052 673 402 343 218 200 194 207 180 240 180
## [31] 208 198 250 192 213 321 569 833 906 1454 298 167 176 258 746
## [46] 746 464 365 282 375 222 812 1548 1839 1528 933 432 550 1571 1190
## [61] 907 761 659 643 801 784 1060 119 778 703 676 793 685 593 549
## [76] 680 539 560 1136 1383 1161 1672 765 279 241 317 545 505 420 332
## [91] 400 553 577 155 224 180 226 186 198 187 199 157 203 143 136
## [106] 117 113 130 192 240 221 140 128 166 191 232 203 722 210 198
## [121] 139 253 703 832 262 142 119 152 415 474 126 210 220 133 141
## [136] 158 129 206 451 296 189 154 169 403 471 612 601 783 258 214
## [151] 166 496 342 162 375
hist(meuse.sf$zinc, breaks = 16) #Distribucion no simetrica, sesgada hacia la derecha#Al ser una distribucion no simetrica, se aplica logaritmo para transformar los valores y obtener una distribucion simetrica (normal). Esto, ademas, reduce los posibles outliers.
meuse.sf$logZn <- log10(meuse.sf$zinc)
hist(meuse.sf$logZn, breaks = 16)# summary(meuse.sf$logZn)
# head(meuse.sf$zinc)
# head(meuse.sf$logZn)
# head(10^(meuse.sf$logZn))#Luego para transformar a los valores originales se utiliza antilog. antilog (x)=10^xEstructura espacial local
3 Pasos - variograma empirico - variograma teorico o inicial - ajuste de variograma
data(meuse.riv, package="sp")
meuse.riv.sf <- st_sfc(st_linestring(meuse.riv, dim="XY"), crs = st_crs(meuse.sf))
plot(meuse.sf["zinc"],
reset = FALSE,
nbreaks = 64, pch = 20,
cex=4*meuse.sf$zinc/max(meuse.sf$zinc),
main = "Zn concentration [ppm]")
plot(meuse.riv.sf, add = TRUE)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 concentraciones de Zinc (log). Es decir la media de las semivarianzas, respecto de la distancia media (bin o lag). En este caso de 90m, hasta una distancia maxima (cutoff) de 1300m.
ve <- variogram(logZn ~ 1, meuse.sf, cutoff = 1300,width = 90)
plot(ve, plot.numbers = T, asp=1)variogram: genera la nube de variograma. logZn ~ 1: logZn 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.
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
Range o rango: separacion o distancia entre pares de puntos en la cual ya no hay dependencia espacial. aprox 850m Nugget o pepita: semivarianza a la separacion de 0m. aprox 0.01 Total-sill o meseta: semivarianza a la distancia del rango. aprox 0.13 Partial-sill o meseta parcial: total sill - nugget. aprox 0.12
vgm genera el modelo de variograma
vt <- vgm(psill = 0.12, model = "Sph", range = 850,nugget = 0.01)
plot(ve, pl = T, model = vt)fit.variogram: ajuta el modelo de variograma a un variograma empirico.
va <- fit.variogram(ve, vt)
plot(ve, pl = T, model = va)Variograma inicial. Regla general para determinar parametros automaticamente -Nugget = 0 -partial-sill = varianza total de los datos -Range = 1/4 de la distancia maxima, diagonal del bounding box
vt.i <- vgm(nugget=0, model="Sph", range=sqrt(diff(st_bbox(meuse.sf)[c("xmax", "xmin")])^2 +
diff(st_bbox(meuse.sf)[c("ymax", "ymin")])^2)/4,
psill=var(meuse.sf$logZn))Ajuste
va <- fit.variogram(ve, vt.i)
plot(ve, pl = T, model = va)Usualmente kriging se utiliza para predecir los pixeles (o nodos) de una malla regular que cubre la zona de estudio.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. prediction (var1.pred) prediction variance (var1.var)
data(meuse.grid) #malla de 40m x 40m, disponible con el dataset meuse.
meuse.grid.sf <- st_as_sf(meuse.grid, coords = c("x", "y"))
st_crs(meuse.grid.sf) <- st_crs(meuse.sf)
ok <- krige(logZn ~ 1, locations = meuse.sf, newdata = meuse.grid.sf, model = va) ## [using ordinary kriging]
ok$pred <- 10^(ok$var1.pred)#volver a valores originales
plot(ok["var1.pred"], pch=15,
nbreaks = 64,
main="OK prediction [log10(Zn ppm)]")plot(ok["var1.var"], pch=15,
nbreaks = 64,
pal = cm.colors,
main="OK prediction variance [log10(Zn ppm)^2]")Poligonos de Thiessen: 1. Cambios abruptos de bordes. 2. Solo utiliza un punto para cada prediccion.
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 debe ser estimada a partir de un conjunto de datos de validacion, especificamente reservado para ello.
thiessen = krige(zinc ~ 1, meuse.sf, meuse.grid.sf, nmax = 1)## [inverse distance weighted interpolation]
plot(thiessen["var1.pred"], pch=15,main="Thiessen")idw = idw(zinc ~ 1, meuse.sf, meuse.grid.sf)## [inverse distance weighted interpolation]
plot(idw["var1.pred"], pch=15,main="IDW")#Cambiando el numero de vecinos
# idw$vecino<- krige(zinc ~ 1, meuse.sf, meuse.grid.sf,nmax=6)
#Cambiando pesos
# idw$idp05 = idw(zinc ~ 1, meuse.sf, meuse.grid.sf, idp = 0.5)$var1.pred
# idw$idp5 = idw(zinc ~ 1, meuse.sf, meuse.grid.sf, idp = 5)$var1.predthiessen.cv <- krige.cv(logZn ~ 1, meuse.sf, nmax = 1)
idw.cv<- krige.cv(logZn ~ 1, meuse.sf)
ok.cv <- krige.cv(logZn ~ 1, meuse.sf, model = va)
thiessen.cv[1:5,]## Simple feature collection with 5 features and 6 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 181025 ymin: 333330 xmax: 181307 ymax: 333611
## Projected CRS: Amersfoort / RD New
## var1.pred var1.var observed residual zscore fold geometry
## 1 3.057286 NA 3.009451 -0.04783475 NA 1 POINT (181072 333611)
## 2 3.009451 NA 3.057286 0.04783475 NA 2 POINT (181025 333558)
## 3 3.009451 NA 2.806180 -0.20327092 NA 3 POINT (181165 333537)
## 4 2.806180 NA 2.409933 -0.39624685 NA 4 POINT (181298 333484)
## 5 2.448706 NA 2.429752 -0.01895404 NA 5 POINT (181307 333330)
idw.cv[1:5,]## Simple feature collection with 5 features and 6 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 181025 ymin: 333330 xmax: 181307 ymax: 333611
## Projected CRS: Amersfoort / RD New
## var1.pred var1.var observed residual zscore fold geometry
## 1 2.830957 NA 3.009451 0.1784941 NA 1 POINT (181072 333611)
## 2 2.797944 NA 3.057286 0.2593420 NA 2 POINT (181025 333558)
## 3 2.687633 NA 2.806180 0.1185473 NA 3 POINT (181165 333537)
## 4 2.605734 NA 2.409933 -0.1958009 NA 4 POINT (181298 333484)
## 5 2.505657 NA 2.429752 -0.0759050 NA 5 POINT (181307 333330)
ok.cv[1:5,]## Simple feature collection with 5 features and 6 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 181025 ymin: 333330 xmax: 181307 ymax: 333611
## Projected CRS: Amersfoort / RD New
## var1.pred var1.var observed residual zscore fold
## 1 2.941046 0.03408724 3.009451 0.068404690 0.37050151 1
## 2 2.938452 0.03300608 3.057286 0.118833216 0.65409504 2
## 3 2.735836 0.03416564 2.806180 0.070343758 0.38056671 3
## 4 2.627050 0.04264164 2.409933 -0.217116957 -1.05142137 4
## 5 2.425835 0.03281227 2.429752 0.003917734 0.02162802 5
## geometry
## 1 POINT (181072 333611)
## 2 POINT (181025 333558)
## 3 POINT (181165 333537)
## 4 POINT (181298 333484)
## 5 POINT (181307 333330)
ok.cv$obs <- 10^(ok.cv$observed)par(mfrow=c(1,3))
print(plot(var1.pred~observed,thiessen.cv, main="Thiessen"), split=c(1,1,3,1), more=TRUE)## NULL
print(plot(var1.pred~observed,idw.cv, main="IDW"), split=c(2,1,3,1), more=TRUE)## NULL
print(plot(var1.pred~obs,ok.cv, main="OK"), split=c(3,1,2,1), more=FALSE)## NULL
Idealmente 1
cor(thiessen.cv$var1.pred,thiessen.cv$observed)## [1] 0.685839
cor(idw.cv$var1.pred,idw.cv$observed)## [1] 0.7640391
cor(ok.cv$var1.pred,ok.cv$obs)## [1] 0.7677732
Idealmente 0
mean(thiessen.cv$residual)## [1] 0.003457601
mean(idw.cv$residual)## [1] -0.005565866
mean(ok.cv$residual)## [1] -0.0001470178
Desviaciones estandar del error de interpolacion (residuos)
Idealmente pequeno
sd(thiessen.cv$residual)## [1] 0.2463506
sd(idw.cv$residual)## [1] 0.2238086
sd(ok.cv$residual)## [1] 0.1731182
Idealmente pequeno
mean(thiessen.cv$residual^2)## [1] 0.06030903
mean(idw.cv$residual^2)## [1] 0.0497981
mean(ok.cv$residual^2)## [1] 0.02977656
Idealmente pequeno
sqrt(sum(thiessen.cv$residual^2)/length(thiessen.cv$residual))## [1] 0.245579
sqrt(sum(idw.cv$residual^2)/length(idw.cv$residual))## [1] 0.2231549
sqrt(sum(ok.cv$residual^2)/length(ok.cv$residual))## [1] 0.1725589
Idealmente cercanos a cero
var(thiessen.cv$residual, na.rm=T)## [1] 0.06068862
var(idw.cv$residual, na.rm=T)## [1] 0.05009028
var(ok.cv$residual, na.rm=T)## [1] 0.02996989
Cantidad de variacion explicada por el modelo en cada metodo
Idealmente cercano a 100
(1-var(thiessen.cv$residual, na.rm=T)/var(meuse$zinc))*100## [1] 99.99995
(1-var(idw.cv$residual, na.rm=T)/var(meuse$zinc))*100## [1] 99.99996
(1-var(ok.cv$residual, na.rm=T)/var(meuse$zinc))*100## [1] 99.99998
Variogramas direccionales
https://rpubs.com/nnnagle/vario. Patron en los datos (suroeste - noreste). Esto viola el principio de estacionalidad (stationarity). La estructura espacial puede ser diferente en distintas direcciones. Por ello se genera un variograma en 4 direcciones: 0, 45, 90, 135
vgm.aniso <- variogram(logZn ~ 1, meuse.sf, alpha = c(0, 45, 90, 135))
plot(vgm.aniso)Autocorrelacion mas fuerte a los 45 y menos fuerte a los 135.
vgm.map = variogram(logZn~1, meuse.sf, cutoff = 1500, width = 100,map = TRUE)
# vgm.map = variogram(logZn~sqrt(dist), meuse, cutoff = 1500, width = 100,map = TRUE)
plot(vgm.map, threshold = 5)Ajuste de variograma
vt.i.a <- vgm(nugget=0, model="Sph", range=sqrt(diff(st_bbox(meuse.sf)[c("xmax", "xmin")])^2 +
diff(st_bbox(meuse.sf)[c("ymax", "ymin")])^2)/4, psill=var(meuse.sf$logZn), anis = c(45, 0.4))
#In two dimensions, two parameters define an anisotropy ellipse, say anis = c(30, 0.5). The first parameter, 30, refers to the main axis direction: it is the angle for the principal direction of continuity (measured in degrees, clockwise from positive Y, i.e. North). The second parameter, 0.5, is the anisotropy ratio, the ratio of the minor range to the major range (a value between 0 and 1). So, in our example, if the range in the major direction (North-East) is 100, the range in the minor direction (South-East) is 0.5 x 100 = 50.
# In three dimensions, anis = c(p,q,r,s,t). $p$ is the angle for the principal direction of continuity (measured in degrees, clockwise from Y, in direction of X), $q$ is the dip angle for the principal direction of continuity (measured in positive degrees up from horizontal), $r$ is the third rotation angle to rotateanis = c(30, 10, 0, 0.5, 0.3))
va.a <- fit.variogram(vgm.aniso, vt.i.a)
va.a## model psill range ang1 anis1
## 1 Nug 0.0111140 0.00 0 1.0
## 2 Sph 0.1102725 1742.85 45 0.4
plot(vgm.aniso, pl = T, model = va.a)A partir de aqui se procede con kriging pero utilizando este variograma
ok <- krige(logZn ~ 1, locations = meuse.sf, newdata = meuse.grid.sf, model = va.a) ## [using ordinary kriging]
ok$pred <- 10^(ok$var1.pred)#volver a valores originales
plot(ok["var1.pred"], pch=15,
nbreaks = 64,
main="OK prediction [log10(Zn ppm)]")plot(ok["var1.var"], pch=15,
nbreaks = 64,
pal = cm.colors,
main="OK prediction variance [log10(Zn ppm)^2]")Analisis EDA - Exploracion de atributos - Bivariado
Analisis de correlacion (https://www0.gsb.columbia.edu/premba/analytical/s7/s7_5.cfm)
Distancia al rio
cor(meuse.sf$logZn, meuse.sf$dist)## [1] -0.7394276
plot(meuse.sf$logZn ~ meuse.sf$dist)Regresion lineal (https://www0.gsb.columbia.edu/premba/analytical/s7/s7_6.cfm)
m.lzn.dist <- lm(logZn ~ dist, data = meuse.sf)
summary(m.lzn.dist)##
## Call:
## lm(formula = logZn ~ dist, data = meuse.sf)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.4889 -0.1583 -0.0007 0.1387 0.7286
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.83759 0.02680 105.87 <2e-16 ***
## dist -1.17256 0.08631 -13.59 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2118 on 153 degrees of freedom
## Multiple R-squared: 0.5468, Adjusted R-squared: 0.5438
## F-statistic: 184.6 on 1 and 153 DF, p-value: < 2.2e-16
plot(meuse.sf$logZn ~ meuse.sf$dist)
abline(m.lzn.dist)Analisis EDA (Exploratory Data Analysis) - Exploracion de atributos - multivariado
Modelo aditivo, asume que las variables actuan lineal e independientemente
meuse.sf$logCu <- log10(meuse.sf$copper)
m.lzn.lcu.dist <- lm(logZn ~ logCu + dist, data = meuse.sf)
summary(m.lzn.lcu.dist)##
## Call:
## lm(formula = logZn ~ logCu + dist, data = meuse.sf)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.54110 -0.07904 -0.00324 0.08194 0.29847
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.06843 0.10500 10.175 < 2e-16 ***
## logCu 1.02805 0.06032 17.042 < 2e-16 ***
## dist -0.41777 0.06736 -6.202 5.04e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1245 on 152 degrees of freedom
## Multiple R-squared: 0.8443, Adjusted R-squared: 0.8422
## F-statistic: 412.1 on 2 and 152 DF, p-value: < 2.2e-16
Modelo de interaccion
m.lzn.lcu.dist.i <- lm(logZn ~ logCu*dist, data = meuse.sf)
summary(m.lzn.lcu.dist.i)##
## Call:
## lm(formula = logZn ~ logCu * dist, data = meuse.sf)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.53466 -0.07806 -0.00211 0.08016 0.29964
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.04958 0.11446 9.170 3.27e-16 ***
## logCu 1.04049 0.06736 15.447 < 2e-16 ***
## dist -0.24777 0.41044 -0.604 0.547
## logCu:dist -0.12031 0.28653 -0.420 0.675
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1249 on 151 degrees of freedom
## Multiple R-squared: 0.8445, Adjusted R-squared: 0.8414
## F-statistic: 273.3 on 3 and 151 DF, p-value: < 2.2e-16
“drift” being the value of the covariable
Prediccion de concentracion de metales de acuerdo con la distancia al rio.
vr <- variogram(logZn ~ dist, location=meuse.sf,cutoff=1300, width=90)
plot(vr, plot.numbers=T, main="Residuals, dist co-variable")vked <- fit.variogram(vr, vgm(nugget=0, model="Sph", range=sqrt(diff(st_bbox(meuse.sf)[c("xmax", "xmin")])^2 + diff(st_bbox(meuse.sf)[c("ymax", "ymin")])^2)/4, psill=var(meuse.sf$logZn)))
plot(vr, plot.numbers=T, model=vked, main="Dist co-variable")ked <- krige(logZn ~ dist, locations=meuse.sf,newdata=meuse.grid.sf, model=vked)## [using universal kriging]
ked$pred <- 10^(ked$var1.pred)#volver a valores originales
plot(ked["var1.pred"], pch=15,
nbreaks = 64,
main="KED prediction [log10(Zn ppm)]")plot(ked["var1.var"], pch=15,
nbreaks = 64,
pal = cm.colors,
main="KED prediction variance [log10(Zn ppm)^2]")Prediccion de tendencia espacial geografica (x e y) ademas de estructura local.
meuse.sf$x<- st_coordinates(meuse.sf)[,"X"]
meuse.sf$y<- st_coordinates(meuse.sf)[,"Y"]
meuse.grid.sf$x<- st_coordinates(meuse.grid.sf)[,"X"]
meuse.grid.sf$y<- st_coordinates(meuse.grid.sf)[,"Y"]
vr <- variogram(logZn ~ dist + x + y, location=meuse.sf,cutoff=1300, width=90)
plot(vr, plot.numbers=T, main="Residuals, dist co-variable")vuk <- fit.variogram(vr, vgm(nugget=0, model="Sph",range=sqrt(diff(st_bbox(meuse.sf)[c("xmax", "xmin")])^2 + diff(st_bbox(meuse.sf)[c("ymax", "ymin")])^2)/4, psill=var(meuse.sf$logZn)))
plot(vr, plot.numbers=T, model=vuk, main="Dist co-variable")uk <- krige(logZn ~ dist + x + y, locations=meuse.sf,newdata=meuse.grid.sf, model=vuk)## [using universal kriging]
uk$pred <- 10^(uk$var1.pred)#volver a valores originales
plot(uk["var1.pred"], pch=15,
nbreaks = 64,
main="KU prediction [log10(Zn ppm)]")plot(uk["var1.var"], pch=15,
nbreaks = 64,
pal = cm.colors,
main="KU prediction variance [log10(Zn ppm)^2]")En la misma escala
zmax <- max(ok$pred,ked$pred, uk$pred)
zmin <- min(ok$pred,ked$pred, uk$pred)
zmax <- round(zmax, 1) + 0.1
zmin <- round(zmin, 1) - 0.1
ramp <- seq(from=zmin, to=zmax, by=50)
p1 <- spplot(as(ok, "Spatial"), "pred", asp=1, main="OK prediction",at=ramp, col.regions=bpy.colors(64))
p2 <- spplot(as(ked, "Spatial"), "pred", asp=1, main="KED-prediction",at=ramp, col.regions=bpy.colors(64))
p3 <- spplot(as(uk, "Spatial"), "pred", asp=1, main="UK-prediction",at=ramp, col.regions=bpy.colors(64))
plot(p1, split = c(1, 1, 3, 1), more = T)
plot(p2, split = c(2, 1, 3, 1), more = T)
plot(p3, split = c(3, 1, 3, 1), more = F)summary(ok$var1.var)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01733 0.02517 0.02944 0.03289 0.03647 0.08100
summary(ked$var1.var)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01978 0.02389 0.02584 0.02777 0.02980 0.05236
summary(uk$var1.var)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01993 0.02382 0.02568 0.02761 0.02948 0.05155
zmax <- max(ok$var1.var,ked$var1.var, uk$var1.var)
zmin <- min(ok$var1.var,ked$var1.var, uk$var1.var)
zmax <- round(zmax, 1) + 0.1
zmin <- round(zmin, 1) - 0.1
ramp <- seq(from=zmin, to=zmax, by=0.005)
p1 <- spplot(as(ok, "Spatial"), "var1.var", asp=1, main="OK varianza",at=ramp, col.regions=cm.colors(64))
p2 <- spplot(as(ked, "Spatial"), "var1.var", asp=1, main="KED-ffreq varianza",at=ramp, col.regions=cm.colors(64))
p3 <- spplot(as(uk, "Spatial"), "var1.var", asp=1, main="UK-ffreq varianza",at=ramp, col.regions=cm.colors(64))
plot(p1, split = c(1, 1, 3, 1), more = T)
plot(p2, split = c(2, 1, 3, 1), more = T)
plot(p3, split = c(3, 1, 3, 1), more = F)Compruebe con validacion cruzada el metodo de kriging que mejor predice la variable interpolada. Compruebe ademas incorporando anisotropia en el variograma.