Probabilistic framework for the analysis of archaeological palimpsests based on the Stratigraphic Entanglement Field (SEF). Integrates spatial proximity, stratigraphic depth, chronological overlap, and cultural similarity to estimate latent depositional phases via diagonal Gaussian mixture Expectation-Maximisation (EM). Provides the Stratigraphic Entanglement Index (SEI), Excavation Stratigraphic Energy (ESE), and Palimpsest Dissolution Index (PDI) for quantifying depositional coherence, detecting intrusive finds, and measuring palimpsest formation. Includes simulation, diagnostics, phase-count selection, publication-quality plots, and Geographic Information System (GIS) export via 'sf'. Methods are described in Cocca (2026) < https://github.com/enzococca/palimpsestr>.
Probabilistic decomposition of archaeological palimpsests using Stratigraphic Entanglement Fields.
If you use palimpsestr in your research, please cite the software:
Cocca, E. (2026). palimpsestr: Probabilistic Decomposition of Archaeological Palimpsests. R package version 0.12.0. Zenodo. https://doi.org/10.5281/zenodo.19881542
If you refer to the methodological framework, please cite the preprint:
Cocca, E., Montagnetti, R., & Cattani, M. (2026). palimpsestR: An R Package for the Identification and Probabilistic Decomposition of Archaeological Palimpsests. Zenodo. https://doi.org/10.5281/zenodo.19969277
# install.packages("remotes")
remotes::install_github("enzococca/palimpsestr")
palimpsestr models each archaeological find as a probabilistic member of latent depositional phases by integrating spatial proximity, stratigraphic depth, chronological overlap, and cultural similarity via diagonal Gaussian mixture EM.
Three statistics quantify the deposit:
library(palimpsestr)
# Simulate a 3-phase deposit with 30% mixing
x <- archaeo_sim(n = 200, k = 3, mixing = 0.30, seed = 42)
# Fit the SEF model
fit <- fit_sef(x, k = 3, context = "context")
print(fit)
summary(fit)
# Visualisation (base R)
plot_phasefield(fit)
plot_entropy(fit)
# ggplot2 equivalents (requires ggplot2)
gg_phasefield(fit)
gg_entropy(fit)
gg_energy(fit)
gg_intrusions(fit)
# Intrusion detection
detect_intrusions(fit)
# Compare multiple K values
compare_k(x, k_values = 2:6, context = "context")
data(demo_easy) # 3 phases, 5% mixing
data(demo_moderate) # 3 phases, 30% mixing
data(demo_compressed) # 4 phases, 50% mixing
data(villa_romana) # Real data: Poggio Gramignano (VRPG 3004)
bootstrap_sef())cv_sef(), optimize_weights())as_sf_phase(), as_sf_links())gg_map())report_sef())read_db())MIT