Methods
I designed the study so that two independent lines of evidence point at the same question. My field survey measures the fine-scale edge gradient, and my real-data analysis tests the same idea at landscape scale.
1 · Field sampling design
At each site I lay belt transects perpendicular to a mapped edge, and I classify the edge as human-disturbed (road, trail, mowed field margin) or natural (stream bank, treefall gap). Along each transect I place quadrats at fixed distances of 0, 5, 10, 25, and 50 m from the edge. That distance gradient is my main predictor.
- Cover of each species in Daubenmire classes, in a 1 × 1 m quadrat (herbs) nested in a 5 × 5 m plot (woody/vine species).
- Covariates at every quadrat: canopy openness, distance to water, and native species richness.
- A GPS position for each quadrat, so my field points feed directly into the spatial analysis.
Study area
The study area includes northwest and central Connecticut, with special attention to two community landscapes: Avon and the Farmington Valley, where I grew up, and Lakeville/Salisbury, where I attend school.
Public occurrence records show the broader regional patterns. My field-study sites are designed to test those patterns at the local habitat scale, especially along roads, trails, fields, stream corridors, and forest edges. Seven sites span both areas:
Northwest hills
- Hotchkiss farm area, with field margins and farm edges
- Campus trail / forest edge, where foot traffic disturbs the trail
- Roadside / field boundary near campus, with road and mowed edges
- Great Mountain Forest vicinity, a large conservation forest I use as an interior reference
Farmington Valley
- Avon, Farmington Canal trail and roadside edges
- Simsbury, town open space and rail-trail edges
- Farmington, Farmington River trail and field margins
2 · Statistical analysis: does invasion track edges?
Because quadrats on the same transect are not independent, I model that correlation two complementary ways.
Population-averaged models (Python)
I fit generalized estimating equations (GEE) with an exchangeable correlation clustered by transect. That gives a binomial model for presence and a Gaussian model for logit-transformed cover, using distance, edge type, species, their interaction, and covariates as predictors.
Mixed models & nonlinear effects (R)
I then fit true mixed models with a random transect effect (lme4),
test fixed effects with Type-II Wald tests, and use a generalized additive model
(mgcv) with a per-species smooth of distance and a 2-D spatial smooth.
I check residual spatial autocorrelation with Moran's I and an nlme
spatial-correlation model.
3 · Spatial analysis: where are the clusters?
I map clustering with the Getis-Ord Gi* local statistic, computed within each site from a k-nearest-neighbour weights matrix (k = 8) with 999 permutations; quadrats with p < 0.05 are hot or cold spots. I run it for total invasive cover and for each species separately, and I quantify whether the species cluster in the same places using co-occurrence counts and Jaccard overlap.
Finally I cross the hotspots with a conservation-value score (native richness and interior position) to label each location as Remove / Treat, Restore native, Monitor, or Low.
4 · Real-data validation
To test the hypothesis independently of my own survey, I pull real records and layers for the same area:
- Occurrences from GBIF (iNaturalist research-grade observations plus herbarium specimens), filtered to northwest and central Connecticut.
- Land cover from CT ECO's 2015 "Connecticut's Changing Landscape," sampled live at each occurrence and at random background points. This is a used-vs-available test of disturbed-land association.
Data & tools
Everything is reproducible: my real-data results come from open public sources, and my analysis runs on free, open-source tools.
Data sources
GBIF
Real occurrence records (iNaturalist research-grade + herbarium specimens), pulled via the open GBIF API for my four species across northwest and central Connecticut.
CT ECO land cover
Connecticut's Changing Landscape (2015), sampled live from the CT ECO ArcGIS service for my disturbed-land test. Land cover, impervious surface, imagery.
CT invasive plant list
I selected my species from Connecticut's official list, maintained by the CT Invasive Plants Council / UConn (updated October 2024). All four are classified invasive and prohibited under CGS §22a-381d.
Dynamic World
Near-real-time 10 m land cover from Sentinel-2, via Google Earth Engine. I use its 2025 to 2026 data for the higher-resolution disturbed-land and distance-to-built tests, which gives a current cross-check on the 2015 layer.
For environmental layers I also use the CT Geodata Portal and CT DEEP GIS Open Data (roads, hydrography, boundaries).
Tools
- Python:
geopandas,libpysal/esda(Getis-Ord Gi*),statsmodels(GEE),folium(interactive maps),matplotlib. - R:
lme4(mixed models),mgcv(GAMs),nlme(spatial correlation),ggplot2. - Google Earth Engine:
earthengine-api, for server-side sampling of Dynamic World land cover and distance-to-built. - QGIS: optional, for final cartography from my exported GeoPackage.
My analysis scripts
| Script | What it does | Data |
|---|---|---|
fetch_real_data.py | Pull GBIF occurrence records | real |
hotspot_real_data.py | Gi* hotspots from real records | real |
make_web_map.py | Interactive Leaflet maps of the real data | real |
landcover_test.py | CT ECO 2015 disturbed-land used-vs-available test | real |
landcover_dynamicworld.py | Same test on Dynamic World 2025-26 (10 m, Earth Engine) | real |
distance_to_built_dw.py | Distance-to-built edge-proximity test (Dynamic World) | real |
analysis_python.py | GEE models of the edge gradient | framework |
analysis_advanced.R | Mixed models, GAM, spatial models | framework |
hotspot_priority.py | Gi* + conservation priority zones | framework |
hotspot_by_species.py | Per-species Gi* + overlap | framework |