inst/doc/NKDE.R

## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
backup_option <- options()
base_wd <- getwd()

## ----include=FALSE------------------------------------------------------------
load(system.file("extdata", "results_vignette_nkde.rda",
                           package = "spNetwork", mustWork = TRUE))

## ----message=FALSE, warning=FALSE---------------------------------------------
library(ggplot2)
library(reshape2)
library(kableExtra)
library(spNetwork)
library(RColorBrewer)

x <- seq(-15.01,15.01,by = 0.01)
df <- data.frame(
  x = x,
  gaussian = gaussian_kernel(x,15),
  epanechnikov = epanechnikov_kernel(x,15),
  quartic = quartic_kernel(x,15),
  triangle = triangle_kernel(x,15),
  tricube = tricube_kernel(x,15),
  triweight = triweight_kernel(x,15),
  cosine = cosine_kernel(x,15),
  uniform = uniform_kernel(x,15))

df2 <- melt(df, id.vars = "x")
names(df2) <- c("x","kernel","y")

ggplot(df2) + 
  geom_line(aes(x=x,y=y,color=kernel),size=1)


## ----message=FALSE, warning=FALSE---------------------------------------------
Funs <- c(gaussian_kernel, gaussian_kernel_scaled,epanechnikov_kernel,
          quartic_kernel,triangle_kernel, uniform_kernel,
          tricube_kernel,triweight_kernel,
          cosine_kernel)
Names <- c("gaussian", "scaled gaussian", "epanechnikov", "quartic",
           "triangle","uniform", "tricube", "triweight", "cosine")
integrals <- sapply(Funs,function(f){
  return(round(integrate(f,upper=15,lower=-15,bw=15)$value,3))
         })
df <- data.frame("kernel"=Names,
                 "integrals" = integrals)

kable(df)


## ----message=FALSE, warning=FALSE---------------------------------------------
x <- seq(-15.01,15.01,by = 0.01)
df <- data.frame(
  x = x,
  gaussian = gaussian_kernel(x,15),
  gaussian_scaled = gaussian_kernel_scaled(x,15),
  epanechnikov = epanechnikov_kernel(x,15),
  quartic = quartic_kernel(x,15)
  )

df2 <- melt(df, id.vars = "x")
names(df2) <- c("x","kernel","y")

ggplot(df2) + 
  geom_line(aes(x=x,y=y,color=kernel),size=1)

## ----message=FALSE, warning=FALSE---------------------------------------------
# first load data and packages
library(sf)
library(spNetwork)
library(tmap)

data(mtl_network) 
data(bike_accidents)

# then plotting the data
tm_shape(mtl_network) + 
  tm_lines("black") + 
  tm_shape(bike_accidents) + 
  tm_dots("red", size = 0.2)

# then calculating some lixels to use as sampling points
lixels <- lixelize_lines(mtl_network,200,mindist = 50)
samples <- lines_center(lixels)

## ----message=FALSE, warning=FALSE, eval=FALSE---------------------------------
#  # then applying the NKDE
#  densities <- nkde(mtl_network,
#                    events = bike_accidents,
#                    w = rep(1,nrow(bike_accidents)),
#                    samples = samples,
#                    kernel_name = "quartic",
#                    bw = 300, div= "bw",
#                    method = "discontinuous", digits = 1, tol = 1,
#                    grid_shape = c(1,1), max_depth = 8,
#                    agg = 5, #we aggregate events within a 5m radius (faster calculation)
#                    sparse = TRUE,
#                    verbose = FALSE)
#  

## ----message=FALSE, warning=FALSE---------------------------------------------
samples$density <- densities

## ----message=FALSE, warning=FALSE---------------------------------------------

# rescaling to help the mapping
samples$density <- samples$density*1000

samples2 <- samples[order(samples$density),]

colorRamp <- brewer.pal(n = 7, name = "Spectral")
colorRamp <- rev(colorRamp)

title <- paste0("bike accident density by kilometres in 2016,",
                "\nwithin a radius of 300 metres")

tm_shape(mtl_network) + 
  tm_lines("black") + 
  tm_shape(samples2) + 
  tm_dots("density", style = "kmeans", palette = colorRamp, n = 7, size = 0.1) + 
  tm_layout(legend.outside = TRUE, 
            main.title = title , main.title.size = 1)


## ----message=FALSE, warning=FALSE, eval = FALSE-------------------------------
#  # setting the multisession plan
#  future::plan(future::multisession(workers=2))
#  
#  # then applying the NKDE
#  densities_mc <- nkde.mc(mtl_network,
#                    events = bike_accidents,
#                    w = rep(1,nrow(bike_accidents)),
#                    samples = samples,
#                    kernel_name = "quartic",
#                    bw = 300, div= "bw",
#                    method = "discontinuous", digits = 1, tol = 1,
#                    grid_shape = c(2,2), # splitting the study area in 4 rectangles
#                    max_depth = 8,
#                    agg = 5, #we aggregate events within a 5m radius
#                    sparse = TRUE,
#                    verbose = FALSE)
#  
#  # let's set back the classical sequential plan
#  if (!inherits(future::plan(), "sequential")) future::plan(future::sequential)

## ----message=FALSE, warning=FALSE---------------------------------------------
# we can compare the previous result and the new one
diff <- sum(abs(densities - densities_mc))
print(paste("overall difference between the regular and paralellized method : ",round(diff,12),sep=""))


## ----message=FALSE, warning=FALSE, eval = FALSE-------------------------------
#  adapt_densities <- nkde(mtl_network,
#                    events = bike_accidents,
#                    w = rep(1,nrow(bike_accidents)),
#                    samples = samples,
#                    kernel_name = "quartic",
#                    bw = 300, div= "bw",
#                    adaptive = TRUE, # we use here an adaptive bandwidth
#                    trim_bw = 600, # the maximum local values of bandwidth will be 600m
#                    method = "discontinuous", digits = 1, tol = 1,
#                    grid_shape = c(1,1), max_depth = 16,
#                    agg = 5, #we aggregate events within a 5m radius (faster calculation)
#                    sparse = TRUE,
#                    verbose=FALSE)
#  
#  samples$density <- adapt_densities$k

## ----message=FALSE, warning=FALSE---------------------------------------------
samples$density <- adapt_densities$k

## ----message=FALSE, warning=FALSE---------------------------------------------
circles <- st_buffer(adapt_densities$events,
                     dist = adapt_densities$events$bw)

ids <- c(1,52,20,86,14,75,126,200,177)

tm_shape(mtl_network) + 
  tm_lines("black") + 
  tm_shape(bike_accidents) + 
  tm_dots("red", size = 0.2) + 
  tm_shape(circles[ids,]) + 
  tm_borders("blue", lwd = 2)

## ----echo=FALSE, message=FALSE, warning=FALSE---------------------------------
# rescaling to help the mapping
samples$density <- samples$density*1000

colorRamp <- brewer.pal(n = 7, name = "Spectral")
colorRamp <- rev(colorRamp)

samples2 <- samples[order(samples$density),]
title <- paste0("bike accident density by kilometres in 2016,",
                "\nwithin a radius of 300 metres (adaptive bandiwdth)")

tm_shape(mtl_network) + 
  tm_lines("black") + 
  tm_shape(samples2) + 
  tm_dots("density", style = "kmeans", palette = colorRamp, n = 7, size = 0.1) + 
  tm_layout(legend.outside = TRUE, 
            main.title = title, main.title.size = 1)


## ----message=FALSE, warning=FALSE---------------------------------------------
# selecting the events in a subset of the data
center_event <- bike_accidents[125,]
study_area <- st_buffer(center_event, dist = 800)
events_sel <- as.vector(st_intersects(bike_accidents, study_area, sparse = FALSE))
events <- subset(bike_accidents,events_sel)

# generating the sampling points
lines_sel <- as.vector(st_intersects(mtl_network, study_area, sparse = FALSE))
lines <- subset(mtl_network,lines_sel)

lixels <- lixelize_lines(lines,200,mindist = 50)
samples <- lines_center(lixels)

tm_shape(study_area) + 
  tm_borders("black", lwd = 2) + 
  tm_shape(lines) + 
  tm_lines("black") +
  tm_shape(events) + 
  tm_dots("red", size = 0.2)

## ----message=FALSE, warning=FALSE, eval = FALSE-------------------------------
#  # calculating the NKDE values, adjusted
#  adjusted_densities <- nkde(lines = mtl_network,
#                              events = events,
#                              w = rep(1,nrow(events)),
#                              samples = samples,
#                              kernel_name = "quartic",
#                              bw = 150,
#                              adaptive = FALSE,
#                              method = "discontinuous",
#                              div = "bw",
#                              diggle_correction = TRUE, study_area = study_area,
#                              max_depth = 15,
#                              digits = 2,tol = 0.1,agg = 5,sparse = TRUE,
#                              grid_shape = c(1,1),verbose = FALSE)
#  
#  samples$density <- adjusted_densities

## ----message=FALSE, warning=FALSE---------------------------------------------
samples$density <- adjusted_densities * 1000

## ----echo=FALSE, message=FALSE, warning=FALSE---------------------------------
colorRamp <- brewer.pal(n = 7, name = "Spectral")
colorRamp <- rev(colorRamp)

title <- paste0("bike accident density by kilometres in 2016", 
                "\nwithin a radius of 150 metres")

tm_shape(lines) + 
  tm_lines("black") + 
  tm_shape(samples) + 
  tm_dots("density", palette = colorRamp, style = "kmeans", n = 7, size = 0.1) + 
  tm_layout(legend.outside = TRUE, 
            main.title = title, main.title.size = 1)
  

## ----eval = FALSE-------------------------------------------------------------
#  bws_selection_cv <- bw_cv_likelihood_calc(
#    bws = seq(50,700,50),
#    lines = mtl_network, events = bike_accidents,
#    w = rep(1,nrow(bike_accidents)),
#    kernel_name = "quartic", method = "discontinuous",
#    diggle_correction = FALSE, study_area = NULL,
#    max_depth = 8,
#    digits=2, tol=0.1, agg=5,
#    sparse=TRUE, grid_shape=c(1,1),
#    verbose=FALSE, check=TRUE)
#  
#  bws_selection_cvl <- bw_cvl_calc(
#    bws = seq(50,700,50),
#    lines = mtl_network, events = bike_accidents,
#    w = rep(1,nrow(bike_accidents)),
#    kernel_name = "quartic", method = "discontinuous",
#    diggle_correction = FALSE, study_area = NULL,
#    max_depth = 8,
#    digits=2, tol=0.1, agg=5,
#    sparse=TRUE, grid_shape=c(1,1),
#    verbose=FALSE, check=TRUE)
#  

## ----eval = FALSE-------------------------------------------------------------
#  bws_selection_cv_adpt_dis <- bw_cv_likelihood_calc(
#    bws = seq(50,700,50),
#    trim_bws = seq(50,700,50)*2,
#    lines = mtl_network,
#    events = bike_accidents,
#    w = rep(1,nrow(bike_accidents)),
#    adaptive = TRUE,
#    kernel_name = "quartic",
#    method = "discontinuous",
#    diggle_correction = FALSE,
#    study_area = NULL,
#    max_depth = 8,
#    digits=2,
#    tol=0.1,
#    agg=5,
#    sparse=TRUE,
#    grid_shape=c(1,1),
#    verbose=TRUE,
#    check=TRUE)
#  
#  bws_selection_cv_adpt_cont <- bw_cv_likelihood_calc(
#    bws = seq(50,700,50),
#    trim_bws = seq(50,700,50)*2,
#    lines = mtl_network,
#    events = bike_accidents,
#    w = rep(1,nrow(bike_accidents)),
#    adaptive = TRUE,
#    kernel_name = "quartic",
#    method = "continuous",
#    diggle_correction = FALSE,
#    study_area = NULL,
#    max_depth = 8,
#    digits=2,
#    tol=0.1,
#    agg=5,
#    sparse=TRUE,
#    grid_shape=c(1,1),
#    verbose=TRUE,
#    check=TRUE)
#  
#  cv_values <- data.frame(
#    "bw" = bws_selection_cv$bw,
#    "cv_likelihood" = bws_selection_cv$cv_scores,
#    "cvl_crit" = bws_selection_cvl$cvl_scores,
#    "cv_likelihood_adpt_dis" = bws_selection_cv_adpt_dis$cv_scores,
#    "cv_likelihood_adpt_cont" = bws_selection_cv_adpt_cont$cv_scores
#  )

## ----echo=FALSE---------------------------------------------------------------
knitr::kable(cv_values, digits = 2,row.names = FALSE)

## ----include = FALSE----------------------------------------------------------
# reset all the user parameters
options(backup_option)
setwd(base_wd)
oldpar <- par(mfrow = c(1,2))
par(oldpar)

Try the spNetwork package in your browser

Any scripts or data that you put into this service are public.

spNetwork documentation built on June 22, 2024, 9:40 a.m.