TruncatedPCQM

TruncatedPCQM provides a systematic methodology for estimating population density from point-centered quarter method (PCQM) surveys when distance measurements are truncated by a maximum search radius (right-censored). The package implements both completely randomly distributed (Poisson) and spatially aggregated (Negative Binomial) models.

Installation

You can install the development version of TruncatedPCQM from GitHub with:

# install.packages("devtools")
devtools::install_github("rcjhrpyt-droid/TruncatedPCQM")

Quick Start

library(TruncatedPCQM)
# Create example PCQM distance matrix
distances_matrix <- matrix(c(
  9999.000000, 9999.000000, 9999.000000, 9999.000000,
  9999.000000, 7.655136, 13.815876, 10.423496,
     6.094721, 4.135461, 7.732912, 5.454545,
  9999.000000, 9999.000000, 14.787289, 15.670821,
  9999.000000, 9.825537, 11.611850, 15.757861,
  9999.000000, 9.670381, 14.055394, 17.075678,
    11.529219, 4.464136, 7.793114, 11.309553,
    13.307828, 5.864490, 13.309636, 5.897720,
  9999.000000, 9999.000000, 9999.000000, 9999.000000,
  9999.000000, 9999.000000, 18.201084, 9999.000000,
  9999.000000, 7.809056, 12.612496, 5.601366,
     9.201294, 9999.000000, 8.353524, 9.683701,
     6.592604, 19.117869, 19.758384, 12.923507,
    15.574824, 10.643719, 9.494539, 7.382031,
     9.143077, 9999.000000, 15.551414, 5.266916,
  9999.000000, 9999.000000, 9999.000000, 9999.000000,
    18.604278, 7.279454, 9.385355, 5.573127,
  9999.000000, 9999.000000, 9999.000000, 9999.000000,
  9999.000000, 9999.000000, 9999.000000, 9999.000000,
    11.980811, 9999.000000, 11.853695, 14.405252
), nrow = 20, ncol = 4, byrow = TRUE)
# Negative Binomial model (spatially aggregated populations)
nbd_result <- nbd_mle(
  distances = distances_matrix,
  C = 20,
  q = 4,
  l = 2,
  init_method = "Pollard_censored",
  lambda_lower = 1e-4,
  lambda_upper = 10
)
# CSR model (randomly distributed populations)
csr_result <- csr_mle(
  distances = distances_matrix,
  C = 20,
  q = 4,
  l = 2,
  lambda_lower = 1e-4,
  lambda_upper = 1
)
# Multiple moment-based estimators
moment_result <- adjusted_moments(
  distances = distances_matrix,
  C = 20,
  q = 4,
  l = 2,
  init_method = "Pollard_censored"
)
# Display results
print(nbd_result)
#> NBD-based PCQM density estimation (MLE)
#> --------------------------------------------------
#> Estimated density (lambda): 0.014366 
#> Aggregation parameter (k): 0.702610 
#> Number of focal points: 20.0000 
#> Censored sectors: 32 (40.0%)
print(csr_result)
#> CSR-based PCQM density estimation (MLE)
#> --------------------------------------------------
#> Estimated density (lambda): 0.007840 
#> Number of focal points: 20.0000 
#> Total sectors: 80 
#> Censored sectors: 32 (40.0%)
print(moment_result)
#> Adjusted Moment Estimators for PCQM Density
#> ===========================================
#> Number of focal points: 20 
#> Total sectors: 80 
#> Censored sectors: 32 (40.0%) 
#> 
#> Density Estimators:
#> -------------------
#> Cottam_censored:    0.009915 
#> Pollard_censored:   0.010331 
#> Shen_censored:      0.011546 
#> Morisita_censored:  0.011723 
#> 
#> Aggregation Parameter:
#> ----------------------
#> k_hat:  3.721403

Main Functions

nbd_mle(): Negative Binomial Distribution MLE

Estimates population density and aggregation parameter under the Negative Binomial model, accounting for right-censored distances.

csr_mle(): Complete Spatial Randomness MLE

Estimates population density under the Poisson (CSR) model for right-censored PCQM data.

adjusted_moments(): Adjusted Moment Estimators

Computes multiple moment-based density estimators (DK, Cottam, Pollard, Shen, Morisita) for right-censored PCQM data.

Data Input Formats

# Matrix format (each row = sampling point, each column = sector)
set.seed(123)
matrix_data <- matrix(runif(80, 5, 15), nrow = 20, ncol = 4)
# Data frame format
df_data <- as.data.frame(matrix_data)
# Vector format (auto-reshaped by q parameter)
vector_data <- as.vector(t(matrix_data))
# All formats should give similar results
res1 <- adjusted_moments(matrix_data, C = 20, q = 4, l = 2)
res2 <- adjusted_moments(df_data, C = 20, q = 4, l = 2)
res3 <- adjusted_moments(vector_data, C = 20, q = 4, l = 2)
cat("Matrix result:", res1$Cottam_censored, "\n")
#> Matrix result: 0.01994273
cat("Data frame result:", res2$Cottam_censored, "\n")
#> Data frame result: 0.01994273
cat("Vector result:", res3$Cottam_censored, "\n")
#> Vector result: 0.01994273

Citation

If you use TruncatedPCQM in your research, please cite:

@article{,
  title   = {Population Density Estimators for Right-Censored Distance Sampling},
  author  = {Huang, Wenzhe and Shen, Guochun and Xing, Dingliang and Zhao, Jiangyan},
  year    = {2026},
  journal = {arXiv preprint arXiv:2603.08276},
  url     = {https://arxiv.org/abs/2603.08276}
}

@software{,
  title = {TruncatedPCQM: Density Estimation for Point-Centered Quarter Method with Truncated Sampling},
  author = {Huang, Wenzhe and Shen, Guochun and Xing, Dingliang and Zhao, Jiangyan},
  year = {2026},
  url = {https://github.com/rcjhrpyt-droid/TruncatedPCQM}
}

Support


mirror server hosted at Truenetwork, Russian Federation.