########################################################## #### Spatial analysis Ebola outbreak West Africa 2014 #### ########################################################## # load libraries library(geosphere) library(rjags) library(runjags) library(parallel) library(abind) # set working directory setwd("./Ebola") ############## Data ################### # load data data <- read.table(file = "./data/SpatialAnalysis_Ebola_data.txt", header = TRUE) # extract incidence data inc <- data[, grep("W", colnames(data))] row.names(inc) <- data[, "prefecture"] # extract country names country <- data[, "country"] # extract population sizes population <- data[, "pop.size"] # construct distance matrix from lon/lat coordinates lonlat <- data[, c("lon", "lat")] dist.matrix <- apply(lonlat, 1, FUN=function(X) distHaversine(X, lonlat, r=6378.137)) diag(dist.matrix) <- 1 # augment incidence data to include suspected cases cum.cases <- c("GUINEA" = 3652, "LIBERIA" = 10666, "SIERRA LEONE" = 12827) extra.cases <- c() nonzero.pos <- which(inc != 0, arr.ind = TRUE) for(ctry in c("GUINEA", "LIBERIA", "SIERRA LEONE")) { inc.ctry <- inc[country == ctry, ] nonzero.inc <- inc.ctry[inc.ctry != 0] extra.cases <- rbind(extra.cases, nonzero.pos[sample(which(nonzero.pos[,1]%in% which(country == ctry)), cum.cases[ctry] - sum(inc[country == ctry, ]), replace = TRUE, prob = nonzero.inc), ]) } extra.inc <- array(0, dim = dim(inc)) for(i in 1:nrow(extra.cases)) extra.inc[extra.cases[i,1], extra.cases[i,2]] <- extra.inc[extra.cases[i,1], extra.cases[i,2]] + 1 inc <- inc + extra.inc # convolution of serial interval distribution (weights) and incidence data weights <- c(0.3655, 0.3526, 0.1499, 0.0700, 0.0336, 0.0164, 0.0080, 0.0040) wmax <- length(weights) weightedinc <- array(0, dim = dim(inc)) for(i in 1:nrow(inc)) { for(j in 2:ncol(inc)) { weightedinc[i, j] <- sum(weights[1:min(wmax, j-1)]*inc[i, (j-1):max(1,j-wmax)]) } } ############## Analysis with JAGS ################### # input data.list = list( n.weeks = ncol(inc), n.districts = nrow(inc), dist.matrix = dist.matrix, country = country, weightedinc = weightedinc, population = population, inc.matrix = as.matrix(inc)) #Nodes to monitor parameters=c("alpha", "dG", "dL", "dS", "dGL", "dGS", "dLG", "dLS", "dSG", "dSL", "fG", "fL", "fS", "R2") # draw random initial values init.values <- function() { list(alpha = runif(1, min = 0, max = 2), fG = runif(1, min = 0.05, max = 0.15), fL = runif(1, min = 0.05, max = 0.15), fS = runif(1, min = 0.05, max = 0.15), dG = runif(1, min = 1, max = 4), dL = runif(1, min = 1, max = 4), dS = runif(1, min = 1, max = 4), dGL = runif(1, min = 1, max = 4), dGS = runif(1, min = 1, max = 4), dLS = runif(1, min = 1, max = 4) ) } # ten sets of initial values init.list <- replicate(10, init.values(), simplify = FALSE) system.time ( res <- run.jags( model = "model { for(i in 1:n.districts) { for(j in 1:n.districts) { gravity[i, j] <- (population[j]^alpha)*(dist.matrix[i, j]^(-delta[country[i], country[j]])) } } for(i in 1:n.districts) { tot[i] <- sum(gravity[i, ]) - (population[i]^alpha)*(dist.matrix[i, i]^(-delta[country[i], country[i]])) for(j in 1:n.districts) { normgravity[i, j] <- frac[country[i]]*gravity[i, j]/tot[i] } } for(i in 1:n.districts) { for(j in 1:n.weeks) { R2[i, j] ~ dgamma(2, 2/1) lambda[i, j] <- weightedinc[i, j]*R2[i, j] } } for(i in 1:n.districts) { infpres[i, 1] <- 0 inc.matrix[i, 1] ~ dpois(1) } for(i in 1:n.districts) { for(j in 2:n.weeks) { infpres[i, j] <- (1-frac[country[i]])*lambda[i, j] + sum(normgravity[, i]*lambda[, j]) - normgravity[i, i]*lambda[i, j] inc.matrix[i, j] ~ dpois(infpres[i, j]) } } delta[1, 1] <- dG delta[2, 2] <- dL delta[3, 3] <- dS delta[1, 2] <- dGL delta[1, 3] <- dGS delta[2, 1] <- dLG delta[2, 3] <- dLS delta[3, 1] <- dSG delta[3, 2] <- dSL frac[1] <- fG frac[2] <- fL frac[3] <- fS alpha ~ dunif(-1, 6) fG ~ dbeta(1,9) fL ~ dbeta(1,9) fS ~ dbeta(1,9) dG ~ dunif(-1, 6) dL ~ dunif(-1, 6) dS ~ dunif(-1, 6) dGL ~ dunif(-1, 6) dLG ~ dunif(-1, 6) dGS <- dGL dSG ~ dunif(-1, 6) dLS <- dLG dSL <- dSG }", monitor = parameters, data = data.list, n.chains = 10, inits = init.list, burnin = 100, sample = 500, adapt = 100, thin = 10, summarise = FALSE, method = "rjparallel") ) saveRDS(res, file = "./results/SpatialEbola_results.rds") ############## END ###################