From d86efa3c8e767c89cc47a863631084cef0c9b386 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 6 Jul 2023 10:03:49 +0100 Subject: [PATCH 01/44] fix typo and simplify summary output --- R/summary.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/summary.R b/R/summary.R index 2a744e1..cf3c3ec 100644 --- a/R/summary.R +++ b/R/summary.R @@ -118,14 +118,14 @@ summary.disag_data <- function(object, ...) { n_polygons <- nrow(object$polygon_shapefile) n_covariates <- raster::nlayers(object$covariate_rasters) - cat(paste("They data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) + cat(paste("The data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) cat(paste("The largest polygon contains", max(table(object$covariate_data[ , object$shapefile_names$id_var])), "pixels", "and the smallest polygon contains", min(table(object$covariate_data[ , object$shapefile_names$id_var])), "pixels\n")) cat(paste("There are", n_covariates, "covariates\n")) - covariate_summary <- summary(object$covariate_data[ , names(object$covariate_rasters)]) + covariate_summary <- summary(object$covariate_rasters) cat("\nCovariate summary:\n") print(covariate_summary) @@ -241,4 +241,4 @@ print.disag_prediction <- function(x, ...){ cat(paste0('There are ', raster::nlayers(x$uncertainty_prediction$realisations), ' uncertainty realisations')) return(invisible(x)) -} \ No newline at end of file +} From c78f11b8e7428dc429133ca341e99fe04e8d8fe6 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Wed, 19 Jun 2024 12:10:36 +0100 Subject: [PATCH 02/44] fix iid_effect predictions aknandi/disaggregation#90 --- R/predict.R | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/R/predict.R b/R/predict.R index 6cbfc67..d1b1097 100644 --- a/R/predict.R +++ b/R/predict.R @@ -275,11 +275,7 @@ setup_objects <- function(model_output, newdata = NULL, predict_iid = FALSE) { area_id = factor(model_output$data$polygon_data$area_id)) } - shapefile_raster <- terra::rasterize(tmp_shp, - model_output$data$covariate_rasters, - field = 'area_id') - shapefile_ids <- terra::unique(shapefile_raster) - iid_objects <- list(shapefile_raster = shapefile_raster, shapefile_ids = shapefile_ids) + iid_objects <- list(shapefile = tmp_shp, template = model_output$data$covariate_rasters) } else { iid_objects <- NULL } @@ -320,23 +316,22 @@ predict_single_raster <- function(model_parameters, objects, link_function) { } if(!is.null(objects$iid_objects)) { - iid_ras <- objects$iid_objects$shapefile_raster + + objects$iid_objects$shapefile$iid <- model_parameters$iideffect + + iid_ras <- terra::rasterize(objects$iid_objects$shapefile, objects$iid_objects$template, field = 'iid') iideffect_sd <- 1/sqrt(exp(model_parameters$iideffect_log_tau)) - # todo - for(i in seq_along(model_parameters$iideffect)) { - targetvals <- terra::values(objects$iid_objects$shapefile_raster, - dataframe = FALSE, mat = FALSE) - whichvals <- which(targetvals == objects$iid_objects$shapefile_ids[1, i]) - terra::values(iid_ras)[whichvals] <- - model_parameters$iideffect[i] - na_pixels <- which(is.na(terra::values(iid_ras, dataframe = FALSE, mat = FALSE))) + + na_pixels <- which(is.na(terra::values(iid_ras, dataframe = FALSE, mat = FALSE))) + if (length(na_pixels) != 0){ na_iid_values <- stats::rnorm(length(na_pixels), 0, iideffect_sd) - terra::values(iid_ras)[na_pixels] <- na_iid_values + iid_ras[na_pixels] <- na_iid_values } + if(terra::ext(iid_ras) != terra::ext(linear_pred)) { # Extent of prediction space is different to the original model. Keep any overlapping iid values but predict to the new extent raster_new_extent <- linear_pred - terra::values(raster_new_extent) <- NA + raster_new_extent[1:terra::ncell(raster_new_extent)] <- NA #iid_ras <- terra::merge(iid_ras, raster_new_extent, ext = terra::ext(raster_new_extent)) # NOt sure why we no longer need the ext argument # SS - added a crop which I think does the same thing @@ -344,7 +339,7 @@ predict_single_raster <- function(model_parameters, objects, link_function) { iid_ras <- terra::crop(iid_ras, raster_new_extent) missing_pixels <- which(is.na(terra::values(iid_ras, dataframe = FALSE, mat = FALSE))) missing_iid_values <- stats::rnorm(length(missing_pixels), 0, iideffect_sd) - terra::values(iid_ras)[missing_pixels] <- missing_iid_values + iid_ras[missing_pixels] <- missing_iid_values } linear_pred <- linear_pred + iid_ras } else { From 82b1ea83313ea14b9a3c02d973fbf8661de265cb Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 08:45:22 +0100 Subject: [PATCH 03/44] alternative renaming aknandi/disaggregation#86 --- R/plotting.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index f9b9a2b..a887d76 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -156,8 +156,8 @@ plot_polygon_data <- function(polygon_shapefile, names) { # Rename the response variable for plotting shp <- polygon_shapefile - shp <- dplyr::rename(shp, 'response' = names$response_var) - shp <- dplyr::rename(shp, 'area_id' = names$id_var) + names(shp)[names(shp) == names$id_var] <- 'area_id' + names(shp)[names(shp) == names$response_var] <- 'response' area_id <- long <- lat <- group <- response <- NULL stopifnot(inherits(shp, 'sf')) From 6dfee7d4e73071329d787cc071d8b912ad66115e Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 09:09:29 +0100 Subject: [PATCH 04/44] migrate from INLA to rSPDE aknandi/disaggregation#80 --- DESCRIPTION | 3 +-- R/fit_model.R | 4 +++- tests/testthat/test-build-mesh.R | 2 -- tests/testthat/test-extract.R | 6 ------ tests/testthat/test-fit-model.R | 18 ------------------ tests/testthat/test-plotting.R | 11 ----------- tests/testthat/test-predict-model.R | 15 --------------- tests/testthat/test-prepare-data.R | 8 -------- tests/testthat/test-summary.R | 16 ---------------- vignettes/disaggregation.Rmd | 14 +++++--------- 10 files changed, 9 insertions(+), 88 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c49bce4..bf39cb2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,16 +26,15 @@ Imports: dplyr, ggplot2, cowplot, + rSPDE, sparseMVN, fmesher, tidyterra, terra, sf, utils -Additional_repositories: https://inla.r-inla-download.org/R/stable Suggests: testthat, - INLA, knitr, rmarkdown, SpatialEpi diff --git a/R/fit_model.R b/R/fit_model.R index e448890..ba9c769 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -356,7 +356,9 @@ make_model_object <- function(data, nu = 1 # Sort out mesh bits - spde <- (INLA::inla.spde2.matern(data$mesh, alpha = nu + 1)$param.inla)[c("M0", "M1", "M2")] + spde <- rSPDE::matern.operators(mesh = data$mesh, alpha = nu + 1, compute_higher_order = TRUE)$fem_mesh_matrices + spde[[4]] <- NULL + names(spde) <- c("M0", "M1", "M2") Apix <- fmesher::fm_evaluator(data$mesh, loc = data$coordsForFit)$proj$A n_s <- nrow(spde$M0) diff --git a/tests/testthat/test-build-mesh.R b/tests/testthat/test-build-mesh.R index 8bd19a2..812c96f 100644 --- a/tests/testthat/test-build-mesh.R +++ b/tests/testthat/test-build-mesh.R @@ -3,8 +3,6 @@ context("Build mesh") test_that("build_mesh behaves as expected", { - skip_on_cran() - my_mesh <- build_mesh(spdf) expect_error(build_mesh(response_df)) diff --git a/tests/testthat/test-extract.R b/tests/testthat/test-extract.R index 84ba7b4..582bda6 100644 --- a/tests/testthat/test-extract.R +++ b/tests/testthat/test-extract.R @@ -3,8 +3,6 @@ context("Extract covariates and polygon data") test_that("getPolygonData function", { - skip_on_cran() - expect_error(getPolygonData(spdf, id_var = 'id', response_var = 'response')) expect_error(getPolygonData(spdf, id_var = 'area_id', response_var = 'data')) @@ -29,8 +27,6 @@ test_that("getPolygonData function", { test_that("getCovariateData function gives errors when it should", { - skip_on_cran() - expect_error(getCovariateRasters('/home/rasters', '.tif$', spdf)) # Save .tif files in tempdir() @@ -43,8 +39,6 @@ test_that("getCovariateData function gives errors when it should", { test_that("extractCoordsForMesh function behaves as it should", { - skip_on_cran() - cov_data <- terra::extract(cov_stack, spdf, cells = TRUE, na.rm = TRUE, ID = TRUE) names(cov_data)[1] <- 'area_id' diff --git a/tests/testthat/test-fit-model.R b/tests/testthat/test-fit-model.R index a3a7774..8c88a1e 100644 --- a/tests/testthat/test-fit-model.R +++ b/tests/testthat/test-fit-model.R @@ -3,9 +3,6 @@ context("Fitting model") test_that("disag_model produces errors when expected", { - skip_if_not_installed('INLA') - skip_on_cran() - expect_error(disag_model(list())) expect_error(disag_model(test_data, iterations = 'iterations')) expect_error(disag_model(test_data, priors = list(polygon_sd_men = 0.3, polygon_sd_sd = 0.4))) @@ -17,9 +14,6 @@ test_that("disag_model produces errors when expected", { test_that("disag_model behaves as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iterations = 100, iid = FALSE) expect_is(result, 'disag_model') @@ -31,9 +25,6 @@ test_that("disag_model behaves as expected", { test_that("disag_model with 1 covariate behaves as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - test_data2 <- test_data test_data2$covariate_rasters <- test_data2$covariate_rasters[[1]] test_data2$covariate_data <- test_data2$covariate_data[, 1:3] @@ -53,9 +44,6 @@ test_that("disag_model with 1 covariate behaves as expected", { }) test_that("user defined model setup is working as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - binom_data <- prepare_data(polygon_shapefile = spdf_binom, covariate_rasters = cov_stack, sample_size_var = 'sample_size') @@ -96,9 +84,6 @@ test_that("user defined model setup is working as expected", { test_that("make_model_object behaves as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- make_model_object(test_data) expect_is(result, 'list') @@ -108,9 +93,6 @@ test_that("make_model_object behaves as expected", { test_that("setup_hess_control behaves as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - obj <- make_model_object(test_data) opt <- stats::nlminb(obj$par, obj$fn, obj$gr, control = list(iter.max = 2, trace = 0)) diff --git a/tests/testthat/test-plotting.R b/tests/testthat/test-plotting.R index ab0e0e6..87e6b86 100644 --- a/tests/testthat/test-plotting.R +++ b/tests/testthat/test-plotting.R @@ -2,8 +2,6 @@ context("Plotting data") test_that("Check plot_polygon_data function works as expected", { - skip_on_cran() - p <- plot_polygon_data(spdf, list(id_var = 'area_id', response_var = 'response')) expect_error(plot_polygon_data(polys, list(id_var = 'area_id', response_var = 'response'))) expect_is(p, 'ggplot') @@ -15,9 +13,6 @@ test_that("Check plot_polygon_data function works as expected", { test_that("Check plot.disag.data function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - test_data2 <- prepare_data(polygon_shapefile = spdf2, covariate_rasters = cov_stack, response_var = 'n_positive') @@ -44,9 +39,6 @@ test_that("Check plot.disag.data function works as expected", { test_that("Check plot.disag_model function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - fit_result <- disag_model(test_data, iterations = 10) fit_result_nofield <- disag_model(test_data, iterations = 10, field = FALSE) @@ -66,9 +58,6 @@ test_that("Check plot.disag_model function works as expected", { test_that("Check plot.disag_prediction function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - fit_result <- disag_model(test_data, iterations = 1000, iid = TRUE, field = TRUE, diff --git a/tests/testthat/test-predict-model.R b/tests/testthat/test-predict-model.R index d2cd848..48ab497 100644 --- a/tests/testthat/test-predict-model.R +++ b/tests/testthat/test-predict-model.R @@ -2,9 +2,6 @@ context("Predict model") test_that("Check predict.disag_model function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iterations = 1000, iid = TRUE, field = TRUE, @@ -96,9 +93,6 @@ test_that("Check predict.disag_model function works as expected", { test_that("Check predict.disag_model function works with newdata", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, field = FALSE, iid = TRUE, iterations = 100, priors = list(priormean_intercept = 0, priorsd_intercept = 1, @@ -143,9 +137,6 @@ test_that("Check predict.disag_model function works with newdata", { test_that('Check that check_newdata works', { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, field = FALSE, iterations = 100) newdata <- terra::crop(c(r, r2), c(0, 10, 0, 10)) @@ -170,9 +161,6 @@ test_that('Check that check_newdata works', { test_that('Check that setup_objects works', { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iterations = 100, iid = TRUE, field = TRUE, @@ -217,9 +205,6 @@ test_that('Check that setup_objects works', { test_that('Check that predict_single_raster works', { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iterations = 100, iid = TRUE, field = TRUE, diff --git a/tests/testthat/test-prepare-data.R b/tests/testthat/test-prepare-data.R index f71c4dd..53c0508 100644 --- a/tests/testthat/test-prepare-data.R +++ b/tests/testthat/test-prepare-data.R @@ -2,8 +2,6 @@ context("Preparing data") test_that("Check prepare_data function works as expected", { - skip_on_cran() - result <- prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack) @@ -29,8 +27,6 @@ test_that("Check prepare_data function works as expected", { test_that("Check prepare_data function with sample size works as expected", { - skip_on_cran() - result <- prepare_data(polygon_shapefile = spdf_binom, covariate_rasters = cov_stack, sample_size_var = 'sample_size', @@ -58,8 +54,6 @@ test_that("Check prepare_data function with sample size works as expected", { test_that("Check prepare_data function deals with NAs as expected", { - skip_on_cran() - cov_stack_na <- cov_stack cov_stack_na[[1]][c(1:10)] <- NA @@ -100,8 +94,6 @@ test_that("Check prepare_data function deals with NAs as expected", { test_that("Check as.disag_data function works as expected", { - skip_on_cran() - polygon_data <- getPolygonData(spdf, id_var = 'area_id', response_var = 'response') cov_data <- terra::extract(cov_stack, spdf, cells=TRUE, na.rm=TRUE, ID=TRUE) diff --git a/tests/testthat/test-summary.R b/tests/testthat/test-summary.R index 0538441..0fcf7b0 100644 --- a/tests/testthat/test-summary.R +++ b/tests/testthat/test-summary.R @@ -2,8 +2,6 @@ context("Summary functions") test_that("Check summary.disag_data function works as expected", { - skip_on_cran() - data_summary <- summary(test_data) expect_is(data_summary, 'list') @@ -18,8 +16,6 @@ test_that("Check summary.disag_data function works as expected", { test_that("Check print.disag_data function works as expected", { - skip_on_cran() - print_output <- print(test_data) expect_is(print_output, 'disag_data') @@ -29,9 +25,6 @@ test_that("Check print.disag_data function works as expected", { test_that("Check summary.disag_model function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, field = FALSE, iterations = 2) model_summary <- summary(result) @@ -48,9 +41,6 @@ test_that("Check summary.disag_model function works as expected", { test_that("Check print.disag_model function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, field = FALSE, iterations = 2) print_output <- print(result) @@ -62,9 +52,6 @@ test_that("Check print.disag_model function works as expected", { test_that("Check summary.disag_predictions function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iid = FALSE, iterations = 100, list(priormean_intercept = 0, priorsd_intercept = 0.1, @@ -92,9 +79,6 @@ test_that("Check summary.disag_predictions function works as expected", { test_that("Check print.disag_predictions function works as expected", { - skip_if_not_installed('INLA') - skip_on_cran() - result <- disag_model(test_data, iid = FALSE, iterations = 100, list(priormean_intercept = 0, priorsd_intercept = 0.1, diff --git a/vignettes/disaggregation.Rmd b/vignettes/disaggregation.Rmd index 9892b98..6011bcd 100644 --- a/vignettes/disaggregation.Rmd +++ b/vignettes/disaggregation.Rmd @@ -19,10 +19,6 @@ knitr::opts_chunk$set( ) ``` -```{r, echo = FALSE, eval = TRUE} -isINLA <- requireNamespace('INLA', quietly = TRUE) -``` - The **disaggregation** package contains functions to run Bayesian disaggregation models. Aggregated response data over large heterogeneous regions can be used alongside fine-scale covariate information to predict fine-scale response across the region. The github page for this package can be found [here](https://github.com/aknandi/disaggregation). Install **disaggregation** using: @@ -112,7 +108,7 @@ Now we have setup the data we can use the `prepare_data` function to create the The user can also control the parameters of the mesh that is used to create the spatial field. The mesh is created by finding a tight boundary around the polygon data, and creating a fine mesh within the boundary and a coarser mesh outside. This speeds up computation time by only having a very fine mesh within the area of interest and having a small region outside with a coarser mesh to avoid edge effects. The mesh parameters: `concave`, `convex` and `resolution` refer to the parameters used to create the mesh boundary using the [fm_nonconvex_hull_inla function](https://rdrr.io/cran/fmesher/man/fm_nonconvex_hull_inla.html), while the mesh parameters `max.edge`, `cut` and `offset` refer to the parameters used to create the mesh using the [fm_mesh_2d function](https://rdrr.io/cran/fmesher/man/fm_mesh_2d.html). -```{r, fig.show='hold', eval= isINLA} +```{r, fig.show='hold'} data_for_model <- prepare_data(polygon_shapefile = df, covariate_rasters = cov_stack, aggregation_raster = pop_raster, @@ -125,7 +121,7 @@ data_for_model <- prepare_data(polygon_shapefile = df, na.action = TRUE) ``` -```{r, fig.show='hold', eval= isINLA} +```{r, fig.show='hold'} plot(data_for_model) ``` @@ -164,7 +160,7 @@ $dpois(y_j, cases_j)$ By default the model contains a spatial field and a polygon iid effect. These can be turned off in the `disag_model` function, using `field = FALSE` or `iid = FALSE`. -```{r, fig.show='hold', eval=isINLA} +```{r, fig.show='hold'} model_result <- disag_model(data_for_model, iterations = 1000, family = 'poisson', @@ -181,14 +177,14 @@ model_result <- disag_model(data_for_model, prior_iideffect_sd_prob = 0.01)) ``` -```{r, fig.show='hold', eval=isINLA} +```{r, fig.show='hold'} plot(model_result) ``` Now we have the results from the model of the fitted parameters, we can predict Leukemia incidence rate at fine-scale (the scale of the covariate data) across New York. The `predict` function takes the model result and predicts both the mean raster surface and predicts and summarises `N` parameter draws, where `N` is set by the user (default 100). The uncertainty is summarised via the confidence interval set by the user (default 95% CI). -```{r, fig.show='hold', eval=isINLA} +```{r, fig.show='hold'} preds <- predict(model_result, N = 100, CI = 0.95) From 2c88e04a377960d2560c45207609ca132869020c Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 09:33:47 +0100 Subject: [PATCH 05/44] rename parameters aknandi/disaggregation#83 --- R/prepare_data.R | 39 ++++++++++++++++++++++++------ tests/testthat/test-prepare-data.R | 12 ++++----- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/R/prepare_data.R b/R/prepare_data.R index f95cd31..05f50f1 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -32,9 +32,12 @@ #' @param id_var Name of column in sf object with the polygon id. #' @param response_var Name of column in sf object with the response data. #' @param sample_size_var For survey data, name of column in sf object (if it exists) with the sample size data. -#' @param mesh.args list of parameters that control the mesh structure with the same names as used by INLA. -#' @param na.action logical. If TRUE, NAs in response will be removed, covariate NAs will be given the median value, aggregation NAs will be set to zero. Default FALSE (NAs in response or covariate data within the polygons will give errors). -#' @param makeMesh logical. If TRUE, build INLA mesh, takes some time. Default TRUE. +#' @param mesh_args list of parameters that control the mesh structure with the same names as used by INLA. +#' @param na_action logical. If TRUE, NAs in response will be removed, covariate NAs will be given the median value, aggregation NAs will be set to zero. Default FALSE (NAs in response or covariate data within the polygons will give errors). +#' @param make_mesh logical. If TRUE, build INLA mesh, takes some time. Default TRUE. +#' @param mesh.args Deprecated. +#' @param na.action Deprecated. +#' @param makeMesh Deprecated. #' @param ncores Deprecated. #' #' @return A list is returned of class \code{disag_data}. @@ -91,13 +94,35 @@ prepare_data <- function(polygon_shapefile, id_var = 'area_id', response_var = 'response', sample_size_var = NULL, + mesh_args = NULL, + na_action = FALSE, + make_mesh = TRUE, mesh.args = NULL, - na.action = FALSE, - makeMesh = TRUE, + na.action = NULL, + makeMesh = NULL, ncores = NULL) { - if (!missing("ncores")) - warning("The ncores argument has been deprecated") + # Deal with deprecated parameters + + if (!is.null(na.action) && missing(na_action)) { + na_action <- na.action + message("na.action is deprecated and will be removed in a future version - please use na_action instead") + } + + # Handle mesh.args / mesh_args + if (!is.null(mesh.args) && missing(mesh_args)) { + mesh_args <- mesh.args + message("mesh.args is deprecated and will be removed in a future version - please use mesh_args instead") + } + + # Handle makeMesh / make_mesh + if (!is.null(makeMesh) && missing(make_mesh)) { + make_mesh <- makeMesh + message("makeMesh is deprecated and will be removed in a future version - please use make_mesh instead") + } + + if (!missing("ncores")) + warning("ncores is deprecated and will be removed in a future version") stopifnot(inherits(polygon_shapefile, 'sf')) stopifnot(inherits(covariate_rasters, 'SpatRaster')) diff --git a/tests/testthat/test-prepare-data.R b/tests/testthat/test-prepare-data.R index 53c0508..1723a43 100644 --- a/tests/testthat/test-prepare-data.R +++ b/tests/testthat/test-prepare-data.R @@ -30,7 +30,7 @@ test_that("Check prepare_data function with sample size works as expected", { result <- prepare_data(polygon_shapefile = spdf_binom, covariate_rasters = cov_stack, sample_size_var = 'sample_size', - makeMesh = FALSE) + make_mesh = FALSE) expect_is(result, 'disag_data') expect_equal(length(result), 10) @@ -60,15 +60,15 @@ test_that("Check prepare_data function deals with NAs as expected", { aggregation_raster_na <- r aggregation_raster_na[c(1:10)] <- NA - expect_error(prepare_data(polygon_shapefile = spdf_na, covariate_rasters = cov_stack, makeMesh = FALSE)) - expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack_na, makeMesh = FALSE)) - expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack, aggregation_raster = aggregation_raster_na, makeMesh = FALSE)) + expect_error(prepare_data(polygon_shapefile = spdf_na, covariate_rasters = cov_stack, make_mesh = FALSE)) + expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack_na, make_mesh = FALSE)) + expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack, aggregation_raster = aggregation_raster_na, make_mesh = FALSE)) result <- prepare_data(polygon_shapefile = spdf_na, covariate_rasters = cov_stack_na, aggregation_raster = aggregation_raster_na, - na.action = TRUE, - makeMesh = FALSE) + na_action = TRUE, + make_mesh = FALSE) expect_is(result, 'disag_data') expect_equal(length(result), 10) From 99f786555b9869f914ab7b0311115e68a83d8270 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 11:33:23 +0100 Subject: [PATCH 06/44] More renaming of parameters aknandi/disaggregation#83 --- R/build_mesh.R | 14 ++++++++++---- R/prepare_data.R | 18 ++++++++---------- man/build_mesh.Rd | 6 ++++-- man/prepare_data.Rd | 19 ++++++++++++++----- tests/testthat/test-build-mesh.R | 4 ++-- vignettes/disaggregation.Rmd | 4 ++-- 6 files changed, 40 insertions(+), 25 deletions(-) diff --git a/R/build_mesh.R b/R/build_mesh.R index b005a55..8d774cb 100644 --- a/R/build_mesh.R +++ b/R/build_mesh.R @@ -14,9 +14,10 @@ #' pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(3.0, 8), cut = 0.4, offset = c(1, 15)). #' #' @param shapes sf covering the region under investigation. -#' @param mesh.args list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, +#' @param mesh_args list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, #' to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, #' with the parameters having the same meaning as in the INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}. +#' @param mesh.args Deprecated. #' #' @return An inla.mesh object #' @@ -43,10 +44,15 @@ #' #' @export -build_mesh <- function(shapes, mesh.args = NULL) { +build_mesh <- function(shapes, mesh_args = NULL) { + + if (!is.null(mesh.args) && missing(mesh_args)) { + mesh_args <- mesh.args + message("mesh.args is deprecated and will be removed in a future version - please use mesh_args instead") + } stopifnot(inherits(shapes, 'sf')) - if(!is.null(mesh.args)) stopifnot(inherits(mesh.args, 'list')) + if(!is.null(mesh_args)) stopifnot(inherits(mesh_args, 'list')) limits <- sf::st_bbox(shapes) hypotenuse <- sqrt((limits$xmax - limits$xmin)^2 + (limits$ymax - limits$ymin)^2) @@ -61,7 +67,7 @@ build_mesh <- function(shapes, mesh.args = NULL) { offset = c(hypotenuse / 10, hypotenuse / 10)) - pars[names(mesh.args)] <- mesh.args + pars[names(mesh_args)] <- mesh_args outline <- sf::st_sf(sf::st_union(sf::st_convex_hull(shapes))) diff --git a/R/prepare_data.R b/R/prepare_data.R index 05f50f1..1fb7b8a 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -109,13 +109,11 @@ prepare_data <- function(polygon_shapefile, message("na.action is deprecated and will be removed in a future version - please use na_action instead") } - # Handle mesh.args / mesh_args if (!is.null(mesh.args) && missing(mesh_args)) { mesh_args <- mesh.args message("mesh.args is deprecated and will be removed in a future version - please use mesh_args instead") } - # Handle makeMesh / make_mesh if (!is.null(makeMesh) && missing(make_mesh)) { make_mesh <- makeMesh message("makeMesh is deprecated and will be removed in a future version - please use make_mesh instead") @@ -129,12 +127,12 @@ prepare_data <- function(polygon_shapefile, if(!is.null(aggregation_raster)) stopifnot(inherits(aggregation_raster, 'SpatRaster')) stopifnot(inherits(id_var, 'character')) stopifnot(inherits(response_var, 'character')) - if(!is.null(mesh.args)) stopifnot(inherits(mesh.args, 'list')) + if(!is.null(mesh_args)) stopifnot(inherits(mesh_args, 'list')) # Check for NAs in response data na_rows <- is.na(polygon_shapefile[, response_var, drop = TRUE]) if(sum(na_rows) != 0) { - if(na.action) { + if(na_action) { polygon_shapefile <- polygon_shapefile[!na_rows, ] } else { stop('There are NAs in the response data. Please deal with these, or set na.action = TRUE') @@ -175,20 +173,20 @@ prepare_data <- function(polygon_shapefile, # Check for NAs in population data if(sum(is.na(aggregation_pixels)) != 0) { - if(na.action) { + if(na_action) { aggregation_pixels[is.na(aggregation_pixels)] <- 0 } else { - stop('There are NAs in the aggregation rasters within polygons. Please deal with these, or set na.action = TRUE') + stop('There are NAs in the aggregation rasters within polygons. Please deal with these, or set na_action = TRUE') } } # Check for NAs in covariate data if(sum(is.na(covariate_data)) != 0) { - if(na.action) { + if(na_action) { cov_filter <- !(names(covariate_data) %in% c(id_var,'cell')) covariate_data[ , cov_filter] <- sapply(covariate_data[ , cov_filter], function(x) { x[is.na(x)] <- stats::median(x, na.rm = T); return(x) }) } else { - stop('There are NAs in the covariate rasters within polygons. Please deal with these, or set na.action = TRUE') + stop('There are NAs in the covariate rasters within polygons. Please deal with these, or set na_action = TRUE') } } @@ -198,8 +196,8 @@ prepare_data <- function(polygon_shapefile, startendindex <- getStartendindex(covariate_data, polygon_data, id_var = id_var) - if(makeMesh) { - mesh <- build_mesh(polygon_shapefile, mesh.args) + if(make_mesh) { + mesh <- build_mesh(polygon_shapefile, mesh_args) } else { mesh <- NULL message("A mesh is not being built. You will not be able to run a spatial model without a mesh.") diff --git a/man/build_mesh.Rd b/man/build_mesh.Rd index 77561ca..bcf8683 100644 --- a/man/build_mesh.Rd +++ b/man/build_mesh.Rd @@ -4,14 +4,16 @@ \alias{build_mesh} \title{Build mesh for disaggregaton model} \usage{ -build_mesh(shapes, mesh.args = NULL) +build_mesh(shapes, mesh_args = NULL) } \arguments{ \item{shapes}{sf covering the region under investigation.} -\item{mesh.args}{list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, +\item{mesh_args}{list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, with the parameters having the same meaning as in the INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}.} + +\item{mesh.args}{Deprecated.} } \value{ An inla.mesh object diff --git a/man/prepare_data.Rd b/man/prepare_data.Rd index 5b5d5ab..d122228 100644 --- a/man/prepare_data.Rd +++ b/man/prepare_data.Rd @@ -11,9 +11,12 @@ prepare_data( id_var = "area_id", response_var = "response", sample_size_var = NULL, + mesh_args = NULL, + na_action = FALSE, + make_mesh = TRUE, mesh.args = NULL, - na.action = FALSE, - makeMesh = TRUE, + na.action = NULL, + makeMesh = NULL, ncores = NULL ) } @@ -30,11 +33,17 @@ prepare_data( \item{sample_size_var}{For survey data, name of column in sf object (if it exists) with the sample size data.} -\item{mesh.args}{list of parameters that control the mesh structure with the same names as used by INLA.} +\item{mesh_args}{list of parameters that control the mesh structure with the same names as used by INLA.} -\item{na.action}{logical. If TRUE, NAs in response will be removed, covariate NAs will be given the median value, aggregation NAs will be set to zero. Default FALSE (NAs in response or covariate data within the polygons will give errors).} +\item{na_action}{logical. If TRUE, NAs in response will be removed, covariate NAs will be given the median value, aggregation NAs will be set to zero. Default FALSE (NAs in response or covariate data within the polygons will give errors).} -\item{makeMesh}{logical. If TRUE, build INLA mesh, takes some time. Default TRUE.} +\item{make_mesh}{logical. If TRUE, build INLA mesh, takes some time. Default TRUE.} + +\item{mesh.args}{Deprecated.} + +\item{na.action}{Deprecated.} + +\item{makeMesh}{Deprecated.} \item{ncores}{Deprecated.} } diff --git a/tests/testthat/test-build-mesh.R b/tests/testthat/test-build-mesh.R index 812c96f..45cfdc6 100644 --- a/tests/testthat/test-build-mesh.R +++ b/tests/testthat/test-build-mesh.R @@ -6,8 +6,8 @@ test_that("build_mesh behaves as expected", { my_mesh <- build_mesh(spdf) expect_error(build_mesh(response_df)) - expect_error(build_mesh(spdf, mesh.args = c(4, 8))) + expect_error(build_mesh(spdf, mesh_args = c(4, 8))) expect_is(my_mesh, 'inla.mesh') - expect_is(build_mesh(spdf, mesh.args = list(max.edge = c(50, 100))), 'inla.mesh') + expect_is(build_mesh(spdf, mesh_args = list(max.edge = c(50, 100))), 'inla.mesh') }) diff --git a/vignettes/disaggregation.Rmd b/vignettes/disaggregation.Rmd index 6011bcd..d99c89f 100644 --- a/vignettes/disaggregation.Rmd +++ b/vignettes/disaggregation.Rmd @@ -114,11 +114,11 @@ data_for_model <- prepare_data(polygon_shapefile = df, aggregation_raster = pop_raster, response_var = 'cases', id_var = 'censustract.FIPS', - mesh.args = list(cut = 0.01, + mesh_args = list(cut = 0.01, offset = c(0.1, 0.5), max.edge = c(0.1, 0.2), resolution = 250), - na.action = TRUE) + na_action = TRUE) ``` ```{r, fig.show='hold'} From 7099b9e3240ba57c397824fa397323f31ef1ab56 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 11:46:59 +0100 Subject: [PATCH 07/44] Deprecate newdata > new_data and fix confidence > credible aknandi/disaggregation#87 --- R/predict.R | 82 +++++++++++++++++++++++--------------- man/predict.disag_model.Rd | 20 +++++++--- man/predict_model.Rd | 15 +++++-- man/predict_uncertainty.Rd | 15 ++++--- 4 files changed, 85 insertions(+), 47 deletions(-) diff --git a/R/predict.R b/R/predict.R index d1b1097..cf4754d 100644 --- a/R/predict.R +++ b/R/predict.R @@ -4,21 +4,22 @@ #' predicts mean and uncertainty maps. #' #' To predict over a different spatial extent to that used in the model, -#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. #' If this is not given predictions are made over the data used in the fit. #' #' The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. #' -#' For the uncertainty calculations, the number of the realisations and the size of the confidence interval to be calculated +#' For the uncertainty calculations, the number of the realisations and the size of the credible interval to be calculated #' are given by the arguments \emph{N} and \emph{CI} respectively. #' #' @param object disag_model object returned by disag_model function. -#' @param newdata If NULL, predictions are made using the data in model_output. +#' @param new_data If NULL, predictions are made using the data in model_output. #' If this is a raster stack or brick, predictions will be made over this data. #' @param predict_iid logical. If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE. #' @param N Number of realisations. Default: 100. -#' @param CI Confidence interval to be calculated from the realisations. Default: 0.95. +#' @param CI Credible interval to be calculated from the realisations. Default: 0.95. #' @param ... Further arguments passed to or from other methods. +#' @param newdata Deprecated. #' #' @return An object of class \emph{disag_prediction} which consists of a list of two objects: #' \item{mean_prediction }{List of: @@ -45,11 +46,16 @@ #' @export -predict.disag_model <- function(object, newdata = NULL, predict_iid = FALSE, N = 100, CI = 0.95, ...) { +predict.disag_model <- function(object, new_data = NULL, predict_iid = FALSE, N = 100, CI = 0.95, newdata = NULL, ...) { - mean_prediction <- predict_model(object, newdata = newdata, predict_iid) + if (!is.null(newdata) && missing(new_data)) { + new_data <- newdata + message("newdata is deprecated and will be removed in a future version - please use new_data instead") + } + + mean_prediction <- predict_model(object, new_data = new_data, predict_iid) - uncertainty_prediction <- predict_uncertainty(object, newdata = newdata, predict_iid, N, CI) + uncertainty_prediction <- predict_uncertainty(object, new_data = new_data, predict_iid, N, CI) prediction <- list(mean_prediction = mean_prediction, uncertainty_prediction = uncertainty_prediction) @@ -68,15 +74,16 @@ predict.disag_model <- function(object, newdata = NULL, predict_iid = FALSE, N = #' to the linear predictor. #' #' To predict over a different spatial extent to that used in the model, -#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. #' If this is not given predictions are made over the data used in the fit. #' #' The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. #' #' @param model_output disag_model object returned by disag_model function -#' @param newdata If NULL, predictions are made using the data in model_output. -#' If this is a raster stack or brick, predictions will be made over this data. Default NULL. +#' @param new_data If NULL, predictions are made using the data in model_output. +#' If this is a SpatRaster, predictions will be made over this data. Default NULL. #' @param predict_iid If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE. +#' @param newdata Deprecated. #' #' @return The mean prediction, which is a list of: #' \itemize{ @@ -95,9 +102,14 @@ predict.disag_model <- function(object, newdata = NULL, predict_iid = FALSE, N = #' #' @export -predict_model <- function(model_output, newdata = NULL, predict_iid = FALSE) { +predict_model <- function(model_output, new_data = NULL, predict_iid = FALSE, newdata = NULL) { - objects_for_prediction <- setup_objects(model_output, newdata = newdata, predict_iid) + if (!is.null(newdata) && missing(new_data)) { + new_data <- newdata + message("newdata is deprecated and will be removed in a future version - please use new_data instead") + } + + objects_for_prediction <- setup_objects(model_output, new_data = new_data, predict_iid) pars <- model_output$obj$env$last.par.best pars <- split(pars, names(pars)) @@ -118,20 +130,21 @@ predict_model <- function(model_output, newdata = NULL, predict_iid = FALSE) { #' Function returns a SpatRaster of the realisations as well as the upper and lower credible interval rasters. #' #' To predict over a different spatial extent to that used in the model, -#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +#' a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. #' If this is not given predictions are made over the data used in the fit. #' #' The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. #' -#' The number of the realisations and the size of the confidence interval to be calculated. +#' The number of the realisations and the size of the credible interval to be calculated. #' are given by the arguments \emph{N} and \emph{CI} respectively. #' #' @param model_output disag_model object returned by disag_model function. -#' @param newdata If NULL, predictions are made using the data in model_output. +#' @param new_data If NULL, predictions are made using the data in model_output. #' If this is a raster stack or brick, predictions will be made over this data. Default NULL. #' @param predict_iid If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE. #' @param N number of realisations. Default: 100. -#' @param CI confidence interval. Default: 0.95. +#' @param CI credible interval. Default: 0.95. +#' @param newdata Deprecated. #' #' @return The uncertainty prediction, which is a list of: #' \itemize{ @@ -148,9 +161,14 @@ predict_model <- function(model_output, newdata = NULL, predict_iid = FALSE) { #' #' @export -predict_uncertainty <- function(model_output, newdata = NULL, predict_iid = FALSE, N = 100, CI = 0.95) { +predict_uncertainty <- function(model_output, new_data = NULL, predict_iid = FALSE, N = 100, CI = 0.95, newdata = NULL) { + + if (!is.null(newdata) && missing(new_data)) { + new_data <- newdata + message("newdata is deprecated and will be removed in a future version - please use new_data instead") + } - objects_for_prediction <- setup_objects(model_output, newdata = newdata, predict_iid) + objects_for_prediction <- setup_objects(model_output, new_data = new_data, predict_iid) parameters <- model_output$obj$env$last.par.best @@ -218,34 +236,34 @@ getCoords <- function(data) { } # Helper to check and sort out new raster data. -check_newdata <- function(newdata, model_output){ - if(is.null(newdata)) return(NULL) - if(!is.null(newdata)){ - if(!(inherits(newdata, c('SpatRaster')))){ - stop('newdata should be NULL or a SpatRaster') +check_new_data <- function(new_data, model_output){ + if(is.null(new_data)) return(NULL) + if(!is.null(new_data)){ + if(!(inherits(new_data, c('SpatRaster')))){ + stop('new_data should be NULL or a SpatRaster') } - if(!all(names(model_output$data$covariate_rasters) %in% names(newdata))){ - stop('All covariates used to fit the model must be in newdata') + if(!all(names(model_output$data$covariate_rasters) %in% names(new_data))){ + stop('All covariates used to fit the model must be in new_data') } # Take just the covariates we need and in the right order - newdata <- newdata[[names(model_output$data$covariate_rasters)]] + new_data <- new_data[[names(model_output$data$covariate_rasters)]] } - return(newdata) + return(new_data) } # Function to setup covariates, field and iid objects for prediction -setup_objects <- function(model_output, newdata = NULL, predict_iid = FALSE) { +setup_objects <- function(model_output, new_data = NULL, predict_iid = FALSE) { - newdata <- check_newdata(newdata, model_output) + new_data <- check_new_data(new_data, model_output) # Pull out original data data <- model_output$data # Decide which covariates to predict over - if(is.null(newdata)){ + if(is.null(new_data)){ covariates <- data$covariate_rasters } else { - covariates <- newdata + covariates <- new_data } data$covariate_rasters <- covariates @@ -256,7 +274,7 @@ setup_objects <- function(model_output, newdata = NULL, predict_iid = FALSE) { } if(model_output$model_setup$field) { - if(is.null(newdata)) { + if(is.null(new_data)) { coords <- data$coordsForPrediction } else { coords <- getCoords(data) diff --git a/man/predict.disag_model.Rd b/man/predict.disag_model.Rd index f85ed7a..aac2536 100644 --- a/man/predict.disag_model.Rd +++ b/man/predict.disag_model.Rd @@ -4,19 +4,29 @@ \alias{predict.disag_model} \title{Predict mean and uncertainty from the disaggregation model result} \usage{ -\method{predict}{disag_model}(object, newdata = NULL, predict_iid = FALSE, N = 100, CI = 0.95, ...) +\method{predict}{disag_model}( + object, + new_data = NULL, + predict_iid = FALSE, + N = 100, + CI = 0.95, + newdata = NULL, + ... +) } \arguments{ \item{object}{disag_model object returned by disag_model function.} -\item{newdata}{If NULL, predictions are made using the data in model_output. +\item{new_data}{If NULL, predictions are made using the data in model_output. If this is a raster stack or brick, predictions will be made over this data.} \item{predict_iid}{logical. If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE.} \item{N}{Number of realisations. Default: 100.} -\item{CI}{Confidence interval to be calculated from the realisations. Default: 0.95.} +\item{CI}{Credible interval to be calculated from the realisations. Default: 0.95.} + +\item{newdata}{Deprecated.} \item{...}{Further arguments passed to or from other methods.} } @@ -41,12 +51,12 @@ predicts mean and uncertainty maps. } \details{ To predict over a different spatial extent to that used in the model, -a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. If this is not given predictions are made over the data used in the fit. The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. -For the uncertainty calculations, the number of the realisations and the size of the confidence interval to be calculated +For the uncertainty calculations, the number of the realisations and the size of the credible interval to be calculated are given by the arguments \emph{N} and \emph{CI} respectively. } \examples{ diff --git a/man/predict_model.Rd b/man/predict_model.Rd index 3e0387a..d85d1c8 100644 --- a/man/predict_model.Rd +++ b/man/predict_model.Rd @@ -4,15 +4,22 @@ \alias{predict_model} \title{Function to predict mean from the model result} \usage{ -predict_model(model_output, newdata = NULL, predict_iid = FALSE) +predict_model( + model_output, + new_data = NULL, + predict_iid = FALSE, + newdata = NULL +) } \arguments{ \item{model_output}{disag_model object returned by disag_model function} -\item{newdata}{If NULL, predictions are made using the data in model_output. -If this is a raster stack or brick, predictions will be made over this data. Default NULL.} +\item{new_data}{If NULL, predictions are made using the data in model_output. +If this is a SpatRaster, predictions will be made over this data. Default NULL.} \item{predict_iid}{If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE.} + +\item{newdata}{Deprecated.} } \value{ The mean prediction, which is a list of: @@ -32,7 +39,7 @@ Function returns rasters of the mean predictions as well as the covariate and f to the linear predictor. To predict over a different spatial extent to that used in the model, -a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. If this is not given predictions are made over the data used in the fit. The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. diff --git a/man/predict_uncertainty.Rd b/man/predict_uncertainty.Rd index ccf361d..59373a2 100644 --- a/man/predict_uncertainty.Rd +++ b/man/predict_uncertainty.Rd @@ -6,23 +6,26 @@ \usage{ predict_uncertainty( model_output, - newdata = NULL, + new_data = NULL, predict_iid = FALSE, N = 100, - CI = 0.95 + CI = 0.95, + newdata = NULL ) } \arguments{ \item{model_output}{disag_model object returned by disag_model function.} -\item{newdata}{If NULL, predictions are made using the data in model_output. +\item{new_data}{If NULL, predictions are made using the data in model_output. If this is a raster stack or brick, predictions will be made over this data. Default NULL.} \item{predict_iid}{If TRUE, any polygon iid effect from the model will be used in the prediction. Default FALSE.} \item{N}{number of realisations. Default: 100.} -\item{CI}{confidence interval. Default: 0.95.} +\item{CI}{credible interval. Default: 0.95.} + +\item{newdata}{Deprecated.} } \value{ The uncertainty prediction, which is a list of: @@ -39,12 +42,12 @@ The uncertainty prediction, which is a list of: Function returns a SpatRaster of the realisations as well as the upper and lower credible interval rasters. To predict over a different spatial extent to that used in the model, -a SpatRaster covering the region to make predictions over is passed to the argument \emph{newdata}. +a SpatRaster covering the region to make predictions over is passed to the argument \emph{new_data}. If this is not given predictions are made over the data used in the fit. The \emph{predict_iid} logical flag should be set to TRUE if the results of the iid effect from the model are to be used in the prediction. -The number of the realisations and the size of the confidence interval to be calculated. +The number of the realisations and the size of the credible interval to be calculated. are given by the arguments \emph{N} and \emph{CI} respectively. } \examples{ From d2bef80bd9c0a673ff9f8b7e8e38c5d281aaf18a Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 12:13:35 +0100 Subject: [PATCH 08/44] remove deprecated fit_model --- NAMESPACE | 1 - R/deprecated.R | 11 - R/fit_model.R | 38 +--- R/prepare_data.R | 2 +- README.md | 4 +- man/{fit_model.Rd => disag_model.Rd} | 294 +++++++++++++-------------- man/disaggregation-deprecated.Rd | 14 -- man/prepare_data.Rd | 2 +- tests/testthat/Rplots.pdf | Bin 0 -> 169871 bytes vignettes/disaggregation.Rmd | 2 +- 10 files changed, 148 insertions(+), 220 deletions(-) delete mode 100644 R/deprecated.R rename man/{fit_model.Rd => disag_model.Rd} (92%) delete mode 100644 man/disaggregation-deprecated.Rd create mode 100644 tests/testthat/Rplots.pdf diff --git a/NAMESPACE b/NAMESPACE index 47705eb..9222c95 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -13,7 +13,6 @@ S3method(summary,disag_prediction) export(as.disag_data) export(build_mesh) export(disag_model) -export(fit_model) export(getCovariateRasters) export(getPolygonData) export(getStartendindex) diff --git a/R/deprecated.R b/R/deprecated.R deleted file mode 100644 index 5d3a206..0000000 --- a/R/deprecated.R +++ /dev/null @@ -1,11 +0,0 @@ -#' Deprecated functions in disaggregation -#' -#' These functions still work but will be removed (defunct) in the next version. -#' -#' \itemize{ -#' \item \code{\link{fit_model}}: This function is deprecated, and will -#' be removed in the next version of this package. -#' } -#' -#' @name disaggregation-deprecated -NULL \ No newline at end of file diff --git a/R/fit_model.R b/R/fit_model.R index ba9c769..61a6830 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -1,6 +1,6 @@ #' Fit the disaggregation model #' -#' \emph{fit_model} function takes a \emph{disag_data} object created by +#' \emph{disag_model} function takes a \emph{disag_data} object created by #' \code{\link{prepare_data}} and performs a Bayesian disaggregation fit. #' #' \strong{The model definition} @@ -66,7 +66,7 @@ #' \item{data }{The \emph{disag_data} object used as an input to the model.} #' \item{model_setup }{A list of information on the model setup. Likelihood function (\emph{family}), link function(\emph{link}), logical: whether a field was used (\emph{field}) and logical: whether an iid effect was used (\emph{iid}).} #' -#' @name fit_model +#' @name disag_model #' @references Nanda et al. (2023) disaggregation: An R Package for Bayesian #' Spatial Disaggregation Modeling. #' @@ -105,43 +105,11 @@ #' test_data <- prepare_data(polygon_shapefile = spdf, #' covariate_rasters = cov_stack) #' -#' result <- fit_model(test_data, iterations = 2) +#' result <- disag_model(test_data, iterations = 2) #' } #' #' @export -fit_model <- function(data, - priors = NULL, - family = 'gaussian', - link = 'identity', - iterations = 100, - field = TRUE, - iid = TRUE, - hess_control_parscale = NULL, - hess_control_ndeps = 1e-4, - silent = TRUE) { - - .Deprecated(new = 'disag_model', msg = "'fit_model' will be removed in the next version. Please use 'disag_model' instead") - - model_output <- disag_model(data, - priors = priors, - family = family, - link = link, - iterations = iterations, - field = field, - iid = iid, - hess_control_parscale = hess_control_parscale, - hess_control_ndeps = hess_control_ndeps, - silent = silent) - - return(model_output) - - -} - -#' @export -#' @rdname fit_model - disag_model <- function(data, priors = NULL, family = 'gaussian', diff --git a/R/prepare_data.R b/R/prepare_data.R index 1fb7b8a..aeb5cb7 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -1,7 +1,7 @@ #' Prepare data for disaggregation modelling #' #' \emph{prepare_data} function is used to extract all the data required for fitting a disaggregation model. -#' Designed to be used in the \emph{disaggregation::fit_model} function. +#' Designed to be used in the \emph{disaggregation::disag_model} function. #' #' Takes a sf object with the response data and a SpatRaster of covariates. #' diff --git a/README.md b/README.md index c0dd5ac..73ba4c0 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ data_for_model <- prepare_data(shps, covariate_stack, ## Model fitting -Function fit_model takes data structure returned by prepare_data and fits a TMB disaggregation model. Here you can specify priors, likelihood function, link function and whether to include a field or iid effect (default includes both) +Function disag_model takes data structure returned by prepare_data and fits a TMB disaggregation model. Here you can specify priors, likelihood function, link function and whether to include a field or iid effect (default includes both) ```R model_result <- disag_model(data_for_model, @@ -87,7 +87,7 @@ model_result <- disag_model(data_for_model, ### Predict model -Function predict takes data structure returned by fit_model to predict model results and uncertainty. +Function predict takes data structure returned by disag_model to predict model results and uncertainty. ```R prediction <- predict(model_result) diff --git a/man/fit_model.Rd b/man/disag_model.Rd similarity index 92% rename from man/fit_model.Rd rename to man/disag_model.Rd index 771fac7..e0aeb19 100644 --- a/man/fit_model.Rd +++ b/man/disag_model.Rd @@ -1,154 +1,140 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/fit_model.R -\name{fit_model} -\alias{fit_model} -\alias{disag_model} -\title{Fit the disaggregation model} -\usage{ -fit_model( - data, - priors = NULL, - family = "gaussian", - link = "identity", - iterations = 100, - field = TRUE, - iid = TRUE, - hess_control_parscale = NULL, - hess_control_ndeps = 1e-04, - silent = TRUE -) - -disag_model( - data, - priors = NULL, - family = "gaussian", - link = "identity", - iterations = 100, - field = TRUE, - iid = TRUE, - hess_control_parscale = NULL, - hess_control_ndeps = 1e-04, - silent = TRUE -) -} -\arguments{ -\item{data}{disag_data object returned by \code{\link{prepare_data}} function that contains all the necessary objects for the model fitting} - -\item{priors}{list of prior values} - -\item{family}{likelihood function: \emph{gaussian}, \emph{binomial} or \emph{poisson}} - -\item{link}{link function: \emph{logit}, \emph{log} or \emph{identity}} - -\item{iterations}{number of iterations to run the optimisation for} - -\item{field}{logical. Flag the spatial field on or off} - -\item{iid}{logical. Flag the iid effect on or off} - -\item{hess_control_parscale}{Argument to scale parameters during the calculation of the Hessian. -Must be the same length as the number of parameters. See \code{\link[stats]{optimHess}} for details.} - -\item{hess_control_ndeps}{Argument to control step sizes during the calculation of the Hessian. -Either length 1 (same step size applied to all parameters) or the same length as the number of parameters. -Default is 1e-3, try setting a smaller value if you get NaNs in the standard error of the parameters. -See \code{\link[stats]{optimHess}} for details.} - -\item{silent}{logical. Suppress verbose output.} -} -\value{ -A list is returned of class \code{disag_model}. -The functions \emph{summary}, \emph{print} and \emph{plot} can be used on \code{disag_model}. -The list of class \code{disag_model} contains: - \item{obj }{The TMB model object returned by \code{\link[TMB]{MakeADFun}}.} - \item{opt }{The optimized model object returned by \code{\link[stats]{nlminb}}.} - \item{sd_out }{The TMB object returned by \code{\link[TMB]{sdreport}}.} - \item{data }{The \emph{disag_data} object used as an input to the model.} - \item{model_setup }{A list of information on the model setup. Likelihood function (\emph{family}), link function(\emph{link}), logical: whether a field was used (\emph{field}) and logical: whether an iid effect was used (\emph{iid}).} -} -\description{ -\emph{fit_model} function takes a \emph{disag_data} object created by -\code{\link{prepare_data}} and performs a Bayesian disaggregation fit. -} -\details{ -\strong{The model definition} - -The disaggregation model makes predictions at the pixel level: -\deqn{link(pred_i) = \beta_0 + \beta X + GP(s_i) + u_i}{ link(predi) = \beta 0 + \beta X + GP + u} - -And then aggregates these predictions to the polygon level using the weighted sum (via the aggregation raster, \eqn{agg_i}{aggi}): -\deqn{cases_j = \sum_{i \epsilon j} pred_i \times agg_i}{ casesj = \sum (predi x aggi)} -\deqn{rate_j = \frac{\sum_{i \epsilon j} pred_i \times agg_i}{\sum_{i \epsilon j} agg_i}}{ratej = \sum(predi x aggi) / \sum (aggi)} - -The different likelihood correspond to slightly different models (\eqn{y_j}{yi} is the response count data): -\itemize{ - \item Gaussian: - If \eqn{\sigma} is the dispersion of the pixel data, \eqn{\sigma_j}{\sigmaj} is the dispersion of the polygon data, where - \eqn{\sigma_j = \sigma \sqrt{\sum agg_i^2} / \sum agg_i }{\sigmaj = \sigma x { \sqrt \sum (aggi ^ 2) } / \sum aggi} - \deqn{dnorm(y_j/\sum agg_i, rate_j, \sigma_j)}{dnorm(yj / \sum aggi, ratej, \sigmaj)} - predicts incidence rate. - \item Binomial: - For a survey in polygon j, \eqn{y_j}{yj} is the number positive and \eqn{N_j}{Nj} is the number tested. - \deqn{dbinom(y_j, N_j, rate_j)}{dbinom(yj, Nj, ratej)} - predicts prevalence rate. - \item Poisson: - \deqn{dpois(y_j, cases_j)}{dpois(yj, casesj)} - predicts incidence count. -} - -Specify priors for the regression parameters, field and iid effect as a single list. Hyperpriors for the field -are given as penalised complexity priors you specify \eqn{\rho_{min}} and \eqn{\rho_{prob}} for the range of the field -where \eqn{P(\rho < \rho_{min}) = \rho_{prob}}, and \eqn{\sigma_{min}} and \eqn{\sigma_{prob}} for the variation of the field -where \eqn{P(\sigma > \sigma_{min}) = \sigma_{prob}}. Also, specify pc priors for the iid effect - -The \emph{family} and \emph{link} arguments are used to specify the likelihood and link function respectively. -The likelihood function can be one of \emph{gaussian}, \emph{poisson} or \emph{binomial}. -The link function can be one of \emph{logit}, \emph{log} or \emph{identity}. -These are specified as strings. - -The field and iid effect can be turned on or off via the \emph{field} and \emph{iid} logical flags. Both are default TRUE. - -The \emph{iterations} argument specifies the maximum number of iterations the model can run for to find an optimal point. - -The \emph{silent} argument can be used to publish/suppress verbose output. Default TRUE. -} -\examples{ -\dontrun{ -polygons <- list() -n_polygon_per_side <- 10 -n_polygons <- n_polygon_per_side * n_polygon_per_side -n_pixels_per_side <- n_polygon_per_side * 2 - -for(i in 1:n_polygons) { - row <- ceiling(i/n_polygon_per_side) - col <- ifelse(i \%\% n_polygon_per_side != 0, i \%\% n_polygon_per_side, n_polygon_per_side) - xmin = 2*(col - 1); xmax = 2*col; ymin = 2*(row - 1); ymax = 2*row - polygons[[i]] <- list(cbind(c(xmin, xmax, xmax, xmin, xmin), - c(ymax, ymax, ymin, ymin, ymax))) -} - -polys <- lapply(polygons,sf::st_polygon) -N <- floor(runif(n_polygons, min = 1, max = 100)) -response_df <- data.frame(area_id = 1:n_polygons, response = runif(n_polygons, min = 0, max = 1000)) - -spdf <- sf::st_sf(response_df, geometry = polys) - -# Create raster stack -r <- terra::rast(ncol=n_pixels_per_side, nrow=n_pixels_per_side) -terra::ext(r) <- terra::ext(spdf) -r[] <- sapply(1:terra::ncell(r), function(x){ -rnorm(1, ifelse(x \%\% n_pixels_per_side != 0, x \%\% n_pixels_per_side, n_pixels_per_side), 3))} -r2 <- terra::rast(ncol=n_pixels_per_side, nrow=n_pixels_per_side) -terra::ext(r2) <- terra::ext(spdf) -r2[] <- sapply(1:terra::ncell(r), function(x) rnorm(1, ceiling(x/n_pixels_per_side), 3)) -cov_stack <- c(r, r2) -names(cov_stack) <- c('layer1', 'layer2') - -test_data <- prepare_data(polygon_shapefile = spdf, - covariate_rasters = cov_stack) - - result <- fit_model(test_data, iterations = 2) - } - -} -\references{ -Nanda et al. (2023) disaggregation: An R Package for Bayesian -Spatial Disaggregation Modeling. -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fit_model.R +\name{disag_model} +\alias{disag_model} +\title{Fit the disaggregation model} +\usage{ +disag_model( + data, + priors = NULL, + family = "gaussian", + link = "identity", + iterations = 100, + field = TRUE, + iid = TRUE, + hess_control_parscale = NULL, + hess_control_ndeps = 1e-04, + silent = TRUE +) +} +\arguments{ +\item{data}{disag_data object returned by \code{\link{prepare_data}} function that contains all the necessary objects for the model fitting} + +\item{priors}{list of prior values} + +\item{family}{likelihood function: \emph{gaussian}, \emph{binomial} or \emph{poisson}} + +\item{link}{link function: \emph{logit}, \emph{log} or \emph{identity}} + +\item{iterations}{number of iterations to run the optimisation for} + +\item{field}{logical. Flag the spatial field on or off} + +\item{iid}{logical. Flag the iid effect on or off} + +\item{hess_control_parscale}{Argument to scale parameters during the calculation of the Hessian. +Must be the same length as the number of parameters. See \code{\link[stats]{optimHess}} for details.} + +\item{hess_control_ndeps}{Argument to control step sizes during the calculation of the Hessian. +Either length 1 (same step size applied to all parameters) or the same length as the number of parameters. +Default is 1e-3, try setting a smaller value if you get NaNs in the standard error of the parameters. +See \code{\link[stats]{optimHess}} for details.} + +\item{silent}{logical. Suppress verbose output.} +} +\value{ +A list is returned of class \code{disag_model}. +The functions \emph{summary}, \emph{print} and \emph{plot} can be used on \code{disag_model}. +The list of class \code{disag_model} contains: + \item{obj }{The TMB model object returned by \code{\link[TMB]{MakeADFun}}.} + \item{opt }{The optimized model object returned by \code{\link[stats]{nlminb}}.} + \item{sd_out }{The TMB object returned by \code{\link[TMB]{sdreport}}.} + \item{data }{The \emph{disag_data} object used as an input to the model.} + \item{model_setup }{A list of information on the model setup. Likelihood function (\emph{family}), link function(\emph{link}), logical: whether a field was used (\emph{field}) and logical: whether an iid effect was used (\emph{iid}).} +} +\description{ +\emph{disag_model} function takes a \emph{disag_data} object created by +\code{\link{prepare_data}} and performs a Bayesian disaggregation fit. +} +\details{ +\strong{The model definition} + +The disaggregation model makes predictions at the pixel level: +\deqn{link(pred_i) = \beta_0 + \beta X + GP(s_i) + u_i}{ link(predi) = \beta 0 + \beta X + GP + u} + +And then aggregates these predictions to the polygon level using the weighted sum (via the aggregation raster, \eqn{agg_i}{aggi}): +\deqn{cases_j = \sum_{i \epsilon j} pred_i \times agg_i}{ casesj = \sum (predi x aggi)} +\deqn{rate_j = \frac{\sum_{i \epsilon j} pred_i \times agg_i}{\sum_{i \epsilon j} agg_i}}{ratej = \sum(predi x aggi) / \sum (aggi)} + +The different likelihood correspond to slightly different models (\eqn{y_j}{yi} is the response count data): +\itemize{ + \item Gaussian: + If \eqn{\sigma} is the dispersion of the pixel data, \eqn{\sigma_j}{\sigmaj} is the dispersion of the polygon data, where + \eqn{\sigma_j = \sigma \sqrt{\sum agg_i^2} / \sum agg_i }{\sigmaj = \sigma x { \sqrt \sum (aggi ^ 2) } / \sum aggi} + \deqn{dnorm(y_j/\sum agg_i, rate_j, \sigma_j)}{dnorm(yj / \sum aggi, ratej, \sigmaj)} - predicts incidence rate. + \item Binomial: + For a survey in polygon j, \eqn{y_j}{yj} is the number positive and \eqn{N_j}{Nj} is the number tested. + \deqn{dbinom(y_j, N_j, rate_j)}{dbinom(yj, Nj, ratej)} - predicts prevalence rate. + \item Poisson: + \deqn{dpois(y_j, cases_j)}{dpois(yj, casesj)} - predicts incidence count. +} + +Specify priors for the regression parameters, field and iid effect as a single list. Hyperpriors for the field +are given as penalised complexity priors you specify \eqn{\rho_{min}} and \eqn{\rho_{prob}} for the range of the field +where \eqn{P(\rho < \rho_{min}) = \rho_{prob}}, and \eqn{\sigma_{min}} and \eqn{\sigma_{prob}} for the variation of the field +where \eqn{P(\sigma > \sigma_{min}) = \sigma_{prob}}. Also, specify pc priors for the iid effect + +The \emph{family} and \emph{link} arguments are used to specify the likelihood and link function respectively. +The likelihood function can be one of \emph{gaussian}, \emph{poisson} or \emph{binomial}. +The link function can be one of \emph{logit}, \emph{log} or \emph{identity}. +These are specified as strings. + +The field and iid effect can be turned on or off via the \emph{field} and \emph{iid} logical flags. Both are default TRUE. + +The \emph{iterations} argument specifies the maximum number of iterations the model can run for to find an optimal point. + +The \emph{silent} argument can be used to publish/suppress verbose output. Default TRUE. +} +\examples{ +\dontrun{ +polygons <- list() +n_polygon_per_side <- 10 +n_polygons <- n_polygon_per_side * n_polygon_per_side +n_pixels_per_side <- n_polygon_per_side * 2 + +for(i in 1:n_polygons) { + row <- ceiling(i/n_polygon_per_side) + col <- ifelse(i \%\% n_polygon_per_side != 0, i \%\% n_polygon_per_side, n_polygon_per_side) + xmin = 2*(col - 1); xmax = 2*col; ymin = 2*(row - 1); ymax = 2*row + polygons[[i]] <- list(cbind(c(xmin, xmax, xmax, xmin, xmin), + c(ymax, ymax, ymin, ymin, ymax))) +} + +polys <- lapply(polygons,sf::st_polygon) +N <- floor(runif(n_polygons, min = 1, max = 100)) +response_df <- data.frame(area_id = 1:n_polygons, response = runif(n_polygons, min = 0, max = 1000)) + +spdf <- sf::st_sf(response_df, geometry = polys) + +# Create raster stack +r <- terra::rast(ncol=n_pixels_per_side, nrow=n_pixels_per_side) +terra::ext(r) <- terra::ext(spdf) +r[] <- sapply(1:terra::ncell(r), function(x){ +rnorm(1, ifelse(x \%\% n_pixels_per_side != 0, x \%\% n_pixels_per_side, n_pixels_per_side), 3))} +r2 <- terra::rast(ncol=n_pixels_per_side, nrow=n_pixels_per_side) +terra::ext(r2) <- terra::ext(spdf) +r2[] <- sapply(1:terra::ncell(r), function(x) rnorm(1, ceiling(x/n_pixels_per_side), 3)) +cov_stack <- c(r, r2) +names(cov_stack) <- c('layer1', 'layer2') + +test_data <- prepare_data(polygon_shapefile = spdf, + covariate_rasters = cov_stack) + + result <- disag_model(test_data, iterations = 2) + } + +} +\references{ +Nanda et al. (2023) disaggregation: An R Package for Bayesian +Spatial Disaggregation Modeling. +} diff --git a/man/disaggregation-deprecated.Rd b/man/disaggregation-deprecated.Rd deleted file mode 100644 index ad9c87d..0000000 --- a/man/disaggregation-deprecated.Rd +++ /dev/null @@ -1,14 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/deprecated.R -\name{disaggregation-deprecated} -\alias{disaggregation-deprecated} -\title{Deprecated functions in disaggregation} -\description{ -These functions still work but will be removed (defunct) in the next version. -} -\details{ -\itemize{ - \item \code{\link{fit_model}}: This function is deprecated, and will - be removed in the next version of this package. -} -} diff --git a/man/prepare_data.Rd b/man/prepare_data.Rd index d122228..b4e936d 100644 --- a/man/prepare_data.Rd +++ b/man/prepare_data.Rd @@ -63,7 +63,7 @@ The list of class \code{disag_data} contains: } \description{ \emph{prepare_data} function is used to extract all the data required for fitting a disaggregation model. -Designed to be used in the \emph{disaggregation::fit_model} function. +Designed to be used in the \emph{disaggregation::disag_model} function. } \details{ Takes a sf object with the response data and a SpatRaster of covariates. diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..640f790adf03dc80cf007ac7c33175f421e441ae GIT binary patch literal 169871 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%0A@HDf*TQewpBBSWr_KY3~OhKr;d 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%0A(ILi7as zN&b_HX9qsCEod!jJ~uuEUjx5>3}k&_gT=$7z>N5^pUw1Dy%9gF1=|O`Ax%r*e^K2` z@0n*!948T2OW4F1^B8fMeEaZvp;v4AeCd8-NMP^>JPE)NM;Q)}Z86pjQXZo7q=Toc zp-uXLrPQWkQnFcb`N_mA!F2YMONY-#)K9XXhP99K@?+`7%iB+tMb-t2V6|` zO*<;4we5xz4GBIrG}VvadU~dLcBb@c4GlIj4i=3aJPBxr(>Bpdu;b@);K;Y-TsXurDDME!{MV+aPotj;cljjvAk_%Fz zaCnDTR*rt|+M5A=^)Yqg0>pxGWBpUnQ!2C8>4BP7r=Pxys4KENR`ZGjY?BqEcHIMW zX5RBuZl!J^cdU0fkCY$Hd|v&W^SYxk(%t1vdNTBz(KkpQeI9R{c!pgR`6Y_ zV;XuIYHD1XMu&YzM2CoW{zt`jb^l>M)K;4g?WMG(xWz2YOWK(#bM7YI6!u@2#7l1- z0_bVSl;Z2p&r#aQ;>mQ2Sz@(3Kpv~eOro>4L>4h<2(~d zv`l-Cem!ZBQjyrLbJnI%BQ-QvPRdMxLYMRsp>-Pkp;tpL>~C znSqfTWhp%^gL4(Vo|l`Aw{2{!mB!iAep8ea?3D()nYr%?#O%p1 z#qz~yMCZ*`P3zAi`xGNJT&BWGbqjk_j0Y5Y6@HCvP0v)|Q7ZmFm7Qx$990y@6PrL> zKN79@fN2!_p`o+0^VpdZAT@nZiERnW#>yhY>?}^4oxz=%c7g5^(?%>R#ux&&6&k5x z(-2An!SV>UO|4A@3>z)jiq@j#y{&*emKM(}0d{ATCeEkbf9}2K+;i?t&To?4v$YRR zyqR#mONr%nU#qN6sh;TE&)TxuK0KFsKJ!3)?x3CD-`YCn)n1v+_}KPpX`^%U>tAnl z6n8XD+#m4gG`wy*Fef$T2YO1n7kgvs->>l2c$r`VwafZ%S^x z`(T5&r?RIf`FJwlSakNZ_D}w$i`Reml=*-AUOX!|v{ffOR{mmnLfMJ=$=S=>%S%5w zSJ~n%oVUATTkB89jpYt8KUei9O;(O4q&?$lX}kJW!=2LWfw@F~YL1fomuK+tOUJ&9 ztK0i`-O02nZESRO*w1xkmIO{7OH~@tPWhhr)8O>o!+l?j&P}8j56vz$Khe9fGS6Y3 zXdf;*qkQK(btg8MxGm=Sn3VG8%G=Qt`&4|b_3)n+!79J4tEsl*siMjLAC^A7J)U(# z9?JN3Q`fbQg^`@a#=C8b)OYI*Wuv!kxVFEmB6xi6Ss(GB**=D(rj4a;yO)3QND6nW zd2>3yJmc#e*|fl3Ioi8p`h}ajufF8njHc(!dzSY6^4aGNSJJmE=LUZq9z4|TS+ba) zOd%iU&Mf(xPQ3L^_rP-h6dzCrW**q$o1A&oompkdAIamc<&K&|arlKmb6`t)jc;V( z>6!ae4Ik~R^KF(=#eHbL4hDZ;8?LU#yG zCl7tx^*-%yA_R%L1W8j6hC<)fWR(|rr)t6o0(Ho$$SaC~poMPsAXs2IO|Nx1!Odwd zr^tH{R24)ANG_Ih%MyYXxOsgb%w#zZTEm-AhXAG&0bppWB&!bIiJvQoryygjT^50T8u&z@JQE5tcywpO5q0-}cn8qDuy zUEmV1Pbe-cV={R0Ag>A>3&67)HhhK1)>$9~NdLnEl>K_-4HlALmPN-S&8#wq&Lu0U zeB?#|DAvtn7rP2%F)S<|H}5o=5u7ra*B*o-NkBX&vZm=wr9X(YrePGIVYr4-Bu)UA z88m_de+?RK1}rjaIG|a$2A?fD5gIkds1byjF#1Q3m`=2V0t^^AjwUEz zU4upv2A|E01vl=)%-}c;#2GP{AxI)hBPlv+J<6){XyjaqHpT$MNeg2bhv5`%HS7&E zFdVraTvJ-7 Date: Tue, 25 Jun 2024 15:30:32 +0100 Subject: [PATCH 09/44] rename as.disag_data items aknandi/disaggregation#83 --- R/build_mesh.R | 2 +- R/fit_model.R | 4 +- R/predict.R | 2 +- R/prepare_data.R | 72 ++-- man/as.disag_data.Rd | 29 +- man/build_mesh.Rd | 2 +- man/prepare_data.Rd | 6 +- src/disaggregation.cpp | 524 ++++++++++++++--------------- tests/testthat/test-prepare-data.R | 58 ++-- 9 files changed, 365 insertions(+), 334 deletions(-) diff --git a/R/build_mesh.R b/R/build_mesh.R index 8d774cb..de08013 100644 --- a/R/build_mesh.R +++ b/R/build_mesh.R @@ -44,7 +44,7 @@ #' #' @export -build_mesh <- function(shapes, mesh_args = NULL) { +build_mesh <- function(shapes, mesh_args = NULL, mesh.args = NULL) { if (!is.null(mesh.args) && missing(mesh_args)) { mesh_args <- mesh.args diff --git a/R/fit_model.R b/R/fit_model.R index 61a6830..7500f46 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -327,7 +327,7 @@ make_model_object <- function(data, spde <- rSPDE::matern.operators(mesh = data$mesh, alpha = nu + 1, compute_higher_order = TRUE)$fem_mesh_matrices spde[[4]] <- NULL names(spde) <- c("M0", "M1", "M2") - Apix <- fmesher::fm_evaluator(data$mesh, loc = data$coordsForFit)$proj$A + Apix <- fmesher::fm_evaluator(data$mesh, loc = data$coords_for_fit)$proj$A n_s <- nrow(spde$M0) cov_matrix <- as.matrix(data$covariate_data[, (names(data$covariate_data) %in% names(data$covariate_rasters))]) @@ -393,7 +393,7 @@ make_model_object <- function(data, aggregation_values = data$aggregation_pixels, Apixel = Apix, spde = spde, - startendindex = data$startendindex, + start_end_index = data$start_end_index, polygon_response_data = data$polygon_data$response, response_sample_size = data$polygon_data$N, family = family_id, diff --git a/R/predict.R b/R/predict.R index cf4754d..c692ebc 100644 --- a/R/predict.R +++ b/R/predict.R @@ -275,7 +275,7 @@ setup_objects <- function(model_output, new_data = NULL, predict_iid = FALSE) { if(model_output$model_setup$field) { if(is.null(new_data)) { - coords <- data$coordsForPrediction + coords <- data$coords_for_prediction } else { coords <- getCoords(data) } diff --git a/R/prepare_data.R b/R/prepare_data.R index aeb5cb7..88e17f7 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -48,9 +48,9 @@ #' \item{polygon_data }{A data frame with columns of \emph{area_id}, \emph{response} and \emph{N} (sample size: all NAs unless using binomial data). Each row represents a polygon.} #' \item{covariate_data }{A data frame with columns of \emph{area_id}, \emph{cell_id} and one for each covariate in \emph{covariate_rasters}. Each row represents a pixel in a polygon.} #' \item{aggregation_pixels }{An array with the value of the aggregation raster for each pixel in the same order as the rows of \emph{covariate_data}.} -#' \item{coordsForFit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} -#' \item{coordsForPrediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} -#' \item{startendindex }{A matrix with two columns containing the start and end index of the pixels within each polygon.} +#' \item{coords_for_fit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} +#' \item{coords_for_prediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} +#' \item{start_end_index }{A matrix with two columns containing the start and end index of the pixels within each polygon.} #' \item{mesh }{A INLA mesh to be used for the spatial field of the disaggregation model.} #' @import splancs #' @import utils @@ -190,11 +190,11 @@ prepare_data <- function(polygon_shapefile, } } - coordsForFit <- extractCoordsForMesh(covariate_rasters, selectIds = covariate_data$cell) + coords_for_fit <- extractCoordsForMesh(covariate_rasters, selectIds = covariate_data$cell) - coordsForPrediction <- extractCoordsForMesh(covariate_rasters) + coords_for_prediction <- extractCoordsForMesh(covariate_rasters) - startendindex <- getStartendindex(covariate_data, polygon_data, id_var = id_var) + start_end_index <- getStartendindex(covariate_data, polygon_data, id_var = id_var) if(make_mesh) { mesh <- build_mesh(polygon_shapefile, mesh_args) @@ -209,9 +209,9 @@ prepare_data <- function(polygon_shapefile, polygon_data = polygon_data, covariate_data = covariate_data, aggregation_pixels = aggregation_pixels, - coordsForFit = coordsForFit, - coordsForPrediction = coordsForPrediction, - startendindex = startendindex, + coords_for_fit = coords_for_fit, + coords_for_prediction = coords_for_prediction, + start_end_index = start_end_index, mesh = mesh) class(disag_data) <- c('disag_data', 'list') @@ -228,9 +228,12 @@ prepare_data <- function(polygon_shapefile, #' @param polygon_data data.frame with two columns: polygon id and response #' @param covariate_data data.frame with cell id, polygon id and covariate columns #' @param aggregation_pixels vector with value of aggregation raster at each pixel -#' @param coordsForFit coordinates of the covariate data points within the polygons in x -#' @param coordsForPrediction coordinates of the covariate data points in the whole raster extent -#' @param startendindex matrix containing the start and end index for each polygon +#' @param coords_for_fit coordinates of the covariate data points within the polygons in x +#' @param coords_for_prediction coordinates of the covariate data points in the whole raster extent +#' @param start_end_index matrix containing the start and end index for each polygon +#' @param coordsForFit Deprecated. +#' @param coordsForPrediction Deprecated. +#' @param startendindex Deprecated. #' @param mesh inla.mesh object to use in the fit #' #' @return A list is returned of class \code{disag_data}. @@ -241,9 +244,9 @@ prepare_data <- function(polygon_shapefile, #' \item{polygon_data }{A data frame with columns of \emph{area_id}, \emph{response} and \emph{N} (sample size: all NAs unless using binomial data). Each row represents a polygon.} #' \item{covariate_data }{A data frame with columns of \emph{area_id}, \emph{cell_id} and one for each covariate in \emph{covariate_rasters}. Each row represents a pixel in a polygon.} #' \item{aggregation_pixels }{An array with the value of the aggregation raster for each pixel in the same order as the rows of \emph{covariate_data}.} -#' \item{coordsForFit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} -#' \item{coordsForPrediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} -#' \item{startendindex }{A matrix with two columns containing the start and end index of the pixels within each polygon.} +#' \item{coords_for_fit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} +#' \item{coords_for_prediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} +#' \item{start_end_index }{A matrix with two columns containing the start and end index of the pixels within each polygon.} #' \item{mesh }{A INLA mesh to be used for the spatial field of the disaggregation model.} #' #' @name as.disag_data @@ -257,10 +260,29 @@ as.disag_data <- function(polygon_shapefile, polygon_data, covariate_data, aggregation_pixels, - coordsForFit, - coordsForPrediction, - startendindex, - mesh = NULL) { + coords_for_fit, + coords_for_prediction, + start_end_index, + mesh = NULL, + coordsForFit = NULL, + coordsForPrediction = NULL, + startendindex = NULL) { + + # Handle deprecated variables + if (!is.null(coordsForFit) && missing(coords_for_fit)) { + coords_for_fit <- coordsForFit + message("coordsForFit is deprecated and will be removed in a future version - please use coords_for_fit instead") + } + + if (!is.null(coordsForPrediction) && missing(coords_for_prediction)) { + coords_for_prediction <- coordsForPrediction + message("coordsForPrediction is deprecated and will be removed in a future version - please use coords_for_prediction instead") + } + + if (!is.null(startendindex) && missing(start_end_index)) { + start_end_index <- startendindex + message("startendindex is deprecated and will be removed in a future version - please use start_end_index instead") + } stopifnot(inherits(polygon_shapefile, 'sf')) stopifnot(inherits(shapefile_names, 'list')) @@ -268,9 +290,9 @@ as.disag_data <- function(polygon_shapefile, stopifnot(inherits(polygon_data, 'data.frame')) stopifnot(inherits(covariate_data, 'data.frame')) stopifnot(inherits(aggregation_pixels, 'numeric')) - stopifnot(inherits(coordsForFit, 'matrix')) - stopifnot(inherits(coordsForPrediction, 'matrix')) - stopifnot(inherits(startendindex, 'matrix')) + stopifnot(inherits(coords_for_fit, 'matrix')) + stopifnot(inherits(coords_for_prediction, 'matrix')) + stopifnot(inherits(start_end_index, 'matrix')) if(!is.null(mesh)) { stopifnot(inherits(mesh, 'inla.mesh')) } @@ -281,9 +303,9 @@ as.disag_data <- function(polygon_shapefile, polygon_data = polygon_data, covariate_data = covariate_data, aggregation_pixels = aggregation_pixels, - coordsForFit = coordsForFit, - coordsForPrediction = coordsForPrediction, - startendindex = startendindex, + coords_for_fit = coords_for_fit, + coords_for_prediction = coords_for_prediction, + start_end_index = start_end_index, mesh = mesh) class(disag_data) <- c('disag_data', 'list') diff --git a/man/as.disag_data.Rd b/man/as.disag_data.Rd index 803d050..35dec38 100644 --- a/man/as.disag_data.Rd +++ b/man/as.disag_data.Rd @@ -11,10 +11,13 @@ as.disag_data( polygon_data, covariate_data, aggregation_pixels, - coordsForFit, - coordsForPrediction, - startendindex, - mesh = NULL + coords_for_fit, + coords_for_prediction, + start_end_index, + mesh = NULL, + coordsForFit = NULL, + coordsForPrediction = NULL, + startendindex = NULL ) } \arguments{ @@ -30,13 +33,19 @@ as.disag_data( \item{aggregation_pixels}{vector with value of aggregation raster at each pixel} -\item{coordsForFit}{coordinates of the covariate data points within the polygons in x} +\item{coords_for_fit}{coordinates of the covariate data points within the polygons in x} -\item{coordsForPrediction}{coordinates of the covariate data points in the whole raster extent} +\item{coords_for_prediction}{coordinates of the covariate data points in the whole raster extent} -\item{startendindex}{matrix containing the start and end index for each polygon} +\item{start_end_index}{matrix containing the start and end index for each polygon} \item{mesh}{inla.mesh object to use in the fit} + +\item{coordsForFit}{Deprecated.} + +\item{coordsForPrediction}{Deprecated.} + +\item{startendindex}{Deprecated.} } \value{ A list is returned of class \code{disag_data}. @@ -47,9 +56,9 @@ The list of class \code{disag_data} contains: \item{polygon_data }{A data frame with columns of \emph{area_id}, \emph{response} and \emph{N} (sample size: all NAs unless using binomial data). Each row represents a polygon.} \item{covariate_data }{A data frame with columns of \emph{area_id}, \emph{cell_id} and one for each covariate in \emph{covariate_rasters}. Each row represents a pixel in a polygon.} \item{aggregation_pixels }{An array with the value of the aggregation raster for each pixel in the same order as the rows of \emph{covariate_data}.} - \item{coordsForFit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} - \item{coordsForPrediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} - \item{startendindex }{A matrix with two columns containing the start and end index of the pixels within each polygon.} + \item{coords_for_fit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} + \item{coords_for_prediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} + \item{start_end_index }{A matrix with two columns containing the start and end index of the pixels within each polygon.} \item{mesh }{A INLA mesh to be used for the spatial field of the disaggregation model.} } \description{ diff --git a/man/build_mesh.Rd b/man/build_mesh.Rd index bcf8683..05af618 100644 --- a/man/build_mesh.Rd +++ b/man/build_mesh.Rd @@ -4,7 +4,7 @@ \alias{build_mesh} \title{Build mesh for disaggregaton model} \usage{ -build_mesh(shapes, mesh_args = NULL) +build_mesh(shapes, mesh_args = NULL, mesh.args = NULL) } \arguments{ \item{shapes}{sf covering the region under investigation.} diff --git a/man/prepare_data.Rd b/man/prepare_data.Rd index b4e936d..efe0e50 100644 --- a/man/prepare_data.Rd +++ b/man/prepare_data.Rd @@ -56,9 +56,9 @@ The list of class \code{disag_data} contains: \item{polygon_data }{A data frame with columns of \emph{area_id}, \emph{response} and \emph{N} (sample size: all NAs unless using binomial data). Each row represents a polygon.} \item{covariate_data }{A data frame with columns of \emph{area_id}, \emph{cell_id} and one for each covariate in \emph{covariate_rasters}. Each row represents a pixel in a polygon.} \item{aggregation_pixels }{An array with the value of the aggregation raster for each pixel in the same order as the rows of \emph{covariate_data}.} - \item{coordsForFit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} - \item{coordsForPrediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} - \item{startendindex }{A matrix with two columns containing the start and end index of the pixels within each polygon.} + \item{coords_for_fit }{A matrix with two columns of x, y coordinates of pixels within the polygons. Used to make the spatial field.} + \item{coords_for_prediction }{A matrix with two columns of x, y coordinates of pixels in the whole Raster. Used to make predictions.} + \item{start_end_index }{A matrix with two columns containing the start and end index of the pixels within each polygon.} \item{mesh }{A INLA mesh to be used for the spatial field of the disaggregation model.} } \description{ diff --git a/src/disaggregation.cpp b/src/disaggregation.cpp index d476bbd..82c4efa 100644 --- a/src/disaggregation.cpp +++ b/src/disaggregation.cpp @@ -1,262 +1,262 @@ -// -// Author: Anita Nandi -// Date: 2019-02-14 - -// Data: Spatial field mesh and matrices, polygon data, covariate pixel data - - -#define TMB_LIB_INIT R_init_disaggregation -#include - -template -Type objective_function::operator()() -{ - - using namespace R_inla; - using namespace density; - using namespace Eigen; - - // ------------------------------------------------------------------------ // - // Spatial field data - // ------------------------------------------------------------------------ // - - // The A matrices are for projecting the mesh to a point for the pixel and point data respectively. - DATA_SPARSE_MATRIX(Apixel); - DATA_STRUCT(spde, spde_t); - - // ------------------------------------------------------------------------ // - // Polygon level data - // ------------------------------------------------------------------------ // - - // Covariate pixel data - DATA_MATRIX(x); - - // two col matrix with start end indices for each shape case. - DATA_IARRAY(startendindex); - - // Shape data. Cases and region id. - DATA_VECTOR(polygon_response_data); - DATA_VECTOR(response_sample_size); - - // Use to aggreagte pixel response values to polygon level - DATA_VECTOR(aggregation_values); - - // ------------------------------------------------------------------------ // - // Likelihood and link functions - // ------------------------------------------------------------------------ // - - DATA_INTEGER(family); - DATA_INTEGER(link); - - // ------------------------------------------------------------------------ // - // Parameters - // ------------------------------------------------------------------------ // - - PARAMETER(intercept); - PARAMETER_VECTOR(slope); - - DATA_SCALAR(priormean_intercept); - DATA_SCALAR(priorsd_intercept); - DATA_SCALAR(priormean_slope); - DATA_SCALAR(priorsd_slope); - - // Priors for likelihood - PARAMETER(log_tau_gaussian); - Type tau_gaussian = exp(log_tau_gaussian); - Type gaussian_sd = 1 / sqrt(tau_gaussian); - - // INLA defines a loggamma prior on log tau. - // We evaluate a gamma prior on tau, but the parameters are - // therefore the same. - Type prior_gamma_shape = 1; - Type prior_gamma_rate = 5e-05; - - PARAMETER_VECTOR(iideffect); - PARAMETER(iideffect_log_tau); - Type iideffect_tau = exp(iideffect_log_tau); - Type iideffect_sd = 1 / sqrt(iideffect_tau); - - Type iideffect_mean = 0.0; - - // Priors on iid random effect for polygons - DATA_SCALAR(prior_iideffect_sd_max); - DATA_SCALAR(prior_iideffect_sd_prob); - - // spde hyperparameters - PARAMETER(log_sigma); - PARAMETER(log_rho); - Type sigma = exp(log_sigma); - Type rho = exp(log_rho); - - // Priors on spde hyperparameters - DATA_SCALAR(prior_rho_min); - DATA_SCALAR(prior_rho_prob); - DATA_SCALAR(prior_sigma_max); - DATA_SCALAR(prior_sigma_prob); - - // Convert hyperparameters to natural scale - DATA_SCALAR(nu); - Type kappa = sqrt(8.0) / rho; - - // Random effect parameters - PARAMETER_VECTOR(nodemean); - - // Model component flags - DATA_INTEGER(field); - DATA_INTEGER(iid); - - // Number of polygons - int n_polygons = polygon_response_data.size(); - // Number of pixels - int n_pixels = x.rows(); - - Type nll = 0.0; - - // ------------------------------------------------------------------------ // - // Likelihood from priors - // ------------------------------------------------------------------------ // - - nll -= dnorm(intercept, priormean_intercept, priorsd_intercept, true); - for (int s = 0; s < slope.size(); s++) { - nll -= dnorm(slope[s], priormean_slope, priorsd_slope, true); - } - - if(iid) { - // Likelihood of hyperparameter of polygon iid random effect. - // From https://projecteuclid.org/euclid.ss/1491465621 (Eqn 3.3) - Type lambda = -log(prior_iideffect_sd_prob) / prior_iideffect_sd_max; - Type log_pcdensity_iid = log(lambda / 2) - (3/2)*iideffect_log_tau - lambda * pow(iideffect_tau, -1/2); - // log(iideffect_sd) from the Jacobian - nll -= log_pcdensity_iid + iideffect_log_tau; - - // Likelihood of random effect for polygons - for(int p = 0; p < iideffect.size(); p++) { - nll -= dnorm(iideffect[p], iideffect_mean, iideffect_sd, true); - } - } - - // Likelihood from the gaussian prior. - // log(prec) ~ loggamma - // prec ~ gamma - if(family == 0) { - nll -= dgamma(tau_gaussian, prior_gamma_shape, prior_gamma_rate, true); - } - - if(field) { - // Likelihood of hyperparameters for field. - // From https://www.tandfonline.com/doi/full/10.1080/01621459.2017.1415907 (Theorem 2.6) - Type lambdatilde1 = -log(prior_rho_prob) * prior_rho_min; - Type lambdatilde2 = -log(prior_sigma_prob) / prior_sigma_max; - Type log_pcdensity = log(lambdatilde1) + log(lambdatilde2) - 2*log_rho - lambdatilde1 * pow(rho, -1) - lambdatilde2 * sigma; - // log_rho and log_sigma from the Jacobian - nll -= log_pcdensity + log_rho + log_sigma; - - // Build spde matrix - SparseMatrix Q = Q_spde(spde, kappa); - - // From Lindgren (2011) https://doi.org/10.1111/j.1467-9868.2011.00777.x, see equation for the marginal variance - Type scaling_factor = sqrt(exp(lgamma(nu)) / (exp(lgamma(nu + 1)) * 4 * M_PI * pow(kappa, 2*nu))); - - // Likelihood of the random field. - nll += SCALE(GMRF(Q), sigma / scaling_factor)(nodemean); - } - - Type nll_priors = nll; - - // ------------------------------------------------------------------------ // - // Likelihood from data - // ------------------------------------------------------------------------ // - - vector pixel_linear_pred(n_pixels); - pixel_linear_pred = intercept + x * slope; - - if(field) { - // Calculate field for pixel data - vector linear_pred_field(n_pixels); - linear_pred_field = Apixel * nodemean; - pixel_linear_pred += linear_pred_field.array(); - } - - // recalculate startendindices to be in the form start, n - startendindex.col(1) = startendindex.col(1) - startendindex.col(0) + 1; - - Type polygon_response; - Type normalised_polygon_response; - Type normalisation_total; - Type pred_polygoncases; - Type pred_polygonrate; - Type polygon_sd; - vector pixel_pred; - vector numerator_pixels; - vector normalisation_pixels; - vector reportnormalisation(n_polygons); - vector reportprediction_cases(n_polygons); - vector reportprediction_rate(n_polygons); - vector reportnll(n_polygons); - vector reportpolygonsd(n_polygons); - - // For each shape get pixel predictions within and aggregate to polygon level - for (int polygon = 0; polygon < n_polygons; polygon++) { - - // Get pixel level predictions (rate) - pixel_pred = pixel_linear_pred.segment(startendindex(polygon, 0), startendindex(polygon, 1)).array(); - if(iid) { - pixel_pred += iideffect[polygon]; - } - // Use correct link function - if(link == 0) { - pixel_pred = invlogit(pixel_pred); - } else if(link == 1) { - pixel_pred = exp(pixel_pred); - } else if(link == 2){ - // Don't need to do anything, i.e. pixel_pred = pixel_pred; - } else { - error("Link function not implemented."); - } - - // Aggregate to polygon prediction - numerator_pixels = pixel_pred * aggregation_values.segment(startendindex(polygon, 0), startendindex(polygon, 1)).array(); - normalisation_pixels = aggregation_values.segment(startendindex(polygon, 0), startendindex(polygon, 1)); - normalisation_total = sum(normalisation_pixels); - pred_polygoncases = sum(numerator_pixels); - pred_polygonrate = pred_polygoncases/normalisation_total; - - reportnormalisation[polygon] = normalisation_total; - reportprediction_cases[polygon] = pred_polygoncases; - reportprediction_rate[polygon] = pred_polygonrate; - - // Use correct likelihood function - if(family == 0) { - // Scale the pixel sd to polygon level - polygon_sd = gaussian_sd * sqrt((normalisation_pixels * normalisation_pixels).sum()) / normalisation_total; - reportpolygonsd[polygon] = polygon_sd; - // Calculate normal likelihood in rate space - polygon_response = polygon_response_data(polygon); - normalised_polygon_response = polygon_response/normalisation_total; - nll -= dnorm(normalised_polygon_response, pred_polygonrate, polygon_sd, true); - reportnll[polygon] = -dnorm(normalised_polygon_response, pred_polygonrate, polygon_sd, true); - } else if(family == 1) { - nll -= dbinom(polygon_response_data[polygon], response_sample_size[polygon], pred_polygonrate, true); - reportnll[polygon] = -dbinom(polygon_response_data[polygon], response_sample_size[polygon], pred_polygonrate, true); - } else if(family == 2) { - nll -= dpois(polygon_response_data[polygon], pred_polygoncases, true); - reportnll[polygon] = -dpois(polygon_response_data[polygon], pred_polygoncases, true); - } else { - error("Likelihood not implemented."); - } - - } - - REPORT(reportprediction_cases); - REPORT(reportprediction_rate); - REPORT(reportnormalisation); - REPORT(reportnll); - REPORT(polygon_response_data); - REPORT(nll_priors); - REPORT(nll); - if(family == 0) { - REPORT(reportpolygonsd); - } - - return nll; -} +// +// Author: Anita Nandi +// Date: 2019-02-14 + +// Data: Spatial field mesh and matrices, polygon data, covariate pixel data + + +#define TMB_LIB_INIT R_init_disaggregation +#include + +template +Type objective_function::operator()() +{ + + using namespace R_inla; + using namespace density; + using namespace Eigen; + + // ------------------------------------------------------------------------ // + // Spatial field data + // ------------------------------------------------------------------------ // + + // The A matrices are for projecting the mesh to a point for the pixel and point data respectively. + DATA_SPARSE_MATRIX(Apixel); + DATA_STRUCT(spde, spde_t); + + // ------------------------------------------------------------------------ // + // Polygon level data + // ------------------------------------------------------------------------ // + + // Covariate pixel data + DATA_MATRIX(x); + + // two col matrix with start end indices for each shape case. + DATA_IARRAY(start_end_index); + + // Shape data. Cases and region id. + DATA_VECTOR(polygon_response_data); + DATA_VECTOR(response_sample_size); + + // Use to aggreagte pixel response values to polygon level + DATA_VECTOR(aggregation_values); + + // ------------------------------------------------------------------------ // + // Likelihood and link functions + // ------------------------------------------------------------------------ // + + DATA_INTEGER(family); + DATA_INTEGER(link); + + // ------------------------------------------------------------------------ // + // Parameters + // ------------------------------------------------------------------------ // + + PARAMETER(intercept); + PARAMETER_VECTOR(slope); + + DATA_SCALAR(priormean_intercept); + DATA_SCALAR(priorsd_intercept); + DATA_SCALAR(priormean_slope); + DATA_SCALAR(priorsd_slope); + + // Priors for likelihood + PARAMETER(log_tau_gaussian); + Type tau_gaussian = exp(log_tau_gaussian); + Type gaussian_sd = 1 / sqrt(tau_gaussian); + + // INLA defines a loggamma prior on log tau. + // We evaluate a gamma prior on tau, but the parameters are + // therefore the same. + Type prior_gamma_shape = 1; + Type prior_gamma_rate = 5e-05; + + PARAMETER_VECTOR(iideffect); + PARAMETER(iideffect_log_tau); + Type iideffect_tau = exp(iideffect_log_tau); + Type iideffect_sd = 1 / sqrt(iideffect_tau); + + Type iideffect_mean = 0.0; + + // Priors on iid random effect for polygons + DATA_SCALAR(prior_iideffect_sd_max); + DATA_SCALAR(prior_iideffect_sd_prob); + + // spde hyperparameters + PARAMETER(log_sigma); + PARAMETER(log_rho); + Type sigma = exp(log_sigma); + Type rho = exp(log_rho); + + // Priors on spde hyperparameters + DATA_SCALAR(prior_rho_min); + DATA_SCALAR(prior_rho_prob); + DATA_SCALAR(prior_sigma_max); + DATA_SCALAR(prior_sigma_prob); + + // Convert hyperparameters to natural scale + DATA_SCALAR(nu); + Type kappa = sqrt(8.0) / rho; + + // Random effect parameters + PARAMETER_VECTOR(nodemean); + + // Model component flags + DATA_INTEGER(field); + DATA_INTEGER(iid); + + // Number of polygons + int n_polygons = polygon_response_data.size(); + // Number of pixels + int n_pixels = x.rows(); + + Type nll = 0.0; + + // ------------------------------------------------------------------------ // + // Likelihood from priors + // ------------------------------------------------------------------------ // + + nll -= dnorm(intercept, priormean_intercept, priorsd_intercept, true); + for (int s = 0; s < slope.size(); s++) { + nll -= dnorm(slope[s], priormean_slope, priorsd_slope, true); + } + + if(iid) { + // Likelihood of hyperparameter of polygon iid random effect. + // From https://projecteuclid.org/euclid.ss/1491465621 (Eqn 3.3) + Type lambda = -log(prior_iideffect_sd_prob) / prior_iideffect_sd_max; + Type log_pcdensity_iid = log(lambda / 2) - (3/2)*iideffect_log_tau - lambda * pow(iideffect_tau, -1/2); + // log(iideffect_sd) from the Jacobian + nll -= log_pcdensity_iid + iideffect_log_tau; + + // Likelihood of random effect for polygons + for(int p = 0; p < iideffect.size(); p++) { + nll -= dnorm(iideffect[p], iideffect_mean, iideffect_sd, true); + } + } + + // Likelihood from the gaussian prior. + // log(prec) ~ loggamma + // prec ~ gamma + if(family == 0) { + nll -= dgamma(tau_gaussian, prior_gamma_shape, prior_gamma_rate, true); + } + + if(field) { + // Likelihood of hyperparameters for field. + // From https://www.tandfonline.com/doi/full/10.1080/01621459.2017.1415907 (Theorem 2.6) + Type lambdatilde1 = -log(prior_rho_prob) * prior_rho_min; + Type lambdatilde2 = -log(prior_sigma_prob) / prior_sigma_max; + Type log_pcdensity = log(lambdatilde1) + log(lambdatilde2) - 2*log_rho - lambdatilde1 * pow(rho, -1) - lambdatilde2 * sigma; + // log_rho and log_sigma from the Jacobian + nll -= log_pcdensity + log_rho + log_sigma; + + // Build spde matrix + SparseMatrix Q = Q_spde(spde, kappa); + + // From Lindgren (2011) https://doi.org/10.1111/j.1467-9868.2011.00777.x, see equation for the marginal variance + Type scaling_factor = sqrt(exp(lgamma(nu)) / (exp(lgamma(nu + 1)) * 4 * M_PI * pow(kappa, 2*nu))); + + // Likelihood of the random field. + nll += SCALE(GMRF(Q), sigma / scaling_factor)(nodemean); + } + + Type nll_priors = nll; + + // ------------------------------------------------------------------------ // + // Likelihood from data + // ------------------------------------------------------------------------ // + + vector pixel_linear_pred(n_pixels); + pixel_linear_pred = intercept + x * slope; + + if(field) { + // Calculate field for pixel data + vector linear_pred_field(n_pixels); + linear_pred_field = Apixel * nodemean; + pixel_linear_pred += linear_pred_field.array(); + } + + // recalculate startendindices to be in the form start, n + start_end_index.col(1) = start_end_index.col(1) - start_end_index.col(0) + 1; + + Type polygon_response; + Type normalised_polygon_response; + Type normalisation_total; + Type pred_polygoncases; + Type pred_polygonrate; + Type polygon_sd; + vector pixel_pred; + vector numerator_pixels; + vector normalisation_pixels; + vector reportnormalisation(n_polygons); + vector reportprediction_cases(n_polygons); + vector reportprediction_rate(n_polygons); + vector reportnll(n_polygons); + vector reportpolygonsd(n_polygons); + + // For each shape get pixel predictions within and aggregate to polygon level + for (int polygon = 0; polygon < n_polygons; polygon++) { + + // Get pixel level predictions (rate) + pixel_pred = pixel_linear_pred.segment(start_end_index(polygon, 0), start_end_index(polygon, 1)).array(); + if(iid) { + pixel_pred += iideffect[polygon]; + } + // Use correct link function + if(link == 0) { + pixel_pred = invlogit(pixel_pred); + } else if(link == 1) { + pixel_pred = exp(pixel_pred); + } else if(link == 2){ + // Don't need to do anything, i.e. pixel_pred = pixel_pred; + } else { + error("Link function not implemented."); + } + + // Aggregate to polygon prediction + numerator_pixels = pixel_pred * aggregation_values.segment(start_end_index(polygon, 0), start_end_index(polygon, 1)).array(); + normalisation_pixels = aggregation_values.segment(start_end_index(polygon, 0), start_end_index(polygon, 1)); + normalisation_total = sum(normalisation_pixels); + pred_polygoncases = sum(numerator_pixels); + pred_polygonrate = pred_polygoncases/normalisation_total; + + reportnormalisation[polygon] = normalisation_total; + reportprediction_cases[polygon] = pred_polygoncases; + reportprediction_rate[polygon] = pred_polygonrate; + + // Use correct likelihood function + if(family == 0) { + // Scale the pixel sd to polygon level + polygon_sd = gaussian_sd * sqrt((normalisation_pixels * normalisation_pixels).sum()) / normalisation_total; + reportpolygonsd[polygon] = polygon_sd; + // Calculate normal likelihood in rate space + polygon_response = polygon_response_data(polygon); + normalised_polygon_response = polygon_response/normalisation_total; + nll -= dnorm(normalised_polygon_response, pred_polygonrate, polygon_sd, true); + reportnll[polygon] = -dnorm(normalised_polygon_response, pred_polygonrate, polygon_sd, true); + } else if(family == 1) { + nll -= dbinom(polygon_response_data[polygon], response_sample_size[polygon], pred_polygonrate, true); + reportnll[polygon] = -dbinom(polygon_response_data[polygon], response_sample_size[polygon], pred_polygonrate, true); + } else if(family == 2) { + nll -= dpois(polygon_response_data[polygon], pred_polygoncases, true); + reportnll[polygon] = -dpois(polygon_response_data[polygon], pred_polygoncases, true); + } else { + error("Likelihood not implemented."); + } + + } + + REPORT(reportprediction_cases); + REPORT(reportprediction_rate); + REPORT(reportnormalisation); + REPORT(reportnll); + REPORT(polygon_response_data); + REPORT(nll_priors); + REPORT(nll); + if(family == 0) { + REPORT(reportpolygonsd); + } + + return nll; +} diff --git a/tests/testthat/test-prepare-data.R b/tests/testthat/test-prepare-data.R index 1723a43..6cbc7e5 100644 --- a/tests/testthat/test-prepare-data.R +++ b/tests/testthat/test-prepare-data.R @@ -8,20 +8,20 @@ test_that("Check prepare_data function works as expected", { expect_is(result, 'disag_data') expect_equal(length(result), 10) expect_equal(names(result), c('polygon_shapefile', 'shapefile_names', 'covariate_rasters', 'polygon_data', 'covariate_data', - 'aggregation_pixels', 'coordsForFit', 'coordsForPrediction', 'startendindex', 'mesh')) + 'aggregation_pixels', 'coords_for_fit', 'coords_for_prediction', 'start_end_index', 'mesh')) expect_is(result$polygon_shapefile, 'sf') expect_is(result$shapefile_names, 'list') expect_is(result$covariate_rasters, 'SpatRaster') expect_is(result$polygon_data, 'data.frame') expect_is(result$covariate_data, 'data.frame') expect_is(result$aggregation_pixels, 'numeric') - expect_is(result$coordsForFit, 'matrix') - expect_is(result$coordsForPrediction, 'matrix') - expect_is(result$startendindex, 'matrix') + expect_is(result$coords_for_fit, 'matrix') + expect_is(result$coords_for_prediction, 'matrix') + expect_is(result$start_end_index, 'matrix') expect_is(result$mesh, 'inla.mesh') expect_equal(sum(is.na(result$polygon_data$N)), length(result$polygon_data$N)) - expect_equal(nrow(result$polygon_data), nrow(result$startendindex)) - expect_equal(nrow(result$covariate_data), nrow(result$coordsForFit)) + expect_equal(nrow(result$polygon_data), nrow(result$start_end_index)) + expect_equal(nrow(result$covariate_data), nrow(result$coords_for_fit)) }) @@ -35,20 +35,20 @@ test_that("Check prepare_data function with sample size works as expected", { expect_is(result, 'disag_data') expect_equal(length(result), 10) expect_equal(names(result), c('polygon_shapefile', 'shapefile_names', 'covariate_rasters', 'polygon_data', 'covariate_data', - 'aggregation_pixels', 'coordsForFit', 'coordsForPrediction', 'startendindex', 'mesh')) + 'aggregation_pixels', 'coords_for_fit', 'coords_for_prediction', 'start_end_index', 'mesh')) expect_is(result$polygon_shapefile, 'sf') expect_is(result$shapefile_names, 'list') expect_is(result$covariate_rasters, 'SpatRaster') expect_is(result$polygon_data, 'data.frame') expect_is(result$covariate_data, 'data.frame') expect_is(result$aggregation_pixels, 'numeric') - expect_is(result$coordsForFit, 'matrix') - expect_is(result$coordsForPrediction, 'matrix') - expect_is(result$startendindex, 'matrix') + expect_is(result$coords_for_fit, 'matrix') + expect_is(result$coords_for_prediction, 'matrix') + expect_is(result$start_end_index, 'matrix') expect_true(is.null(result$mesh)) expect_equal(sum(is.na(result$polygon_data$N)), 0) - expect_equal(nrow(result$polygon_data), nrow(result$startendindex)) - expect_equal(nrow(result$covariate_data), nrow(result$coordsForFit)) + expect_equal(nrow(result$polygon_data), nrow(result$start_end_index)) + expect_equal(nrow(result$covariate_data), nrow(result$coords_for_fit)) }) @@ -73,18 +73,18 @@ test_that("Check prepare_data function deals with NAs as expected", { expect_is(result, 'disag_data') expect_equal(length(result), 10) expect_equal(names(result), c('polygon_shapefile', 'shapefile_names', 'covariate_rasters', 'polygon_data', 'covariate_data', - 'aggregation_pixels', 'coordsForFit', 'coordsForPrediction', 'startendindex', 'mesh')) + 'aggregation_pixels', 'coords_for_fit', 'coords_for_prediction', 'start_end_index', 'mesh')) expect_is(result$polygon_shapefile, 'sf') expect_is(result$shapefile_names, 'list') expect_is(result$covariate_rasters, 'SpatRaster') expect_is(result$polygon_data, 'data.frame') expect_is(result$covariate_data, 'data.frame') expect_is(result$aggregation_pixels, 'numeric') - expect_is(result$coordsForFit, 'matrix') - expect_is(result$startendindex, 'matrix') + expect_is(result$coords_for_fit, 'matrix') + expect_is(result$start_end_index, 'matrix') expect_true(is.null(result$mesh)) - expect_equal(nrow(result$polygon_data), nrow(result$startendindex)) - expect_equal(nrow(result$covariate_data), nrow(result$coordsForFit)) + expect_equal(nrow(result$polygon_data), nrow(result$start_end_index)) + expect_equal(nrow(result$covariate_data), nrow(result$coords_for_fit)) expect_equal(sum(is.na(result$polygon_data$response)), 0) expect_equal(sum(is.na(result$covariate_data)), 0) expect_equal(sum(is.na(result$aggregation_pixels)), 0) @@ -101,11 +101,11 @@ test_that("Check as.disag_data function works as expected", { aggregation_data <- rep(1, nrow(cov_data)) - coordsForFit <- extractCoordsForMesh(cov_stack, cov_data$cellid) + coords_for_fit <- extractCoordsForMesh(cov_stack, cov_data$cellid) - coordsForPrediction <- extractCoordsForMesh(cov_stack) + coords_for_prediction <- extractCoordsForMesh(cov_stack) - startendindex <- getStartendindex(cov_data, polygon_data, 'area_id') + start_end_index <- getStartendindex(cov_data, polygon_data, 'area_id') result <- as.disag_data(spdf, list('area_id', 'response'), @@ -113,27 +113,27 @@ test_that("Check as.disag_data function works as expected", { polygon_data, cov_data, aggregation_data, - coordsForFit, - coordsForPrediction, - startendindex, + coords_for_fit, + coords_for_prediction, + start_end_index, mesh = NULL) expect_is(result, 'disag_data') expect_equal(length(result), 10) expect_equal(names(result), c('polygon_shapefile', 'shapefile_names', 'covariate_rasters', 'polygon_data', 'covariate_data', - 'aggregation_pixels', 'coordsForFit', 'coordsForPrediction', 'startendindex', 'mesh')) + 'aggregation_pixels', 'coords_for_fit', 'coords_for_prediction', 'start_end_index', 'mesh')) expect_is(result$polygon_shapefile, 'sf') expect_is(result$shapefile_names, 'list') expect_is(result$covariate_rasters, 'SpatRaster') expect_is(result$polygon_data, 'data.frame') expect_is(result$covariate_data, 'data.frame') expect_is(result$aggregation_pixels, 'numeric') - expect_is(result$coordsForFit, 'matrix') - expect_is(result$coordsForPrediction, 'matrix') - expect_is(result$startendindex, 'matrix') + expect_is(result$coords_for_fit, 'matrix') + expect_is(result$coords_for_prediction, 'matrix') + expect_is(result$start_end_index, 'matrix') expect_true(is.null(result$mesh)) - expect_equal(nrow(result$polygon_data), nrow(result$startendindex)) - expect_equal(nrow(result$covariate_data), nrow(result$coordsForFit)) + expect_equal(nrow(result$polygon_data), nrow(result$start_end_index)) + expect_equal(nrow(result$covariate_data), nrow(result$coords_for_fit)) }) From 061f901d3879fba9a29ebfb23f5fa00bba1e00b1 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 25 Jun 2024 16:05:47 +0100 Subject: [PATCH 10/44] spin out plot_disag_model_data --- NAMESPACE | 1 + R/plotting.R | 68 ++++++++++++++++++++++++------------ man/plot_disag_model_data.Rd | 20 +++++++++++ 3 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 man/plot_disag_model_data.Rd diff --git a/NAMESPACE b/NAMESPACE index 9222c95..854a626 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,6 +17,7 @@ export(getCovariateRasters) export(getPolygonData) export(getStartendindex) export(make_model_object) +export(plot_disag_model_data) export(predict_model) export(predict_uncertainty) export(prepare_data) diff --git a/R/plotting.R b/R/plotting.R index a887d76..5a4762d 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -42,24 +42,18 @@ plot.disag_data <- function(x, which = c(1,2,3), ...) { return(invisible(plots)) } -#' Plot results of fitted model -#' -#' Plotting function for class \emph{disag_model} (the result of the disaggregation fitting). -#' -#' Produces two plots: results of the fixed effects and in-sample observed vs predicted plot. + +#' Convert results of the model ready for plotting #' #' @param x Object of class \emph{disag_model} to be plotted. -#' @param ... Further arguments to \emph{plot} function. #' -#' @return A list of two ggplot plots: results of the fixed effects and an in-sample observed vs predicted plot -#' -#' @import ggplot2 -#' @method plot disag_model +#' @return A list that contains: +#' \item{posteriors} A data.frame of posteriors +#' \item{data} A data.frame of observed and predicted data +#' \item{title} The title of the observed vs. predicted plot #' #' @export - - -plot.disag_model <- function(x, ...){ +plot_disag_model_data <- function(x){ parameter <- sd <- obs <- pred <- NULL posteriors <- as.data.frame(summary(x$sd_out, select = 'fixed')) @@ -74,15 +68,6 @@ plot.disag_model <- function(x, ...){ posteriors$parameter[grepl('slope', posteriors$parameter)] <- names(x$data$covariate_rasters) } - fixedeffects <- ggplot() + - geom_errorbar(posteriors, mapping = aes(x = parameter, ymin = mean - sd, - ymax = mean + sd), - width = 0.2, color = "blue") + - geom_point(posteriors, mapping = aes(x = parameter, y = mean)) + - facet_wrap( ~ type , scales = 'free') + - coord_flip() + - ggtitle("Parameters (excluding random effects)") - report <- x$obj$report() # Form of the observed and predicted results depends on the likelihood function used @@ -102,6 +87,45 @@ plot.disag_model <- function(x, ...){ data <- data.frame(obs = observed_data, pred = predicted_data) + return(list(posteriors = posteriors, + data = data, + title = title)) + +} + +#' Plot results of fitted model +#' +#' Plotting function for class \emph{disag_model} (the result of the disaggregation fitting). +#' +#' Produces two plots: results of the fixed effects and in-sample observed vs predicted plot. +#' +#' @param x Object of class \emph{disag_model} to be plotted. +#' @param ... Further arguments to \emph{plot} function. +#' +#' @return A list of two ggplot plots: results of the fixed effects and an in-sample observed vs predicted plot +#' +#' @import ggplot2 +#' @method plot disag_model +#' +#' @export + +plot.disag_model <- function(x, ...){ + + x <- plot_disag_model_data(x) + + posteriors <- x$posteriors + data <- x$data + title <- x$title + + fixedeffects <- ggplot() + + geom_errorbar(posteriors, mapping = aes(x = parameter, ymin = mean - sd, + ymax = mean + sd), + width = 0.2, color = "blue") + + geom_point(posteriors, mapping = aes(x = parameter, y = mean)) + + facet_wrap( ~ type , scales = 'free') + + coord_flip() + + ggtitle("Parameters (excluding random effects)") + obspred <- ggplot(data, aes(x = obs, y = pred)) + geom_point() + geom_abline(intercept = 0, slope = 1, color = 'blue') + diff --git a/man/plot_disag_model_data.Rd b/man/plot_disag_model_data.Rd new file mode 100644 index 0000000..c277555 --- /dev/null +++ b/man/plot_disag_model_data.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plotting.R +\name{plot_disag_model_data} +\alias{plot_disag_model_data} +\title{Convert results of the model ready for plotting} +\usage{ +plot_disag_model_data(x) +} +\arguments{ +\item{x}{Object of class \emph{disag_model} to be plotted.} +} +\value{ +A list that contains: +\item{posteriors} A data.frame of posteriors +\item{data} A data.frame of observed and predicted data +\item{title} The title of the observed vs. predicted plot +} +\description{ +Convert results of the model ready for plotting +} From 2054bcce25441684f2df00692369939422df431e Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 12:09:54 +0100 Subject: [PATCH 11/44] fix typo --- R/summary.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/summary.R b/R/summary.R index 2c34c07..0f3c953 100644 --- a/R/summary.R +++ b/R/summary.R @@ -118,7 +118,7 @@ summary.disag_data <- function(object, ...) { n_polygons <- nrow(object$polygon_shapefile) n_covariates <- as.integer(terra::nlyr(object$covariate_rasters)) - cat(paste("They data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) + cat(paste("The data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) cat(paste("The largest polygon contains", max(table(object$covariate_data[ , object$shapefile_names$id_var])), "pixels", "and the smallest polygon contains", min(table(object$covariate_data[ , object$shapefile_names$id_var])), "pixels\n")) From 45ee57e149d00dec88d18f6fe104cab75a595c82 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 12:19:30 +0100 Subject: [PATCH 12/44] change models to ensure that they fit --- tests/testthat/test-summary.R | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/tests/testthat/test-summary.R b/tests/testthat/test-summary.R index 0fcf7b0..0e97c35 100644 --- a/tests/testthat/test-summary.R +++ b/tests/testthat/test-summary.R @@ -25,7 +25,7 @@ test_that("Check print.disag_data function works as expected", { test_that("Check summary.disag_model function works as expected", { - result <- disag_model(test_data, field = FALSE, iterations = 2) + result <- disag_model(test_data, iid = FALSE, iterations = 100) model_summary <- summary(result) @@ -41,7 +41,7 @@ test_that("Check summary.disag_model function works as expected", { test_that("Check print.disag_model function works as expected", { - result <- disag_model(test_data, field = FALSE, iterations = 2) + result <- disag_model(test_data, iid = FALSE, iterations = 100) print_output <- print(result) @@ -52,17 +52,7 @@ test_that("Check print.disag_model function works as expected", { test_that("Check summary.disag_predictions function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100, - list(priormean_intercept = 0, - priorsd_intercept = 0.1, - priormean_slope = 0.0, - priorsd_slope = 0.1, - prior_rho_min = 5, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.00001, - prior_iideffect_sd_prob = 0.01)) + result <- disag_model(test_data, iid = FALSE, iterations = 100) pred <- predict(result) @@ -79,17 +69,7 @@ test_that("Check summary.disag_predictions function works as expected", { test_that("Check print.disag_predictions function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100, - list(priormean_intercept = 0, - priorsd_intercept = 0.1, - priormean_slope = 0.0, - priorsd_slope = 0.1, - prior_rho_min = 5, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.0001, - prior_iideffect_sd_prob = 0.01)) + result <- disag_model(test_data, iid = FALSE, iterations = 100) pred <- predict(result) From de1e977a2b62d151e21d0294cb53c2aeb138fafc Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 12:20:03 +0100 Subject: [PATCH 13/44] newdata > new_data --- tests/testthat/test-predict-model.R | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/testthat/test-predict-model.R b/tests/testthat/test-predict-model.R index 48ab497..fd8549c 100644 --- a/tests/testthat/test-predict-model.R +++ b/tests/testthat/test-predict-model.R @@ -91,7 +91,7 @@ test_that("Check predict.disag_model function works as expected", { -test_that("Check predict.disag_model function works with newdata", { +test_that("Check predict.disag_model function works with new data", { result <- disag_model(test_data, field = FALSE, iid = TRUE, iterations = 100, priors = list(priormean_intercept = 0, @@ -105,10 +105,10 @@ test_that("Check predict.disag_model function works with newdata", { prior_iideffect_sd_max = 0.0001, prior_iideffect_sd_prob = 0.01)) - newdata <- terra::crop(c(r, r2), c(0, 10, 0, 10)) - names(newdata) <- c('layer1', 'layer2') + new_data <- terra::crop(c(r, r2), c(0, 10, 0, 10)) + names(new_data) <- c('layer1', 'layer2') pred1 <- predict(result) - pred2 <- predict(result, newdata, predict_iid = TRUE, N = 5) + pred2 <- predict(result, new_data, predict_iid = TRUE, N = 5) expect_is(pred2, 'disag_prediction') expect_equal(length(pred2), 2) @@ -135,26 +135,26 @@ test_that("Check predict.disag_model function works with newdata", { }) -test_that('Check that check_newdata works', { +test_that('Check that check_new_data works', { result <- disag_model(test_data, field = FALSE, iterations = 100) - newdata <- terra::crop(c(r, r2), c(0, 10, 0, 10)) - names(newdata) <- c('layer1', 'layer2') + new_data <- terra::crop(c(r, r2), c(0, 10, 0, 10)) + names(new_data) <- c('layer1', 'layer2') - nd1 <- check_newdata(newdata, result) + nd1 <- check_new_data(new_data, result) expect_is(nd1, 'SpatRaster') - nn <- newdata[[1]] + nn <- new_data[[1]] names(nn) <- 'extra_unneeded' - newdata2 <- c(newdata, nn) - expect_error(check_newdata(newdata2, result), NA) + new_data2 <- c(new_data, nn) + expect_error(check_new_data(new_data2, result), NA) - newdata3 <- newdata[[1]] - expect_error(check_newdata(newdata3, result), 'All covariates') + new_data3 <- new_data[[1]] + expect_error(check_new_data(new_data3, result), 'All covariates') - newdata4 <- result$data$covariate_data - expect_error(check_newdata(newdata4, result), 'newdata should be NULL or') + new_data4 <- result$data$covariate_data + expect_error(check_new_data(new_data4, result), 'new_data should be NULL or') }) @@ -183,9 +183,9 @@ test_that('Check that setup_objects works', { expect_is(objects$field_objects, 'list') expect_true(is.null(objects$iid_objects)) - newdata <- terra::crop(c(r, r2), c(0, 180, -90, 90)) - names(newdata) <- c('layer1', 'layer2') - objects2 <- setup_objects(result, newdata) + new_data <- terra::crop(c(r, r2), c(0, 180, -90, 90)) + names(new_data) <- c('layer1', 'layer2') + objects2 <- setup_objects(result, new_data) expect_is(objects2, 'list') expect_equal(length(objects2), 3) From 6e64a49323fede39180c50aba2c6b035542e9cb8 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 12:20:43 +0100 Subject: [PATCH 14/44] fix docs and import .data --- R/plotting.R | 11 ++++++----- man/plot_disag_model_data.Rd | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index 5a4762d..fdacb40 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -48,9 +48,9 @@ plot.disag_data <- function(x, which = c(1,2,3), ...) { #' @param x Object of class \emph{disag_model} to be plotted. #' #' @return A list that contains: -#' \item{posteriors} A data.frame of posteriors -#' \item{data} A data.frame of observed and predicted data -#' \item{title} The title of the observed vs. predicted plot +#' \item{posteriors}{A data.frame of posteriors} +#' \item{data}{A data.frame of observed and predicted data} +#' \item{title}{The title of the observed vs. predicted plot} #' #' @export plot_disag_model_data <- function(x){ @@ -105,6 +105,7 @@ plot_disag_model_data <- function(x){ #' @return A list of two ggplot plots: results of the fixed effects and an in-sample observed vs predicted plot #' #' @import ggplot2 +#' @importFrom rlang .data #' @method plot disag_model #' #' @export @@ -118,7 +119,7 @@ plot.disag_model <- function(x, ...){ title <- x$title fixedeffects <- ggplot() + - geom_errorbar(posteriors, mapping = aes(x = parameter, ymin = mean - sd, + geom_errorbar(posteriors, mapping = aes(x = .data$parameter, ymin = mean - sd, ymax = mean + sd), width = 0.2, color = "blue") + geom_point(posteriors, mapping = aes(x = parameter, y = mean)) + @@ -126,7 +127,7 @@ plot.disag_model <- function(x, ...){ coord_flip() + ggtitle("Parameters (excluding random effects)") - obspred <- ggplot(data, aes(x = obs, y = pred)) + + obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred)) + geom_point() + geom_abline(intercept = 0, slope = 1, color = 'blue') + ggtitle(title) diff --git a/man/plot_disag_model_data.Rd b/man/plot_disag_model_data.Rd index c277555..9113c3f 100644 --- a/man/plot_disag_model_data.Rd +++ b/man/plot_disag_model_data.Rd @@ -11,9 +11,9 @@ plot_disag_model_data(x) } \value{ A list that contains: -\item{posteriors} A data.frame of posteriors -\item{data} A data.frame of observed and predicted data -\item{title} The title of the observed vs. predicted plot + \item{posteriors}{A data.frame of posteriors} + \item{data}{A data.frame of observed and predicted data} + \item{title}{The title of the observed vs. predicted plot} } \description{ Convert results of the model ready for plotting From 853aa70a42b932978baa14648e400a6993ac1030 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 14:02:16 +0100 Subject: [PATCH 15/44] move result to helper_data --- tests/testthat/helper_data.R | 7 ++++ tests/testthat/test-plotting.R | 23 ++--------- tests/testthat/test-predict-model.R | 64 ++--------------------------- tests/testthat/test-summary.R | 8 ---- 4 files changed, 13 insertions(+), 89 deletions(-) diff --git a/tests/testthat/helper_data.R b/tests/testthat/helper_data.R index 89deef8..8ef4831 100644 --- a/tests/testthat/helper_data.R +++ b/tests/testthat/helper_data.R @@ -35,3 +35,10 @@ names(cov_stack) <- c('layer1', 'layer2') test_data <- prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack) + +result <- disag_model(test_data, + field = TRUE, + iid = TRUE, + iterations = 100, + family = "poisson", + link = "log") diff --git a/tests/testthat/test-plotting.R b/tests/testthat/test-plotting.R index 87e6b86..3240be3 100644 --- a/tests/testthat/test-plotting.R +++ b/tests/testthat/test-plotting.R @@ -39,11 +39,9 @@ test_that("Check plot.disag.data function works as expected", { test_that("Check plot.disag_model function works as expected", { - fit_result <- disag_model(test_data, iterations = 10) + fit_result_nofield <- disag_model(test_data, iterations = 100, field = FALSE, family = "poisson", link = "log") - fit_result_nofield <- disag_model(test_data, iterations = 10, field = FALSE) - - p1 <- plot(fit_result) + p1 <- plot(result) p2 <- plot(fit_result_nofield) @@ -58,22 +56,7 @@ test_that("Check plot.disag_model function works as expected", { test_that("Check plot.disag_prediction function works as expected", { - fit_result <- disag_model(test_data, iterations = 1000, - iid = TRUE, - field = TRUE, - family = 'poisson', - link = 'log', - priors = list(priormean_intercept = 0, - priorsd_intercept = 0.1, - priormean_slope = 0.0, - priorsd_slope = 0.1, - prior_rho_min = 5, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.0001, - prior_iideffect_sd_prob = 0.01)) - pred <- predict(fit_result) + pred <- predict(result) p <- plot(pred) expect_is(p, 'gg') diff --git a/tests/testthat/test-predict-model.R b/tests/testthat/test-predict-model.R index fd8549c..e8b5c82 100644 --- a/tests/testthat/test-predict-model.R +++ b/tests/testthat/test-predict-model.R @@ -2,22 +2,6 @@ context("Predict model") test_that("Check predict.disag_model function works as expected", { - result <- disag_model(test_data, iterations = 1000, - iid = TRUE, - field = TRUE, - family = 'poisson', - link = 'log', - priors = list(priormean_intercept = 0, - priorsd_intercept = 0.1, - priormean_slope = 0.0, - priorsd_slope = 0.1, - prior_rho_min = 5, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.0001, - prior_iideffect_sd_prob = 0.01)) - pred2 <- predict(result) expect_is(pred2, 'disag_prediction') @@ -64,9 +48,9 @@ test_that("Check predict.disag_model function works as expected", { # For a model with no field or iid - result <- disag_model(test_data, iterations = 100, field = FALSE, iid = FALSE) + result2 <- disag_model(test_data, iterations = 100, field = FALSE, iid = FALSE) - pred2 <- predict(result) + pred2 <- predict(result2) expect_is(pred2, 'disag_prediction') expect_equal(length(pred2), 2) @@ -93,18 +77,6 @@ test_that("Check predict.disag_model function works as expected", { test_that("Check predict.disag_model function works with new data", { - result <- disag_model(test_data, field = FALSE, iid = TRUE, iterations = 100, - priors = list(priormean_intercept = 0, - priorsd_intercept = 1, - priormean_slope = 0.0, - priorsd_slope = 0.4, - prior_rho_min = 1, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.0001, - prior_iideffect_sd_prob = 0.01)) - new_data <- terra::crop(c(r, r2), c(0, 10, 0, 10)) names(new_data) <- c('layer1', 'layer2') pred1 <- predict(result) @@ -118,7 +90,7 @@ test_that("Check predict.disag_model function works with new data", { expect_equal(length(pred2$mean_prediction), 4) expect_equal(names(pred2$mean_prediction), c('prediction', 'field', 'iid', 'covariates')) expect_is(pred2$mean_prediction$prediction, 'SpatRaster') - expect_true(is.null(pred2$mean_prediction$field)) + expect_true(!is.null(pred2$mean_prediction$field)) expect_is(pred2$mean_prediction$iid, 'SpatRaster') expect_is(pred2$mean_prediction$covariates, 'SpatRaster') @@ -137,8 +109,6 @@ test_that("Check predict.disag_model function works with new data", { test_that('Check that check_new_data works', { - result <- disag_model(test_data, field = FALSE, iterations = 100) - new_data <- terra::crop(c(r, r2), c(0, 10, 0, 10)) names(new_data) <- c('layer1', 'layer2') @@ -161,20 +131,6 @@ test_that('Check that check_new_data works', { test_that('Check that setup_objects works', { - result <- disag_model(test_data, iterations = 100, - iid = TRUE, - field = TRUE, - priors = list(priormean_intercept = 0, - priorsd_intercept = 1, - priormean_slope = 0.0, - priorsd_slope = 0.4, - prior_rho_min = 1, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.01, - prior_iideffect_sd_prob = 0.01)) - objects <- setup_objects(result) expect_is(objects, 'list') @@ -205,20 +161,6 @@ test_that('Check that setup_objects works', { test_that('Check that predict_single_raster works', { - result <- disag_model(test_data, iterations = 100, - iid = TRUE, - field = TRUE, - priors = list(priormean_intercept = 0, - priorsd_intercept = 1, - priormean_slope = 0.0, - priorsd_slope = 0.4, - prior_rho_min = 1, - prior_rho_prob = 0.01, - prior_sigma_max = 0.1, - prior_sigma_prob = 0.01, - prior_iideffect_sd_max = 0.01, - prior_iideffect_sd_prob = 0.01)) - objects <- setup_objects(result) pars <- result$obj$env$last.par.best diff --git a/tests/testthat/test-summary.R b/tests/testthat/test-summary.R index 0e97c35..7cc5561 100644 --- a/tests/testthat/test-summary.R +++ b/tests/testthat/test-summary.R @@ -25,8 +25,6 @@ test_that("Check print.disag_data function works as expected", { test_that("Check summary.disag_model function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100) - model_summary <- summary(result) expect_is(model_summary, 'list') @@ -41,8 +39,6 @@ test_that("Check summary.disag_model function works as expected", { test_that("Check print.disag_model function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100) - print_output <- print(result) expect_is(print_output, 'disag_model') @@ -52,8 +48,6 @@ test_that("Check print.disag_model function works as expected", { test_that("Check summary.disag_predictions function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100) - pred <- predict(result) model_summary <- summary(pred) @@ -69,8 +63,6 @@ test_that("Check summary.disag_predictions function works as expected", { test_that("Check print.disag_predictions function works as expected", { - result <- disag_model(test_data, iid = FALSE, iterations = 100) - pred <- predict(result) print_output <- print(pred) From 52fa600fe8be75001eb2dc23bb11248d2a071c36 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 27 Jun 2024 14:22:30 +0100 Subject: [PATCH 16/44] add missing .data$ --- R/plotting.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/plotting.R b/R/plotting.R index fdacb40..7c37a07 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -122,7 +122,7 @@ plot.disag_model <- function(x, ...){ geom_errorbar(posteriors, mapping = aes(x = .data$parameter, ymin = mean - sd, ymax = mean + sd), width = 0.2, color = "blue") + - geom_point(posteriors, mapping = aes(x = parameter, y = mean)) + + geom_point(posteriors, mapping = aes(x = .data$parameter, y = mean)) + facet_wrap( ~ type , scales = 'free') + coord_flip() + ggtitle("Parameters (excluding random effects)") From 6d11608888a6073f3e78731294710a79140834c3 Mon Sep 17 00:00:00 2001 From: simon-smart88 <137152810+simon-smart88@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:27:45 +0100 Subject: [PATCH 17/44] Update R-CMD-check.yaml remove INLA --- .github/workflows/R-CMD-check.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 41332d5..4ff98e2 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -37,7 +37,6 @@ jobs: - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} - extra-repositories: "https://inla.r-inla-download.org/R/stable" - uses: r-lib/actions/setup-pandoc@v2 From fb8eb1ca73ef7e45a51fdc2728e720facf75f573 Mon Sep 17 00:00:00 2001 From: simon-smart88 <137152810+simon-smart88@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:28:56 +0100 Subject: [PATCH 18/44] Update R-CMD-build.yaml remove INLA --- .github/workflows/R-CMD-build.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/R-CMD-build.yaml b/.github/workflows/R-CMD-build.yaml index 01e9167..4d1956a 100644 --- a/.github/workflows/R-CMD-build.yaml +++ b/.github/workflows/R-CMD-build.yaml @@ -40,7 +40,6 @@ jobs: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - extra-repositories: "https://inla.r-inla-download.org/R/testing" - name: Install system dependencies on MacOS (X11, gdal) if: runner.os == 'macOS' From e57af27636c056e308cee3df03fa41b6dbe3f061 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Fri, 28 Jun 2024 09:07:34 +0100 Subject: [PATCH 19/44] remove INLA from workflows --- .github/workflows/R-CMD-check-HTML5.yaml | 114 ++++++------ .../workflows/R-CMD-check-no-suggests.yaml | 173 ++++++++---------- 2 files changed, 133 insertions(+), 154 deletions(-) diff --git a/.github/workflows/R-CMD-check-HTML5.yaml b/.github/workflows/R-CMD-check-HTML5.yaml index a4c492c..1dd5a46 100644 --- a/.github/workflows/R-CMD-check-HTML5.yaml +++ b/.github/workflows/R-CMD-check-HTML5.yaml @@ -1,58 +1,56 @@ -# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. -# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions -on: - push: - branches: [html5] - pull_request: - branches: [html5] - -name: R-CMD-check-html5 - - -jobs: - HTML5-check: - runs-on: ubuntu-latest - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} - - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - extra-repositories: "https://inla.r-inla-download.org/R/stable" - - - - name: Install pdflatex - run: sudo apt-get install texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra - - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Install system dependencies on MacOS (X11, gdal) - if: runner.os == 'macOS' - run: | - brew install --cask xquartz - brew install pkg-config - brew install proj@8 - brew install gdal - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - dependencies: '"all"' - extra-packages: | - rcmdcheck - - - name: Session info - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - sessioninfo::session_info(pkgs, include_base = TRUE) - shell: Rscript {0} - - - uses: r-lib/actions/check-r-package@v2 - with: - args: '"--as-cran"' - build_args: 'character()' - #error-on: '"note"' +# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. +# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions +on: + push: + branches: [html5] + pull_request: + branches: [html5] + +name: R-CMD-check-html5 + + +jobs: + HTML5-check: + runs-on: ubuntu-latest + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + + - name: Install pdflatex + run: sudo apt-get install texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra + + - uses: r-lib/actions/setup-pandoc@v2 + + - name: Install system dependencies on MacOS (X11, gdal) + if: runner.os == 'macOS' + run: | + brew install --cask xquartz + brew install pkg-config + brew install proj@8 + brew install gdal + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + dependencies: '"all"' + extra-packages: | + rcmdcheck + + - name: Session info + run: | + options(width = 100) + pkgs <- installed.packages()[, "Package"] + sessioninfo::session_info(pkgs, include_base = TRUE) + shell: Rscript {0} + + - uses: r-lib/actions/check-r-package@v2 + with: + args: '"--as-cran"' + build_args: 'character()' + #error-on: '"note"' diff --git a/.github/workflows/R-CMD-check-no-suggests.yaml b/.github/workflows/R-CMD-check-no-suggests.yaml index cea02e9..bc1f469 100644 --- a/.github/workflows/R-CMD-check-no-suggests.yaml +++ b/.github/workflows/R-CMD-check-no-suggests.yaml @@ -1,96 +1,77 @@ -# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. -# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions -# -# Largely copied from: https://github.com/inlabru-org/inlabru/blob/devel/.github/workflows/R-CMD-check-no-suggests.yaml -# Want to test without suggests to ensure things don't fail on cran when INLA isn't there. - -on: - push: - branches: - '**' - pull_request: - branches: - - devel - - master - -name: R-CMD-check-no-suggests - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: windows-latest, r: 'release'} - # - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} - - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - extra-repositories: "https://inla.r-inla-download.org/R/testing" - - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Install system dependencies on MacOS (X11, gdal) - if: runner.os == 'macOS' - run: | - brew install --cask xquartz - brew install pkg-config - brew install proj@9 - brew install gdal - - - name: Has inla? Check. - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - "INLA" %in% pkgs - shell: Rscript {0} - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - dependencies: '"hard"' - extra-packages: | - rcmdcheck - testthat - - - name: Has inla? Check, and remove. - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - "INLA" %in% pkgs - if ("INLA" %in% pkgs) { - remove.packages("INLA") - } - shell: Rscript {0} - - - name: Session info - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - sessioninfo::session_info(pkgs, include_base = TRUE) - shell: Rscript {0} - - - uses: r-lib/actions/check-r-package@v2 - env: - _R_CHECK_CRAN_INCOMING_REMOTE_: false - _R_CHECK_FORCE_SUGGESTS_: false - with: - build_args: 'c("--no-manual", "--no-build-vignettes")' - args: 'c("--no-manual", "--ignore-vignettes", "--as-cran")' - - - - \ No newline at end of file +# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. +# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions +# +# Largely copied from: https://github.com/inlabru-org/inlabru/blob/devel/.github/workflows/R-CMD-check-no-suggests.yaml +# Want to test without suggests to ensure things don't fail on cran when INLA isn't there. + +on: + push: + branches: + '**' + pull_request: + branches: + - devel + - master + +name: R-CMD-check-no-suggests + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: windows-latest, r: 'release'} + # - {os: macOS-latest, r: 'release'} + - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + + - uses: r-lib/actions/setup-pandoc@v2 + + - name: Install system dependencies on MacOS (X11, gdal) + if: runner.os == 'macOS' + run: | + brew install --cask xquartz + brew install pkg-config + brew install proj@9 + brew install gdal + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + dependencies: '"hard"' + extra-packages: | + rcmdcheck + testthat + + - name: Session info + run: | + options(width = 100) + pkgs <- installed.packages()[, "Package"] + sessioninfo::session_info(pkgs, include_base = TRUE) + shell: Rscript {0} + + - uses: r-lib/actions/check-r-package@v2 + env: + _R_CHECK_CRAN_INCOMING_REMOTE_: false + _R_CHECK_FORCE_SUGGESTS_: false + with: + build_args: 'c("--no-manual", "--no-build-vignettes")' + args: 'c("--no-manual", "--ignore-vignettes", "--as-cran")' + + + From 52555c25467e8fb7fdc63836de1d1e5ae2a2e914 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Fri, 28 Jun 2024 11:30:37 +0100 Subject: [PATCH 20/44] bump to ubuntu-24.04 --- .github/workflows/R-CMD-check-no-suggests.yaml | 4 ++-- .github/workflows/R-CMD-check.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/R-CMD-check-no-suggests.yaml b/.github/workflows/R-CMD-check-no-suggests.yaml index bc1f469..0518870 100644 --- a/.github/workflows/R-CMD-check-no-suggests.yaml +++ b/.github/workflows/R-CMD-check-no-suggests.yaml @@ -27,8 +27,8 @@ jobs: config: - {os: windows-latest, r: 'release'} # - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-24.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-24.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 4ff98e2..266b1d9 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -3,7 +3,7 @@ on: push: branches: - '**' + '**' pull_request: branches: - devel @@ -23,9 +23,9 @@ jobs: config: # - {os: windows-latest, r: 'release'} # - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-20.04, r: 'oldrel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-24.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-24.04, r: 'oldrel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-24.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true From 7a0b24c1ee46263f29f9be7f7485807cf5ea9f01 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Fri, 28 Jun 2024 11:31:00 +0100 Subject: [PATCH 21/44] update to run without warnings --- tests/testthat/test-fit-model.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/testthat/test-fit-model.R b/tests/testthat/test-fit-model.R index 8c88a1e..517a1df 100644 --- a/tests/testthat/test-fit-model.R +++ b/tests/testthat/test-fit-model.R @@ -5,7 +5,7 @@ test_that("disag_model produces errors when expected", { expect_error(disag_model(list())) expect_error(disag_model(test_data, iterations = 'iterations')) - expect_error(disag_model(test_data, priors = list(polygon_sd_men = 0.3, polygon_sd_sd = 0.4))) + expect_error(disag_model(test_data, iid = FALSE, priors = list(polygon_sd_men = 0.3, polygon_sd_sd = 0.4))) expect_error(disag_model(test_data, priors = c(polygon_sd_mean = 1.2))) expect_error(disag_model(test_data, family = 'banana')) expect_error(disag_model(test_data, link = 'apple')) @@ -14,12 +14,12 @@ test_that("disag_model produces errors when expected", { test_that("disag_model behaves as expected", { - result <- disag_model(test_data, iterations = 100, iid = FALSE) + result <- disag_model(test_data, iterations = 100, family = 'poisson', link = 'log') expect_is(result, 'disag_model') expect_equal(length(result), 5) expect_equal(length(result$sd_out$par.fixed), terra::nlyr(test_data$covariate_rasters) + 4) - expect_equal(unique(names(result$sd_out$par.random)), c("nodemean")) + expect_equal(unique(names(result$sd_out$par.random)), c("iideffect", "nodemean")) }) @@ -84,7 +84,7 @@ test_that("user defined model setup is working as expected", { test_that("make_model_object behaves as expected", { - result <- make_model_object(test_data) + result <- make_model_object(test_data, family = 'poisson', link = 'log') expect_is(result, 'list') expect_equal(sum(sapply(c("par", "fn", "gr", "report"), function(x) !(x %in% names(result)))), 0) @@ -93,11 +93,11 @@ test_that("make_model_object behaves as expected", { test_that("setup_hess_control behaves as expected", { - obj <- make_model_object(test_data) + obj <- make_model_object(test_data, family = 'poisson', link = 'log') opt <- stats::nlminb(obj$par, obj$fn, obj$gr, control = list(iter.max = 2, trace = 0)) - hess_control <- setup_hess_control(opt, hess_control_parscale = c(rep(c(0.9, 1.1), 3), 1), hess_control_ndeps = 1e-3) + hess_control <- setup_hess_control(opt, hess_control_parscale = rep(c(0.9, 1.1), 3), hess_control_ndeps = 1e-3) expect_is(hess_control, 'list') expect_equal(length(hess_control$parscale), length(opt$par)) From 09652e3f2311e6b24e561b59fbcc4d2d79079a88 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Fri, 28 Jun 2024 12:20:05 +0100 Subject: [PATCH 22/44] update description and gitignore, delete plots --- .gitignore | 22 +++++++++++----------- DESCRIPTION | 4 ++-- tests/testthat/Rplots.pdf | Bin 169871 -> 0 bytes 3 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 tests/testthat/Rplots.pdf diff --git a/.gitignore b/.gitignore index eef5be0..847e7ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,11 @@ -inst/doc -.Rproj.user -.Rhistory -.Rproj -.RData -*.o -*.so -vignettes/disaggregation_cache/* -vignettes/disaggregation_files/* -.github/workflows/R-CMD-check-HTML5.archyaml -vignettes/spatio_temporal_disaggregation.Rmd \ No newline at end of file +inst/doc +.Rproj.user +.Rhistory +*.Rproj +.RData +*.o +*.so +vignettes/disaggregation_cache/* +vignettes/disaggregation_files/* +.github/workflows/R-CMD-check-HTML5.archyaml +vignettes/spatio_temporal_disaggregation.Rmd diff --git a/DESCRIPTION b/DESCRIPTION index bf39cb2..9adb0cb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: disaggregation Type: Package Title: Disaggregation Modelling -Version: 0.3.0 +Version: 0.4.0 Authors@R: c( person("Anita", "Nandi", email = "anita.k.nandi@gmail.com", role = "aut", comment = c(ORCID = "0000-0002-5087-2494")), person("Tim", "Lucas", email = "timcdlucas@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-4694-8107")), @@ -17,7 +17,7 @@ Description: Fits disaggregation regression models using 'TMB' ('Template Model License: MIT + file LICENSE Encoding: UTF-8 LazyData: true -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.1 Imports: splancs, Matrix, diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf deleted file mode 100644 index 640f790adf03dc80cf007ac7c33175f421e441ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169871 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%0A@HDf*TQewpBBSWr_KY3~OhKr;d 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%0A(ILi7as zN&b_HX9qsCEod!jJ~uuEUjx5>3}k&_gT=$7z>N5^pUw1Dy%9gF1=|O`Ax%r*e^K2` z@0n*!948T2OW4F1^B8fMeEaZvp;v4AeCd8-NMP^>JPE)NM;Q)}Z86pjQXZo7q=Toc zp-uXLrPQWkQnFcb`N_mA!F2YMONY-#)K9XXhP99K@?+`7%iB+tMb-t2V6|` zO*<;4we5xz4GBIrG}VvadU~dLcBb@c4GlIj4i=3aJPBxr(>Bpdu;b@);K;Y-TsXurDDME!{MV+aPotj;cljjvAk_%Fz zaCnDTR*rt|+M5A=^)Yqg0>pxGWBpUnQ!2C8>4BP7r=Pxys4KENR`ZGjY?BqEcHIMW zX5RBuZl!J^cdU0fkCY$Hd|v&W^SYxk(%t1vdNTBz(KkpQeI9R{c!pgR`6Y_ zV;XuIYHD1XMu&YzM2CoW{zt`jb^l>M)K;4g?WMG(xWz2YOWK(#bM7YI6!u@2#7l1- z0_bVSl;Z2p&r#aQ;>mQ2Sz@(3Kpv~eOro>4L>4h<2(~d zv`l-Cem!ZBQjyrLbJnI%BQ-QvPRdMxLYMRsp>-Pkp;tpL>~C znSqfTWhp%^gL4(Vo|l`Aw{2{!mB!iAep8ea?3D()nYr%?#O%p1 z#qz~yMCZ*`P3zAi`xGNJT&BWGbqjk_j0Y5Y6@HCvP0v)|Q7ZmFm7Qx$990y@6PrL> zKN79@fN2!_p`o+0^VpdZAT@nZiERnW#>yhY>?}^4oxz=%c7g5^(?%>R#ux&&6&k5x z(-2An!SV>UO|4A@3>z)jiq@j#y{&*emKM(}0d{ATCeEkbf9}2K+;i?t&To?4v$YRR zyqR#mONr%nU#qN6sh;TE&)TxuK0KFsKJ!3)?x3CD-`YCn)n1v+_}KPpX`^%U>tAnl z6n8XD+#m4gG`wy*Fef$T2YO1n7kgvs->>l2c$r`VwafZ%S^x z`(T5&r?RIf`FJwlSakNZ_D}w$i`Reml=*-AUOX!|v{ffOR{mmnLfMJ=$=S=>%S%5w zSJ~n%oVUATTkB89jpYt8KUei9O;(O4q&?$lX}kJW!=2LWfw@F~YL1fomuK+tOUJ&9 ztK0i`-O02nZESRO*w1xkmIO{7OH~@tPWhhr)8O>o!+l?j&P}8j56vz$Khe9fGS6Y3 zXdf;*qkQK(btg8MxGm=Sn3VG8%G=Qt`&4|b_3)n+!79J4tEsl*siMjLAC^A7J)U(# z9?JN3Q`fbQg^`@a#=C8b)OYI*Wuv!kxVFEmB6xi6Ss(GB**=D(rj4a;yO)3QND6nW zd2>3yJmc#e*|fl3Ioi8p`h}ajufF8njHc(!dzSY6^4aGNSJJmE=LUZq9z4|TS+ba) zOd%iU&Mf(xPQ3L^_rP-h6dzCrW**q$o1A&oompkdAIamc<&K&|arlKmb6`t)jc;V( z>6!ae4Ik~R^KF(=#eHbL4hDZ;8?LU#yG zCl7tx^*-%yA_R%L1W8j6hC<)fWR(|rr)t6o0(Ho$$SaC~poMPsAXs2IO|Nx1!Odwd zr^tH{R24)ANG_Ih%MyYXxOsgb%w#zZTEm-AhXAG&0bppWB&!bIiJvQoryygjT^50T8u&z@JQE5tcywpO5q0-}cn8qDuy zUEmV1Pbe-cV={R0Ag>A>3&67)HhhK1)>$9~NdLnEl>K_-4HlALmPN-S&8#wq&Lu0U zeB?#|DAvtn7rP2%F)S<|H}5o=5u7ra*B*o-NkBX&vZm=wr9X(YrePGIVYr4-Bu)UA z88m_de+?RK1}rjaIG|a$2A?fD5gIkds1byjF#1Q3m`=2V0t^^AjwUEz zU4upv2A|E01vl=)%-}c;#2GP{AxI)hBPlv+J<6){XyjaqHpT$MNeg2bhv5`%HS7&E zFdVraTvJ-7 Date: Mon, 1 Jul 2024 10:29:09 +0100 Subject: [PATCH 23/44] error > perror --- src/disaggregation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disaggregation.cpp b/src/disaggregation.cpp index 82c4efa..efbaf8b 100644 --- a/src/disaggregation.cpp +++ b/src/disaggregation.cpp @@ -211,7 +211,7 @@ Type objective_function::operator()() } else if(link == 2){ // Don't need to do anything, i.e. pixel_pred = pixel_pred; } else { - error("Link function not implemented."); + perror("Link function not implemented."); } // Aggregate to polygon prediction @@ -242,7 +242,7 @@ Type objective_function::operator()() nll -= dpois(polygon_response_data[polygon], pred_polygoncases, true); reportnll[polygon] = -dpois(polygon_response_data[polygon], pred_polygoncases, true); } else { - error("Likelihood not implemented."); + perror("Likelihood not implemented."); } } From 1f78ffb0124ef5ae1797992cd65927b2a5a2167c Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 10:56:06 +0100 Subject: [PATCH 24/44] explicitly install gdal and proj --- .github/workflows/R-CMD-build.yaml | 3 ++- .github/workflows/R-CMD-check-no-suggests.yaml | 6 ++++++ .github/workflows/R-CMD-check.yaml | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-build.yaml b/.github/workflows/R-CMD-build.yaml index 4d1956a..25b5f8b 100644 --- a/.github/workflows/R-CMD-build.yaml +++ b/.github/workflows/R-CMD-build.yaml @@ -3,7 +3,7 @@ on: push: branches: - 'build' + 'build' pull_request: branches: - master @@ -53,6 +53,7 @@ jobs: if: runner.os == 'Linux' run: | sudo apt-get update -y && sudo apt-get install -y libglu1-mesa-dev + sudo apt-get install -y libproj-dev gdal-bin - uses: r-lib/actions/setup-r-dependencies@v2 with: diff --git a/.github/workflows/R-CMD-check-no-suggests.yaml b/.github/workflows/R-CMD-check-no-suggests.yaml index 0518870..5224795 100644 --- a/.github/workflows/R-CMD-check-no-suggests.yaml +++ b/.github/workflows/R-CMD-check-no-suggests.yaml @@ -51,6 +51,12 @@ jobs: brew install proj@9 brew install gdal + - name: Install System Dependencies on Ubuntu + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libproj-dev gdal-bin + - uses: r-lib/actions/setup-r-dependencies@v2 with: dependencies: '"hard"' diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 266b1d9..6c6a51b 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -48,6 +48,12 @@ jobs: brew install proj@8 brew install gdal + - name: Install System Dependencies on Ubuntu + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libproj-dev gdal-bin + - uses: r-lib/actions/setup-r-dependencies@v2 with: dependencies: '"all"' From 82fb6b214eac58b0cd4a21242f75d05b898a5c4c Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 10:56:06 +0100 Subject: [PATCH 25/44] explicitly install gdal and proj --- .github/workflows/R-CMD-build.yaml | 3 ++- .github/workflows/R-CMD-check-no-suggests.yaml | 6 ++++++ .github/workflows/R-CMD-check.yaml | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-build.yaml b/.github/workflows/R-CMD-build.yaml index 4d1956a..25b5f8b 100644 --- a/.github/workflows/R-CMD-build.yaml +++ b/.github/workflows/R-CMD-build.yaml @@ -3,7 +3,7 @@ on: push: branches: - 'build' + 'build' pull_request: branches: - master @@ -53,6 +53,7 @@ jobs: if: runner.os == 'Linux' run: | sudo apt-get update -y && sudo apt-get install -y libglu1-mesa-dev + sudo apt-get install -y libproj-dev gdal-bin - uses: r-lib/actions/setup-r-dependencies@v2 with: diff --git a/.github/workflows/R-CMD-check-no-suggests.yaml b/.github/workflows/R-CMD-check-no-suggests.yaml index 0518870..8b27bf9 100644 --- a/.github/workflows/R-CMD-check-no-suggests.yaml +++ b/.github/workflows/R-CMD-check-no-suggests.yaml @@ -51,6 +51,12 @@ jobs: brew install proj@9 brew install gdal + - name: Install System Dependencies on Ubuntu + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libproj-dev gdal-bin + - uses: r-lib/actions/setup-r-dependencies@v2 with: dependencies: '"hard"' diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 266b1d9..6f62b62 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -48,6 +48,12 @@ jobs: brew install proj@8 brew install gdal + - name: Install System Dependencies on Ubuntu + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libproj-dev gdal-bin + - uses: r-lib/actions/setup-r-dependencies@v2 with: dependencies: '"all"' From 9347f1eeecdc6f62949f14644de9ceff93815438 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 11:45:13 +0100 Subject: [PATCH 26/44] remove errant raster function --- R/summary.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/summary.R b/R/summary.R index 8019b54..7fbe5cf 100644 --- a/R/summary.R +++ b/R/summary.R @@ -116,7 +116,7 @@ print.disag_model <- function(x, ...){ summary.disag_data <- function(object, ...) { n_polygons <- nrow(object$polygon_shapefile) - n_covariates <- raster::nlayers(object$covariate_rasters) + n_covariates <- terra::nlyr(object$covariate_rasters) cat(paste("The data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) From 764b34a0d5e7fe2d69a1cfe12a992699a49ee07f Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 12:40:44 +0100 Subject: [PATCH 27/44] n_covariates as.integer --- R/summary.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/summary.R b/R/summary.R index 7fbe5cf..0918e6f 100644 --- a/R/summary.R +++ b/R/summary.R @@ -116,7 +116,7 @@ print.disag_model <- function(x, ...){ summary.disag_data <- function(object, ...) { n_polygons <- nrow(object$polygon_shapefile) - n_covariates <- terra::nlyr(object$covariate_rasters) + n_covariates <- as.integer(terra::nlyr(object$covariate_rasters)) cat(paste("The data contains", n_polygons, "polygons and", nrow(object$covariate_data), "pixels\n")) From cb0b718605d1b49613127d7e1bd54c92f41fa5db Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 14:48:10 +0100 Subject: [PATCH 28/44] not needed now no longer depedent on INLA --- .../workflows/R-CMD-check-no-suggests.yaml | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100644 .github/workflows/R-CMD-check-no-suggests.yaml diff --git a/.github/workflows/R-CMD-check-no-suggests.yaml b/.github/workflows/R-CMD-check-no-suggests.yaml deleted file mode 100644 index 8b27bf9..0000000 --- a/.github/workflows/R-CMD-check-no-suggests.yaml +++ /dev/null @@ -1,83 +0,0 @@ -# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. -# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions -# -# Largely copied from: https://github.com/inlabru-org/inlabru/blob/devel/.github/workflows/R-CMD-check-no-suggests.yaml -# Want to test without suggests to ensure things don't fail on cran when INLA isn't there. - -on: - push: - branches: - '**' - pull_request: - branches: - - devel - - master - -name: R-CMD-check-no-suggests - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: windows-latest, r: 'release'} - # - {os: macOS-latest, r: 'release'} - - {os: ubuntu-24.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-24.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} - - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Install system dependencies on MacOS (X11, gdal) - if: runner.os == 'macOS' - run: | - brew install --cask xquartz - brew install pkg-config - brew install proj@9 - brew install gdal - - - name: Install System Dependencies on Ubuntu - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y libproj-dev gdal-bin - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - dependencies: '"hard"' - extra-packages: | - rcmdcheck - testthat - - - name: Session info - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - sessioninfo::session_info(pkgs, include_base = TRUE) - shell: Rscript {0} - - - uses: r-lib/actions/check-r-package@v2 - env: - _R_CHECK_CRAN_INCOMING_REMOTE_: false - _R_CHECK_FORCE_SUGGESTS_: false - with: - build_args: 'c("--no-manual", "--no-build-vignettes")' - args: 'c("--no-manual", "--ignore-vignettes", "--as-cran")' - - - From d5d223286d6a2a3bc7bee2ef9ac30ebb3a924918 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 15:00:43 +0100 Subject: [PATCH 29/44] remove erroneous line --- R/fit_model.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/R/fit_model.R b/R/fit_model.R index 7500f46..01b2621 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -148,9 +148,6 @@ disag_model <- function(data, # Calc uncertainty using the fixed hessian from above. sd_out <- TMB::sdreport(obj, getJointPrecision = TRUE, hessian.fixed = hess) - - sd_out <- TMB::sdreport(obj, getJointPrecision = TRUE) - # Rename parameters to match layers # Need to change in sd_out as well # names(opt$par)[names(opt$par) == 'slope'] <- names(data$covariate_rasters) From 6bb26dff5681f7ca29c67dfe1d906ca774b9cfbe Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 1 Jul 2024 15:01:25 +0100 Subject: [PATCH 30/44] update inspired by sf --- .github/workflows/R-CMD-check.yaml | 34 ++++++++++-------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 6f62b62..68a3933 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -1,5 +1,7 @@ # For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. # https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions + +# inspired by: https://github.com/r-spatial/sf/blob/main/.github/workflows/R-CMD-check.yaml on: push: branches: @@ -21,15 +23,15 @@ jobs: fail-fast: false matrix: config: - # - {os: windows-latest, r: 'release'} - # - {os: macOS-latest, r: 'release'} - - {os: ubuntu-24.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-24.04, r: 'oldrel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-24.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + - {os: ubuntu-latest, r: 'oldrel-2'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} steps: - uses: actions/checkout@v2 @@ -45,27 +47,13 @@ jobs: run: | brew install --cask xquartz brew install pkg-config - brew install proj@8 + brew install proj brew install gdal - - name: Install System Dependencies on Ubuntu - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y libproj-dev gdal-bin - - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: '"all"' - extra-packages: | - rcmdcheck - - - name: Session info - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - sessioninfo::session_info(pkgs, include_base = TRUE) - shell: Rscript {0} + extra-packages: any::rcmdcheck + needs: check - uses: r-lib/actions/check-r-package@v2 env: From 65f536c27ee29600360c7193df8a34df32718d94 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Wed, 31 Jul 2024 10:30:43 +0100 Subject: [PATCH 31/44] rename slope parameters and update tests --- R/fit_model.R | 4 ++-- tests/testthat/test-fit-model.R | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/R/fit_model.R b/R/fit_model.R index 01b2621..28d39f8 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -149,8 +149,8 @@ disag_model <- function(data, sd_out <- TMB::sdreport(obj, getJointPrecision = TRUE, hessian.fixed = hess) # Rename parameters to match layers - # Need to change in sd_out as well - # names(opt$par)[names(opt$par) == 'slope'] <- names(data$covariate_rasters) + names(sd_out$par.fixed)[names(sd_out$par.fixed) == "slope"] <- names(data$covariate_rasters) + names(opt$par)[names(opt$par) == "slope"] <- names(data$covariate_rasters) model_output <- list(obj = obj, opt = opt, diff --git a/tests/testthat/test-fit-model.R b/tests/testthat/test-fit-model.R index 517a1df..e5b6053 100644 --- a/tests/testthat/test-fit-model.R +++ b/tests/testthat/test-fit-model.R @@ -20,6 +20,10 @@ test_that("disag_model behaves as expected", { expect_equal(length(result), 5) expect_equal(length(result$sd_out$par.fixed), terra::nlyr(test_data$covariate_rasters) + 4) expect_equal(unique(names(result$sd_out$par.random)), c("iideffect", "nodemean")) + expect_true(all(c("layer1", "layer2") %in% names(result$sd_out$par.fixed))) + expect_false(any(names(result$sd_out$par.fixed) == "slope")) + expect_true(all(c("layer1", "layer2") %in% names(result$opt$par))) + expect_false(any(names(result$opt$par) == "slope")) }) @@ -29,17 +33,18 @@ test_that("disag_model with 1 covariate behaves as expected", { test_data2$covariate_rasters <- test_data2$covariate_rasters[[1]] test_data2$covariate_data <- test_data2$covariate_data[, 1:3] - result <- disag_model(test_data2, iterations = 100, iid = FALSE) + result <- disag_model(test_data2, iterations = 100, iid = FALSE, family = 'poisson', link = 'log') expect_is(result, 'disag_model') expect_equal(length(result), 5) # Should be intercept, 1 slope, tau gaussian, and 2 for space. None for iid anymore. - expect_equal(length(result$sd_out$par.fixed), terra::nlyr(test_data$covariate_rasters) + 3) + expect_equal(length(result$sd_out$par.fixed), terra::nlyr(test_data2$covariate_rasters) + 3) expect_equal(unique(names(result$sd_out$par.random)), c("nodemean")) - # Confirm only two covariates were fitted. - expect_equal(sum(names(result$opt$par) == 'slope'), 1) + # Confirm only one covariate was fitted. + expect_equal(sum(names(result$opt$par) == "layer1"), 1) + expect_false(any(names(result$opt$par) == "layer2")) }) test_that("user defined model setup is working as expected", { From e769822a1d232423fd19c3bfc642cfcb8caf64c4 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 10 Sep 2024 12:06:40 +0100 Subject: [PATCH 32/44] rename slope parameters and update tests --- R/summary.R | 5 ++++- tests/testthat/test-summary.R | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/R/summary.R b/R/summary.R index 0918e6f..f725db8 100644 --- a/R/summary.R +++ b/R/summary.R @@ -18,7 +18,10 @@ summary.disag_model <- function(object, ...) { pred <- obs <- NULL - model_params <- summary(object$sd_out, select = 'fixed') + sd_out <- object$sd_out + names(sd_out$par.fixed)[names(sd_out$par.fixed) == "slope"] <- names(object$data$covariate_rasters) + + model_params <- summary(sd_out, select = 'fixed') report <- object$obj$report() nll <- report$nll diff --git a/tests/testthat/test-summary.R b/tests/testthat/test-summary.R index 7cc5561..0839587 100644 --- a/tests/testthat/test-summary.R +++ b/tests/testthat/test-summary.R @@ -30,6 +30,8 @@ test_that("Check summary.disag_model function works as expected", { expect_is(model_summary, 'list') expect_equal(length(model_summary), 3) expect_equal(names(model_summary), c('model_params', 'nll', 'metrics')) + expect_true(c("layer1" %in% rownames(model_summary$model_params))) + expect_true(c("layer2" %in% rownames(model_summary$model_params))) expect_is(model_summary$model_params, 'matrix') expect_is(model_summary$nll, 'numeric') expect_is(model_summary$metrics, 'data.frame') From bd422866693d89e9f251833d1fe6b2a036b0c53b Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Fri, 13 Sep 2024 17:39:03 +0100 Subject: [PATCH 33/44] warn if covariates are not numeric aknandi #91 --- R/prepare_data.R | 10 ++++++++++ tests/testthat/test-prepare-data.R | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/R/prepare_data.R b/R/prepare_data.R index 88e17f7..18932ee 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -141,6 +141,16 @@ prepare_data <- function(polygon_shapefile, polygon_data <- getPolygonData(polygon_shapefile, id_var, response_var, sample_size_var) + # Check for non-numeric covariate values + cv_df <- terra::as.data.frame(covariate_rasters, xy = FALSE) + cv_classes <- unlist(lapply(cv_df, class)) + cv_check <- all(as.vector(cv_classes) == "numeric") + if (!cv_check){ + non_numeric <- which(cv_classes != "numeric") + for (raster in non_numeric){ + warning(paste0("The values of ", names(covariate_rasters)[raster], " are not numeric")) + } + } # Save raster layer names so we can reassign it to make sure names don't change. cov_names <- names(covariate_rasters) diff --git a/tests/testthat/test-prepare-data.R b/tests/testthat/test-prepare-data.R index 6cbc7e5..f6b8ccc 100644 --- a/tests/testthat/test-prepare-data.R +++ b/tests/testthat/test-prepare-data.R @@ -137,3 +137,15 @@ test_that("Check as.disag_data function works as expected", { }) +test_that("Check prepare_data warns about non-numeric covariates", { + r3 <- terra::rast(ncol=n_pixels_per_side, nrow=n_pixels_per_side) + terra::ext(r3) <- terra::ext(spdf) + r3[] <- sapply(1:terra::ncell(r), function(x) as.integer(x)) + + cov_stack <- c(r, r2, r3) + names(cov_stack) <- c('layer1', 'layer2', 'layer3') + + expect_warning(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack), + "The values of layer3 are not numeric") + +}) From 6b0d9d77680a65dd5200e36f063c1811ff2b1ef4 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 24 Sep 2024 14:53:54 +0100 Subject: [PATCH 34/44] try to force noRemap error --- src/disaggregation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disaggregation.cpp b/src/disaggregation.cpp index efbaf8b..82c4efa 100644 --- a/src/disaggregation.cpp +++ b/src/disaggregation.cpp @@ -211,7 +211,7 @@ Type objective_function::operator()() } else if(link == 2){ // Don't need to do anything, i.e. pixel_pred = pixel_pred; } else { - perror("Link function not implemented."); + error("Link function not implemented."); } // Aggregate to polygon prediction @@ -242,7 +242,7 @@ Type objective_function::operator()() nll -= dpois(polygon_response_data[polygon], pred_polygoncases, true); reportnll[polygon] = -dpois(polygon_response_data[polygon], pred_polygoncases, true); } else { - perror("Likelihood not implemented."); + error("Likelihood not implemented."); } } From 038290c88ab5896d5f065a9a4bb74ba13ebaa767 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 24 Sep 2024 15:13:37 +0100 Subject: [PATCH 35/44] error > Rf_error to try and fix noRemap error --- src/disaggregation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disaggregation.cpp b/src/disaggregation.cpp index 82c4efa..332fb20 100644 --- a/src/disaggregation.cpp +++ b/src/disaggregation.cpp @@ -211,7 +211,7 @@ Type objective_function::operator()() } else if(link == 2){ // Don't need to do anything, i.e. pixel_pred = pixel_pred; } else { - error("Link function not implemented."); + Rf_error("Link function not implemented."); } // Aggregate to polygon prediction @@ -242,7 +242,7 @@ Type objective_function::operator()() nll -= dpois(polygon_response_data[polygon], pred_polygoncases, true); reportnll[polygon] = -dpois(polygon_response_data[polygon], pred_polygoncases, true); } else { - error("Likelihood not implemented."); + Rf_error("Likelihood not implemented."); } } From a84a3b5bb649ec3a32c810119560fa3a5516339d Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 24 Sep 2024 16:56:35 +0100 Subject: [PATCH 36/44] Plot predictions with and without IID effect aknandi#68 --- R/plotting.R | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index 7c37a07..866bfc8 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -85,7 +85,15 @@ plot_disag_model_data <- function(x){ title <- 'In sample performance: incidence rate' } - data <- data.frame(obs = observed_data, pred = predicted_data) + if (x$model_setup$iid){ + pars <- x$obj$env$last.par.best + iid_poly <- pars[names(pars) == "iideffect"] + pred_no_iid <- predicted_data / exp(iid_poly) + data <- data.frame(obs = observed_data, pred = predicted_data, pred_no_iid = pred_no_iid) + } else { + data <- data.frame(obs = observed_data, pred = predicted_data) + } + return(list(posteriors = posteriors, data = data, @@ -110,13 +118,13 @@ plot_disag_model_data <- function(x){ #' #' @export -plot.disag_model <- function(x, ...){ +plot.disag_model <- function(x, include_iid = FALSE, ...){ - x <- plot_disag_model_data(x) + mod_data <- plot_disag_model_data(x) - posteriors <- x$posteriors - data <- x$data - title <- x$title + posteriors <- mod_data$posteriors + data <- mod_data$data + title <- mod_data$title fixedeffects <- ggplot() + geom_errorbar(posteriors, mapping = aes(x = .data$parameter, ymin = mean - sd, @@ -127,10 +135,25 @@ plot.disag_model <- function(x, ...){ coord_flip() + ggtitle("Parameters (excluding random effects)") - obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred)) + - geom_point() + - geom_abline(intercept = 0, slope = 1, color = 'blue') + - ggtitle(title) + if (x$model_setup$iid){ + obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred_no_iid, color = "Without IID")) + + geom_point() + + geom_abline(intercept = 0, slope = 1, color = 'blue') + + ggtitle(title) + + labs(color = NULL) + + theme(legend.position = c(0, 1), + legend.justification = c(0, 1)) + if (include_iid){ + obspred <- obspred + + geom_point(data = data, aes(x = .data$obs, y = .data$pred, color = "With IID")) + + scale_color_manual(values = c("Without IID" = "black", "With IID" = "red")) + } + } else { + obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred)) + + geom_point() + + geom_abline(intercept = 0, slope = 1, color = 'blue') + + ggtitle(title) + } plots <- list(fixedeffects, obspred) print(cowplot::plot_grid(plotlist = plots)) From a2d7ed7a996323ec39a11e20b33dabab8b84af57 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 26 Sep 2024 16:33:14 +0100 Subject: [PATCH 37/44] fix docs and improve consistency in point colour --- DESCRIPTION | 2 +- NAMESPACE | 1 + R/plotting.R | 4 ++++ man/plot.disag_model.Rd | 5 ++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9adb0cb..f4c7def 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,7 @@ Description: Fits disaggregation regression models using 'TMB' ('Template Model License: MIT + file LICENSE Encoding: UTF-8 LazyData: true -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 Imports: splancs, Matrix, diff --git a/NAMESPACE b/NAMESPACE index 854a626..68ec099 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -24,6 +24,7 @@ export(prepare_data) import(ggplot2) import(splancs) import(utils) +importFrom(rlang,.data) importFrom(stats,cor) importFrom(stats,quantile) importFrom(stats,sd) diff --git a/R/plotting.R b/R/plotting.R index 866bfc8..4968794 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -108,6 +108,8 @@ plot_disag_model_data <- function(x){ #' Produces two plots: results of the fixed effects and in-sample observed vs predicted plot. #' #' @param x Object of class \emph{disag_model} to be plotted. +#' @param include_iid logical. Whether or not to include predictions that include the +#' IID effect. #' @param ... Further arguments to \emph{plot} function. #' #' @return A list of two ggplot plots: results of the fixed effects and an in-sample observed vs predicted plot @@ -139,11 +141,13 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred_no_iid, color = "Without IID")) + geom_point() + geom_abline(intercept = 0, slope = 1, color = 'blue') + + scale_color_manual(values = c("Without IID" = "black")) + ggtitle(title) + labs(color = NULL) + theme(legend.position = c(0, 1), legend.justification = c(0, 1)) if (include_iid){ + obspred$scales$scales <- list() obspred <- obspred + geom_point(data = data, aes(x = .data$obs, y = .data$pred, color = "With IID")) + scale_color_manual(values = c("Without IID" = "black", "With IID" = "red")) diff --git a/man/plot.disag_model.Rd b/man/plot.disag_model.Rd index 421e14c..e97259d 100644 --- a/man/plot.disag_model.Rd +++ b/man/plot.disag_model.Rd @@ -4,11 +4,14 @@ \alias{plot.disag_model} \title{Plot results of fitted model} \usage{ -\method{plot}{disag_model}(x, ...) +\method{plot}{disag_model}(x, include_iid = FALSE, ...) } \arguments{ \item{x}{Object of class \emph{disag_model} to be plotted.} +\item{include_iid}{logical. Whether or not to include predictions that include the +IID effect.} + \item{...}{Further arguments to \emph{plot} function.} } \value{ From cfa0a329a7ac42f3ddc77e6c750c84f1e74deee0 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Thu, 26 Sep 2024 17:53:29 +0100 Subject: [PATCH 38/44] remove .data --- NAMESPACE | 1 - R/plotting.R | 11 +++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 68ec099..854a626 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -24,7 +24,6 @@ export(prepare_data) import(ggplot2) import(splancs) import(utils) -importFrom(rlang,.data) importFrom(stats,cor) importFrom(stats,quantile) importFrom(stats,sd) diff --git a/R/plotting.R b/R/plotting.R index 4968794..6c12649 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -115,7 +115,6 @@ plot_disag_model_data <- function(x){ #' @return A list of two ggplot plots: results of the fixed effects and an in-sample observed vs predicted plot #' #' @import ggplot2 -#' @importFrom rlang .data #' @method plot disag_model #' #' @export @@ -129,7 +128,7 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ title <- mod_data$title fixedeffects <- ggplot() + - geom_errorbar(posteriors, mapping = aes(x = .data$parameter, ymin = mean - sd, + geom_errorbar(posteriors, mapping = aes(x = parameter, ymin = mean - sd, ymax = mean + sd), width = 0.2, color = "blue") + geom_point(posteriors, mapping = aes(x = .data$parameter, y = mean)) + @@ -138,22 +137,22 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ ggtitle("Parameters (excluding random effects)") if (x$model_setup$iid){ - obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred_no_iid, color = "Without IID")) + + obspred <- ggplot(data, aes(x = obs, y = pred_no_iid, color = "Without IID")) + geom_point() + geom_abline(intercept = 0, slope = 1, color = 'blue') + scale_color_manual(values = c("Without IID" = "black")) + ggtitle(title) + labs(color = NULL) + - theme(legend.position = c(0, 1), + theme(legend.position.inside = c(0, 1), legend.justification = c(0, 1)) if (include_iid){ obspred$scales$scales <- list() obspred <- obspred + - geom_point(data = data, aes(x = .data$obs, y = .data$pred, color = "With IID")) + + geom_point(data, aes(x = obs, y = pred, color = "With IID")) + scale_color_manual(values = c("Without IID" = "black", "With IID" = "red")) } } else { - obspred <- ggplot(data, aes(x = .data$obs, y = .data$pred)) + + obspred <- ggplot(data, aes(x = obs, y = pred)) + geom_point() + geom_abline(intercept = 0, slope = 1, color = 'blue') + ggtitle(title) From 49189655458f6e0563827c601ff2b2d608bc86d4 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 30 Sep 2024 12:13:24 +0100 Subject: [PATCH 39/44] deal with cases where polygons have zero aggregation values aknandi#92 --- R/prepare_data.R | 33 ++++++++++++++++++++++-------- tests/testthat/test-prepare-data.R | 12 +++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/R/prepare_data.R b/R/prepare_data.R index 18932ee..0d7014e 100644 --- a/R/prepare_data.R +++ b/R/prepare_data.R @@ -139,6 +139,31 @@ prepare_data <- function(polygon_shapefile, } } + # If no aggregation raster is given, use a 'unity' raster + if(is.null(aggregation_raster)) { + aggregation_raster <- covariate_rasters[[1]] + terra::values(aggregation_raster) <- rep(1, terra::ncell(aggregation_raster)) + } + names(aggregation_raster) <- 'aggregation_raster' + + # Check for polygons with zero aggregation + aggregation_sum <- terra::extract(aggregation_raster, polygon_shapefile, cells = TRUE, na.rm = TRUE, ID = TRUE, fun = "sum") + zero_aggregation <- aggregation_sum[aggregation_sum[, 2] == 0,] + if (nrow(zero_aggregation) > 0){ + zero_polygons <- polygon_shapefile[zero_aggregation$ID,] + if (na_action){ + for (p in zero_polygons[[id_var]]){ + message(paste0(p, " has zero aggregation values and has been removed from the response data")) + } + polygon_shapefile <- polygon_shapefile[-zero_aggregation$ID,] + } else { + for (p in zero_polygons[[id_var]]){ + message(paste0(p, " has zero aggregation values")) + } + stop("Please remove the polygons from the response data or set na.action = TRUE") + } + } + polygon_data <- getPolygonData(polygon_shapefile, id_var, response_var, sample_size_var) # Check for non-numeric covariate values @@ -155,14 +180,6 @@ prepare_data <- function(polygon_shapefile, # Save raster layer names so we can reassign it to make sure names don't change. cov_names <- names(covariate_rasters) - # If no aggregation raster is given, use a 'unity' raster - if(is.null(aggregation_raster)) { - aggregation_raster <- covariate_rasters[[1]] - terra::values(aggregation_raster) <- rep(1, terra::ncell(aggregation_raster)) - } - names(aggregation_raster) <- 'aggregation_raster' - - covariate_rasters <- c(covariate_rasters, aggregation_raster) covariate_data <- terra::extract(covariate_rasters, terra::vect(polygon_shapefile), cells=TRUE, na.rm=TRUE, ID=TRUE) #merge to transfer area_id and then tidy up diff --git a/tests/testthat/test-prepare-data.R b/tests/testthat/test-prepare-data.R index f6b8ccc..4e13cfc 100644 --- a/tests/testthat/test-prepare-data.R +++ b/tests/testthat/test-prepare-data.R @@ -60,9 +60,13 @@ test_that("Check prepare_data function deals with NAs as expected", { aggregation_raster_na <- r aggregation_raster_na[c(1:10)] <- NA + aggregation_raster_zero <- r + aggregation_raster_zero[c(1:2, 21:22)] <- 0 + expect_error(prepare_data(polygon_shapefile = spdf_na, covariate_rasters = cov_stack, make_mesh = FALSE)) expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack_na, make_mesh = FALSE)) expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack, aggregation_raster = aggregation_raster_na, make_mesh = FALSE)) + expect_error(prepare_data(polygon_shapefile = spdf, covariate_rasters = cov_stack, aggregation_raster = aggregation_raster_zero, make_mesh = FALSE)) result <- prepare_data(polygon_shapefile = spdf_na, covariate_rasters = cov_stack_na, @@ -89,6 +93,14 @@ test_that("Check prepare_data function deals with NAs as expected", { expect_equal(sum(is.na(result$covariate_data)), 0) expect_equal(sum(is.na(result$aggregation_pixels)), 0) expect_equal(nrow(result$polygon_shapefile), nrow(spdf_na) - 1) + + result <- prepare_data(polygon_shapefile = spdf_na, + covariate_rasters = cov_stack_na, + aggregation_raster = aggregation_raster_zero, + na_action = TRUE, + make_mesh = FALSE) + + expect_equal(nrow(result$polygon_shapefile), nrow(spdf_na) - 2) }) From e9142f8b22a39abbd5cf0e6ec160ca61b1fbab02 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Mon, 30 Sep 2024 12:51:08 +0100 Subject: [PATCH 40/44] list names of priors in disag_model docs aknandi#85 --- DESCRIPTION | 2 +- R/fit_model.R | 14 +++++++++++++- man/disag_model.Rd | 14 +++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9adb0cb..f4c7def 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,7 @@ Description: Fits disaggregation regression models using 'TMB' ('Template Model License: MIT + file LICENSE Encoding: UTF-8 LazyData: true -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 Imports: splancs, Matrix, diff --git a/R/fit_model.R b/R/fit_model.R index 28d39f8..b42ea67 100644 --- a/R/fit_model.R +++ b/R/fit_model.R @@ -43,7 +43,19 @@ #' #' #' @param data disag_data object returned by \code{\link{prepare_data}} function that contains all the necessary objects for the model fitting -#' @param priors list of prior values +#' @param priors list of prior values: +#' \itemize{ +#' \item \code{priormean_intercept} +#' \item \code{priorsd_intercept} +#' \item \code{priormean_slope} +#' \item \code{priorsd_slope} +#' \item \code{prior_rho_min} +#' \item \code{prior_rho_prob} +#' \item \code{prior_sigma_max} +#' \item \code{prior_sigma_prob} +#' \item \code{prior_iideffect_sd_max} +#' \item \code{prior_iideffect_sd_prob} +#' } #' @param family likelihood function: \emph{gaussian}, \emph{binomial} or \emph{poisson} #' @param link link function: \emph{logit}, \emph{log} or \emph{identity} #' @param iterations number of iterations to run the optimisation for diff --git a/man/disag_model.Rd b/man/disag_model.Rd index e0aeb19..41ba149 100644 --- a/man/disag_model.Rd +++ b/man/disag_model.Rd @@ -20,7 +20,19 @@ disag_model( \arguments{ \item{data}{disag_data object returned by \code{\link{prepare_data}} function that contains all the necessary objects for the model fitting} -\item{priors}{list of prior values} +\item{priors}{list of prior values: +\itemize{ +\item \code{priormean_intercept} +\item \code{priorsd_intercept} +\item \code{priormean_slope} +\item \code{priorsd_slope} +\item \code{prior_rho_min} +\item \code{prior_rho_prob} +\item \code{prior_sigma_max} +\item \code{prior_sigma_prob} +\item \code{prior_iideffect_sd_max} +\item \code{prior_iideffect_sd_prob} + }} \item{family}{likelihood function: \emph{gaussian}, \emph{binomial} or \emph{poisson}} From 5ea89ef8a50d345e6007b7be002523c15a092402 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Tue, 1 Oct 2024 13:08:05 +0100 Subject: [PATCH 41/44] cut > cutoff resolves aknandi#94 --- R/build_mesh.R | 18 +++++++++++------- tests/testthat/test-build-mesh.R | 1 + 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/R/build_mesh.R b/R/build_mesh.R index de08013..70d93b5 100644 --- a/R/build_mesh.R +++ b/R/build_mesh.R @@ -7,16 +7,17 @@ #' and having a small region outside with a coarser mesh to avoid edge effects. #' #' Six mesh parameters can be specified as arguments: \emph{convex}, \emph{concave} and \emph{resolution}, -#' to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, -#' with the names meaning the same as used by INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}. +#' to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cutoff} and \emph{offset}, to control the mesh itself, +#' with the names meaning the same as used by the fmesher functions \emph{fm_nonconvex_hull_inla} and \emph{fm_mesh_2d}. #' #' Defaults are: -#' pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(3.0, 8), cut = 0.4, offset = c(1, 15)). +#' pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(3.0, 8), cutoff = 0.4, offset = c(1, 15)). #' #' @param shapes sf covering the region under investigation. #' @param mesh_args list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, -#' to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, +#' to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cutoff} and \emph{offset}, to control the mesh itself, #' with the parameters having the same meaning as in the INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}. +#' \emph{cut} has been deprecated - use \emph{cutoff} instead. #' @param mesh.args Deprecated. #' #' @return An inla.mesh object @@ -58,15 +59,18 @@ build_mesh <- function(shapes, mesh_args = NULL, mesh.args = NULL) { hypotenuse <- sqrt((limits$xmax - limits$xmin)^2 + (limits$ymax - limits$ymin)^2) maxedge <- hypotenuse/10 + if (!(is.null(mesh_args)) && ("cut" %in% names(mesh_args))){ + mesh_args$cutoff <- mesh_args$cut + message("cut is deprecated and will be removed in a future version - please use cutoff instead") + } pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(maxedge, maxedge * 2), - cut = 0.1, + cutoff = 0.1, offset = c(hypotenuse / 10, hypotenuse / 10)) - pars[names(mesh_args)] <- mesh_args outline <- sf::st_sf(sf::st_union(sf::st_convex_hull(shapes))) @@ -81,7 +85,7 @@ build_mesh <- function(shapes, mesh_args = NULL, mesh.args = NULL) { mesh <- fmesher::fm_mesh_2d( boundary = outline.hull, max.edge = pars$max.edge, - cut = pars$cut, + cutoff = pars$cutoff, offset = pars$offset) diff --git a/tests/testthat/test-build-mesh.R b/tests/testthat/test-build-mesh.R index 45cfdc6..a66b9d5 100644 --- a/tests/testthat/test-build-mesh.R +++ b/tests/testthat/test-build-mesh.R @@ -7,6 +7,7 @@ test_that("build_mesh behaves as expected", { expect_error(build_mesh(response_df)) expect_error(build_mesh(spdf, mesh_args = c(4, 8))) + expect_message(build_mesh(spdf, mesh_args = list(cut = 0.1))) expect_is(my_mesh, 'inla.mesh') expect_is(build_mesh(spdf, mesh_args = list(max.edge = c(50, 100))), 'inla.mesh') From 01348d4df0d9759931d4fd04c5de433d2a21daf1 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Wed, 2 Oct 2024 09:16:36 +0100 Subject: [PATCH 42/44] update README and docs --- README.md | 14 +++++++------- man/build_mesh.Rd | 11 ++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 73ba4c0..ab4445f 100644 --- a/README.md +++ b/README.md @@ -34,34 +34,34 @@ data_for_model <- prepare_data(polygon_shapefile = shps, ### Input data * A SpatRaster of covariate rasters to be used in the model (covariate_rasters) -* A sf (polygon_shapefile) containing at least two columns: one with the id for the polygons (id_var) and one with the response count data (response_var); for binomial data, i.e survey data, it can also contain a sample size column (sample_size_var). +* A sf (polygon_shapefile) containing at least two columns: one with the id for the polygons (id_var) and one with the response count data (response_var); for binomial data, i.e survey data, it can also contain a sample size column (sample_size_var). * (Optional) SpatRaster used to aggregate the pixel level predictions (aggregation_raster) to polygon level (usually population). If this is not supplied a uniform raster will be used ### Controlling the mesh -The argument mesh.args in prepare_data allows you to supply a list of INLA mesh parameter to control the mesh used for the spatial field +The argument mesh_args in prepare_data allows you to supply a list of INLA mesh parameters to control the mesh used for the spatial field ```R data_for_model <- prepare_data(shps, covariate_stack, - mesh.args = list(max.edge = c(0.2, 8), - cut = 0.05, + mesh_args = list(max.edge = c(0.2, 8), + cutoff = 0.05, offset = c(1, 0.7))) ``` ### Dealing with NAs -There is an na.action flag that is automatically off. If there are any NAs in your response or covariate data within the polygons the prepare_data method will fail. We advise you to sort out the NAs in your data yourself, however, if you want the function to automatically deal with NAs you can set na.action = TRUE. This will remove any polygons that have NAs as a response, set any aggregation pixels with NA to zero and set covariate NAs pixels to the median value for the that covariate. +There is an na_action flag that is automatically off. If there are any NAs in your response or covariate data within the polygons the prepare_data method will fail. We advise you to sort out the NAs in your data yourself, however, if you want the function to automatically deal with NAs you can set na_action = TRUE. This will remove any polygons that have NAs as a response or a population of zero, set any aggregation pixels with NA to zero and set covariate NAs pixels to the median value for the that covariate. ```R data_for_model <- prepare_data(shps, covariate_stack, aggregation_raster = population_raster, - na.action = TRUE) + na_action = TRUE) ``` ## Model fitting -Function disag_model takes data structure returned by prepare_data and fits a TMB disaggregation model. Here you can specify priors, likelihood function, link function and whether to include a field or iid effect (default includes both) +Function disag_model takes the data structure returned by prepare_data and fits a TMB disaggregation model. Here you can specify priors, likelihood function, link function and whether to include a field or iid effect (default includes both). ```R model_result <- disag_model(data_for_model, diff --git a/man/build_mesh.Rd b/man/build_mesh.Rd index 05af618..0bcbf05 100644 --- a/man/build_mesh.Rd +++ b/man/build_mesh.Rd @@ -10,8 +10,9 @@ build_mesh(shapes, mesh_args = NULL, mesh.args = NULL) \item{shapes}{sf covering the region under investigation.} \item{mesh_args}{list of parameters that control the mesh structure. \emph{convex}, \emph{concave} and \emph{resolution}, -to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, -with the parameters having the same meaning as in the INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}.} +to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cutoff} and \emph{offset}, to control the mesh itself, +with the parameters having the same meaning as in the INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}. +\emph{cut} has been deprecated - use \emph{cutoff} instead.} \item{mesh.args}{Deprecated.} } @@ -27,11 +28,11 @@ and a coarser mesh outside. This speeds up computation time by only having a ver and having a small region outside with a coarser mesh to avoid edge effects. Six mesh parameters can be specified as arguments: \emph{convex}, \emph{concave} and \emph{resolution}, -to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cut} and \emph{offset}, to control the mesh itself, -with the names meaning the same as used by INLA functions \emph{inla.convex.hull} and \emph{inla.mesh.2d}. +to control the boundary of the inner mesh, and \emph{max.edge}, \emph{cutoff} and \emph{offset}, to control the mesh itself, +with the names meaning the same as used by the fmesher functions \emph{fm_nonconvex_hull_inla} and \emph{fm_mesh_2d}. Defaults are: -pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(3.0, 8), cut = 0.4, offset = c(1, 15)). +pars <- list(convex = -0.01, concave = -0.5, resolution = 300, max.edge = c(3.0, 8), cutoff = 0.4, offset = c(1, 15)). } \examples{ \dontrun{ From 0e0dcc4270786596fe92b3997e67607ceea6aad6 Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Wed, 2 Oct 2024 10:22:10 +0100 Subject: [PATCH 43/44] fix undefined variables NOTE and update vignette --- R/plotting.R | 4 +++- vignettes/disaggregation.Rmd | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index 6c12649..71f7a0d 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -123,6 +123,8 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ mod_data <- plot_disag_model_data(x) + parameter <- obs <- pred <- pred_no_iid <- NULL + posteriors <- mod_data$posteriors data <- mod_data$data title <- mod_data$title @@ -131,7 +133,7 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ geom_errorbar(posteriors, mapping = aes(x = parameter, ymin = mean - sd, ymax = mean + sd), width = 0.2, color = "blue") + - geom_point(posteriors, mapping = aes(x = .data$parameter, y = mean)) + + geom_point(posteriors, mapping = aes(x = parameter, y = mean)) + facet_wrap( ~ type , scales = 'free') + coord_flip() + ggtitle("Parameters (excluding random effects)") diff --git a/vignettes/disaggregation.Rmd b/vignettes/disaggregation.Rmd index 2138e3f..efa58f9 100644 --- a/vignettes/disaggregation.Rmd +++ b/vignettes/disaggregation.Rmd @@ -114,7 +114,7 @@ data_for_model <- prepare_data(polygon_shapefile = df, aggregation_raster = pop_raster, response_var = 'cases', id_var = 'censustract.FIPS', - mesh_args = list(cut = 0.01, + mesh_args = list(cutoff = 0.01, offset = c(0.1, 0.5), max.edge = c(0.1, 0.2), resolution = 250), From d9e31a6a48021e64d606414fb2b49adc594ba1ce Mon Sep 17 00:00:00 2001 From: simon-smart88 Date: Wed, 2 Oct 2024 17:11:44 +0100 Subject: [PATCH 44/44] fix geom_point, add labels, add test --- R/plotting.R | 4 ++-- tests/testthat/test-plotting.R | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index 71f7a0d..57a2083 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -144,13 +144,13 @@ plot.disag_model <- function(x, include_iid = FALSE, ...){ geom_abline(intercept = 0, slope = 1, color = 'blue') + scale_color_manual(values = c("Without IID" = "black")) + ggtitle(title) + - labs(color = NULL) + + labs(x = "Observed", y = "Predicted", color = NULL) + theme(legend.position.inside = c(0, 1), legend.justification = c(0, 1)) if (include_iid){ obspred$scales$scales <- list() obspred <- obspred + - geom_point(data, aes(x = obs, y = pred, color = "With IID")) + + geom_point(data = data, aes(x = obs, y = pred, color = "With IID")) + scale_color_manual(values = c("Without IID" = "black", "With IID" = "red")) } } else { diff --git a/tests/testthat/test-plotting.R b/tests/testthat/test-plotting.R index 3240be3..78b554e 100644 --- a/tests/testthat/test-plotting.R +++ b/tests/testthat/test-plotting.R @@ -45,12 +45,16 @@ test_that("Check plot.disag_model function works as expected", { p2 <- plot(fit_result_nofield) + p3 <- plot(result, include_iid = TRUE) + expect_is(p1, 'list') expect_equal(length(p1), 2) expect_is(p2, 'list') expect_equal(length(p2), 2) + expect_is(p3, 'list') + expect_equal(length(p3), 2) })