# Test of biased prior approach to sampling bias with Merow et al. 2016 example dataset
require(raster)
require(maxnet)
require(bossMaps)
dir <- '~/Merow_et_al_2016_GEB_Minxent_Examples/Appendix_Data'
# function to normalize a raster (make it sum to unity
norm <- function(surf) {surf / sum(surf, na.rm = TRUE)}
envFiles <- list.files(paste0(dir, '/App1_Sampling_Bias/NE_ASCII'), pattern='.asc', full.names=TRUE)
env <- stack(envFiles)
bioEnv <- env[[grep('bio', names(env), value=TRUE)]]
anthropo <- env[[c('roads_max', 'pop_max')]]
occ <- read.csv(paste0(dir, '/App1_Sampling_Bias/CEOR_IPANE_5min_nodup.csv'), stringsAsFactors=FALSE)[,2:3]
targetocc <- read.csv(paste0(dir, '/App1_Sampling_Bias/Bias_IPANE_allPoints.csv'), stringsAsFactors=FALSE)[,2:3]
###############################
# Create sampling bias model in raw format
bg.coords <- sampleRandom(anthropo[[1]], 5000, xy=TRUE)[,1:2]
DFenvAbs <- extract(anthropo, bg.coords)
DFenvPres <- extract(anthropo, targetocc)
DFenvAbs <- DFenvAbs[complete.cases(DFenvAbs),]
DFenvPres <- DFenvPres[complete.cases(DFenvPres),]
bin <- c(rep(1, nrow(DFenvPres)), rep(0, nrow(DFenvAbs)))
DFenv <- as.data.frame(rbind(DFenvPres, DFenvAbs))
projDF <- as.data.frame(rasterToPoints(anthropo))
projDF <- projDF[complete.cases(projDF),]
cellsWithData <- cellFromXY(bioEnv, projDF[, 1:2])
biasmod <- maxnet(bin, DFenv, f=maxnet.formula(p=bin, data=DFenv, classes='lqp'))
biaspx <- predict(biasmod, projDF, type='exponential')[,1]
biaspx <- norm(biaspx)
biaspx <- rasterFromXYZ(cbind(allPts[,1:2], biaspx), crs = projection(anthropo))
plot(biaspx, col=hcols(100, bias=1))
##############################################
# Create focal species model for comparison
bg.coords <- sampleRandom(bioEnv[[1]], 5000, xy=TRUE)[,1:2]
DFenvAbs <- extract(bioEnv, bg.coords)
DFenvPres <- extract(bioEnv, occ)
DFenvAbs <- DFenvAbs[complete.cases(DFenvAbs),]
DFenvPres <- DFenvPres[complete.cases(DFenvPres),]
bin <- c(rep(1, nrow(DFenvPres)), rep(0, nrow(DFenvAbs)))
DFenv <- as.data.frame(rbind(DFenvPres, DFenvAbs))
projDF <- as.data.frame(rasterToPoints(bioEnv))
projDF <- projDF[complete.cases(projDF),]
cellsWithData <- cellFromXY(bioEnv, projDF[, 1:2])
noBias <- maxnet(bin, DFenv, f=maxnet.formula(p=bin, data=DFenv, classes='lqp'))
noBiaspx <- predict(noBias, projDF, type='exponential')[,1]
noBiaspx <- norm(noBiaspx)
noBiaspx <- rasterFromXYZ(cbind(projDF[,1:2], noBiaspx), crs = projection(bioEnv))
noBiaspx_cloglog <- predict(noBias, projDF, type='cloglog')[,1]
noBiaspx_cloglog <- rasterFromXYZ(cbind(projDF[,1:2], noBiaspx_cloglog), crs = projection(bioEnv))
################################################
# Create focal species model with biased prior
biaspx[is.na(biaspx)] <- 0
bg.coords <- xyFromCell(biaspx, sample(ncell(biaspx), 10000, prob=values(biaspx), replace = TRUE))
biaspx[biaspx == 0] <- NA
# plot(biaspx)
# points(bg.coords, cex=0.05)
DFenvAbs <- extract(bioEnv, bg.coords)
DFenvPres <- extract(bioEnv, occ)
DFenvAbs <- DFenvAbs[complete.cases(DFenvAbs),]
DFenvPres <- DFenvPres[complete.cases(DFenvPres),]
bin <- c(rep(1, nrow(DFenvPres)), rep(0, nrow(DFenvAbs)))
DFenv <- as.data.frame(rbind(DFenvPres, DFenvAbs))
projDF <- as.data.frame(rasterToPoints(bioEnv))
projDF <- projDF[complete.cases(projDF),]
cellsWithData <- cellFromXY(bioEnv, projDF[, 1:2])
mod <- maxnet(bin, DFenv, regmult=1, f=maxnet.formula(p=bin, data=DFenv, classes='lqp'))
# generate raw/exponential output
px <- predict(mod, projDF, type='exponential')[,1]
# normalize
px <- norm(px)
# factor out the bias grid
# This step does not seem to have been done in the code example
# in the appendix of Merow et al. 2016, but I think you are supposed to
px <- px / values(biaspx)[cellsWithData]
# normalize the result so that it once again sums to unity
px <- norm(px)
px_raw <- rasterFromXYZ(cbind(projDF[,1:2], px))
# produce cloglog output
entrop <- -sum(px * log(px), na.rm=TRUE)
px <- 1 - exp(0 - exp(entrop + log(px)))
px_cloglog <- rasterFromXYZ(cbind(projDF[,1:2], px))
par(mfrow=c(1,3))
plot(biaspx, col=hcols(100, bias=1), box=FALSE, axes=FALSE)
title('bias grid')
plot(noBiaspx, col=hcols(100, bias=2), box=FALSE, axes=FALSE)
title('no bias correction')
plot(px_raw, col=hcols(100, bias=1), box=FALSE, axes=FALSE)
title('with bias correction')