--- title: "Getting started" output: rmarkdown::html_vignette bibliography: vignette.bib vignette: > %\VignetteIndexEntry{ht} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(sapo) library(sf) set.seed(2024) ``` > The `sapo` package provides a Monte Carlo test for evaluating spatial > association between polygons. For reproducibility, set a seed before using the > functions. This vignette illustrates the functionality of the `sapo` package. `sapo`, which is Portuguese for "toad," stands for "**S**patial **A**ssociation Between **Po**lygons". This package enables you to test whether two types of polygons are spatially associated. This raises two key questions: 1) What do these "polygon types" represent? and 2) What constitutes spatial association? Polygons can represent various spatial entities. In ecology, for instance, polygons might represent ecological patches [@mcgarigal2013landscape], animal home ranges, or forest canopy gaps. It's often important to determine if two types of spatial phenomena (like those mentioned above) tend to attract or repel each other. Conditional Monte Carlo (MC) hypothesis tests [@godoy2022testing] offer a way to test these hypotheses. The `cmc_psat` function (conditional MC polygon association test) implements these methods. All methods are based on conditional MC simulation, generating spatial patterns that assume spatial independence (using an adaptation of the toroidal shift^[a technique that shifts the polygons to simulate different spatial arrangements]) while preserving the observed marginal spatial structures. To illustrate the package's functionality, consider two simulated polygon types, `poly1` and `poly2`, loaded below as `sf` objects. These will represent two distinct spatial features. Our goal is to test whether they are _spatially independent_. ```{r} poly1 <- system.file("extdata", "poly1.rds", package = "sapo") |> readRDS() poly2 <- system.file("extdata", "poly2.rds", package = "sapo") |> readRDS() str(poly1) str(poly2) ``` Below, we plot these polygon types from this toy example. ```{r} plot(sf::st_geometry(poly1), col = "gray70") plot(sf::st_geometry(poly2), add = TRUE) ``` The `cmc_psat` function requires that its first two arguments, `p1` and `p2`, are `sf` objects. Other important arguments include: * `n_sim` (default = 499): An integer specifying the number of conditional MC simulations under the null hypothesis of spatial independence. * `alpha` (default = 0.05): A real number (between 0 and 1) indicating the significance level for the hypothesis test. For a deeper understanding of the remaining arguments, refer to @godoy2022testing, which provides a comprehensive explanation of the method. The default argument values generally optimize the test's power and type I error rate. The code below tests whether `poly1` and `poly2` are _spatially independent_. In essence, it assesses whether the presence of a type 2 polygon affects the likelihood of observing a type 1 polygon. ```{r} my_ht <- cmc_psat(poly1, poly2) ``` The test's p-value is `r sprintf("%.4f", my_ht$p_value)`, indicating a lack of spatial dependence. If the analysis suggests that the polygons are not spatially independent, a descriptive analysis can be performed using a generalization of the $H_{12}$ function (typically $K_{12}$ or $L_{12}$, with the latter being the package default) used for analyzing spatial point patterns. We'll now create point-wise confidence bands based on the $L_{12}$ null hypothesis. These bands will be plotted against the $L_{12}$ function calculated from the real data. A significant result with the black curve (representing the real data) below the envelope suggests that the two polygon types repel each other. Conversely, if the black curve is above the envelope, it indicates attraction. Remember that these envelopes are for descriptive analysis, not inference. The _p-value_ determines whether to reject the hypothesis of spatial independence. ```{r} sig_level <- my_ht$alpha sig_plot <- data.frame(r = my_ht$distances, h = my_ht$mc_funct[NROW(my_ht$mc_funct), ], l = apply(my_ht$mc_funct, 2, quantile, prob = .5 * sig_level), u = apply(my_ht$mc_funct, 2, quantile, prob = 1 - .5 * sig_level)) ## par(mfrow = c(1, 2)) ## ## plot density part ## den <- density(my_ht$mc_sample) ## plot(den, main = sprintf("Test statistic (p-value = %.4f)", ## my_ht$p_value), ## xlab = "u", ylab = "density") ## value <- my_ht$mc_sample[length(my_ht$mc_sample)] ## polygon(c(den$x[den$x >= value], value), ## c(den$y[den$x >= value], 0), ## col = "coral1", ## border = "transparent") ## lines(den) ## H function with(sig_plot, plot(x = r, y = h, type = "l", col = 2, main = "Local envelope", xlab = "r", ylab = expression(H[12](r)), ylim = range(c(h, l, u)))) with(sig_plot, lines(x = r, y = l, lty = 2, col = 2)) with(sig_plot, lines(x = r, y = u, lty = 2, col = 2)) with(sig_plot, polygon(c(r, rev(r)), c(l, rev(u)), col = "coral1", lty = 0)) with(sig_plot, lines(x = r, y = h, col = 1)) ```