library(magrittr)
library(raster)
## Loading required package: sp
## 
## Attaching package: 'raster'
## The following object is masked from 'package:magrittr':
## 
##     extract
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:raster':
## 
##     intersect, select, union
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(FRK)
## 
## Attaching package: 'FRK'
## The following object is masked from 'package:raster':
## 
##     distance
library(spacetime)
library(sp)
library(rgdal)
## rgdal: version: 1.2-8, (SVN revision 663)
##  Geospatial Data Abstraction Library extensions to R successfully loaded
##  Loaded GDAL runtime: GDAL 2.2.2, released 2017/09/15
##  Path to GDAL shared files: /usr/share/gdal/2.2
##  Loaded PROJ.4 runtime: Rel. 4.9.2, 08 September 2015, [PJ_VERSION: 492]
##  Path to PROJ.4 shared files: (autodetected)
##  Linking to sp version: 1.2-5
library(mapview)
## Loading required package: leaflet
library(fst)

# devtools::install_github("andrewzm/dggrids")

setwd("/home/michael/Dropbox/BGU/Itai_Kloog/p_46_FRK_Kriging_test/")

# Read data
dat = read.fst("01_raw/modX2009.fst")

# Rename
dat$lon = dat$Longitude
dat$lat = dat$Latitude
dat$Longitude = NULL
dat$Latitude = NULL

# Subset days
dat = dat[dat$day < (min(dat$day) + 11), ]

# Standard deviation of measurements (cannot be estimated from data in spatio-temporal kriging)
dat$std = 1

# Observations to 'spacetime' object
STObj = stConstruct(
  x = dat, # dataset
  space = c("lon","lat"), # spatial fields
  time = "day", # time field
  crs = CRS("+proj=longlat +ellps=sphere"), # CRS
  interval = TRUE # time reflects an interval
) 

# Time to POSIXct
STObj@time = xts::xts(zoo::coredata(STObj@time), as.POSIXct(as.character(time(STObj@time))))

###################################
# Plot - locations
sp = as(STObj, "Spatial")
plot(sp)

###################################

# Prediction (BAU) grid
grid_BAUs = auto_BAUs(
  manifold = STsphere(), # space-time field on sphere
  data = STObj, 
  cellsize = c(0.1, 0.1, 1),
  # cellsize = c(1, 1, 1),
  type = "grid", 
  tunit = "days" # time spacing in days
) 
grid_BAUs$fs = 1

###################################
# Plot
sp = as(grid_BAUs, "Spatial")
plot(sp)

###################################

# Basis functions
G_spatial = auto_basis(
  manifold = sphere(), # functions on sphere
  data = as(STObj,"Spatial"), # collapse time out
  nres = 3, # use three DGGRID resolutions
  prune = 15, # prune basis functions
  type = "bisquare", # bisquare basis functions
  subsamp = 2000, # use only 2000 data points for pruning
  isea3h_lo = 2
) 
G_temporal = local_basis(
  manifold = real_line(), # functions on real line
  loc = matrix(c(2,7,12)), # location parameter
  scale = rep(3,3), # scale parameter
  type = "Gaussian"
)
G_spacetime = TensorP(G_spatial,G_temporal)

###############################################################################################
# Cross-validation

result = NULL

for(i in unique(STObj[["fold"]])) {

  # Model
  f = error ~ 1 # formula for fixed effects
  S = SRE(
    f = f, # formula
    data = list(STObj[STObj[["fold"]] != i, ]), # spatio-temporal object
    basis = G_spacetime, # space-time basis functions
    BAUs = grid_BAUs, # space-time BAUs
    est_error = FALSE, # do not estimate measurement error
    average_in_BAU = TRUE
  ) # average data that fall inside BAUs
  
  # Fit
  S = SRE.fit(
    SRE_model = S, # SRE model
    n_EM = 2, # max. EM iterations
    tol = 0.01
  ) # convergence criteria
  
  # Predict
  grid_BAUs = predict(S, obs_fs = TRUE) # predict only at select days
  
  # Extract
  x = as.data.frame(STObj[STObj[["fold"]] == i, ])
  y = over(STObj[STObj[["fold"]] == i, ], grid_BAUs)
  y$error_pred = y$mu
  z = cbind(x, y[, "error_pred", drop = FALSE])
  result = rbind(result, z)
  
}
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.491 seconds
## Binned data in 0.481 seconds
## Binned data in 0.441 seconds
## Binned data in 0.445 seconds
## Binned data in 0.433 seconds
## Binned data in 0.415 seconds
## Binned data in 0.48 seconds
## Binned data in 0.412 seconds
## Binned data in 0.439 seconds
## Binned data in 0.446 seconds
## Binned data in 0.439 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.49 seconds
## Binned data in 0.444 seconds
## Binned data in 0.416 seconds
## Binned data in 0.516 seconds
## Binned data in 0.408 seconds
## Binned data in 0.454 seconds
## Binned data in 0.456 seconds
## Binned data in 0.449 seconds
## Binned data in 0.439 seconds
## Binned data in 0.486 seconds
## Binned data in 0.461 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.534 seconds
## Binned data in 0.482 seconds
## Binned data in 0.453 seconds
## Binned data in 0.55 seconds
## Binned data in 0.481 seconds
## Binned data in 0.507 seconds
## Binned data in 0.461 seconds
## Binned data in 0.442 seconds
## Binned data in 0.42 seconds
## Binned data in 0.489 seconds
## Binned data in 0.431 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.511 seconds
## Binned data in 0.463 seconds
## Binned data in 0.432 seconds
## Binned data in 0.498 seconds
## Binned data in 0.424 seconds
## Binned data in 0.449 seconds
## Binned data in 0.52 seconds
## Binned data in 0.431 seconds
## Binned data in 0.459 seconds
## Binned data in 0.485 seconds
## Binned data in 0.458 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.505 seconds
## Binned data in 0.427 seconds
## Binned data in 0.451 seconds
## Binned data in 0.473 seconds
## Binned data in 0.464 seconds
## Binned data in 0.438 seconds
## Binned data in 0.509 seconds
## Binned data in 0.471 seconds
## Binned data in 0.426 seconds
## Binned data in 0.501 seconds
## Binned data in 0.431 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.509 seconds
## Binned data in 0.474 seconds
## Binned data in 0.424 seconds
## Binned data in 0.499 seconds
## Binned data in 0.423 seconds
## Binned data in 0.451 seconds
## Binned data in 0.488 seconds
## Binned data in 0.459 seconds
## Binned data in 0.453 seconds
## Binned data in 0.499 seconds
## Binned data in 0.459 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.561 seconds
## Binned data in 0.462 seconds
## Binned data in 0.456 seconds
## Binned data in 0.498 seconds
## Binned data in 0.482 seconds
## Binned data in 0.427 seconds
## Binned data in 0.548 seconds
## Binned data in 0.532 seconds
## Binned data in 0.453 seconds
## Binned data in 0.469 seconds
## Binned data in 0.485 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.527 seconds
## Binned data in 0.504 seconds
## Binned data in 0.501 seconds
## Binned data in 0.461 seconds
## Binned data in 0.449 seconds
## Binned data in 0.422 seconds
## Binned data in 0.495 seconds
## Binned data in 0.427 seconds
## Binned data in 0.481 seconds
## Binned data in 0.662 seconds
## Binned data in 0.522 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.533 seconds
## Binned data in 0.483 seconds
## Binned data in 0.45 seconds
## Binned data in 0.522 seconds
## Binned data in 0.482 seconds
## Binned data in 0.451 seconds
## Binned data in 0.538 seconds
## Binned data in 0.463 seconds
## Binned data in 0.494 seconds
## Binned data in 0.505 seconds
## Binned data in 0.489 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
## Normalising basis function evaluations at BAU level ...
## Binning data ...
## Binned data in 0.527 seconds
## Binned data in 0.454 seconds
## Binned data in 0.484 seconds
## Binned data in 0.489 seconds
## Binned data in 0.531 seconds
## Binned data in 0.446 seconds
## Binned data in 0.527 seconds
## Binned data in 0.447 seconds
## Binned data in 0.474 seconds
## Binned data in 0.534 seconds
## Binned data in 0.454 seconds
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |=================================================================| 100%
## Maximum EM iterations reached
###############################################################################################
# Cross-validation Plot

plot(error_pred ~ error, result)
fit = lm(error_pred ~ error, result)
summary(fit)
## 
## Call:
## lm(formula = error_pred ~ error, data = result)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.0958 -0.2779 -0.0589  0.2880  1.7954 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.016554   0.014157   1.169    0.242
## error       0.005507   0.004585   1.201    0.230
## 
## Residual standard error: 0.5453 on 1482 degrees of freedom
## Multiple R-squared:  0.0009725,  Adjusted R-squared:  0.0002984 
## F-statistic: 1.443 on 1 and 1482 DF,  p-value: 0.2299
abline(fit, col = "red")

###################################
# Variogram - one day
sp = as(STObj[STObj@data$dayint == "14245"], "Spatial")
bubble(sp, "error")

v = automap::autofitVariogram(error ~ 1, sp)
plot(v)

###############################################################################################
# Ordinary Kriging

library(gstat)
library(automap)

sp = as(STObj[STObj@data$dayint == "14245"], "Spatial")
model_data = sp[sp$fold != 3, ]
test_data = sp[sp$fold == 3, ]
v = autofitVariogram(error ~ 1, model_data)
g = gstat(formula = error ~ 1, model = v$var_model, data = model_data)
pred = predict(g, test_data)
## [using ordinary kriging]
plot(pred$var1.pred ~ test_data$error)
fit = lm(error_pred ~ error, result)
summary(fit)
## 
## Call:
## lm(formula = error_pred ~ error, data = result)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.0958 -0.2779 -0.0589  0.2880  1.7954 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.016554   0.014157   1.169    0.242
## error       0.005507   0.004585   1.201    0.230
## 
## Residual standard error: 0.5453 on 1482 degrees of freedom
## Multiple R-squared:  0.0009725,  Adjusted R-squared:  0.0002984 
## F-statistic: 1.443 on 1 and 1482 DF,  p-value: 0.2299
abline(fit, col = "red")

# ###################################
# # Plot - Space-time
# stplot(grid_BAUs[, , "mu"])
# ###################################
# # Plot - Space only
# grid_BAUs[, 3, "mu"] %>% spplot
# ###################################