## ----fields00----------------------------------------------------------------- if (!require("rspat")) remotes::install_github('rspatial/rspat') ## ----fields0------------------------------------------------------------------ library(rspat) d <- spat_data('precipitation') head(d) ## ----fields1------------------------------------------------------------------ mnts <- toupper(month.abb) d$prec <- rowSums(d[, mnts]) plot(sort(d$prec), ylab="Annual precipitation (mm)", las=1, xlab="Stations") ## ----fields15----------------------------------------------------------------- dsp <- vect(d, c("LONG", "LAT"), crs="+proj=longlat +datum=NAD83") CA <- spat_data("counties") # define groups for mapping cuts <- c(0,200,300,500,1000,3000) # set up a palette of interpolated colors blues <- colorRampPalette(c('yellow', 'orange', 'blue', 'dark blue')) plot(CA, col="light gray", lwd=4, border="dark gray") plot(dsp, "prec", type="interval", col=blues(10), legend=TRUE, cex=2, breaks=cuts, add=TRUE, plg=list(x=-117.27, y=41.54)) lines(CA) ## ----------------------------------------------------------------------------- TA <- "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +datum=WGS84 +units=m" dta <- project(dsp, TA) cata <- project(CA, TA) ## ----------------------------------------------------------------------------- RMSE <- function(observed, predicted) { sqrt(mean((predicted - observed)^2, na.rm=TRUE)) } ## ----------------------------------------------------------------------------- null <- RMSE(mean(dsp$prec), dsp$prec) null ## ----fields25----------------------------------------------------------------- v <- voronoi(dta) plot(v) points(dta) ## ----fields35----------------------------------------------------------------- vca <- crop(v, cata) plot(vca, "prec") ## ----fields45----------------------------------------------------------------- r <- rast(vca, res=10000) vr <- rasterize(vca, r, "prec") plot(vr) ## ----------------------------------------------------------------------------- set.seed(5132015) kf <- sample(1:5, nrow(dta), replace=TRUE) rmse <- rep(NA, 5) for (k in 1:5) { test <- dta[kf == k, ] train <- dta[kf != k, ] v <- voronoi(train) p <- extract(v, test) rmse[k] <- RMSE(test$prec, p$prec) } rmse mean(rmse) # relative model performance perf <- 1 - (mean(rmse) / null) round(perf, 3) ## ----nneigh------------------------------------------------------------------- library(gstat) d <- data.frame(geom(dta)[,c("x", "y")], as.data.frame(dta)) head(d) gs <- gstat(formula=prec~1, locations=~x+y, data=d, nmax=5, set=list(idp = 0)) nn <- interpolate(r, gs, debug.level=0) nnmsk <- mask(nn, vr) plot(nnmsk, 1) ## ----------------------------------------------------------------------------- rmsenn <- rep(NA, 5) for (k in 1:5) { test <- d[kf == k, ] train <- d[kf != k, ] gscv <- gstat(formula=prec~1, locations=~x+y, data=train, nmax=5, set=list(idp = 0)) p <- predict(gscv, test, debug.level=0)$var1.pred rmsenn[k] <- RMSE(test$prec, p) } rmsenn mean(rmsenn) 1 - (mean(rmsenn) / null) ## ----fields70----------------------------------------------------------------- library(gstat) gs <- gstat(formula=prec~1, locations=~x+y, data=d) idw <- interpolate(r, gs, debug.level=0) idwr <- mask(idw, vr) plot(idwr, 1) ## ----------------------------------------------------------------------------- rmse <- rep(NA, 5) for (k in 1:5) { test <- d[kf == k, ] train <- d[kf != k, ] gs <- gstat(formula=prec~1, locations=~x+y, data=train) p <- predict(gs, test, debug.level=0) rmse[k] <- RMSE(test$prec, p$var1.pred) } rmse mean(rmse) 1 - (mean(rmse) / null) ## ----------------------------------------------------------------------------- gs2 <- gstat(formula=prec~1, locations=~x+y, data=d, nmax=1, set=list(idp=1)) ## ----aqual-------------------------------------------------------------------- x <- rspat::spat_data("airqual") x$OZDLYAV <- x$OZDLYAV * 1000 x <- vect(x, c("LONGITUDE", "LATITUDE"), crs="+proj=longlat +datum=WGS84") ## ----------------------------------------------------------------------------- TAkm <- "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +datum=WGS84 +units=km" aq <- project(x, TAkm) ## ----------------------------------------------------------------------------- ca <- project(CA, TAkm) r <- rast(ca) res(r) <- 10 # 10 km if your CRS's units are in km ## ----krig20------------------------------------------------------------------- p <- data.frame(geom(aq)[, c("x", "y")], as.data.frame(aq)) gs <- gstat(formula=OZDLYAV~1, locations=~x+y, data=p) v <- variogram(gs, width=20) v plot(v) ## ----krig22------------------------------------------------------------------- fve <- fit.variogram(v, vgm(85, "Exp", 75, 20)) fve plot(variogramLine(fve, 400), type='l', ylim=c(0,120)) points(v[,2:3], pch=20, col='red') ## ----krig24------------------------------------------------------------------- fvs <- fit.variogram(v, vgm(85, "Sph", 75, 20)) fvs plot(variogramLine(fvs, 400), type='l', ylim=c(0,120) ,col='blue', lwd=2) points(v[,2:3], pch=20, col='red') ## ----krig26------------------------------------------------------------------- plot(v, fve) ## ----krig28, fig.width=10----------------------------------------------------- k <- gstat(formula=OZDLYAV~1, locations=~x+y, data=p, model=fve) # predicted values kp <- interpolate(r, k, debug.level=0) ok <- mask(kp, ca) names(ok) <- c('prediction', 'variance') plot(ok) ## ----krig30------------------------------------------------------------------- idm <- gstat(formula=OZDLYAV~1, locations=~x+y, data=p) idp <- interpolate(r, idm, debug.level=0) idp <- mask(idp, ca) plot(idp, 1) ## ----------------------------------------------------------------------------- f1 <- function(x, test, train) { nmx <- x[1] idp <- x[2] if (nmx < 1) return(Inf) if (idp < .001) return(Inf) m <- gstat(formula=OZDLYAV~1, locations=~x+y, data=train, nmax=nmx, set=list(idp=idp)) p <- predict(m, newdata=test, debug.level=0)$var1.pred RMSE(test$OZDLYAV, p) } set.seed(20150518) i <- sample(nrow(aq), 0.2 * nrow(aq)) tst <- p[i,] trn <- p[-i,] opt <- optim(c(8, .5), f1, test=tst, train=trn) str(opt) ## ----krig32------------------------------------------------------------------- m <- gstat(formula=OZDLYAV~1, locations=~x+y, data=p, nmax=opt$par[1], set=list(idp=opt$par[2])) idw <- interpolate(r, m, debug.level=0) idw <- mask(idw, ca) plot(idw, 1) ## ----krig34, message=FALSE---------------------------------------------------- library(fields) m <- fields::Tps(p[,c("x", "y")], p$OZDLYAV) tps <- interpolate(r, m) tps <- mask(tps, idw[[1]]) plot(tps) ## ----------------------------------------------------------------------------- k <- sample(5, nrow(p), replace=TRUE) ensrmse <- tpsrmse <- krigrmse <- idwrmse <- rep(NA, 5) for (i in 1:5) { test <- p[k!=i,] train <- p[k==i,] m <- gstat(formula=OZDLYAV~1, locations=~x+y, data=train, nmax=opt$par[1], set=list(idp=opt$par[2])) p1 <- predict(m, newdata=test, debug.level=0)$var1.pred idwrmse[i] <- RMSE(test$OZDLYAV, p1) m <- gstat(formula=OZDLYAV~1, locations=~x+y, data=train, model=fve) p2 <- predict(m, newdata=test, debug.level=0)$var1.pred krigrmse[i] <- RMSE(test$OZDLYAV, p2) m <- Tps(train[,c("x", "y")], train$OZDLYAV) p3 <- predict(m, test[,c("x", "y")]) tpsrmse[i] <- RMSE(test$OZDLYAV, p3) w <- c(idwrmse[i], krigrmse[i], tpsrmse[i]) weights <- w / sum(w) ensemble <- p1 * weights[1] + p2 * weights[2] + p3 * weights[3] ensrmse[i] <- RMSE(test$OZDLYAV, ensemble) } rmi <- mean(idwrmse) rmk <- mean(krigrmse) rmt <- mean(tpsrmse) rms <- c(rmi, rmt, rmk) rms rme <- mean(ensrmse) rme ## ----krig40------------------------------------------------------------------- nullrmse <- RMSE(test$OZDLYAV, mean(test$OZDLYAV)) w <- nullrmse - rms # normalize weights to sum to 1 weights <- ( w / sum(w) ) # check sum(weights) s <- c(idw[[1]], ok[[1]], tps) ensemble <- sum(s * weights) ## ----ensplot, fig.width=10, fig.height=10------------------------------------- s <- c(idw[[1]], ok[[1]], tps, ensemble) names(s) <- c("IDW", "OK", "TPS", "Ensemble") plot(s)