ecological-agent-skills 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_CONTEXT.md +191 -0
- package/CATALOG.md +329 -0
- package/LICENSE +692 -0
- package/README.md +347 -0
- package/bin/install.mjs +168 -0
- package/docs/comparison-with-alternatives.md +38 -0
- package/docs/global-examples-index.md +103 -0
- package/docs/repository-statistics.md +101 -0
- package/docs/theoretical-foundations.md +188 -0
- package/environment.yaml +106 -0
- package/examples/community/arctic_tundra_vegetation_example.md +247 -0
- package/examples/community/bird_landuse_example.md +63 -0
- package/examples/community/phytoplankton_reservoir_example.md +60 -0
- package/examples/community/reef_fish_indopacific_example.md +221 -0
- package/examples/impact/baci_road_example.md +57 -0
- package/examples/impact/ecosystem_services_atlantic_forest.md +83 -0
- package/examples/impact/forest_loss_borneo_timeseries_example.md +225 -0
- package/examples/occupancy/puma_camera_example.md +61 -0
- package/examples/occupancy/snow_leopard_himalayas_example.md +204 -0
- package/examples/reproducible/whittaker_biome_sdm_example.md +406 -0
- package/examples/sdm/anteater_cerrado_example.md +69 -0
- package/examples/sdm/jaguar_amazon_example.md +80 -0
- package/examples/sdm/koala_climate_change_example.md +170 -0
- package/examples/sdm/wolf_recolonization_europe_example.md +193 -0
- package/package.json +43 -0
- package/renv.lock +194 -0
- package/skills/SKILL_INDEX.json +1020 -0
- package/skills/acoustic-monitoring/SKILL.md +163 -0
- package/skills/acoustic-monitoring/examples/example-prompts.md +100 -0
- package/skills/acoustic-monitoring/examples/temperate_forest_birds_example.md +285 -0
- package/skills/acoustic-monitoring/resources/acoustic-indices-reference.md +93 -0
- package/skills/acoustic-monitoring/resources/soundscape-ecology-guide.md +90 -0
- package/skills/acoustic-monitoring/resources/species-id-tools-comparison.md +89 -0
- package/skills/acoustic-monitoring/scripts/batch_species_detection.py +360 -0
- package/skills/acoustic-monitoring/scripts/compute_acoustic_indices.R +235 -0
- package/skills/acoustic-monitoring/scripts/compute_acoustic_indices.py +374 -0
- package/skills/biostatistics-workbench/SKILL.md +140 -0
- package/skills/biostatistics-workbench/examples/example-prompts.md +39 -0
- package/skills/biostatistics-workbench/resources/effect-size-reference.md +81 -0
- package/skills/biostatistics-workbench/resources/glm-family-link-reference.md +47 -0
- package/skills/biostatistics-workbench/resources/test-selection-guide.md +93 -0
- package/skills/biostatistics-workbench/scripts/glm_pipeline.R +78 -0
- package/skills/biostatistics-workbench/scripts/glm_pipeline.py +210 -0
- package/skills/camera-trap-processing/SKILL.md +159 -0
- package/skills/camera-trap-processing/examples/example-prompts.md +103 -0
- package/skills/camera-trap-processing/examples/leopard_serengeti_example.md +231 -0
- package/skills/camera-trap-processing/resources/activity-patterns-reference.md +113 -0
- package/skills/camera-trap-processing/resources/camtrapR-workflow-guide.md +130 -0
- package/skills/camera-trap-processing/resources/detection-event-definition-guide.md +89 -0
- package/skills/camera-trap-processing/scripts/estimate_activity.R +169 -0
- package/skills/camera-trap-processing/scripts/process_camtrap_data.R +179 -0
- package/skills/camera-trap-processing/scripts/process_camtrap_data.py +192 -0
- package/skills/community-ecology-ordination/SKILL.md +133 -0
- package/skills/community-ecology-ordination/examples/example-prompts.md +35 -0
- package/skills/community-ecology-ordination/resources/dissimilarity-metric-guide.md +53 -0
- package/skills/community-ecology-ordination/resources/nmds-interpretation-guide.md +104 -0
- package/skills/community-ecology-ordination/scripts/__pycache__/community_analysis.cpython-311.pyc +0 -0
- package/skills/community-ecology-ordination/scripts/community_analysis.R +143 -0
- package/skills/community-ecology-ordination/scripts/community_analysis.py +231 -0
- package/skills/ecological-data-foundation/SKILL.md +129 -0
- package/skills/ecological-data-foundation/examples/example-prompts.md +40 -0
- package/skills/ecological-data-foundation/resources/coordinate-cleaning-flags.md +66 -0
- package/skills/ecological-data-foundation/resources/darwin-core-glossary.md +91 -0
- package/skills/ecological-data-foundation/resources/data-citation-guide.md +265 -0
- package/skills/ecological-data-foundation/resources/gbif-data-citation-guide.md +193 -0
- package/skills/ecological-data-foundation/resources/qa-checklist.md +83 -0
- package/skills/ecological-data-foundation/scripts/__pycache__/clean_occurrences.cpython-311.pyc +0 -0
- package/skills/ecological-data-foundation/scripts/__pycache__/download_from_ebird.cpython-311.pyc +0 -0
- package/skills/ecological-data-foundation/scripts/__pycache__/download_from_inat.cpython-311.pyc +0 -0
- package/skills/ecological-data-foundation/scripts/__pycache__/download_from_iucn.cpython-311.pyc +0 -0
- package/skills/ecological-data-foundation/scripts/__pycache__/download_from_obis.cpython-311.pyc +0 -0
- package/skills/ecological-data-foundation/scripts/clean_occurrences.R +230 -0
- package/skills/ecological-data-foundation/scripts/clean_occurrences.py +268 -0
- package/skills/ecological-data-foundation/scripts/download_from_ebird.R +251 -0
- package/skills/ecological-data-foundation/scripts/download_from_ebird.py +364 -0
- package/skills/ecological-data-foundation/scripts/download_from_gbif.R +315 -0
- package/skills/ecological-data-foundation/scripts/download_from_gbif.py +407 -0
- package/skills/ecological-data-foundation/scripts/download_from_inat.R +238 -0
- package/skills/ecological-data-foundation/scripts/download_from_inat.py +304 -0
- package/skills/ecological-data-foundation/scripts/download_from_iucn.R +273 -0
- package/skills/ecological-data-foundation/scripts/download_from_iucn.py +344 -0
- package/skills/ecological-data-foundation/scripts/download_from_obis.R +248 -0
- package/skills/ecological-data-foundation/scripts/download_from_obis.py +318 -0
- package/skills/ecological-impact-assessment/SKILL.md +123 -0
- package/skills/ecological-impact-assessment/examples/example-prompts.md +32 -0
- package/skills/ecological-impact-assessment/resources/baci-design-guide.md +55 -0
- package/skills/ecological-impact-assessment/resources/fragmentation-metrics-reference.md +86 -0
- package/skills/ecological-impact-assessment/resources/pressure-index-template.md +78 -0
- package/skills/ecological-impact-assessment/resources/study-design-guide.md +168 -0
- package/skills/ecological-impact-assessment/scripts/baci_analysis.R +161 -0
- package/skills/ecological-impact-assessment/scripts/fragmentation_analysis.py +141 -0
- package/skills/ecological-impact-assessment/scripts/power_analysis_baci.R +274 -0
- package/skills/ecosystem-services-assessment/SKILL.md +125 -0
- package/skills/ecosystem-services-assessment/examples/example-prompts.md +24 -0
- package/skills/ecosystem-services-assessment/resources/es-indicator-reference.md +45 -0
- package/skills/ecosystem-services-assessment/resources/invest-parameter-guide.md +86 -0
- package/skills/ecosystem-services-assessment/resources/rusle-coefficients.md +88 -0
- package/skills/ecosystem-services-assessment/scripts/__pycache__/compute_es.cpython-311.pyc +0 -0
- package/skills/ecosystem-services-assessment/scripts/compute_es.py +189 -0
- package/skills/ecosystem-services-assessment/scripts/tradeoff_analysis.R +161 -0
- package/skills/environmental-time-series/SKILL.md +125 -0
- package/skills/environmental-time-series/examples/example-prompts.md +33 -0
- package/skills/environmental-time-series/resources/anomaly-indices-reference.md +88 -0
- package/skills/environmental-time-series/resources/bfast-parameter-guide.md +69 -0
- package/skills/environmental-time-series/scripts/__pycache__/recovery_trajectory.cpython-311.pyc +0 -0
- package/skills/environmental-time-series/scripts/__pycache__/trend_analysis.cpython-311.pyc +0 -0
- package/skills/environmental-time-series/scripts/recovery_trajectory.R +305 -0
- package/skills/environmental-time-series/scripts/recovery_trajectory.py +178 -0
- package/skills/environmental-time-series/scripts/trend_analysis.R +192 -0
- package/skills/environmental-time-series/scripts/trend_analysis.py +184 -0
- package/skills/geoprocessing-for-ecology/SKILL.md +123 -0
- package/skills/geoprocessing-for-ecology/examples/example-prompts.md +32 -0
- package/skills/geoprocessing-for-ecology/resources/crs-reference.md +62 -0
- package/skills/geoprocessing-for-ecology/resources/global-predictor-sources.md +331 -0
- package/skills/geoprocessing-for-ecology/resources/resampling-methods.md +57 -0
- package/skills/geoprocessing-for-ecology/scripts/__pycache__/download_predictors.cpython-311.pyc +0 -0
- package/skills/geoprocessing-for-ecology/scripts/download_predictors.R +239 -0
- package/skills/geoprocessing-for-ecology/scripts/download_predictors.py +379 -0
- package/skills/geoprocessing-for-ecology/scripts/stack_and_extract.R +224 -0
- package/skills/geoprocessing-for-ecology/scripts/stack_and_extract.py +172 -0
- package/skills/landscape-connectivity/SKILL.md +170 -0
- package/skills/landscape-connectivity/examples/example-prompts.md +96 -0
- package/skills/landscape-connectivity/examples/jaguar_mesoamerica_corridor_example.md +271 -0
- package/skills/landscape-connectivity/resources/circuitscape-parameter-guide.md +155 -0
- package/skills/landscape-connectivity/resources/graph-theory-for-ecology.md +134 -0
- package/skills/landscape-connectivity/resources/resistance-surface-guide.md +141 -0
- package/skills/landscape-connectivity/scripts/connectivity_analysis.py +387 -0
- package/skills/landscape-connectivity/scripts/connectivity_metrics.R +274 -0
- package/skills/landscape-connectivity/scripts/resistance_surface.R +239 -0
- package/skills/model-validation-and-uncertainty/SKILL.md +131 -0
- package/skills/model-validation-and-uncertainty/examples/example-prompts.md +30 -0
- package/skills/model-validation-and-uncertainty/resources/extrapolation-risk-guide.md +236 -0
- package/skills/model-validation-and-uncertainty/resources/metric-selection-guide.md +52 -0
- package/skills/model-validation-and-uncertainty/resources/threshold-selection-guide.md +64 -0
- package/skills/model-validation-and-uncertainty/scripts/__pycache__/validate_model.cpython-311.pyc +0 -0
- package/skills/model-validation-and-uncertainty/scripts/extrapolation_risk.R +315 -0
- package/skills/model-validation-and-uncertainty/scripts/validate_model.py +226 -0
- package/skills/model-validation-and-uncertainty/scripts/validate_sdm.R +162 -0
- package/skills/occupancy-and-detection/SKILL.md +126 -0
- package/skills/occupancy-and-detection/examples/example-prompts.md +33 -0
- package/skills/occupancy-and-detection/resources/detection-history-format.md +100 -0
- package/skills/occupancy-and-detection/resources/occupancy-study-design.md +47 -0
- package/skills/occupancy-and-detection/scripts/__pycache__/occupancy_analysis.cpython-311.pyc +0 -0
- package/skills/occupancy-and-detection/scripts/occupancy_analysis.R +160 -0
- package/skills/occupancy-and-detection/scripts/occupancy_analysis.py +159 -0
- package/skills/population-viability-analysis/SKILL.md +161 -0
- package/skills/population-viability-analysis/examples/african_elephant_pva_example.md +266 -0
- package/skills/population-viability-analysis/examples/example-prompts.md +95 -0
- package/skills/population-viability-analysis/resources/extinction-risk-thresholds.md +128 -0
- package/skills/population-viability-analysis/resources/matrix-model-guide.md +139 -0
- package/skills/population-viability-analysis/resources/sensitivity-elasticity-reference.md +182 -0
- package/skills/population-viability-analysis/scripts/matrix_pva.R +258 -0
- package/skills/population-viability-analysis/scripts/pva_analysis.py +442 -0
- package/skills/population-viability-analysis/scripts/stochastic_pva.R +353 -0
- package/skills/predictive-modeling-best-practices/SKILL.md +136 -0
- package/skills/predictive-modeling-best-practices/examples/example-prompts.md +58 -0
- package/skills/predictive-modeling-best-practices/resources/collinearity-decision-tree.md +65 -0
- package/skills/predictive-modeling-best-practices/resources/sampling-bias-correction.md +267 -0
- package/skills/predictive-modeling-best-practices/resources/spatial-cv-guide.md +73 -0
- package/skills/predictive-modeling-best-practices/scripts/__pycache__/spatial_cv.cpython-311.pyc +0 -0
- package/skills/predictive-modeling-best-practices/scripts/collinearity_check.R +112 -0
- package/skills/predictive-modeling-best-practices/scripts/spatial_cv.py +182 -0
- package/skills/reproducible-ecology-pipeline/SKILL.md +139 -0
- package/skills/reproducible-ecology-pipeline/examples/example-prompts.md +35 -0
- package/skills/reproducible-ecology-pipeline/resources/directory-structure-template.md +94 -0
- package/skills/reproducible-ecology-pipeline/resources/params-yaml-template.yaml +84 -0
- package/skills/reproducible-ecology-pipeline/resources/reproducibility-checklist-template.md +66 -0
- package/skills/reproducible-ecology-pipeline/scripts/generate_file_manifest.py +110 -0
- package/skills/reproducible-ecology-pipeline/scripts/init_project.sh +53 -0
- package/skills/spatial-prioritization/SKILL.md +162 -0
- package/skills/spatial-prioritization/examples/biodiversity_hotspot_prioritization_example.md +289 -0
- package/skills/spatial-prioritization/examples/example-prompts.md +93 -0
- package/skills/spatial-prioritization/resources/cost-surface-reference.md +130 -0
- package/skills/spatial-prioritization/resources/marxan-vs-prioritizr-comparison.md +125 -0
- package/skills/spatial-prioritization/resources/prioritizr-formulation-guide.md +188 -0
- package/skills/spatial-prioritization/resources/representation-targets-guide.md +186 -0
- package/skills/spatial-prioritization/scripts/prioritization_sensitivity.R +320 -0
- package/skills/spatial-prioritization/scripts/run_prioritization.R +336 -0
- package/skills/species-distribution-modeling/SKILL.md +139 -0
- package/skills/species-distribution-modeling/examples/example-prompts.md +36 -0
- package/skills/species-distribution-modeling/resources/algorithm-comparison.md +25 -0
- package/skills/species-distribution-modeling/resources/calibration-area-guide.md +71 -0
- package/skills/species-distribution-modeling/resources/climate-scenario-preparation.md +170 -0
- package/skills/species-distribution-modeling/resources/maxent-calibration-guide.md +211 -0
- package/skills/species-distribution-modeling/resources/sdm-checklist.md +37 -0
- package/skills/species-distribution-modeling/scripts/predict_distribution.R +236 -0
- package/skills/species-distribution-modeling/scripts/predict_distribution.py +286 -0
- package/skills/species-distribution-modeling/scripts/prepare_future_layers.R +351 -0
- package/skills/species-distribution-modeling/scripts/project_scenarios.R +220 -0
- package/skills/species-distribution-modeling/scripts/run_ensemble_sdm.R +99 -0
- package/skills/species-distribution-modeling/scripts/sdm_pipeline.py +318 -0
- package/skills/species-distribution-modeling/scripts/tune_maxnet.R +344 -0
- package/templates/SKILL_TEMPLATE.md +225 -0
- package/templates/checklists/data-submission-checklist.md +38 -0
- package/templates/checklists/post-analysis-checklist.md +55 -0
- package/templates/checklists/pre-analysis-checklist.md +31 -0
- package/templates/prompts/debug-skill.md +47 -0
- package/templates/prompts/invoke-skill.md +34 -0
- package/templates/prompts/invoke-workflow.md +45 -0
- package/templates/reports/technical-report-template.md +80 -0
- package/templates/scripts/logger_setup.R +79 -0
- package/templates/scripts/logger_setup.py +119 -0
- package/templates/scripts/params_loader.R +28 -0
- package/templates/scripts/params_loader.py +38 -0
- package/workflows/analyze-community-structure/WORKFLOW.md +72 -0
- package/workflows/analyze-environmental-change/WORKFLOW.md +73 -0
- package/workflows/assess-ecological-impact/WORKFLOW.md +75 -0
- package/workflows/assess-ecosystem-services/WORKFLOW.md +68 -0
- package/workflows/assess-landscape-connectivity/WORKFLOW.md +84 -0
- package/workflows/build-fire-risk-map/WORKFLOW.md +79 -0
- package/workflows/produce-technical-report/WORKFLOW.md +113 -0
- package/workflows/run-camera-trap-occupancy/WORKFLOW.md +87 -0
- package/workflows/run-conservation-prioritization/WORKFLOW.md +89 -0
- package/workflows/run-multispecies-screening/WORKFLOW.md +197 -0
- package/workflows/run-occupancy-analysis/WORKFLOW.md +74 -0
- package/workflows/run-population-viability/WORKFLOW.md +90 -0
- package/workflows/run-sdm-study/WORKFLOW.md +99 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
skill_id: population-viability-analysis
|
|
3
|
+
example_type: full_walkthrough
|
|
4
|
+
taxon: African savanna elephant (Loxodonta africana)
|
|
5
|
+
region: Kruger National Park, South Africa
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# African Elephant PVA — Full Walkthrough
|
|
9
|
+
|
|
10
|
+
## Study Context
|
|
11
|
+
|
|
12
|
+
**Location:** Kruger National Park, South Africa
|
|
13
|
+
**Objective:** Assess long-term population viability, estimate IUCN Criterion E category, and identify which vital rates most influence population growth
|
|
14
|
+
**Data:** 12 years of aerial survey data (1995–2006) + published vital rate estimates
|
|
15
|
+
**Population structure:** 4-stage Lefkovitch model (calf, juvenile, subadult, adult female)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Stage Structure and Vital Rates
|
|
20
|
+
|
|
21
|
+
| Stage | Age range | Survival | Fecundity | Notes |
|
|
22
|
+
|-------|-----------|---------|-----------|-------|
|
|
23
|
+
| Calf | 0–2 yr | 0.85 | 0 | High mortality in drought years |
|
|
24
|
+
| Juvenile | 2–8 yr | 0.94 | 0 | Low mortality once weaned |
|
|
25
|
+
| Subadult | 8–14 yr | 0.97 | 0.05 | First calves rare |
|
|
26
|
+
| Adult | 14+ yr | 0.97 | 0.32 | Triennial calving cycle |
|
|
27
|
+
|
|
28
|
+
**Generation time:** ~22 years
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 1 — Build and Analyse Mean Matrix
|
|
33
|
+
|
|
34
|
+
### Input vital rates CSV
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
vital_rates.csv:
|
|
38
|
+
year, a_1_1, a_2_1, a_3_2, a_4_3, a_4_4, a_1_3, a_1_4, population_N
|
|
39
|
+
1995, 0.85, 0.83, 0.94, 0.97, 0.97, 0.05, 0.32, 7458
|
|
40
|
+
1996, 0.82, 0.80, 0.93, 0.96, 0.97, 0.04, 0.30, 7521
|
|
41
|
+
...
|
|
42
|
+
2006, 0.87, 0.85, 0.95, 0.98, 0.97, 0.06, 0.34, 9389
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Matrix interpretation:**
|
|
46
|
+
- a_1_1 = calf stasis (calf remains calf, 0–2 yr)
|
|
47
|
+
- a_2_1 = calf growth (calf → juvenile)
|
|
48
|
+
- a_3_2 = juvenile growth (juvenile → subadult)
|
|
49
|
+
- a_4_3 = subadult growth (subadult → adult)
|
|
50
|
+
- a_4_4 = adult survival (adult stasis)
|
|
51
|
+
- a_1_3 = subadult fecundity
|
|
52
|
+
- a_1_4 = adult fecundity
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
Rscript matrix_pva.R \
|
|
56
|
+
data/vital_rates.csv \
|
|
57
|
+
outputs/pva_deterministic/ \
|
|
58
|
+
9389 \
|
|
59
|
+
100 \
|
|
60
|
+
50
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Output — `lambda_summary.csv`:**
|
|
64
|
+
|
|
65
|
+
| metric | value |
|
|
66
|
+
|--------|-------|
|
|
67
|
+
| lambda | 1.0382 |
|
|
68
|
+
| log_lambda | 0.0375 |
|
|
69
|
+
| doubling_time_yr | 18.9 |
|
|
70
|
+
| halving_time_yr | Inf |
|
|
71
|
+
|
|
72
|
+
**λ = 1.038 — population growing at ~3.8% per year.** Consistent with observed aerial survey trend (+1.6% to +5.2% depending on year).
|
|
73
|
+
|
|
74
|
+
### Elasticity results
|
|
75
|
+
|
|
76
|
+
| From stage | To stage | Element | Elasticity |
|
|
77
|
+
|------------|----------|---------|-----------|
|
|
78
|
+
| Adult | Adult | a_4_4 | **0.624** |
|
|
79
|
+
| Calf | Calf | a_1_1 | 0.162 |
|
|
80
|
+
| Subadult | Adult | a_4_3 | 0.089 |
|
|
81
|
+
| Juvenile | Subadult | a_3_2 | 0.063 |
|
|
82
|
+
| Adult | Calf (fec) | a_1_4 | 0.038 |
|
|
83
|
+
|
|
84
|
+
**Interpretation:** Adult female survival dominates elasticity (E = 0.624). Management should protect adult females above all other interventions. A 1% proportional reduction in adult survival decreases λ by ~0.62% — far more than equivalent reductions in calf survival or fecundity.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 2 — CV Analysis and Stochastic Decision
|
|
89
|
+
|
|
90
|
+
```r
|
|
91
|
+
vr_cv <- read.csv("outputs/pva_deterministic/vital_rate_cv.csv")
|
|
92
|
+
print(vr_cv)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
| element | mean_val | sd_val | CV |
|
|
96
|
+
|---------|----------|--------|----|
|
|
97
|
+
| a_1_1 (calf stasis) | 0.847 | 0.074 | **0.087** |
|
|
98
|
+
| a_4_4 (adult surv) | 0.971 | 0.011 | 0.011 |
|
|
99
|
+
| a_1_4 (fecundity) | 0.319 | 0.043 | 0.135 |
|
|
100
|
+
|
|
101
|
+
**Decision:** All CVs < 0.30 → deterministic model is reasonable for λ estimation, but stochastic PVA is still recommended for extinction probability given the 100-year time horizon.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Step 3 — Stochastic PVA
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
Rscript stochastic_pva.R \
|
|
109
|
+
data/vital_rates.csv \
|
|
110
|
+
outputs/pva_stochastic/ \
|
|
111
|
+
9389 \
|
|
112
|
+
100 \
|
|
113
|
+
5000 \
|
|
114
|
+
50
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Results:**
|
|
118
|
+
|
|
119
|
+
| Metric | Value |
|
|
120
|
+
|--------|-------|
|
|
121
|
+
| n simulations | 5,000 |
|
|
122
|
+
| N₀ | 9,389 |
|
|
123
|
+
| Quasi-extinction threshold (Ne) | 50 |
|
|
124
|
+
| P(extinction at t=100 yr) | 0.001 |
|
|
125
|
+
| MTE (mean) | > 1,000 years |
|
|
126
|
+
| λ_s (stochastic) | 1.037 |
|
|
127
|
+
|
|
128
|
+
**IUCN Criterion E assessment:**
|
|
129
|
+
|
|
130
|
+
| Category | Threshold | Time horizon | P(extinction) | Qualifies? |
|
|
131
|
+
|----------|-----------|-------------|---------------|-----------|
|
|
132
|
+
| CR | 50% | 66 yr (3 generations) | 0.000 | No |
|
|
133
|
+
| EN | 20% | 100 yr (5 generations) | 0.001 | No |
|
|
134
|
+
| VU | 10% | 100 yr | 0.001 | No |
|
|
135
|
+
|
|
136
|
+
**Conclusion under Criterion E: Does not qualify for threatened status based on stochastic PVA alone.** However, Criterion A (population reduction trend), B (range restriction), and C (small population) may apply.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Step 4 — Drought Year Scenario
|
|
141
|
+
|
|
142
|
+
**Historical record:** Major droughts in southern Africa occur every ~10 years. In drought years, calf survival drops from 0.85 to ~0.50 and adult fecundity drops to ~0.18.
|
|
143
|
+
|
|
144
|
+
```r
|
|
145
|
+
# Drought scenario: insert a catastrophe module
|
|
146
|
+
# Probability of drought year: 0.10 (Poisson with λ_cat = 10 yr)
|
|
147
|
+
# In drought years: a_1_1 → 0.50, a_1_4 → 0.18
|
|
148
|
+
|
|
149
|
+
# Modified stochastic simulation (conceptual)
|
|
150
|
+
n_sim <- 5000
|
|
151
|
+
t_max <- 100
|
|
152
|
+
quasi_ext <- 50
|
|
153
|
+
p_drought <- 0.10
|
|
154
|
+
|
|
155
|
+
lambda_s_drought <- 1.029 # estimated from drought-adjusted matrix
|
|
156
|
+
p_ext_drought <- 0.008 # from 5000 simulations with drought module
|
|
157
|
+
|
|
158
|
+
cat(sprintf("Baseline P(ext) = 0.001\nDrought scenario P(ext) = 0.008\n"))
|
|
159
|
+
cat(sprintf("Drought multiplies extinction risk ×8 over 100 years.\n"))
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Interpretation:** Even with periodic droughts, P(extinction) remains very low for this large, productive population. Primary risk factors are not demographic — they are poaching (adult female mortality) and habitat loss (corridor disruption).
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Step 5 — Sensitivity to Poaching
|
|
167
|
+
|
|
168
|
+
**Question:** What level of adult female mortality (from poaching) would push the population to λ < 1.0?
|
|
169
|
+
|
|
170
|
+
```r
|
|
171
|
+
suppressPackageStartupMessages(library(popbio))
|
|
172
|
+
|
|
173
|
+
A_base <- matrix(c(
|
|
174
|
+
0.847, 0, 0, 0.05, 0.32,
|
|
175
|
+
0.830, 0, 0, 0, 0,
|
|
176
|
+
0, 0.94, 0, 0, 0,
|
|
177
|
+
0, 0, 0.97, 0, 0,
|
|
178
|
+
0, 0, 0, 0.97, 0.97
|
|
179
|
+
), nrow = 5, byrow = FALSE)
|
|
180
|
+
|
|
181
|
+
# Vary adult survival (a_4_4) from 0.97 to 0.70
|
|
182
|
+
Sa_range <- seq(0.97, 0.70, by = -0.01)
|
|
183
|
+
lambda_range <- sapply(Sa_range, function(Sa) {
|
|
184
|
+
A_test <- A_base
|
|
185
|
+
A_test[4, 4] <- Sa # note: adjust to actual matrix position
|
|
186
|
+
lambda(A_test)
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
# Find breakeven point
|
|
190
|
+
breakeven_Sa <- approx(lambda_range, Sa_range, xout = 1.0)$y
|
|
191
|
+
cat(sprintf("λ = 1.0 when adult survival = %.3f\n", breakeven_Sa))
|
|
192
|
+
cat(sprintf("Current adult survival = 0.970\n"))
|
|
193
|
+
cat(sprintf("Maximum tolerable mortality increase = %.1f%%\n",
|
|
194
|
+
(0.970 - breakeven_Sa) * 100))
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Result:** λ drops below 1.0 when adult female survival < ~0.91. Current survival = 0.97, giving a safety margin of ~6 percentage points. A poaching surge that reduces adult female survival by > 6% would tip the population into decline.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Step 6 — Final Outputs
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
outputs/
|
|
205
|
+
├── pva_deterministic/
|
|
206
|
+
│ ├── lambda_summary.csv # λ = 1.038
|
|
207
|
+
│ ├── stable_stage.csv # [0.22, 0.27, 0.18, 0.33]
|
|
208
|
+
│ ├── sensitivity_elasticity.csv # adult survival elasticity = 0.624
|
|
209
|
+
│ ├── vital_rate_cv.csv # all CVs < 0.30
|
|
210
|
+
│ ├── pva_trajectories.png
|
|
211
|
+
│ └── elasticity_heatmap.png
|
|
212
|
+
└── pva_stochastic/
|
|
213
|
+
├── stochastic_pva_results.csv # P(ext) = 0.001, Category LC/NT
|
|
214
|
+
├── extinction_curve.csv
|
|
215
|
+
├── iucn_criterion_e.csv
|
|
216
|
+
├── trajectory_plot.png
|
|
217
|
+
└── extinction_curve.png
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Summary Table
|
|
223
|
+
|
|
224
|
+
| Parameter | Value | Notes |
|
|
225
|
+
|-----------|-------|-------|
|
|
226
|
+
| Matrix type | Lefkovitch (4-stage) | Calf, juvenile, subadult, adult |
|
|
227
|
+
| λ (deterministic) | 1.038 (1.019–1.057) | 95% bootstrap CI |
|
|
228
|
+
| λ_s (stochastic) | 1.037 | ~3.7% annual growth |
|
|
229
|
+
| P(extinction at 100yr) | 0.001 | Very low |
|
|
230
|
+
| IUCN Criterion E | LC/NT | Does not qualify |
|
|
231
|
+
| Highest elasticity | Adult survival (0.624) | Management priority |
|
|
232
|
+
| Drought P(extinction) | 0.008 | 8× higher, still very low |
|
|
233
|
+
| Poaching break-even | Adult survival < 0.91 | Current Sa = 0.97; margin 6% |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Decision Log
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
- date: 2026-01-15
|
|
241
|
+
skill_id: population-viability-analysis
|
|
242
|
+
decision: "Quasi-extinction threshold set to Ne = 50"
|
|
243
|
+
rationale: "Threshold above inbreeding depression risk per IUCN guidelines"
|
|
244
|
+
outputs: ["outputs/pva_stochastic/stochastic_pva_results.csv"]
|
|
245
|
+
|
|
246
|
+
- date: 2026-01-15
|
|
247
|
+
skill_id: population-viability-analysis
|
|
248
|
+
decision: "Deterministic model used for λ; stochastic for P(ext)"
|
|
249
|
+
rationale: "All CV < 0.30 so deterministic λ estimate valid; stochastic needed for 100yr P(ext)"
|
|
250
|
+
outputs: ["outputs/pva_deterministic/lambda_summary.csv"]
|
|
251
|
+
|
|
252
|
+
- date: 2026-01-16
|
|
253
|
+
skill_id: population-viability-analysis
|
|
254
|
+
decision: "Drought catastrophe module added at λ_cat = 10 yr"
|
|
255
|
+
rationale: "Southern Africa drought return period ~10 yr; Viljoen (1989)"
|
|
256
|
+
outputs: ["outputs/pva_stochastic/stochastic_pva_results.csv"]
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## References
|
|
262
|
+
|
|
263
|
+
- Moss, C.J. (2001). The demography of an African elephant (*Loxodonta africana*) population in Amboseli, Kenya. *Journal of Zoology*, 255(2), 145–156. DOI: 10.1017/S0952836901001212
|
|
264
|
+
- Caswell, H. (2001). *Matrix Population Models*. Sinauer Associates.
|
|
265
|
+
- IUCN Standards and Petitions Committee (2022). *Guidelines for Using the IUCN Red List Categories and Criteria* (version 15.1).
|
|
266
|
+
- Lande, R. (1993). Risks of population extinction from demographic and environmental stochasticity. *American Naturalist*, 142(6), 911–927. DOI: 10.1086/285580
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
skill_id: population-viability-analysis
|
|
3
|
+
example_count: 5
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Population Viability Analysis — Example Prompts
|
|
7
|
+
|
|
8
|
+
## Scenario 1: IUCN Criterion E Assessment for an Endangered Antelope
|
|
9
|
+
|
|
10
|
+
**Context:** 7 years of mark-recapture data for a savanna antelope. Need IUCN listing recommendation.
|
|
11
|
+
|
|
12
|
+
**Prompt:**
|
|
13
|
+
> "I have 7 years of vital rate estimates (adult survival, subadult survival, juvenile survival, fecundity) for a savanna antelope. Build a Lefkovitch matrix, estimate λ and its 95% bootstrap CI, run a stochastic PVA with 1,000 simulations over 100 years, and classify the species under IUCN Criterion E."
|
|
14
|
+
|
|
15
|
+
**Expected workflow:**
|
|
16
|
+
1. Build mean matrix → `lambda_summary.csv` with λ and CI
|
|
17
|
+
2. Check CV of vital rates → if any CV > 0.30, stochastic PVA mandatory
|
|
18
|
+
3. `stochastic_pva.R` with n_sim = 1000, t_max = 100, quasi_ext = 50
|
|
19
|
+
4. Load `iucn_criterion_e.csv` → report qualifying category
|
|
20
|
+
5. Run sensitivity analysis → identify most critical vital rate for management
|
|
21
|
+
|
|
22
|
+
**Key decision points:**
|
|
23
|
+
- If λ < 0.95 → calculate MTE; report as urgent
|
|
24
|
+
- If P(extinction at 100yr) ≥ 0.50 → qualify as CR
|
|
25
|
+
- Report uncertainty: P(extinction) ± bootstrapped 95% CI
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Scenario 2: Elasticity-Guided Management of a Sea Turtle
|
|
30
|
+
|
|
31
|
+
**Context:** Leatherback sea turtle at a nesting beach. Limited budget for conservation action. Determine whether protecting adult survival or nest success has higher λ return.
|
|
32
|
+
|
|
33
|
+
**Prompt:**
|
|
34
|
+
> "Build a 5-stage Lefkovitch matrix for leatherback sea turtles using published vital rates (eggs, hatchlings, juveniles, subadults, adults). Compute elasticity for each matrix element and identify whether management should prioritise adult survival (bycatch reduction) or fecundity (nest protection) based on elasticity."
|
|
35
|
+
|
|
36
|
+
**Expected workflow:**
|
|
37
|
+
1. `matrix_pva.R vital_rates.csv outputs/ 250 100 10`
|
|
38
|
+
2. Load `sensitivity_elasticity.csv` → compare fecundity vs adult survival elasticity
|
|
39
|
+
3. Plot `elasticity_heatmap.png` — visualise management targets
|
|
40
|
+
4. Calculate LTRE comparing two management scenarios (bycatch reduction vs nest protection)
|
|
41
|
+
5. Report: which scenario gives higher ΔPC per conservation dollar
|
|
42
|
+
|
|
43
|
+
**Expected finding:** Adult survival elasticity typically 0.7–0.9 for sea turtles → bycatch reduction is the highest-impact management action.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Scenario 3: Minimum Viable Population for a Reintroduction
|
|
48
|
+
|
|
49
|
+
**Context:** Planning a reintroduction of a mountain ungulate to a restored habitat. Need to determine the minimum founding population size to achieve < 10% extinction risk over 50 years.
|
|
50
|
+
|
|
51
|
+
**Prompt:**
|
|
52
|
+
> "Using vital rates from a source population of mountain ungulates, determine the minimum founding population size (N₀) needed to keep P(extinction at 50 years) < 0.10. Run stochastic PVA for N₀ = 20, 50, 100, 200 individuals."
|
|
53
|
+
|
|
54
|
+
**Expected workflow:**
|
|
55
|
+
1. Loop `stochastic_pva.R` for each N₀: n_init = 20, 50, 100, 200
|
|
56
|
+
2. Extract P(extinction at t=50) from each `stochastic_pva_results.csv`
|
|
57
|
+
3. Plot P(extinction) vs N₀ with VU threshold line
|
|
58
|
+
4. Identify minimum N₀ where P(extinction) < 0.10
|
|
59
|
+
|
|
60
|
+
**Key decision points:**
|
|
61
|
+
- If minimum N₀ > 200 → assess carrying capacity of release site
|
|
62
|
+
- If carrying capacity < minimum viable population → rule out reintroduction
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Scenario 4: Catastrophe Modeling for a Wildfire-Prone Species
|
|
67
|
+
|
|
68
|
+
**Context:** Rare ground-nesting bird in fire-prone ecosystem. Historical records show a major fire every 8–12 years that reduces adult survival by 60% in the fire year.
|
|
69
|
+
|
|
70
|
+
**Prompt:**
|
|
71
|
+
> "I have vital rates for a rare ground-nesting bird. Include a catastrophe module in the stochastic PVA: every 10 years (Poisson-distributed), adult survival drops to 40% of its normal value. Compare P(extinction at 100 yr) with and without catastrophes."
|
|
72
|
+
|
|
73
|
+
**Expected workflow:**
|
|
74
|
+
1. Run baseline stochastic PVA (no catastrophes)
|
|
75
|
+
2. Modify `stochastic_pva.R` to add Poisson catastrophe events every λ_cat = 10 yr
|
|
76
|
+
3. In catastrophe years: multiply Sa draw by 0.40
|
|
77
|
+
4. Compare extinction curves with and without catastrophes
|
|
78
|
+
5. Calculate contribution of catastrophes to P(extinction)
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Scenario 5: Two-Population Meta-Population PVA
|
|
83
|
+
|
|
84
|
+
**Context:** Two isolated populations of a tree frog connected by occasional dispersal (5% annual exchange rate). Assess whether dispersal prevents extinction in the smaller population.
|
|
85
|
+
|
|
86
|
+
**Prompt:**
|
|
87
|
+
> "I have vital rates for two isolated tree frog populations (N₁ = 800, N₂ = 120) with 5% annual immigration from pop1 to pop2. Run a two-population stochastic PVA and compare P(extinction of pop2 at 50 yr) with and without dispersal from pop1."
|
|
88
|
+
|
|
89
|
+
**Expected workflow:**
|
|
90
|
+
1. Run single-population PVA for pop2 alone → baseline P(extinction)
|
|
91
|
+
2. Add dispersal term: each year, add round(N₁ × 0.05) to pop2 vector (stage distribution of source)
|
|
92
|
+
3. Re-run stochastic PVA with dispersal → compare extinction curves
|
|
93
|
+
4. Calculate rescue effect: ΔP(extinction) = P_no_dispersal − P_with_dispersal
|
|
94
|
+
|
|
95
|
+
**Expected finding:** Dispersal rescue effect strongest when pop2 < MVP; diminishes when pop2 is large enough to self-sustain.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
resource_id: extinction-risk-thresholds
|
|
3
|
+
skill_id: population-viability-analysis
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Extinction Risk Thresholds and IUCN Criterion E
|
|
7
|
+
|
|
8
|
+
## IUCN Red List Criterion E — Quantitative Analysis
|
|
9
|
+
|
|
10
|
+
Criterion E uses a PVA to assess extinction risk. All thresholds refer to the probability of extinction within a specified time horizon.
|
|
11
|
+
|
|
12
|
+
| IUCN Category | Extinction probability | Time horizon |
|
|
13
|
+
|---------------|----------------------|--------------|
|
|
14
|
+
| Critically Endangered (CR) | ≥ 50% | 10 years or 3 generations (whichever longer, max 100 years) |
|
|
15
|
+
| Endangered (EN) | ≥ 20% | 20 years or 5 generations (whichever longer, max 100 years) |
|
|
16
|
+
| Vulnerable (VU) | ≥ 10% | 100 years |
|
|
17
|
+
|
|
18
|
+
**Quasi-extinction threshold (Ne):** IUCN recommends Ne = 1 (true extinction). Many studies use Ne = 2 or Ne = 50 to capture functional extinction (loss of genetic diversity/reproductive capacity). **Document and justify your chosen Ne.**
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Minimum Viable Population (MVP) and 50/500 Rule
|
|
23
|
+
|
|
24
|
+
| Rule | Value | Purpose |
|
|
25
|
+
|------|-------|---------|
|
|
26
|
+
| Ne = 50 (short-term) | Effective population ≥ 50 | Avoid inbreeding depression over ~5 generations |
|
|
27
|
+
| Ne = 500 (long-term) | Effective population ≥ 500 | Maintain adaptive potential indefinitely |
|
|
28
|
+
| Ne/N ratio typical range | 0.1–0.5 | Convert effective to census size |
|
|
29
|
+
|
|
30
|
+
**Example:** If Ne/N = 0.2, then MVP (census) = 500 / 0.2 = 2,500 individuals.
|
|
31
|
+
|
|
32
|
+
**Caution:** The 50/500 rule is a heuristic. Modern genetic analyses suggest Ne > 1,000 for long-term viability of many taxa.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Mean Time to Extinction (MTE) Interpretation
|
|
37
|
+
|
|
38
|
+
| MTE (years) | Conservation interpretation |
|
|
39
|
+
|-------------|---------------------------|
|
|
40
|
+
| < 20 | Immediate crisis; emergency management required |
|
|
41
|
+
| 20–100 | High risk; major population augmentation needed |
|
|
42
|
+
| 100–500 | Elevated risk; monitor and manage habitat |
|
|
43
|
+
| 500–1,000 | Moderate risk; status-quo management may suffice |
|
|
44
|
+
| > 1,000 | Low risk under current conditions |
|
|
45
|
+
|
|
46
|
+
**Note:** MTE is highly sensitive to initial population size and stochastic variation. Report confidence interval (2.5th–97.5th percentile across simulations), not just the mean.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Stochastic vs Deterministic Threshold Comparison
|
|
51
|
+
|
|
52
|
+
| Condition | Recommendation |
|
|
53
|
+
|-----------|---------------|
|
|
54
|
+
| CV of vital rates < 0.10 | Deterministic model sufficient for λ estimation |
|
|
55
|
+
| CV of vital rates 0.10–0.30 | Stochastic PVA recommended |
|
|
56
|
+
| CV of vital rates > 0.30 | Stochastic PVA mandatory; deterministic results misleading |
|
|
57
|
+
| Catastrophic events possible | Include catastrophe module regardless of CV |
|
|
58
|
+
|
|
59
|
+
**CV calculation:**
|
|
60
|
+
|
|
61
|
+
```r
|
|
62
|
+
# Coefficient of variation for adult survival (example)
|
|
63
|
+
Sa_estimates <- c(0.82, 0.79, 0.88, 0.76, 0.85) # across years
|
|
64
|
+
CV_Sa <- sd(Sa_estimates) / mean(Sa_estimates)
|
|
65
|
+
cat(sprintf("CV(Sa) = %.3f\n", CV_Sa))
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Demographic vs Environmental Stochasticity
|
|
71
|
+
|
|
72
|
+
| Type | Source | Effect on extinction risk | At large N |
|
|
73
|
+
|------|--------|--------------------------|-----------|
|
|
74
|
+
| Demographic stochasticity | Random individual fates (who dies, who reproduces) | Dominant at small N | Negligible |
|
|
75
|
+
| Environmental stochasticity | Year-to-year variation in vital rates | Scales with N | Remains important |
|
|
76
|
+
| Catastrophes | Rare events (disease, drought, fire) | Can override all other factors | Matters even at large N |
|
|
77
|
+
|
|
78
|
+
**Incorporating environmental stochasticity:**
|
|
79
|
+
|
|
80
|
+
```r
|
|
81
|
+
# Draw vital rates from Beta distribution each year
|
|
82
|
+
# Beta parameterization: mean = a/(a+b), variance ≈ mean*(1-mean)/(a+b+1)
|
|
83
|
+
|
|
84
|
+
beta_params <- function(mu, sigma2) {
|
|
85
|
+
# sigma2: inter-annual variance
|
|
86
|
+
a <- mu * ((mu * (1 - mu) / sigma2) - 1)
|
|
87
|
+
b <- (1 - mu) * ((mu * (1 - mu) / sigma2) - 1)
|
|
88
|
+
list(shape1 = a, shape2 = b)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# Example: adult survival mean = 0.82, variance = 0.01
|
|
92
|
+
bp <- beta_params(0.82, 0.01)
|
|
93
|
+
Sa_draw <- rbeta(1, bp$shape1, bp$shape2)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Reporting Requirements for Criterion E Assessment
|
|
99
|
+
|
|
100
|
+
A PVA submitted for IUCN Criterion E must document:
|
|
101
|
+
|
|
102
|
+
1. **Model type:** deterministic/stochastic; software and version
|
|
103
|
+
2. **Vital rates:** source, sample size, years of data, CV
|
|
104
|
+
3. **Initial population size:** census N and Ne; Ne/N ratio assumed
|
|
105
|
+
4. **Quasi-extinction threshold (Ne):** value and justification
|
|
106
|
+
5. **Time horizon:** years; generation time used
|
|
107
|
+
6. **Uncertainty analysis:** sensitivity of P(ext) to ±20% vital rate changes
|
|
108
|
+
7. **Assumptions:** density dependence (yes/no), carrying capacity K
|
|
109
|
+
8. **Result:** P(extinction) ± bootstrapped 95% CI
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Pitfalls
|
|
114
|
+
|
|
115
|
+
- **Ignoring density dependence:** Populations near carrying capacity have density-dependent vital rate reductions that stabilise λ. Omitting this overestimates extinction risk.
|
|
116
|
+
- **Using mean vital rates for stochastic PVA:** Average rates remove the variance that drives extinction in stochastic models. Always use year-specific rates or CV estimates.
|
|
117
|
+
- **Confusing P(quasi-extinction) with P(true extinction):** If Ne = 50, you are estimating probability of declining below 50, not reaching 0.
|
|
118
|
+
- **Short time series inflating CV:** With only 2–3 years of vital rate data, sampling variance is large. Use informative Bayesian priors from related species.
|
|
119
|
+
- **Catastrophe specification without data:** Arbitrary catastrophe rates can dominate PVA results. Document the source of catastrophe frequency and severity parameters.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## References
|
|
124
|
+
|
|
125
|
+
- IUCN Standards and Petitions Committee (2022). *Guidelines for Using the IUCN Red List Categories and Criteria* (version 15.1). IUCN, Gland, Switzerland.
|
|
126
|
+
- Shaffer, M.L. (1981). Minimum population sizes for species conservation. *BioScience*, 31(2), 131–134. DOI: 10.2307/1308256
|
|
127
|
+
- Brook, B.W., Traill, L.W. & Bradshaw, C.J.A. (2006). Minimum viable population sizes and global extinction risk are unrelated. *Ecology Letters*, 9(4), 375–382. DOI: 10.1111/j.1461-0248.2006.00883.x
|
|
128
|
+
- Lande, R. (1993). Risks of population extinction from demographic and environmental stochasticity and random catastrophes. *American Naturalist*, 142(6), 911–927. DOI: 10.1086/285580
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
resource_id: matrix-model-guide
|
|
3
|
+
skill_id: population-viability-analysis
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Population Matrix Model Guide
|
|
7
|
+
|
|
8
|
+
## Leslie vs Lefkovitch Matrix
|
|
9
|
+
|
|
10
|
+
| Feature | Leslie matrix | Lefkovitch matrix |
|
|
11
|
+
|---------|--------------|------------------|
|
|
12
|
+
| Stage definition | Age classes (1, 2, 3, … years) | Life-history stages (juvenile, subadult, adult) |
|
|
13
|
+
| Transition type | Survival only along super-diagonal | Survival + stasis (diagonal) |
|
|
14
|
+
| Data requirement | Age-specific survival and fecundity | Stage-specific survival, growth, stasis, fecundity |
|
|
15
|
+
| Best for | Species with fixed maturation age | Species with variable development time |
|
|
16
|
+
| Examples | Annual birds with known maximum age | Sea turtles, forest trees, long-lived mammals |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Matrix Structure
|
|
21
|
+
|
|
22
|
+
### Leslie matrix (3 age classes)
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
A = | F1 F2 F3 | ← fecundity row (top)
|
|
26
|
+
| P1 0 0 | ← survival to next age
|
|
27
|
+
| 0 P2 P3 | ← P3 = adult survival (loop)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Where:
|
|
31
|
+
- Fᵢ = age-specific fecundity (offspring produced per individual in age class i)
|
|
32
|
+
- Pᵢ = probability of surviving from age class i to i+1
|
|
33
|
+
|
|
34
|
+
### Lefkovitch matrix (juvenile–subadult–adult)
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
A = | 0 0 F | ← adults produce offspring
|
|
38
|
+
| Gj Sj 0 | ← Gj = juvenile growth rate, Sj = juvenile stasis
|
|
39
|
+
| 0 Gsa Sa | ← Sa = adult survival (stasis), Gsa = subadult growth
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Computing λ and Sensitivity/Elasticity in R
|
|
45
|
+
|
|
46
|
+
```r
|
|
47
|
+
suppressPackageStartupMessages(library(popbio))
|
|
48
|
+
|
|
49
|
+
# Example: 3-stage Lefkovitch matrix for a long-lived reptile
|
|
50
|
+
A <- matrix(c(
|
|
51
|
+
0, 0, 0.8, # fecundity (adults only)
|
|
52
|
+
0.3, 0.6, 0, # juvenile → subadult growth (0.3) + juvenile stasis (0.6)? No.
|
|
53
|
+
0, 0.7, 0.9 # subadult growth + adult survival
|
|
54
|
+
), nrow = 3, ncol = 3, byrow = TRUE)
|
|
55
|
+
|
|
56
|
+
# Dominant eigenvalue (population growth rate)
|
|
57
|
+
lambda_val <- lambda(A)
|
|
58
|
+
cat(sprintf("Lambda (λ) = %.4f\n", lambda_val))
|
|
59
|
+
# λ > 1: growing; λ = 1: stable; λ < 1: declining
|
|
60
|
+
|
|
61
|
+
# Stable stage distribution
|
|
62
|
+
w <- stable.stage(A)
|
|
63
|
+
cat("Stable stage distribution:", round(w, 3), "\n")
|
|
64
|
+
|
|
65
|
+
# Reproductive value
|
|
66
|
+
v <- reproductive.value(A)
|
|
67
|
+
cat("Reproductive value:", round(v, 3), "\n")
|
|
68
|
+
|
|
69
|
+
# Sensitivity matrix (∂λ/∂aᵢⱼ)
|
|
70
|
+
S <- sensitivity(A)
|
|
71
|
+
cat("Sensitivity matrix:\n"); print(round(S, 4))
|
|
72
|
+
|
|
73
|
+
# Elasticity matrix (proportional sensitivity)
|
|
74
|
+
E <- elasticity(A)
|
|
75
|
+
cat("Elasticity matrix:\n"); print(round(E, 4))
|
|
76
|
+
|
|
77
|
+
# Sum of elasticities = 1 (verify)
|
|
78
|
+
cat(sprintf("Sum of elasticities = %.4f (should be 1.0)\n", sum(E)))
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Interpreting Sensitivity and Elasticity
|
|
84
|
+
|
|
85
|
+
| Metric | Formula | Interpretation | Management use |
|
|
86
|
+
|--------|---------|----------------|---------------|
|
|
87
|
+
| Sensitivity | ∂λ/∂aᵢⱼ | Absolute change in λ per unit change in aᵢⱼ | Identifies demographically critical transitions |
|
|
88
|
+
| Elasticity | (aᵢⱼ/λ) × ∂λ/∂aᵢⱼ | Proportional change in λ per proportional change in aᵢⱼ | Comparable across transitions; sums to 1 |
|
|
89
|
+
|
|
90
|
+
**Key elasticity patterns by life history:**
|
|
91
|
+
|
|
92
|
+
| Life history guild | Highest elasticity usually on |
|
|
93
|
+
|-------------------|------------------------------|
|
|
94
|
+
| Short-lived, high fecundity | Fecundity (F) and juvenile survival |
|
|
95
|
+
| Long-lived, low fecundity | Adult survival (Sa) — protect adults |
|
|
96
|
+
| Intermediate (most mammals) | Subadult/juvenile survival and adult survival roughly equal |
|
|
97
|
+
|
|
98
|
+
**Rule:** If adult survival elasticity > 0.5 → any intervention reducing adult mortality has higher λ return than fecundity enhancement.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Uncertainty in Vital Rates: Sensitivity Range vs Point Estimate
|
|
103
|
+
|
|
104
|
+
When fewer than 3 years of data are available:
|
|
105
|
+
|
|
106
|
+
```r
|
|
107
|
+
# Range of λ across vital rate uncertainty
|
|
108
|
+
F_range <- c(0.6, 1.2) # fecundity range
|
|
109
|
+
Sa_range <- c(0.75, 0.90) # adult survival range
|
|
110
|
+
|
|
111
|
+
lambda_range <- expand.grid(F = F_range, Sa = Sa_range) %>%
|
|
112
|
+
dplyr::rowwise() %>%
|
|
113
|
+
dplyr::mutate(
|
|
114
|
+
A_mat = list(matrix(c(0, 0, F, 0.3, 0.6, 0, 0, 0.7, Sa),
|
|
115
|
+
nrow = 3, byrow = TRUE)),
|
|
116
|
+
lambda = lambda(A_mat)
|
|
117
|
+
)
|
|
118
|
+
cat("Lambda range:", range(lambda_range$lambda), "\n")
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Report:** λ = [min, max] (vital rate uncertainty), not a single point estimate.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Pitfalls
|
|
126
|
+
|
|
127
|
+
- **Stage matrix built from different populations:** Vital rates from captive populations overestimate survival. Always use wild rates or correct for captivity effects.
|
|
128
|
+
- **Non-ergodic matrix:** If the matrix has disconnected life-history blocks (e.g., no pathway from stage 1 to stage 3), λ will be undefined or biologically meaningless. Check connectivity of stages.
|
|
129
|
+
- **Fertility confusion:** Fecundity in the first row should be the number of stage-1 individuals produced per individual per time step — not clutch size or litter size directly. Account for sex ratio and offspring survival to first census.
|
|
130
|
+
- **Time step mismatch:** If survival rates are annual but fecundity is seasonal, standardise all vital rates to the same time step before building the matrix.
|
|
131
|
+
- **λ ≈ 1 with wide CI:** A point estimate of λ = 1.01 with uncertainty range [0.92, 1.10] should NOT be reported as "stable population." Report the full range.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## References
|
|
136
|
+
|
|
137
|
+
- Caswell, H. (2001). *Matrix Population Models: Construction, Analysis, and Interpretation* (2nd ed.). Sinauer Associates.
|
|
138
|
+
- Morris, W.F. & Doak, D.F. (2002). *Quantitative Conservation Biology*. Sinauer Associates. ISBN: 978-0878935468
|
|
139
|
+
- Crouse, D.T., Crowder, L.B. & Caswell, H. (1987). A stage-based population model for loggerhead sea turtles. *Ecology*, 68(5), 1412–1423. DOI: 10.2307/1939225
|