This is an agent-based model for simulating the demic expansion of tropical forest farmers in late Holocene South America. Over the last 5000 years, archaeological cultures like the Saladoid-Barrancoid and Tupiguarani expanded over different parts of Amazon and beyond, spreading the practice of polyculture agroforestry. Can these archaeological expansions be modelled as demic waves of advance similar to what has been proposed for the Neolithic in Eurasia? Model results are assessed by comparing simulated arrival times with radiocarbon dates. Similar models, where human expansions are determined by population growth, fission and relocation, have been developed for the spread of farming in Europe (Fort et al. 2012; Isern et al. 2017). The same concept is adopted here, with the rules of the model informed by the ethnography of tropical forest farmers. For a complete description of the model, see Souza et al. (2020).
Clone or download the repository. There are some dependencies that need to be installed:
pip3 install -r requirements.txt
Expansions result from the interaction between population growth, village fission and village relocation. Each village has a territory within a catchment radius and a maximum population density (K*). The population grows at a rate of 2.5% per year. If the population is above the maximum density, more cells (10 x 10 km) are added to its territory. When the village population is above a certain threshold and there are free cells outside of its catchment, it fissions, giving birth to a new village. If a village has been in its location beyond a maximum permanence time, it also looks for free cells outside its catchment to move. Finally, villages have the option to leapfrog: if there are no free cells in the immediate neighbourhood, they can jump over longer distances.
The model starts with a village whose population is at the fission threshold, so that it immediately fissions and starts the expansion.
When fissioning or moving, villages choose the best cell according to a suitability layer. Here, a layer env.asc is provided in the /layers
folder for illustrative purposes. The layer was created using MaxEnt. In the code, a parameter tolerance
is passed to the agents, determining the minimum value for a cell to be settled. In this version, the value 0.3 was used, based on the max training sensitivity and specificity threshold of the MaxEnt results.
You must define a start date (BP) and a dictionary with the parameters: the coordinates (lonlat) of the first village, the maximum population density (persons 100 km-2), fission threshold, catchment radius (km), leap distance (km) and maximum permanence time (years).
For now, let's set the start date to 4600 BP and the initial coordinates to -65.77 7.82 (approximate coordinates of La Gruta, which potentially contains some of the earliest Saladoid-Barrancoid ceramics).
>>> from model import Model
>>> start_date = 4600
>>> params = {
'coords': (-65.77, 7.82),
'k': 30,
'fission_threshold': 70,
'catchment': 10,
'leap_distance': 150,
'permanence': 15,
'tolerance': 0.3
}
>>> model = Model(start_date, params)
>>> model.run(4100, show_prog=True)
100%|██████████████████████████████████████| 4100/4100 [00:08<00:00, 507.48it/s]
The results of the model can be evaluated by comparing simulated arrival times with radiocarbon dates in different regions. The calibrated dates you want to use for comparison must be placed in the folder /dates
. Files must be in .csv format with two columns, one for each date, with a first row containing XY coordinates for the dated site in lonlat format and the remaining rows containing years BP and the respective probability densities.
The result is a score from 0 to 1 obtained by averaging the intercepted normalised probability at each dated site (or 0 if the simulated arrival time is outside of the calibrated distribution).
>>> score = model.eval()
>>> print('score:', round(score, 2))
score: 0.57
You can save the results to be used in other software. This creates two files in the /results
folder: one starting with sim...
containing the simulated arrival times and the other starting with dates...
containing the intercepted probability densities.
>>> model.write()
You can also run from the command line by using the following arguments:
python3 run.py --start=4600 --x=-65.77 --y=7.82 --k=30 --fiss=70 --catch=10 --leap=150 --perm=15 --tol=0.3 --iter=4100 --write --eval --show-bar
Fort, Joaquim, Toni Pujol, and Marc Vander Linden. 2012. “Modelling the Neolithic Transition in the Near East and Europe.” American Antiquity 77 (2): 203–19.
Isern, Neus, João Zilhão, Joaquim Fort, and Albert J Ammerman. 2017. “Modeling the Role of Voyaging in the Coastal Spread of the Early Neolithic in the West Mediterranean.” Proceedings of the National Academy of Sciences 114 (5): 897 LP – 902.
Souza, J.G., Alcaina-Mateos, J., Madella, M. 2020. "Archaeological expansions in tropical South America during the late Holocene: Assessing the role of demic diffusion". PLOS ONE 15(4): e0232367.