--- title: "Getting Started with saeHB.Spatial.Beta" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Getting Started with saeHB.Spatial.Beta} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE ) ``` ## Introduction The `saeHB.Spatial.Beta` package provides several functions to estimate small area proportions using Hierarchical Bayesian (HB) methods under spatial and non-spatial models for area-level random effects. This package is specifically designed to accommodate survey design effects (DEFF) for sampling variances. In this vignette, we will demonstrate a complete analytical workflow: 1. **Preparation and Data Loading**, including calculating the variance and RSE of the direct estimates to serve as a baseline. 2. **Fitting the HB Beta Deff Non-Spatial Model**. 3. **Spatial Autocorrelation Diagnostic** on the random effects using Moran's I. 4. **Fitting the HB Beta Deff Spatial Models** (SAR and Leroux CAR). 5. **Evaluation and Comparison** of estimation precision using Relative Standard Error (RSE). ## Model Specifications Before diving into the workflow, let's briefly review the underlying models. Let $\hat{\theta}_i$ denote the direct estimator of the proportion for area $i$ ($i = 1, \dots, m$), and $\theta_i$ denote the true proportion parameter. Under the Hierarchical Bayesian framework, the Beta spatial model accommodating survey design effects is specified as follows: **1. Sampling Model:** $$\hat{\theta}_i \mid \theta_i \sim \text{Beta}(a_i, b_i)$$ To accommodate the effective sample size from complex surveys, the shape parameters are strictly defined using the area's sample size ($n_i$) and survey design effect ($d_i$). Thus, the parameters are formulated as: $$a_i = \theta_i \left(\frac{n_i}{d_i} - 1\right) \quad \text{and} \quad b_i = (1 - \theta_i) \left(\frac{n_i}{d_i} - 1\right)$$ With this specification, the expected value holds $E(\hat{\theta}_i \mid \theta_i) = \theta_i$. The sampling variance of the direct estimator can be expressed as $\psi_i = \left[ \frac{\theta_i (1-\theta_i)}{n_i} \right] d_i$, indicating that the sampling variance directly depends on the proportion parameter $\theta_i$ and the design effect $d_i$. **2. Linking Model:** The true proportion $\theta_i$ is modeled using a logit link function: $$\text{logit}(\theta_i) = \mathbf{x}_i^T \boldsymbol{\beta} + v_i$$ Here, $\mathbf{x}_i^T$ represents the vector of auxiliary variables, $\boldsymbol{\beta}$ the regression coefficients, and $v_i$ the area-specific random effect. **3. Spatial Random Effects:** To account for spatial dependency, the random effects vector $\mathbf{v} = (v_1, \dots, v_m)^T$ can be modeled using two different spatial structures: a. **SAR Model:** The random effects follow a Simultaneous Autoregressive process, mathematically defined as: $$\mathbf{v} = \rho \mathbf{W} \mathbf{v} + \mathbf{u}, \quad \mathbf{u} \sim N_m(\mathbf{0}, \sigma_u^2 \mathbf{I})$$ Assuming the matrix $(\mathbf{I} - \rho \mathbf{W})$ is non-singular, it can be rewritten explicitly as $\mathbf{v} = (\mathbf{I} - \rho \mathbf{W})^{-1} \mathbf{u}$, which implies $\mathbf{v} \sim N_m(\mathbf{0}, \mathbf{G})$ with the covariance dispersion matrix defined as: $$\mathbf{G} = \sigma_u^2 [(\mathbf{I} - \rho \mathbf{W})^T (\mathbf{I} - \rho \mathbf{W})]^{-1}$$ Where $\rho$ is the spatial autocorrelation parameter, $\mathbf{W}$ is a row-standardized spatial weights matrix, and $\mathbf{u}$ is the independent random error vector. b. **Leroux CAR Model:** The random effects follow a Conditional Autoregressive structure, $\mathbf{v} \sim N_m(\mathbf{0}, \mathbf{Q}(\rho)^{-1})$, with the precision matrix defined as: $$\mathbf{Q}(\rho) = \frac{1}{\sigma_v^2} [(1 - \rho)\mathbf{I} + \rho(\mathbf{D} - \mathbf{W})]$$ Where $\mathbf{W}$ is the binary spatial adjacency matrix, $\mathbf{D}$ is a diagonal matrix containing the number of neighbors for each area, and $\rho \in [0,1)$ controls the spatial dependence. ## Step 1: Preparation and Data Loading First, load the package along with the provided synthetic dataset (`databeta`). We will also load `ggplot2` for visualization. After loading the data, we calculate the variance and the Relative Standard Error (RSE) of the direct estimates to serve as our baseline for comparison. ```{r setup} library(saeHB.Spatial.Beta) library(ggplot2) # Load data data("databeta") # Calculate Variance of Direct Estimator for proportion data considering DEFF # var(y) = [y * (1 - y) / n_i] * deff var_direct <- (databeta$y * (1 - databeta$y) / databeta$n_i) * databeta$deff # Calculate Relative Standard Error (RSE) of Direct Estimation databeta$rse_direct <- (sqrt(var_direct) / databeta$y) * 100 ``` ## Step 2: Fitting the HB Beta Deff Non-Spatial Model We begin by fitting a baseline non-spatial model that accommodates the survey design effect. Here, we use the default Markov Chain Monte Carlo (MCMC) iterations. *Note: By default, the function runs MCMC with a predefined number of iterations and burn-in periods. For practical applications, you may need to adjust parameters such as iter.mcmc, burn.in, thin, and chains to ensure proper mixing and convergence.* ```{r ns-model, results='hide'} mod_ns_deff <- betadeff_nonspatial( formula = y ~ x1 + x2, deff = "deff", n_i = "n_i", data = databeta ) ``` Extract the RSE for the non-spatial estimates: ```{r ns-rse} rse_ns_deff <- (mod_ns_deff$est$Est.Error / mod_ns_deff$est$Estimate) * 100 ``` ## Step 3: Spatial Autocorrelation Diagnostic (Moran's I) To determine whether a spatial model is warranted, we evaluate the spatial autocorrelation of the random effects ($v$) obtained from the non-spatial model. We use a row-standardized spatial weight matrix for Moran's I testing. ```{r moran-weights} data("weight_mat") W_listw <- spdep::mat2listw(weight_mat, style = "W") # Extract the mean of the random effects (v) v_ns_deff <- as.numeric(mod_ns_deff$randeff$Estimate) ``` Since our dataset has a relatively small number of areas ($m = 36$), we use the Monte Carlo permutation approach with 999 permutations, which computes the p-value empirically by randomly permuting the observed values. The analytical randomisation approach can be used as an alternative (`mc = FALSE`). ```{r moran-test} set.seed(123) moran_result <- moran_test(x = v_ns_deff, listw = W_listw, mc = TRUE, nsim = 999) print(moran_result) ``` A significant p-value confirms that the non-spatial model left unexplained spatial structure, heavily justifying the use of spatial models. ## Step 4: Fitting the HB Beta Deff Spatial Models We will now fit two spatial models: the Simultaneous Autoregressive (SAR) model and the Leroux Conditional Autoregressive (CAR) model. The SAR model requires a row-standardized weight matrix, while the Leroux CAR model requires a binary adjacency matrix. ```{r spatial-models, results='hide'} # 1. Fit Spatial SAR Model # Load the spatial weight matrix for the SAR model data("weight_mat") mod_sar_deff <- betadeff_sar( formula = y ~ x1 + x2, deff = "deff", n_i = "n_i", proxmat = weight_mat, data = databeta ) # 2. Fit Spatial Leroux CAR Model # Load the binary adjacency matrix for the Leroux CAR model data("adjacency_mat") mod_leroux_deff <- betadeff_lerouxcar( formula = y ~ x1 + x2, deff = "deff", n_i = "n_i", proxmat = adjacency_mat, data = databeta ) ``` Extract the RSE for both spatial models: ```{r spatial-rse} rse_sar_deff <- (mod_sar_deff$est$Est.Error / mod_sar_deff$est$Estimate) * 100 rse_leroux_deff <- (mod_leroux_deff$est$Est.Error / mod_leroux_deff$est$Estimate) * 100 ``` ## Step 5: Evaluation and Comparison We compare the performance of the Direct Estimator, the HB Beta Deff Non-Spatial Model, and the HB Beta Deff Spatial Models (SAR and Leroux CAR). A lower RSE indicates a more reliable and precise estimate. First, let's look at the summary statistics of the RSEs provided by the SAE models compared to the direct estimates. ```{r rse-summary, echo=FALSE} calc_stats <- function(x) { c( Minimum = min(x, na.rm = TRUE), `First Quartile` = unname(quantile(x, 0.25, na.rm = TRUE)), Median = median(x, na.rm = TRUE), Mean = mean(x, na.rm = TRUE), `Third Quartile` = unname(quantile(x, 0.75, na.rm = TRUE)), Maximum = max(x, na.rm = TRUE) ) } rse_summary <- data.frame( Direct = calc_stats(databeta$rse_direct), `HB Beta Deff Non-Spatial` = calc_stats(rse_ns_deff), `HB Beta Deff Spatial Leroux CAR` = calc_stats(rse_leroux_deff), `HB Beta Deff Spatial SAR` = calc_stats(rse_sar_deff), check.names = FALSE ) knitr::kable( rse_summary, digits = 2, align = "c", caption = "Descriptive Statistics of Relative Standard Error (RSE) (%)" ) ``` We can also visualize this comparison across all areas using a line and point plot to observe the fluctuation of RSE values. ```{r comparison, fig.width=8, fig.height=5} # Combine RSEs into a single data frame for plotting df_rse <- data.frame( Area = seq_along(databeta$y), Direct = databeta$rse_direct, Non_Spatial = rse_ns_deff, Spatial_SAR = rse_sar_deff, Spatial_Leroux = rse_leroux_deff ) # Order by Direct RSE for better visualization df_rse <- df_rse[order(df_rse$Direct), ] df_rse$Area_Index <- seq_len(nrow(df_rse)) # Plotting the RSE Comparison ggplot(df_rse, aes(x = Area_Index)) + # Direct Estimation geom_line(aes(y = Direct, color = "Direct"), linewidth = 0.8, alpha = 0.6) + geom_point(aes(y = Direct, color = "Direct"), size = 2, alpha = 0.6) + # Non-Spatial geom_line(aes(y = Non_Spatial, color = "HB Beta Deff Non-Spatial"), linewidth = 0.8, alpha = 0.8) + geom_point(aes(y = Non_Spatial, color = "HB Beta Deff Non-Spatial"), size = 2, alpha = 0.8) + # Spatial SAR geom_line(aes(y = Spatial_SAR, color = "HB Beta Deff Spatial SAR"), linewidth = 1) + geom_point(aes(y = Spatial_SAR, color = "HB Beta Deff Spatial SAR"), size = 2) + # Spatial Leroux CAR geom_line(aes(y = Spatial_Leroux, color = "HB Beta Deff Spatial Leroux CAR"), linewidth = 1) + geom_point(aes(y = Spatial_Leroux, color = "HB Beta Deff Spatial Leroux CAR"), size = 2) + scale_color_manual( name = "Estimator", values = c("Direct" = "#E69F00", "HB Beta Deff Non-Spatial" = "#56B4E9", "HB Beta Deff Spatial SAR" = "#009E73", "HB Beta Deff Spatial Leroux CAR" = "#D55E00") ) + labs( title = "Comparison of Relative Standard Error (RSE)", subtitle = "Lower RSE indicates higher precision", x = "Area (Ordered by Direct RSE)", y = "RSE (%)" ) + theme_minimal() + theme(legend.position = "bottom") ```