Title: | Analysis of Archaeological Mortality Data |
---|---|
Description: | A collection of functions for the analysis of archaeological mortality data (on the topic see e.g. Chamberlain 2006 <https://books.google.de/books?id=nG5FoO_becAC&lpg=PA27&ots=LG0b_xrx6O&dq=life%20table%20archaeology&pg=PA27#v=onepage&q&f=false>). It takes demographic data in different formats and displays the result in a standard life table as well as plots the relevant indices (percentage of deaths, survivorship, probability of death, life expectancy, percentage of population). It also checks for possible biases in the age structure and applies corrections to life tables. |
Authors: | Nils Mueller-Scheessel [aut, cre, cph]
|
Maintainer: | Nils Mueller-Scheessel <[email protected]> |
License: | GPL-3 | file LICENSE |
Version: | 1.1.7 |
Built: | 2025-03-13 06:03:39 UTC |
Source: | https://github.com/isaakiel/mortaar |
A life table from Kokkotidis/Richter 1991, 228.
A data frame with 13 rows and 11 variables.
Alter (age)
a (added to the original dataset)
Dx
Sx
qx
lx
dx
Lx
Tx
ex
rel.Bevx
For further information about the values see the
documentation of life.table
.
The life table is compiled from the Linear pottery burial site Aiterhofen Ödmühle (Lower Bavaria). More information can be found in Baum 1990.
Kokkotidis KG, Richter J (1991). “Graeberfeld-Sterbetafeln.” Archaeologische Informationen. Mitteilungen zur Ur- und Fruehgeschichte, 14(2), 219–241.
Baum N (1990). “Aiterhofen-Oedmuehle - Palaeodontologie eines bandkeramischen Graeberfeldes in Niederbayern.” Praehistorische Zeitschrift, 65, 157–203.
Other lifetables:
gallery_graves
,
magdalenenberg
,
muensingen
,
nitra
,
odagsen_cm
,
odagsen_mo
,
schleswig_ma
A dataset from Czarnetzki 1966.
A data frame with 128 rows and 4 variables.
indnr: ID of the individual represented by a skull.
sex: sex determination, w -> female, m -> male.
age: age class.
site: collective grave.
Skulls from four different collective graves. This dataset is not well prepared and needs some adjustment.
Czarnetzki A (1966). “Die menschlichen Skelettreste aus vier neolithischen Steinkisten Hessens und Niedersachsens.” Dissertation at the University of Tuebingen.
Other lifetables:
aiterhofen_oedmuehlen
,
magdalenenberg
,
muensingen
,
nitra
,
odagsen_cm
,
odagsen_mo
,
schleswig_ma
In a series of papers, M. A. Luy and U. Wittwer-Backofen (2005; 2008) proposed a method they called 'Halley band' as alternative for other methods of sampling from an skeletal population. It basically involves sampling n times from the age-estimation of each individual and then only taking the 2.5th and 97.5th percentile into account. The space between, they dubbed 'Halley band' but pointed out that it is not to be confused with confidence intervals.
halley.band(x, n = 1000, uncert = 0.95, agebeg, ageend, agerange = "excluded")
halley.band(x, n = 1000, uncert = 0.95, agebeg, ageend, agerange = "excluded")
x |
a data.frame with individuals and age estimations. |
n |
number of runs, default: 1000. |
uncert |
level of uncertainty, default: 0.95. |
agebeg |
numeric. Starting age of the respective individual. |
ageend |
numeric. Closing age of the respective individual. |
agerange |
character. Determination if the closing age leaves a gap to the following age category. If yes (= "excluded"), "1" is added to avoid gaps, default: "excluded". |
One data.frame with the following items:
age: age in years.
lower_dx: Lower boundary of uncertainty for dx.
upper_dx: Upper boundary of uncertainty for dx.
lower_qx: Lower boundary of uncertainty for qx.
upper_qx: Upper boundary of uncertainty for qx.
lower_lx: Lower boundary of uncertainty for lx.
upper_lx: Upper boundary of uncertainty for lx.
Luy MA, Wittwer-Backofen U (2005). “Das Halley-Band für paläodemographische Mortalitätsanalysen.” Zeitschrift für Bevölkerungswissenschaft, 30(2–3), 219–244.
Luy MA, Wittwer-Backofen U (2008). “The Halley band for paleodemographic mortality analysis.” In Bocquet-Appel J (ed.), Recent advances in paleodemography. Data, techniques, patterns, volume 31 of Cambridge Stud. Biol. and Evolutionary Anthr., 119-141. Springer, Dordrecht.
# create simulated population with artifical coarsening first pop_sim <- pop.sim.gomp(n = 1000) sim_ranges <- random.cat() # apply random age categories to simulated ages sim_appl <- random.cat.apply(pop_sim$result, age = "age", age_ranges = sim_ranges, from = "from", to = "to") # create halley bands demo <- halley.band(sim_appl, n = 1000, uncert = 0.95, agebeg = "from", ageend = "to", agerange = "excluded") # plot band with ggplot library(ggplot2) ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_dx, ymax = upper_dx), linetype = 0, fill = "grey") ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_lx, ymax = upper_lx), linetype = 0, fill = "grey") ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_qx, ymax = upper_qx), linetype = 0, fill = "grey")
# create simulated population with artifical coarsening first pop_sim <- pop.sim.gomp(n = 1000) sim_ranges <- random.cat() # apply random age categories to simulated ages sim_appl <- random.cat.apply(pop_sim$result, age = "age", age_ranges = sim_ranges, from = "from", to = "to") # create halley bands demo <- halley.band(sim_appl, n = 1000, uncert = 0.95, agebeg = "from", ageend = "to", agerange = "excluded") # plot band with ggplot library(ggplot2) ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_dx, ymax = upper_dx), linetype = 0, fill = "grey") ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_lx, ymax = upper_lx), linetype = 0, fill = "grey") ggplot(demo) + geom_ribbon(aes(x = age, ymin = lower_qx, ymax = upper_qx), linetype = 0, fill = "grey")
life.table
calculates
life table(s).
The algorithm is optimised for deceased populations
encountered in archaeological research.
See Chamberlain 2006, 27ff., Herrmann et. al 1990, 303ff.,
Kokkotidis/Richter 1991, Keyfitz et al. 2005
for selected literature.
The function takes an individual data.frame or a list of
data.frames and returns an object of class mortaar_life_table
or mortaar_life_table_list, for which specialised summary,
print and plot functions exist.
life.table(neclist, agecor = TRUE, agecorfac = c(), option_spline = NULL)
life.table(neclist, agecor = TRUE, agecorfac = c(), option_spline = NULL)
neclist |
single data.frame or list of data.frames with the columns 'x', 'a', 'Dx'.
|
agecor |
logical, optional. If set TRUE, the average number of years lived within a given age class of individuals having died in this class can be adjusted via agecorfac. If set FALSE, it is assumed that they died in the middle of this class. Due to the higher mortality rates of infants, this assumption is certainly inaccurate for individuals <= 5 years. Default setup is: TRUE. |
agecorfac |
numeric vector, optional. Only applies if agecor == TRUE. Given values replace the standard values from the first age interval onward. Default setup is 1/3 for every age class <= 5 life years, and 1/2 for the others. |
option_spline |
integer, optional. If > 0, values for adults will be interpolated by a monotonic cubic spline. Usual options will by '10' or '20' which will interpolate the values for individuals of an age of 20 or older by 10- or 20- year cumulated values. To be used carefully, as diagnostic features of the life table might be smoothed and essentially removed. Only available when the methods 'Standard' or 'Equal5' in prep.life.table have been chosen. |
An object of class mortaar_life_table or mortaar_life_table_list. Each mortaar_life_table contains the following variables:
x: age interval.
a: years within x.
Ax: average number of years lived by an individual that died within a specific age class x :
Dx: number of deaths within x.
dx: proportion of deaths within x (percent) :
lx: survivorship within x (percent) :
with
qx: probability of death within x (percent) :
Lx: number of years lived within x by those that died within x and those that reached the next age class :
Tx: sum of years lived within current and remaining x :
with
ex: average years of life remaining (average life expectancy at mean(x)) :
rel_popx: percentage of L(x) of the sum of L(x) :
Chamberlain AT (2006). Demography in archaeology, Cambridge Manuals in Archaeology. Cambridge University Press. https://doi.org/10.1017/CBO9780511607165.
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
Keyfitz N, Caswell H (2005). Applied Mathematical Demography. Springer. https://link.springer.com/book/10.1007/b139042.
Kokkotidis KG, Richter J (1991). “Graeberfeld-Sterbetafeln.” Archaeologische Informationen. Mitteilungen zur Ur- und Fruehgeschichte, 14(2), 219–241.
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) print(schleswig_1) plot(schleswig_1, display = "lx") # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) print(odagsen) plot(odagsen, display = "ex") # Prepare a real world dataset and create a mortaar_life_table. library(magrittr) magdalenenberg %>% replace(. == "60-x", "60-70") %>% tidyr::separate(a, c("from", "to")) %>% dplyr::mutate(from = as.numeric(from), to = as.numeric(to)) %>% prep.life.table( dec = "Dx", agebeg = "from", ageend = "to", method = "Standard", agerange = "excluded" ) %>% life.table()
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) print(schleswig_1) plot(schleswig_1, display = "lx") # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) print(odagsen) plot(odagsen, display = "ex") # Prepare a real world dataset and create a mortaar_life_table. library(magrittr) magdalenenberg %>% replace(. == "60-x", "60-70") %>% tidyr::separate(a, c("from", "to")) %>% dplyr::mutate(from = as.numeric(from), to = as.numeric(to)) %>% prep.life.table( dec = "Dx", agebeg = "from", ageend = "to", method = "Standard", agerange = "excluded" ) %>% life.table()
It is generally assumed that most skeletal populations lack the youngest age group. Life tables resulting from such populations will necessarily be misleading as they lead to believe that the mortality of younger children was lower than it actually was and that life expectancy was higher. For correcting these missing individuals, Bocquet-Appel and Masset (1977; see also Herrmann et al. 1990, 307) conceived of several calculations based on regression analyses of modern comparable mortality data. However, the applicability of these indices to archaeological data is highly debated and does not necessarily lead to reliable results. Therefore, the correction needs to be weighted carefully and ideally only after the representativity of the base data has been checked with function lt.representativity.
lt.correction(life_table, agecor = TRUE, agecorfac = c(), option_spline = NULL)
lt.correction(life_table, agecor = TRUE, agecorfac = c(), option_spline = NULL)
life_table |
an object of class mortaar_life_table. |
agecor |
logical, optional. Passed to |
agecorfac |
numeric vector, optional. Passed to |
option_spline |
integer, optional. Passed to |
For the parameters see the documentation of life.table
.
a list containing a data.frame with indices e0, 1q0 and 5q0 as well as mortality rate m and growth rate r according to Bocquet-Appel and Masset showing the computed exact value as well as ranges and an object of class mortaar_life_table with the corrected values.
e0: Corrected life expectancy.
1q0: Mortality of age group 0–1.
5q0: Mortality of age group 0–5.
Masset C, Bocquet J (1977). “Estimateurs en paléodémographie.” L’Homme, 17(4), 65–90.
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
# Calculate a corrected life table from real life dataset. schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.correction(schleswig)
# Calculate a corrected life table from real life dataset. schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.correction(schleswig)
This function bundles a number of indices and vectors from a mortAAR life table which are needed by other functions in mortAAR. The results are only meaningful if 5-year-categories have been chosen to construct the life table.
lt.indices(life_table)
lt.indices(life_table)
life_table |
an object of class mortaar_life_table. |
A list with the following indices and vectors:
child_i: ratio of individuals aged 5–9 to those aged 10–14 according to Masset and Bocquet 1977.
juvenile_i: ratio of individuals aged 5–14 to adults according to Masset and Bocquet 1977.
P(5-19): ratio of individuals aged 5–19 to those aged 5 or above according to Bocquet-Appel 2002.
D30_D5): ratio of individuals aged 30 and above to those aged 5 or above according to Buikstra et al. 1986.
D0_14_D: proportion of individuals aged 0–14 according to McFadden & Oxenham 2018a if infants are represented well.
D15_49_D15plus: proportion of individuals aged 15–49 according to Taylor & Oxenham 2024.
e0: life expectancy at age 0.
Bocquet-Appel J (2002). “Paleoanthropological Traces of a Neolithic Demographic Transition.” Current Anthropology, 43(4), 637–650.
Masset C, Bocquet J (1977). “Estimateurs en paléodémographie.” L’Homme, 17(4), 65–90.
Buikstra JE, Konigsberg LW, Bullington J (1986). “Fertility and the Development of Agriculture in the Prehistoric Midwest.” American Antiquity, 51(3), 528–546.
McFadden C, Oxenham MF (2018). “The D0-14/D ratio: A new paleodemographic index and equation for estimating total fertility rates.” American Journal of Physical Anthropology, 165(3), 471–479.
Taylor B, Oxenham M (2024). “A method for detecting bias in human archaeological cemetery samples.” International Journal of Osteoarchaeology, 0. doi:10.1002/oa.3379.
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.indices(schleswig)
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.indices(schleswig)
The estimation of the population size for a given cemetery is only possible if a stationary population is assumed. In this case, the number of deaths is simply multiplied with the life expectancy at birth and divided be the time span in years the cemetery was in use. Additionally, it is assumed that an unknown number of individuals is not represented in the cemetery and, therefore, the resulting number is multiplied by an arbitrary value k (Herrmann et al. 1990, 311f.).
lt.population_size(x, e0, k = 1.1, t)
lt.population_size(x, e0, k = 1.1, t)
x |
either an object of class mortaar_life_table or mortaar_life_table_list or an arbitrary numeric value representing the number of deaths. |
e0 |
numeric. life expectancy at birth in years (if x is of class mortaar_life_table then e0 can be derived directly from the life table's ex column). |
k |
numeric. Arbitrary number to cater for individuals not represented in the number of deaths. Default: 1.1. |
t |
numeric. Time span of usage of cemetery in years. |
A data.frame with the following items:
D: Number of deaths.
e0: Life expectancy at birth in years.
k: Correction factor.
t: Time span of usage of cemetery in years.
P: Population size calculated by the formula
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.population_size(schleswig, t = 100) odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) lt.population_size(odagsen, e0 = 30, t = 100) lt.population_size(x = 111, e0 = 32.2, k = 1.2, t = 100)
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.population_size(schleswig, t = 100) odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) lt.population_size(odagsen, e0 = 30, t = 100) lt.population_size(x = 111, e0 = 32.2, k = 1.2, t = 100)
Weiss 1973, 46f. and Bocquet-Appel and Masset 1977 (see also
Herrmann et al. 1990, 306f.) have devised indices which check
if the non-adult age groups are represented in proportions as can be
expected from modern comparable data. Whether this is really applicable
to archaeological data-sets is a matter of debate.
Quite recently, Taylor and Oxenham 2024 added a comparison of Total
fertility rates (TRF) according to different formulas which depend either
on subadults or adults.
Weiss chose the mortality (qx) as deciding factor and claimed that
(1) the probability of death of the age group 10–15 (5q10)
should be lower than that of the group 15–20 (5q15) and that (2)
the latter in turn should be lower than that of age group 0–5
(5q0).
In contrast, Bocquet-Appel and Masset took the raw number of dead (Dx)
and asserted that (1) the ratio of those having died between 5 and 10
(5D5) to those having died between 10 and 15 (5D15) should be equal or
larger than 2 and that (2) the ratio of those having died between 5 and 15
(10D5) and all adults (>= 20) should be 0.1 or larger.
The formualas Taylor and Oxenham used either weigh all individuals aged 0–14
against all individuals or all individuals aged 15–49 against all individuals
aged 15+. The formulas differ from the original ones published by
McFadden and Oxenham 2018 and Taylor et al. 2023 because the
data basis is slighty different. If the results of the formulas deviate
by more than 0.692 (the standard error of estimate, SEE), there is a problem
with the age structure.
Due to the specific nature of the indices, they only give meaningful
results if 5-year-age categories have been chosen for the non-adults.
lt.representativity(life_table)
lt.representativity(life_table)
life_table |
an object of class mortaar_life_table. |
data.frame showing the indices and explaining their interpretation.
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
Masset C, Bocquet J (1977). “Estimateurs en paléodémographie.” L’Homme, 17(4), 65–90.
mcfadden_oxenham_2018a
Weiss KM, Wobst HM (1973). “Demographic Models for Anthropology.” Memoirs of the Society for American Archaeology, 27, i–186. ISSN 0081-1300.
Taylor B, Oxenham M (2024). “A method for detecting bias in human archaeological cemetery samples.” International Journal of Osteoarchaeology, 0. doi:10.1002/oa.3379. taylor_et_al_2023
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.representativity(schleswig)
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.representativity(schleswig)
For population studies it is of vital importance to estimate growth or decline of a population. For archaeological datasets this is rarely attempted, probably because the data quality seems to scanty. Nevertheless, the calculation of such measures seems worth the try, at least it should give an impression if the resulting values are unrealistic high or low.
lt.reproduction( life_table, fertility_rate = "BA_log", growth_rate = "fertility", gen_len = 20 )
lt.reproduction( life_table, fertility_rate = "BA_log", growth_rate = "fertility", gen_len = 20 )
life_table |
an object of class mortaar_life_table. |
fertility_rate |
string or numeric. Either fertility rate according to McFadden & Oxenham 2018a if infants are represented well or Taylor et al. or fertility rate according to data by McFadden & Oxenham 2018a for P(5-19) index after Bocquet-Appel 2002. Options: 'McFO' (McFadden/Oxenham), 'TOMc' (Taylor et al.), 'BA_linear' (linear fit), 'BA_power' (power fit) or 'BA_log' (logistic fit). Default: BA_log'. Additionally, the user can specify an arbitrary number in lieu of the fertility rate. |
growth_rate |
string or numeric. Either derived directly from the fertility
calculations or from regression analysis by either McFadden & Oxenham 2018b
( |
gen_len |
numeric. Length of generation for determining the rate of doubling the population. Default: 20. |
There are different approaches to calculate reproduction rates (e. g.
Henneberg 1978). We largely follow the methodology by
Hassan 1981. Typically, a Total fertility rate (TFR) of 6-8 is
assumed for prehistoric populations (Ascadi/Nemeskeri 1970;
Henneberg 1978; Hassan 1981). Recently, McFadden
and Oxenham 2018a have published a formula to estimate the Total
fertility rate from archaeological data, provided that infants are
represented fully in the archaeological record.
Unfortunately, this will not be the case for most archaeological
datasets. Therefore, we used the data published by McFadden and
Oxenham to apply it to the P(5-19)-index after Bocquet-Appel
2002. We approximated the ratio by three different methods of
fitting (linear, logistic, power) and recommend logistic fitting,
but the others are available as well.
We have also added the option to use the formula by Taylor et al.
2023 that uses the ratio of adults aged 15–49 in relation to those aged
15 or older.
The Gross reproduction rate (GRR) is calculated by multiplying the TFR
with the ratio of female newborns, assumed to be a constant of 48.8
of all children (Hassan 1981, 136). The Net reproduction rate is
arrived at by summing the product of the GRR, the age specific
fertility rate as defined by Hassan (1981, 137 tab. 8.7) and
the age specific survival taken from the life table and dividing the
result by 10000.
The Rate of natural increase or Intrinsic growth rate r (growth in per cent
per year) can be computed from the fertility following Hassan
(1981, 140). Alternative ways to calculate the intrinsic growth rate
derive from Bocquet-Appel and Masset (1977) and recently from
McFadden and Oxenham 2018b. The latter present a regression
analysis based on the index D0–15/D also used for fertility
calculations (see above) in connections with modern data.
Whatever is chosen as base for the growth rate calculations is used
for computing the doubling time in years, assuming exponential steady growth.
Also calculated is the mortality rate m after Bocquet-Appel and Masset
(1977) in per cent of a given population. Furthermore, the ratio of dependent individuals
is reported that is usually (but probably erroneously for archaic societies
(Grupe et al. 2015, 423) assumed to apply to those aged below 15 or
60 and above.
Finally, Buikstra et al. 1986 have made the interesting observation that
the relation of those individuals aged 30 years and above to those aged
5 years and above is very closely related to the birth rate and also closely
(but less significantly) related to the death rate. Therefore, these indices
are calculated as well.
A data.frame with basic reproduction indices:
m: Mortality rate (= natality rate n).
dep: Dependency ratio.
TFR: Total fertility rate.
GRR: Gross reproduction rate.
NRR: Net reproduction rate.
r: Intrinsic growth rate in per cent per year.
Dt: Doubling time in years.
D30_D5: Ratio D30+/D5+ after Buikstra et al.
BR: Birth rate from ratio D30+/D5+.
DR: Death rate from ratio D30+/D5+.
Acsadi G, Nemeskeri J (1970). History of Human Life Span and Mortality. Akademiai Kiado, Budapest.
Masset C, Bocquet J (1977). “Estimateurs en paléodémographie.” L’Homme, 17(4), 65–90.
Bocquet-Appel J (2002). “Paleoanthropological Traces of a Neolithic Demographic Transition.” Current Anthropology, 43(4), 637–650.
Buikstra JE, Konigsberg LW, Bullington J (1986). “Fertility and the Development of Agriculture in the Prehistoric Midwest.” American Antiquity, 51(3), 528–546.
Grupe G, Harbeck M, McGlynn GC (2015). Prähistorische Anthropologie. Springer, Berlin, Heidelberg.
Hassan FA (1981). Demographic Archaeology. Academic Press, New York.
Henneberg M (1976). “Reproductive possibilities and estimations of the biological dynamics of earlier human populations.” Journal of Human Evolution, 5(1), 41–48.
McFadden C, Oxenham MF (2018). “The D0-14/D ratio: A new paleodemographic index and equation for estimating total fertility rates.” American Journal of Physical Anthropology, 165(3), 471–479.
McFadden C, Oxenham MF (2018). “Rate of natural population increase as a paleodemographic measure of growth.” Journal of Archaeological Science: Reports, 19, 352–356.
Taylor BR, Oxenham M, McFadden C (2023). “Estimating fertility using adults: A method for under-enumerated pre-adult skeletal samples.” American Journal of Biological Anthropology, 181(2), 262–270. doi:10.1002/ajpa.24739.
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.reproduction(schleswig) odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) lt.reproduction(odagsen)
schleswig <- life.table(schleswig_ma[c("a", "Dx")]) lt.reproduction(schleswig) odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) lt.reproduction(odagsen)
The proportional relation between adult males and females (=
Masculinity index) is interesting for a number of reasons: (1)
it can point to basic problems in the datasets in that, say,
one sex is grossly over- or underrepresented (Herrmann et al.
1990, 310). (2) it may hint towards cultural reasons like sex-
specific mobility.
Maternal mortality is a basic indicator for the health system of a
given population. Maternal mortality is defined as dying during
pregnancy or within the first 42 days after birth due to
complications. Recently, McFadden and colleagues 2020 have
provided an updated formula to calculate it from archaeological data.
lt.sexrelation(females, males)
lt.sexrelation(females, males)
females |
an object of class mortaar_life_table for females |
males |
an object of class mortaar_life_table for males |
The Masculinity index (MI) is defined for juvenile and older
individuals. Note that with a higher mortality rate of adult females,
an MI < 100 does not necessarily speak for an unbalanced MI in life.
Maternal mortality is calculated according to the formula
provided by McFadden & Oxenham 2019 in the updated version of
McFadden et al. 2020. McFadden and Oxenham show
that with modern data a very high correlation is achieved by only
comparing the absolute numbers of the age group 20 to 24. This has the
additional advantage that for this age group anthropological aging
methods are reasonable exact.
Output of masculinity index and maternal mortality.
Masculinity index.
Maternal mortality.
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
McFadden C, Oxenham MF (2019). “The Paleodemographic Measure of Maternal Mortality and a Multifaceted Approach to Maternal Health.” Current Anthropology, 60(1), 141–146. http://dx.doi.org/10.1086/701476.
McFadden C, Van Tiel B, Oxenham MF (2020). “A stabilized maternal mortality rate estimator for biased skeletal samples.” Anthropological Science, 128(3), 113–117.
# Calculate Masculinity index and maternal mortality from Nitra # dataset. nitra_prep <- prep.life.table(nitra, group="sex", agebeg = "age_start", ageend = "age_end") nitra_life <- life.table(nitra_prep) lt.sexrelation(nitra_life$f, nitra_life$m)
# Calculate Masculinity index and maternal mortality from Nitra # dataset. nitra_prep <- prep.life.table(nitra, group="sex", agebeg = "age_start", ageend = "age_end") nitra_life <- life.table(nitra_prep) lt.sexrelation(nitra_life$f, nitra_life$m)
A data set from zaeuner_wahl_magdalenenberg_2013.
A data frame with 13 rows and 2 variables.
a: age range.
Dx: number of deceased.
Anthropological data from a large burial mound of the Early Iron Age in southwestern Germany. It is already pooled for constructing a life table.
Zaeuner S, Wahl J (2013). “Zur demographischen Struktur der Bestattungen im späthallstattzeitlichen Grabhügel vom Magdalenenberg.” Fundberichte aus Baden-Württemberg, 33, 133–145.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
muensingen
,
nitra
,
odagsen_cm
,
odagsen_mo
,
schleswig_ma
The mortaar_life_table is the central data structure of the
mortAAR
package. It's a data.frame with set of custom methods and
variables. Please see mortAAR::life.table
for a description
of the variables. Further available variables are ignored.
If an object is of class data.frame or tibble (tbl & tbl_df), it can be
converted to an object of class mortaar_life_table. The only requirement
is that it contains at least the essential columns a and Dx.
The as
function adds the string "mortaar_life_table" to the classes vector.
The mortaar_life_table_list is a list of mortaar_life_tables.
It can contain the additional attribute group
that stores a string with
the name of the grouping variable relevant for the separation of the
different mortaar_life_tables in the list. The group variable is only relevant
for plot and print aesthetics.
as.mortaar_life_table_list(x, ...) as.mortaar_life_table(x, ...)
as.mortaar_life_table_list(x, ...) as.mortaar_life_table(x, ...)
x |
an object |
... |
further arguments passed to or from other methods |
# a mortaar_life_table can be put together manually: as.mortaar_life_table(data.frame(a = c(20, 20, 20), Dx = c(10, 15, 20))) # a mortaar_life_table_list can be constructed from multiple mortaar_life_tables schleswig <- as.mortaar_life_table_list( list( "schleswig data 1" = life.table(schleswig_ma[c("a", "Dx")]), "schleswig data 2" = life.table(schleswig_ma[c("a", "Dx")]) ) ) # you can add new mortaar_life_tables to plot them with the others schleswig$`schleswig data 3` <- life.table(schleswig_ma[c("a", "Dx")]) schleswig[["schleswig data 4"]] <- life.table(schleswig_ma[c("a", "Dx")]) # and you can create arbitrary subsets of mortaar_life_table_lists schleswig_data_3 <- schleswig$`schleswig data 3` schleswig_data_1_3_4 <- schleswig[c(1,3,4)]
# a mortaar_life_table can be put together manually: as.mortaar_life_table(data.frame(a = c(20, 20, 20), Dx = c(10, 15, 20))) # a mortaar_life_table_list can be constructed from multiple mortaar_life_tables schleswig <- as.mortaar_life_table_list( list( "schleswig data 1" = life.table(schleswig_ma[c("a", "Dx")]), "schleswig data 2" = life.table(schleswig_ma[c("a", "Dx")]) ) ) # you can add new mortaar_life_tables to plot them with the others schleswig$`schleswig data 3` <- life.table(schleswig_ma[c("a", "Dx")]) schleswig[["schleswig data 4"]] <- life.table(schleswig_ma[c("a", "Dx")]) # and you can create arbitrary subsets of mortaar_life_table_lists schleswig_data_3 <- schleswig$`schleswig data 3` schleswig_data_1_3_4 <- schleswig[c(1,3,4)]
A data set from moghaddam_et_al_muensingen_2016.
A data frame with 71 rows and 4 variables.
age: age range of the individual.
sex: sex of the individual.
latene_phase: archaeological phasing.
grave_goods: did the grave contain grave goods?
Anthropological data from one of the largest Latene burial grounds of Central Europe. Besides age and sex of each individual, it comprises the archaeological phasing (A, B or C) and the information if the respective burial contained grave goods (yes or no).
Moghaddam N, Mueller F, Hafner A, Loesch S (2016). “Social stratigraphy in Late Iron Age Switzerland: stable carbon, nitrogen and sulphur isotope analysis of human remains from Münsingen.” Archaeological and Anthropological Sciences, 8, 149–160. https://link.springer.com/article/10.1007/s12520-014-0221-4.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
magdalenenberg
,
nitra
,
odagsen_cm
,
odagsen_mo
,
schleswig_ma
The Early Neolithic cemetery of Nitra is one of the best published data sets of the Linearbandkeramik (LBK). The individuals were analysed by J. Jelínek (published in Pavúk 1972) and many decades later also bei L. Fibiger (Bickle/Whittle 2013, 139ff. Tab. 4.15) and in more detail by Z. Tvrdý 2016. We follow here the determinations by L. Fibiger.
A data frame with 4 variables and 75 observations
no: individual
sex: sex determination if available
age_start: start of the ageing interval
age_end: end of the ageing interval (inclusive)
Pavúk J (1972). “Neolithisches Gräberfeld in Nitra.” Slovenská Arch., 22(1), 5–105.
Bickle P, Whittle AWR (eds.) (2013). The first farmers of central Europe: diversity in LBK lifeways. Oxbow Books, Oxford.
Tvrdý Z (2016). “Anthropology of the Neolithic population from Nitra-Horné Krškany (Slovakia).” Anthropologie (Brno), 54(3), 231–284.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
magdalenenberg
,
muensingen
,
odagsen_cm
,
odagsen_mo
,
schleswig_ma
A life table from Grupe/Herrmann 1986, 51.
A data frame with 11 rows and 9 variables.
age.group: inf.I, inf.II -> Infans I, II juv -> juvenil; fa, ma, sa -> früh-, mittel-, spätadult; fm, mm, sm -> früh-, mittel-, spätmatur; s -> senil
x
a
Dx
dx
lx
qx
Lx
ex
In contrast to the general convention Lx represents
the remaining survivors of each age interval ("Zahl der Lebenden
bezogen auf die theoretische Ausgangspopulation zwischen zwei
aufeinanderfolgenden Intervallen").
For further information about the values see the
documentation of life.table
.
The life table is compiled from the mandibulae of the late neolithic collective burial #' from Odagsen, Einbeck district Northeim (3.250 - 2.950 cal BC). The calculated values show minor adjustments in comparison to the published original data in Grupe/Herrmann 1986.
Grupe G, Herrmann B (1986). “Die Skelettreste aus dem neolithischen Kollektivgrab von Odagsen, Stadt Einbeck, Ldkr. Northeim.” Nachrichten aus Niedersachsens Urgeschichte, 55, 41–91.
Rinne C (2012). “Das Kollektivgrab Odagsen I.” Journal of Neolithic Archaeology. ISSN 2197-649X, doi:10.12766/jna.2002.52, http://www.jna.uni-kiel.de/index.php/jna/article/view/52.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
magdalenenberg
,
muensingen
,
nitra
,
odagsen_mo
,
schleswig_ma
A life table from Grupe/Herrmann 1986, 51.
A data frame with 11 rows and 9 variables.
age.group: inf.I, inf.II -> Infans I, II juv -> juvenil; fa, ma, sa -> früh-, mittel-, spätadult; fm, mm, sm -> früh-, mittel-, spätmatur; s -> senil
x
a
Dx
dx
lx
qx
Lx
ex
In contrast to the general convention Lx represents
the remaining survivors of each age interval ("Zahl der Lebenden
bezogen auf die theoretische Ausgangspopulation zwischen zwei
aufeinanderfolgenden Intervallen").
For further information about the values see the
documentation of life.table
.
The life table is compiled from the orbital margin of skulls from the late neolithic collective burial from Odagsen, Einbeck district Northeim (3.250 - 2.950 cal BC). More information can be found in Grupe/Herrmann 1986.
Grupe G, Herrmann B (1986). “Die Skelettreste aus dem neolithischen Kollektivgrab von Odagsen, Stadt Einbeck, Ldkr. Northeim.” Nachrichten aus Niedersachsens Urgeschichte, 55, 41–91.
Rinne C (2012). “Das Kollektivgrab Odagsen I.” Journal of Neolithic Archaeology. ISSN 2197-649X, doi:10.12766/jna.2002.52, http://www.jna.uni-kiel.de/index.php/jna/article/view/52.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
magdalenenberg
,
muensingen
,
nitra
,
odagsen_cm
,
schleswig_ma
Plot a mortaar_life_table or a mortaar_life_table_list. There are several different kinds of plots
to explore the different variables. The parameter display
allows to select the variables
of interest.
x |
a mortaar_life_table or a mortaar_life_table_list. |
display |
a character vector. Displays the calculated variables as plots. These must include
some of the alternatives |
line_vis |
optional string. Differentiate groups either by "linetype" or by "color". Default to "linetype". |
prefer.ggplot |
should ggplot be preferred, if available. Default to TRUE. |
... |
further arguments passed to or from other methods. |
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) plot(schleswig_1) plot(schleswig_1, display = "qx") # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) plot(odagsen) plot(odagsen, display = "lx", line_vis="color")
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) plot(schleswig_1) plot(schleswig_1, display = "qx") # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) plot(odagsen) plot(odagsen, display = "lx", line_vis="color")
In many instances, it is useful to calculate with a population with known parameters. To generate a population with realistic characteristics is less obvious than it seems. We operate here with the Gompertz distribution which provides a reasonable approximation of human mortality for adult mortality, that is for the ages >= 15 years. The user has to specify either the parameter b or the modal age M. The modal age M is particular useful as it provides an intuitive understanding of the resulting age distribution. In both instances, the second parameter a is generated by the regression formula found by Sasaki and Kondo 2016. If neither is given, a population with random parameters realistic for pre-modern times is generated.
pop.sim.gomp(n, b = NULL, M = NULL, start_age = 15, max_age = 100)
pop.sim.gomp(n, b = NULL, M = NULL, start_age = 15, max_age = 100)
n |
number of individuals to be simulated. |
b |
numeric, optional. Gompertz parameter controlling the level of mortality. |
M |
numeric, optional. Modal age M. |
start_age |
numeric. Start age, default: 15 years. |
max_age |
numeric. Maximal age, to avoid unlikely centenaries, default: 100 years. |
A list of two data.frames with the following items:
First data.frame
N: Number of individuals.
b: Gompertz parameter controlling mortality.
M: Modal age.
a: Gompertz parameter controlling hazard of the youngest age group.
Second data.frame
ind: ID of individuals.
age: Simulated absolute age.
Sasaki T, Kondo O (2016). “An informative prior probability distribution of the gompertz parameters for bayesian approaches in paleodemography.” American Journal of Physical Anthropology, 159(3), 523–533. doi:10.1002/ajpa.22891.
pop_sim <- pop.sim.gomp(n = 10000, M = 35) pop_sim <- pop.sim.gomp(n = 10000, b = 0.03) pop_sim <- pop.sim.gomp(n = 10000)
pop_sim <- pop.sim.gomp(n = 10000, M = 35) pop_sim <- pop.sim.gomp(n = 10000, b = 0.03) pop_sim <- pop.sim.gomp(n = 10000)
Prepares the input for life.table()
. An individual based approach is supported as well
as already pooled data (e. g. from an already existing life table). In the latter case, the user
has to specify a numerical variable (dec) which defines the count for each age class.
If no life table exists, this function will process a dataframe including the age ranges of
individuals or groups of individuals to discrete the age classes. The age range is spread to
single years. agebeg has to be specified for the beginning of an age range, as well
as ageend for the end of an age range. If a data-set with year-known individuals is
used, ageend can be omitted but then the parameter agerange has to left on its
default value (included
). The method defines in which way the single years between
the different age classes are split. If the data set comprises a grouping variable (e.g., sex),
this can be specified with group.
prep.life.table( x, dec = NA, agebeg, ageend = NA, group = NA, method = "Standard", agerange = "included" )
prep.life.table( x, dec = NA, agebeg, ageend = NA, group = NA, method = "Standard", agerange = "included" )
x |
single dataframe containing sex age and quantity of deceased (individuals or group of individuals). |
dec |
column name (as character) of the count of deceased, optional. |
agebeg |
column name (as character) for the beginning of an age range. |
ageend |
column name (as character) for the end of an age range, optional. |
group |
column name (as character) of the grouping field (e.g., sex),
optional. Default setup is: |
method |
character string, optional. Default options is |
agerange |
character string, optional. Default setup is: |
A list of input parameter needed for the function life.table
.
x or Age: age interval.
a: years within x.
Dx: number of deaths within x.
# Separate age ranges in your data set. df <- dplyr::mutate( tidyr::separate( replace( magdalenenberg, magdalenenberg=="60-x", "60-69" ), a, c("from", "to") ), from = as.numeric(from), to = as.numeric(to) ) # Apply prep.life.table to a data set containing the age ranges. magda_prep <- prep.life.table( df, dec = "Dx", agebeg = "from", ageend = "to", method = "Equal5", agerange = "included" ) # Create a life.table. life.table(magda_prep)
# Separate age ranges in your data set. df <- dplyr::mutate( tidyr::separate( replace( magdalenenberg, magdalenenberg=="60-x", "60-69" ), a, c("from", "to") ), from = as.numeric(from), to = as.numeric(to) ) # Apply prep.life.table to a data set containing the age ranges. magda_prep <- prep.life.table( df, dec = "Dx", agebeg = "from", ageend = "to", method = "Equal5", agerange = "included" ) # Create a life.table. life.table(magda_prep)
Format for pretty printing.
x |
a mortaar_life_table or a mortaar_life_table_list. |
class_of_deceased |
optional string, specify the class of deceased (male, female, phase, ...). |
... |
further arguments passed to or from other methods. |
A string representation of the mortaar_life_table or the mortaar_life_table_list. For format.mortaar_life_table_list each mortaar_life_table is formatted by itself and strung together. The names of the elements are used to specify the name in the returned header of the printout.
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) print(schleswig_1) # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) print(odagsen)
# Create a mortaar_life_table from a prepared dataset. schleswig_1 <- life.table(schleswig_ma[c("a", "Dx")]) print(schleswig_1) # Create a mortaar_life_table_list from two datasets. odagsen <- life.table(list( "corpus mandibulae" = odagsen_cm[c("a", "Dx")], "margo orbitalis" = odagsen_mo[c("a", "Dx")] )) print(odagsen)
Helper function that generates random age categories of absolute ages.
It is mainly used together with the functions pop.sim.gomp
and random.cat.apply
. It will run until the number of categories
are reached and there are no gaps in the sequence left.
Helper function that applies random age categories to "known" absolute ages.
It is mainly used together with the functions pop.sim.gomp
and random.cat
.
random.cat(n_cat = 20, min_age = 15, max_cat_low = 60, max_age = 74) random.cat.apply(x, age, age_ranges, from, to)
random.cat(n_cat = 20, min_age = 15, max_cat_low = 60, max_age = 74) random.cat.apply(x, age, age_ranges, from, to)
n_cat |
numeric. Number of categories, default: 20. |
min_age |
numeric. Minimum age, default: 15. |
max_cat_low |
numeric. Lower boundary of highest age categoriy, default: 60. |
max_age |
numeric. Maximum age, default: 74. |
x |
a data.frame with individual absolute ages. |
age |
the column containing the individual absolute ages. |
age_ranges |
a data.frame with age ranges. |
from |
numeric. Column name for the begin of an age range. |
to |
numeric. Column name for the end of an age range. |
One data.frame with the following items:
from: Lower boundary of age category.
to: Upper boundary of age category.
The original data.frame x
with two additional columns:
from: Lower boundary of age category.
to: Upper boundary of age category.
sim_ranges <- random.cat() # Simulate population and age ranges first pop_sim <- pop.sim.gomp(n = 10000) sim_ranges <- random.cat() # apply random age categories to simulated ages sim_appl <- random.cat.apply(pop_sim$result, age = "age", age_ranges = sim_ranges, from = "from", to = "to")
sim_ranges <- random.cat() # Simulate population and age ranges first pop_sim <- pop.sim.gomp(n = 10000) sim_ranges <- random.cat() # apply random age categories to simulated ages sim_appl <- random.cat.apply(pop_sim$result, age = "age", age_ranges = sim_ranges, from = "from", to = "to")
A life table from Herrmann et. al 1990, 305.
A data frame with 11 rows and 9 variables.
x: fa, ma, sa -> früh-, mittel-, spätadult; fm, mm, sm -> früh-, mittel-, spätmatur; s -> senil
a
Dx
dx
lx
qx
Lx
Tx
ex
For further information about the values see the
documentation of life.table
.
This lifetable is compiled from a medieval grave collection from Schleswig (11th-13th century). More information can be found in Grupe 1997.
Herrmann B, Grupe G, Hummel S, Piepenbrink H, Schutkowski H (1990). Praehistorische Anthropologie: Leitfaden der Feld- und Labormethoden. Springer, Berlin.
Grupe G (1997). “Die anthropologische Bearbeitung der Skelettreste von Schleswig, Ausgrabung Rathausmarkt. Rekonstruktion einer mittelalterlichen Bevoelkerung und ihrer Beziehungen.” In Kirche und Graeberfeld des 11.-13. Jahrhunderts unter dem Rathausmarkt von Schleswig, volume 12, 147–210. Wachholtz, Neumuenster.
Other lifetables:
aiterhofen_oedmuehlen
,
gallery_graves
,
magdalenenberg
,
muensingen
,
nitra
,
odagsen_cm
,
odagsen_mo