├── analysis ├── data │ └── input_data │ │ ├── research_area_shapefile │ │ ├── research_area.cpg │ │ ├── research_area.dbf │ │ ├── research_area.prj │ │ ├── research_area.shp │ │ ├── research_area.shx │ │ └── research_area.qpj │ │ ├── radonb_04.02.2019 │ │ └── radonb.RData │ │ └── natural_earth_geodata │ │ ├── lakes.RData │ │ ├── rivers.RData │ │ ├── countries.RData │ │ └── land_outline.RData └── code │ ├── create_directories.R │ ├── 02_cultural_distance_scripts │ ├── 01_prepare_sed_function.R │ ├── 05b_burial_type_mantel_test.R │ ├── 05a_burial_construction_mantel_test.R │ ├── 06_general_mantel_test_sed_burial_type_burial_construction.R │ ├── 07_partial_mantel_tests.R │ ├── 03b_burial_type_sed_create_matrizes.R │ ├── 03a_burial_construction_sed_create_matrizes.R │ ├── 02b_burial_type_sed.R │ ├── 02a_burial_construction_sed.R │ ├── 04b_burial_type_sed_vs_spatial_distance_create_data.R │ └── 04a_burial_construction_sed_vs_spatial_distance_create_data.R │ ├── run_all_scripts.R │ ├── 01_data_preparation_scripts │ ├── 03_define_regions_order_and_colors.R │ ├── 08_graves_per_year_and_region.R │ ├── 07_render_region_pictograms.R │ ├── 05_attribute_dates_and_graves_to_regions.R │ ├── 04_construct_circle_regions.R │ ├── 10_calculate_burial_rite_amount_regions_timeseries.R │ ├── 06_create_regions_spatial_distance_matrix.R │ ├── 01_prepare_spatial_data.R │ ├── 09_calculate_burial_rite_proportions_regions_timeseries.R │ └── 02_prepare_c14_data.R │ ├── helper_functions │ └── geom_grob.R │ ├── 03_dataset_description_scripts │ ├── observations_on_final_dataset.R │ ├── cultural_distance_overview_tables.R │ └── observations_during_data_preparation.R │ └── 04_plot_scripts │ ├── sed_region_matrix.R │ ├── development_burial_type.R │ ├── development_burial_construction.R │ ├── map.R │ └── correlation_time_series.R ├── bionote ├── clemens_schmid_bionote.JPG └── clemens_schmid_bionote.md ├── _run_analysis.sh ├── _render_article.sh ├── _copy_and_render.sh ├── article ├── preamble.tex ├── 07_Technical_Remarks.Rmd ├── index.Rmd ├── 05_Conclusion.Rmd ├── 01_Introduction.Rmd ├── 03_Results.Rmd ├── 06_Supplementary_Remarks.Rmd └── 04_Discussion.Rmd ├── _copy_files.sh ├── cultrans.bronzeageburials.article2019.Rproj ├── .gitignore ├── Dockerfile ├── review ├── proof_preparation_communication_2.md ├── review_2.md ├── review_1.md ├── answer_to_review_2.md ├── proof_preparation_communication_1.md └── answer_to_review_1.md ├── DESCRIPTION ├── README.md └── latex_template └── sagej.cls /analysis/data/input_data/research_area_shapefile/research_area.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /analysis/data/input_data/research_area_shapefile/research_area.dbf: -------------------------------------------------------------------------------- 1 | _A idN 2 | 1 -------------------------------------------------------------------------------- /bionote/clemens_schmid_bionote.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/bionote/clemens_schmid_bionote.JPG -------------------------------------------------------------------------------- /analysis/code/create_directories.R: -------------------------------------------------------------------------------- 1 | dir.create('analysis/figures') 2 | dir.create('analysis/data/tmp_data') 3 | dir.create('analysis/data/output_data') 4 | -------------------------------------------------------------------------------- /_run_analysis.sh: -------------------------------------------------------------------------------- 1 | # creation of the output directories 2 | Rscript analysis/code/create_directories.R 3 | 4 | # run analysis 5 | Rscript analysis/code/run_all_scripts.R 6 | -------------------------------------------------------------------------------- /_render_article.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env Rscript 2 | 3 | rmarkdown::render( 4 | "rendered_article/index.Rmd", 5 | output_dir = "rendered_article", 6 | output_file = "article.pdf" 7 | ) 8 | -------------------------------------------------------------------------------- /analysis/data/input_data/radonb_04.02.2019/radonb.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/radonb_04.02.2019/radonb.RData -------------------------------------------------------------------------------- /analysis/data/input_data/natural_earth_geodata/lakes.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/natural_earth_geodata/lakes.RData -------------------------------------------------------------------------------- /analysis/data/input_data/natural_earth_geodata/rivers.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/natural_earth_geodata/rivers.RData -------------------------------------------------------------------------------- /analysis/data/input_data/natural_earth_geodata/countries.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/natural_earth_geodata/countries.RData -------------------------------------------------------------------------------- /analysis/data/input_data/natural_earth_geodata/land_outline.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/natural_earth_geodata/land_outline.RData -------------------------------------------------------------------------------- /analysis/data/input_data/research_area_shapefile/research_area.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] -------------------------------------------------------------------------------- /analysis/data/input_data/research_area_shapefile/research_area.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/research_area_shapefile/research_area.shp -------------------------------------------------------------------------------- /analysis/data/input_data/research_area_shapefile/research_area.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nevrome/cultrans.bronzeageburials.article2019/master/analysis/data/input_data/research_area_shapefile/research_area.shx -------------------------------------------------------------------------------- /_copy_and_render.sh: -------------------------------------------------------------------------------- 1 | # create rendered article directory 2 | mkdir rendered_article 3 | 4 | # copy files to rendered_article directory 5 | ./_copy_files.sh 6 | 7 | # do the actual rendering 8 | ./_render_article.sh 9 | -------------------------------------------------------------------------------- /analysis/data/input_data/research_area_shapefile/research_area.qpj: -------------------------------------------------------------------------------- 1 | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] 2 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/01_prepare_sed_function.R: -------------------------------------------------------------------------------- 1 | #### helper function to calculate squared euclidian distance #### 2 | 3 | sed <- function(pi, pj) { 4 | pi <- pi / sum(pi) 5 | pj <- pj / sum(pj) 6 | sum((pi - pj)^2) 7 | } 8 | 9 | save(sed, file = "analysis/data/tmp_data/sed_function.RData") 10 | -------------------------------------------------------------------------------- /article/preamble.tex: -------------------------------------------------------------------------------- 1 | \usepackage{titlesec} 2 | \titlelabel{\thetitle.\quad} 3 | \setcounter{secnumdepth}{3} 4 | 5 | \usepackage{tabu} 6 | \usepackage{mathtools} 7 | 8 | \usepackage[utf8]{inputenc} 9 | 10 | \usepackage{draftwatermark} 11 | \SetWatermarkText{Preprint} 12 | \SetWatermarkScale{1} 13 | \SetWatermarkLightness{0.9} 14 | -------------------------------------------------------------------------------- /_copy_files.sh: -------------------------------------------------------------------------------- 1 | # markdown text files 2 | cp -r article/* rendered_article/ 3 | 4 | # latex template 5 | cp -r latex_template/* rendered_article/ 6 | 7 | # plots 8 | cp -r analysis/figures/* rendered_article/ 9 | 10 | # data for text and tables 11 | cp -r analysis/data/output_data/* rendered_article/ 12 | 13 | # bibliography 14 | cp references.bib rendered_article/ 15 | -------------------------------------------------------------------------------- /bionote/clemens_schmid_bionote.md: -------------------------------------------------------------------------------- 1 | Clemens Schmid M.A. is a graduate of Tübingen University and Kiel University (Germany). He is an early career researcher with a focus on computer applications in archaeology. Clemens is an avid R developer and a founding member of the Initiative for Statistical Analysis in Archaeology Kiel (ISAAK) working group. He's interested in quantitative analysis, modelling and simulation of (past) human behaviour. -------------------------------------------------------------------------------- /cultrans.bronzeageburials.article2019.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: No 4 | SaveWorkspace: No 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | AutoAppendNewline: Yes 16 | StripTrailingWhitespace: Yes 17 | 18 | BuildType: Custom 19 | CustomScriptPath: _copy_and_render.sh 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .RData 4 | .Ruserdata 5 | 6 | # latex auxiliary files (https://tex.stackexchange.com/questions/17845/which-auxiliary-latex-files-should-be-ignored-by-version-control-software/17852) 7 | # endfloat 8 | *.fff 9 | *.ttt 10 | 11 | # output data 12 | analysis/figures 13 | analysis/data/tmp_data 14 | analysis/data/output_data 15 | 16 | # rendered output 17 | rendered_article 18 | *.pdf 19 | *.html 20 | 21 | # rendering log files 22 | *.log 23 | -------------------------------------------------------------------------------- /analysis/code/run_all_scripts.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | purrr::walk( 4 | c( 5 | "analysis/code/01_data_preparation_scripts", 6 | "analysis/code/02_cultural_distance_scripts", 7 | "analysis/code/03_dataset_description_scripts", 8 | "analysis/code/04_plot_scripts" 9 | ), 10 | function(x) { 11 | purrr::walk( 12 | list.files(x, full.names = TRUE), 13 | function(y) { 14 | message("\n###### ", y, " ######\n") 15 | source(y) 16 | rm(list = ls()) 17 | } 18 | ) 19 | } 20 | ) 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rocker/tidyverse:3.6.0 2 | 3 | RUN apt-get --yes --force-yes update -qq 4 | RUN apt-get install --yes udunits-bin libproj-dev libgeos-dev libgdal-dev libgdal-dev libudunits2-dev 5 | 6 | WORKDIR "home/rstudio" 7 | 8 | COPY ./DESCRIPTION ./ 9 | 10 | RUN R -e "options(repos = list(CRAN = 'http://mran.revolutionanalytics.com/snapshot/2019-06-30/')); devtools::install('.', dep = TRUE)" 11 | 12 | COPY ./analysis/ ./analysis/ 13 | COPY ./_run_analysis.sh ./ 14 | 15 | RUN chmod +x ./_run_analysis.sh 16 | RUN ./_run_analysis.sh 17 | 18 | RUN find . -type d,f -exec chmod 777 {} \; 19 | -------------------------------------------------------------------------------- /review/proof_preparation_communication_2.md: -------------------------------------------------------------------------------- 1 | # Final corrections 2 | 3 | - The author affiliation in the bottom right corner of page 1 could be replaced. Instead of **Römisch-Germanisches Zentralmuseum, Leibniz-Forschungsinstitut für Archäologie, Mainz, Germany** it could be **Institute of Archaeological Sciences, University of Bern, Switzerland.**. Or is this covered with the Author’s Note at the end of the article on page 15? That's also fine. 4 | 5 | - Page 13, Column 2, Paragraph 2, Line 1: **Cultural complexity** should be written in lower case: **cultural complexity** 6 | 7 | - Caption of Figure 5: Superfluous space in **region -region**. Please change to **region-region**. 8 | 9 | - Page 15, Column 1, Paragraph 2, Line 10: Missing space in **Human14C**. Should be **Human 14C**. 10 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/03_define_regions_order_and_colors.R: -------------------------------------------------------------------------------- 1 | #### order of regions #### 2 | 3 | # inspired by geography: Southeast to Northwest 4 | region_order <- c( 5 | "Southeastern Central Europe", 6 | "Poland", 7 | "Southern Germany", 8 | "Northeastern France", 9 | "Northern Germany", 10 | "Southern Scandinavia", 11 | "Benelux", 12 | "England" 13 | ) 14 | 15 | save(region_order, file = "analysis/data/tmp_data/region_order.RData") 16 | 17 | 18 | 19 | #### color of regions #### 20 | 21 | region_colors <- c( 22 | "Southeastern Central Europe" = "#999999", 23 | "Poland" = "#ffe500", 24 | "Southern Germany" = "#56B4E9", 25 | "Northeastern France" = "#009E73", 26 | "Northern Germany" = "#000000", 27 | "Southern Scandinavia" = "#0072B2", 28 | "Benelux" = "#D55E00", 29 | "England" = "#CC79A7" 30 | ) 31 | 32 | save(region_colors, file = "analysis/data/tmp_data/region_colors.RData") 33 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/08_graves_per_year_and_region.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/graves_per_region.RData") 4 | 5 | 6 | 7 | #### unnest graves table #### 8 | 9 | # unnest calage_density_distribution to have per year information: 10 | # a diachron perspective 11 | graves_per_year_and_region <- graves_per_region %>% 12 | tidyr::unnest(calage_density_distribution) %>% 13 | dplyr::filter( 14 | two_sigma == TRUE 15 | ) %>% 16 | dplyr::filter( 17 | age >= -2200 & age <= -800 18 | ) %>% 19 | dplyr::arrange( 20 | desc(burial_construction) 21 | ) 22 | 23 | save(graves_per_year_and_region, file = "analysis/data/tmp_data/graves_per_year_and_region.RData") 24 | 25 | graves_per_year_and_region_list <- graves_per_year_and_region %>% base::split(.$region) 26 | save(graves_per_year_and_region_list, file = "analysis/data/tmp_data/graves_per_year_and_region_list.RData") 27 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/05b_burial_type_mantel_test.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/distance_matrix_spatial.RData") 4 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_type.RData") 5 | 6 | 7 | 8 | #### mantel test sed vs. spatial distance in 200-years time slots #### 9 | 10 | mantel_test_results <- lapply( 11 | 1:length(distance_matrizes_sed), function(i, x, y, a) { 12 | xi <- x[[i]] %>% as.dist() 13 | mantel_result <- ecodist::mantel(xi ~ y, nperm = 999, mrank = T) 14 | data.frame( 15 | time = a[[i]], 16 | statistic = mantel_result[["mantelr"]], 17 | signif = mantel_result[["pval1"]] 18 | ) 19 | }, 20 | x = distance_matrizes_sed, 21 | y = distance_matrix_spatial %>% as.dist(), 22 | a = names(distance_matrizes_sed) 23 | ) %>% 24 | do.call(rbind, .) 25 | 26 | save( 27 | mantel_test_results, 28 | file = "analysis/data/tmp_data/mantel_sed_spatial_burial_type.RData" 29 | ) 30 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: placeholder 2 | Type: Book 3 | Title: Does not matter. 4 | Version: 0.0.1 5 | Depends: R (>= 3.5.0) 6 | Imports: 7 | kableExtra (>= 0.9.0), 8 | knitr (>= 1.20), 9 | rticles (>= 0.6), 10 | magrittr (>= 1.50), 11 | Bchron (>= 4.3.0), 12 | broom (>= 0.5.0), 13 | c14bazAAR (>= 1.0.2), 14 | car (>= 3.0-0), 15 | cowplot (>= 0.9.3), 16 | devtools (>= 1.13.6), 17 | dplyr (>= 0.7.6), 18 | forcats (>= 0.3.0), 19 | GGally (>= 1.3.3), 20 | ggplot2 (>= 3.0.0), 21 | gridExtra (>= 2.3), 22 | pbapply (>= 1.3-4), 23 | plyr (>= 1.8.4), 24 | png (>= 0.1-7), 25 | pryr (>= 0.1.4), 26 | purrr (>= 0.2.5), 27 | raster (>= 2.6-7), 28 | readr (>= 1.1.1), 29 | rgdal (>= 1.3-4), 30 | rnaturalearth (>= 0.1.0), 31 | scales (>= 0.5.0), 32 | shadowtext (>= 0.0.4), 33 | sf (>= 0.6-3), 34 | stringr (>= 1.3.1), 35 | tibble (>= 1.4.2), 36 | tidyr (>= 0.8.1), 37 | ecodist (>= 2.0.1), 38 | txtstorage 39 | Remotes: github::nevrome/txtstorage 40 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/05a_burial_construction_mantel_test.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/distance_matrix_spatial.RData") 4 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_construction.RData") 5 | 6 | 7 | 8 | #### mantel test sed vs. spatial distance in 200-years time slots #### 9 | 10 | mantel_test_results <- lapply( 11 | 1:length(distance_matrizes_sed), function(i, x, y, a) { 12 | xi <- x[[i]] %>% as.dist() 13 | mantel_result <- ecodist::mantel(xi ~ y, nperm = 999, mrank = T) 14 | data.frame( 15 | time = a[[i]], 16 | statistic = mantel_result[["mantelr"]], 17 | signif = mantel_result[["pval1"]] 18 | ) 19 | }, 20 | x = distance_matrizes_sed, 21 | y = distance_matrix_spatial %>% as.dist(), 22 | a = names(distance_matrizes_sed) 23 | ) %>% 24 | do.call(rbind, .) 25 | 26 | save( 27 | mantel_test_results, 28 | file = "analysis/data/tmp_data/mantel_sed_spatial_burial_construction.RData" 29 | ) 30 | 31 | 32 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/06_general_mantel_test_sed_burial_type_burial_construction.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_type.RData") 4 | dms_burial_type <- distance_matrizes_sed 5 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_construction.RData") 6 | dms_burial_construction <- distance_matrizes_sed 7 | 8 | 9 | 10 | #### mantel test sed vs. sed in 200-years time slots #### 11 | 12 | mantel_test_results <- lapply( 13 | 1:length(dms_burial_type), function(i, x, y, a) { 14 | xi <- x[[i]] %>% as.dist() 15 | yi <- y[[i]] %>% as.dist() 16 | mantel_result <- ecodist::mantel(xi ~ yi , nperm = 999, mrank = F) 17 | data.frame( 18 | time = a[[i]], 19 | statistic = mantel_result[["mantelr"]], 20 | signif = mantel_result[["pval1"]] 21 | ) 22 | }, 23 | x = dms_burial_type, 24 | y = dms_burial_construction, 25 | a = names(dms_burial_type) 26 | ) %>% 27 | do.call(rbind, .) 28 | 29 | save( 30 | mantel_test_results, 31 | file = "analysis/data/tmp_data/mantel_sed_burial_type_burial_construction.RData" 32 | ) 33 | -------------------------------------------------------------------------------- /analysis/code/helper_functions/geom_grob.R: -------------------------------------------------------------------------------- 1 | #### custom geom to draw the raster maps in the timeseries plots #### 2 | 3 | library(ggplot2) 4 | library(tibble) 5 | library(gridExtra) 6 | library(grid) 7 | 8 | GeomCustom <- ggproto( 9 | "GeomCustom", 10 | Geom, 11 | setup_data = function(self, data, params) { 12 | data <- ggproto_parent(Geom, self)$setup_data(data, params) 13 | data 14 | }, 15 | 16 | draw_group = function(data, panel_scales, coord) { 17 | vp <- grid::viewport(x=data$x, y=data$y) 18 | g <- grid::editGrob(data$grob[[1]], vp=vp) 19 | ggplot2:::ggname("geom_custom", g) 20 | }, 21 | 22 | required_aes = c("grob","x","y") 23 | 24 | ) 25 | 26 | geom_custom <- function( 27 | mapping = NULL, 28 | data = NULL, 29 | stat = "identity", 30 | position = "identity", 31 | na.rm = FALSE, 32 | show.legend = NA, 33 | inherit.aes = FALSE, 34 | ... 35 | ) { 36 | layer( 37 | geom = GeomCustom, 38 | mapping = mapping, 39 | data = data, 40 | stat = stat, 41 | position = position, 42 | show.legend = show.legend, 43 | inherit.aes = inherit.aes, 44 | params = list(na.rm = na.rm, ...) 45 | ) 46 | } 47 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/07_partial_mantel_tests.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_type.RData") 4 | dms_burial_type <- distance_matrizes_sed 5 | load("analysis/data/tmp_data/distance_matrizes_sed_burial_construction.RData") 6 | dms_burial_construction <- distance_matrizes_sed 7 | load("analysis/data/tmp_data/distance_matrix_spatial.RData") 8 | dms_spatial <- distance_matrix_spatial 9 | 10 | #### partial mantel test with spatial distance correction #### 11 | 12 | # bt as dependent variable 13 | mantel_test_results <- lapply( 14 | 1:length(dms_burial_type), function(i, x, y, z, a) { 15 | xi <- x[[i]] %>% as.dist() 16 | yi <- y[[i]] %>% as.dist() 17 | mantel_result <- ecodist::mantel(xi ~ yi + z, nperm = 999, mrank = T) 18 | data.frame( 19 | time = a[[i]], 20 | statistic = mantel_result[["mantelr"]], 21 | signif = mantel_result[["pval1"]] 22 | ) 23 | }, 24 | x = dms_burial_type, 25 | y = dms_burial_construction, 26 | z = dms_spatial %>% as.dist(), 27 | a = names(dms_burial_type) 28 | ) %>% 29 | do.call(rbind, .) 30 | 31 | save( 32 | mantel_test_results, 33 | file = "analysis/data/tmp_data/mantel_sed_burial_type_burial_construction_spatial.RData" 34 | ) 35 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/07_render_region_pictograms.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/regions.RData") 4 | load("analysis/data/tmp_data/extended_area.RData") 5 | extended_area <- extended_area$geometry 6 | load("analysis/data/tmp_data/region_order.RData") 7 | load("analysis/data/tmp_data/region_colors.RData") 8 | 9 | 10 | 11 | #### plot loop #### 12 | 13 | path = "analysis/data/tmp_data/" 14 | 15 | for (i in 1:nrow(regions)) { 16 | 17 | one_region <- regions[regions$NAME == region_order[i], ] 18 | one_region_buffer <- one_region %>% 19 | sf::st_buffer(400000) 20 | 21 | one_region_geom <- one_region$geometry 22 | one_region_buffer_geom <- one_region_buffer$geometry 23 | 24 | one_region_name <- one_region$NAME %>% gsub(" ", "_", ., fixed = TRUE) 25 | 26 | png( 27 | filename = paste0(path, one_region_name, ".png"), 28 | width = 87*4, height = 100*4, units = "px", res = 300 29 | ) 30 | par(mar = c(0,0,0,0), 31 | pin = c(4,2), 32 | pty = "m", 33 | xaxs = "i", 34 | xaxt = 'n', 35 | xpd = FALSE, 36 | yaxs = "i", 37 | yaxt = 'n', 38 | bg = NA) 39 | plot(extended_area, border = NA , col = "grey85", lwd = 2) 40 | plot(one_region_buffer_geom, border = NA, col = scales::alpha(region_colors[i], 0.4), add = TRUE) 41 | plot(one_region_geom, border = NA, col = region_colors[i], add = TRUE) 42 | dev.off() 43 | 44 | } 45 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/03b_burial_type_sed_create_matrizes.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_type.RData") 4 | 5 | 6 | 7 | #### calculate region-region sed for 200-years time slots #### 8 | 9 | time_regions_grid <- regions_grid %>% dplyr::mutate( 10 | time = base::cut( 11 | time, 12 | seq(-2200, -800, 200), labels = paste(seq(-2200, -1000, 200), seq(-2000, -800, 200), sep = " - "), 13 | include.lowest = TRUE, 14 | right = FALSE) 15 | ) %>% 16 | dplyr::group_by( 17 | time, regionA, regionB 18 | ) %>% 19 | dplyr::summarise( 20 | mean_sed = mean(sed, na.rm = TRUE) 21 | ) %>% 22 | dplyr::ungroup() %>% 23 | dplyr::mutate( 24 | mean_sed = tidyr::replace_na(mean_sed, 0) 25 | ) 26 | 27 | save(time_regions_grid, file = "analysis/data/tmp_data/time_regions_grid_sed_burial_type.RData") 28 | 29 | 30 | 31 | #### create distance matrixes of all regions for 200-years time slots #### 32 | 33 | distance_matrizes_sed <- lapply( 34 | base::split(time_regions_grid, time_regions_grid$time), function(x){ 35 | x %>% 36 | dplyr::select( 37 | -time 38 | ) %>% 39 | tidyr::spread(regionA, mean_sed) %>% 40 | dplyr::select( 41 | -regionB 42 | ) %>% 43 | as.matrix() 44 | } 45 | ) 46 | 47 | save(distance_matrizes_sed, file = "analysis/data/tmp_data/distance_matrizes_sed_burial_type.RData") 48 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/03a_burial_construction_sed_create_matrizes.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_construction.RData") 4 | 5 | 6 | 7 | #### calculate region-region sed for 200-years time slots #### 8 | 9 | time_regions_grid <- regions_grid %>% dplyr::mutate( 10 | time = base::cut( 11 | time, 12 | seq(-2200, -800, 200), labels = paste(seq(-2200, -1000, 200), seq(-2000, -800, 200), sep = " - "), 13 | include.lowest = TRUE, 14 | right = FALSE) 15 | ) %>% 16 | dplyr::group_by( 17 | time, regionA, regionB 18 | ) %>% 19 | dplyr::summarise( 20 | mean_sed = mean(sed, na.rm = TRUE) 21 | ) %>% 22 | dplyr::ungroup() %>% 23 | dplyr::mutate( 24 | mean_sed = tidyr::replace_na(mean_sed, 0) 25 | ) 26 | 27 | save(time_regions_grid, file = "analysis/data/tmp_data/time_regions_grid_sed_burial_construction.RData") 28 | 29 | 30 | 31 | #### create distance matrixes of all regions for 200-years time slots #### 32 | 33 | distance_matrizes_sed <- lapply( 34 | base::split(time_regions_grid, time_regions_grid$time), function(x){ 35 | x %>% 36 | dplyr::select( 37 | -time 38 | ) %>% 39 | tidyr::spread(regionA, mean_sed) %>% 40 | dplyr::select( 41 | -regionB 42 | ) %>% 43 | as.matrix() 44 | } 45 | ) 46 | 47 | save(distance_matrizes_sed, file = "analysis/data/tmp_data/distance_matrizes_sed_burial_construction.RData") 48 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/02b_burial_type_sed.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/sed_function.RData") 4 | load("analysis/data/tmp_data/development_proportions_burial_type.RData") 5 | 6 | 7 | 8 | #### calculate yearwise region-region sed #### 9 | 10 | # preparation of proportion data 11 | prop <- proportion_development_burial_type 12 | long_prop <- prop %>% 13 | tidyr::spread( 14 | idea, proportion 15 | ) 16 | regions <- prop$region %>% unique() 17 | timesteps <- prop$timestep %>% unique() 18 | 19 | # regionA distribution vs. regionB distribution 20 | regions_grid <- 21 | expand.grid( 22 | regionA = regions, regionB = regions, time = timesteps, 23 | stringsAsFactors = FALSE 24 | ) %>% 25 | tibble::as_tibble() %>% 26 | dplyr::left_join( 27 | long_prop, 28 | by = c("regionA" = "region", "time" = "timestep") 29 | ) %>% 30 | dplyr::left_join( 31 | long_prop, 32 | by = c("regionB" = "region", "time" = "timestep"), 33 | suffix = c("_regionA", "_regionB") 34 | ) 35 | 36 | # calculate distance 37 | regions_grid <- regions_grid %>% 38 | dplyr::rowwise() %>% 39 | dplyr::mutate( 40 | sed = sed(c(cremation_regionA, inhumation_regionA), c(cremation_regionB, inhumation_regionB)) 41 | ) %>% 42 | dplyr::ungroup() %>% 43 | dplyr::select( 44 | regionA, regionB, time, sed 45 | ) 46 | 47 | save(regions_grid, file = "analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_type.RData") 48 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/02a_burial_construction_sed.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/sed_function.RData") 4 | load("analysis/data/tmp_data/development_proportions_burial_construction.RData") 5 | 6 | 7 | 8 | #### calculate yearwise region-region sed #### 9 | 10 | # preparation of proportion data 11 | prop <- proportion_development_burial_construction 12 | long_prop <- prop %>% 13 | tidyr::spread( 14 | idea, proportion 15 | ) 16 | regions <- prop$region %>% unique() 17 | timesteps <- prop$timestep %>% unique() 18 | 19 | # regionA distribution vs. regionB distribution 20 | regions_grid <- 21 | expand.grid( 22 | regionA = regions, regionB = regions, time = timesteps, 23 | stringsAsFactors = FALSE 24 | ) %>% 25 | tibble::as_tibble() %>% 26 | dplyr::left_join( 27 | long_prop, 28 | by = c("regionA" = "region", "time" = "timestep") 29 | ) %>% 30 | dplyr::left_join( 31 | long_prop, 32 | by = c("regionB" = "region", "time" = "timestep"), 33 | suffix = c("_regionA", "_regionB") 34 | ) 35 | 36 | # calculate distance 37 | regions_grid <- regions_grid %>% 38 | dplyr::rowwise() %>% 39 | dplyr::mutate( 40 | sed = sed(c(flat_regionA, mound_regionA), c(flat_regionB, mound_regionB)) 41 | ) %>% 42 | dplyr::ungroup() %>% 43 | dplyr::select( 44 | regionA, regionB, time, sed 45 | ) 46 | 47 | save(regions_grid, file = "analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_construction.RData") 48 | -------------------------------------------------------------------------------- /article/07_Technical_Remarks.Rmd: -------------------------------------------------------------------------------- 1 | # Technical Remarks 2 | 3 | ## Acknowledgements 4 | 5 | I would like to offer my special thanks to my supervisors PD Dr. Oliver Nakoinz (University of Kiel) and Dr. Martin Hinz (University of Bern) for developing this research idea with me and for ongoing support and advice before, while and after the creation of the master thesis this article is based on. I had helpful discussions at different stages of the research process with Dr. Jutta Kneisel, Dr. Christoph Rinne, Dr. Daniel Knitter, Dr. Nils Müller-Scheeßel and David Matzig, B.A. (all University of Kiel). Beyond these colleagues at Kiel University I am particularly grateful for the feedback, encouragement and literature recommendations by Prof. Dr. Ben Marwick (University of Washington) and the valuable C++ code review by Benny Baumann (Kiel). 6 | 7 | Finally I would like to thank Sergi Valverde (Pompeu Fabra University Barcelona) and Simon Carrignon (Barcelona Supercomputing Center) for the organisation of the session *Evolution of Cultural Complexity III* at the Conference on Complex Systems 2018 in Thessaloniki (Greece) where this paper was initially presented. 8 | 9 | ## Declaration of Conflicting Interests 10 | 11 | The author declared no potential conflicts of interest with respect to the research, authorship, and/or publication of this article. 12 | 13 | ## Funding 14 | 15 | This research received no specific grant from any funding agency in the public, commercial, or not-for-profit sectors, except for a 300Euro travel grant to attend the Conference on Complex Systems 2018 by the International Center of Kiel University. 16 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/05_attribute_dates_and_graves_to_regions.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/regions.RData") 4 | load("analysis/data/tmp_data/dates_prepared.RData") 5 | load("analysis/data/tmp_data/graves_prepared.RData") 6 | 7 | 8 | 9 | #### attribute dates to regions #### 10 | 11 | dates_prepared %<>% sf::st_as_sf(coords = c("lon", "lat")) 12 | sf::st_crs(dates_prepared) <- 4326 13 | dates_prepared %<>% sf::st_transform("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 14 | 15 | inter_regions_dates <- sf::st_intersection(dates_prepared, regions) 16 | 17 | dates_per_region <- inter_regions_dates %>% sf::st_set_geometry(NULL) %>% 18 | dplyr::mutate( 19 | region = NAME 20 | ) %>% 21 | dplyr::select( 22 | -id, -ID, -NAME 23 | ) 24 | 25 | save( 26 | dates_per_region, 27 | file = "analysis/data/tmp_data/dates_per_region.RData" 28 | ) 29 | 30 | 31 | 32 | #### attribute graves to regions #### 33 | 34 | graves_prepared %<>% sf::st_as_sf(coords = c("lon", "lat")) 35 | sf::st_crs(graves_prepared) <- 4326 36 | graves_prepared %<>% sf::st_transform("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 37 | 38 | inter_regions_graves <- sf::st_intersection(graves_prepared, regions) 39 | 40 | graves_per_region <- inter_regions_graves %>% sf::st_set_geometry(NULL) %>% 41 | dplyr::mutate( 42 | region = NAME 43 | ) %>% 44 | dplyr::select( 45 | -id, -ID, -NAME 46 | ) 47 | 48 | save( 49 | graves_per_region, 50 | file = "analysis/data/tmp_data/graves_per_region.RData" 51 | ) 52 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/04_construct_circle_regions.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/research_area.RData") 4 | load("analysis/data/tmp_data/area.RData") 5 | load("analysis/data/tmp_data/region_order.RData") 6 | 7 | 8 | 9 | #### construct region circles #### 10 | 11 | region_circles <- tibble::tibble( 12 | geometry = sf::st_make_grid(area, 400000, what = "centers", offset = c(-900000,-130000)), 13 | ID = 1:length(geometry) 14 | ) %>% sf::st_as_sf() 15 | region_circles <- sf::st_intersection(region_circles, research_area) 16 | region_circles %<>% sf::st_buffer(dist = 240000) 17 | 18 | 19 | 20 | #### select regions with enough graves #### 21 | 22 | load("analysis/data/tmp_data/graves_prepared.RData") 23 | graves_prepared %<>% sf::st_as_sf(coords = c("lon", "lat")) 24 | sf::st_crs(graves_prepared) <- 4326 25 | graves_prepared %<>% sf::st_transform("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 26 | 27 | inter_area <- sf::st_intersection(graves_prepared, research_area) %>% dplyr::select(-id) 28 | inter_regions <- sf::st_intersection(inter_area, region_circles) %>% dplyr::select(-id) 29 | 30 | number_of_graves_per_circle <- inter_regions %>% 31 | dplyr::group_by(ID) %>% 32 | dplyr::summarise( 33 | n = dplyr::n() 34 | ) 35 | 36 | regions_with_enough_graves <- number_of_graves_per_circle %>% 37 | dplyr::filter( 38 | n >= 60 39 | ) %$% 40 | ID 41 | 42 | 43 | 44 | #### give resulting regions a name and the correct order #### 45 | 46 | regions <- region_circles %>% 47 | dplyr::mutate( 48 | number_of_graves = number_of_graves_per_circle$n 49 | ) %>% 50 | dplyr::filter(ID %in% regions_with_enough_graves) 51 | 52 | regions$ID <- 1:nrow(regions) 53 | regions$NAME <- c( 54 | "Northeastern France", 55 | "Southern Germany", 56 | "Southeastern Central Europe", 57 | "England", "Benelux", 58 | "Northern Germany", 59 | "Poland", 60 | "Southern Scandinavia" 61 | ) 62 | regions$NAME <- factor(regions$NAME, levels = region_order) 63 | 64 | save(regions, file = "analysis/data/tmp_data/regions.RData") 65 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/10_calculate_burial_rite_amount_regions_timeseries.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/graves_per_year_and_region.RData") 4 | 5 | 6 | 7 | #### calculate per year, per region appearance of graves #### 8 | 9 | # burial type 10 | amount_development_burial_type_without_zero <- graves_per_year_and_region %>% 11 | dplyr::group_by(region, age, burial_type) %>% 12 | dplyr::rename( 13 | timestep = age, 14 | idea = burial_type 15 | ) %>% 16 | dplyr::tally() 17 | 18 | amount_development_burial_type <- amount_development_burial_type_without_zero %>% 19 | dplyr::right_join( 20 | expand.grid( 21 | region = unique(amount_development_burial_type_without_zero$region), 22 | idea = unique(amount_development_burial_type_without_zero$idea), 23 | timestep = -2200:-800, 24 | stringsAsFactors = FALSE 25 | ), 26 | by = c("region", "timestep", "idea") 27 | ) %>% 28 | dplyr::mutate( 29 | n = replace(n, is.na(n), 0) 30 | ) 31 | 32 | save( 33 | amount_development_burial_type, 34 | file = "analysis/data/tmp_data/development_amount_burial_type.RData" 35 | ) 36 | 37 | # burial construction 38 | amount_development_burial_construction_without_zero <- graves_per_year_and_region %>% 39 | dplyr::group_by(region, age, burial_construction) %>% 40 | dplyr::rename( 41 | timestep = age, 42 | idea = burial_construction 43 | ) %>% 44 | dplyr::tally() 45 | 46 | amount_development_burial_construction <- amount_development_burial_construction_without_zero%>% 47 | dplyr::right_join( 48 | expand.grid( 49 | region = unique(amount_development_burial_construction_without_zero$region), 50 | idea = unique(amount_development_burial_construction_without_zero$idea), 51 | timestep = -2200:-800, 52 | stringsAsFactors = FALSE 53 | ), 54 | by = c("region", "timestep", "idea") 55 | ) %>% 56 | dplyr::mutate( 57 | n = replace(n, is.na(n), 0) 58 | ) 59 | 60 | save( 61 | amount_development_burial_construction, 62 | file = "analysis/data/tmp_data/development_amount_burial_construction.RData" 63 | ) 64 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/04b_burial_type_sed_vs_spatial_distance_create_data.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_type.RData") 4 | load("analysis/data/tmp_data/distance_matrix_spatial_long.RData") 5 | load("analysis/data/tmp_data/region_order.RData") 6 | 7 | 8 | 9 | #### merge sed and spatial distance for 200-years time slots ### 10 | 11 | sed_long <- regions_grid %>% 12 | dplyr::mutate( 13 | regionA = as.character(regionA), 14 | regionB = as.character(regionB) 15 | ) 16 | 17 | distance_matrix_spatial_long %<>% 18 | dplyr::mutate( 19 | regionA = as.character(regionA), 20 | regionB = as.character(regionB) 21 | ) 22 | 23 | sed_long <- lapply( 24 | split(sed_long, f = sed_long$time), 25 | function(x) { 26 | mn <- pmin(x$regionA, x$regionB) 27 | mx <- pmax(x$regionA, x$regionB) 28 | int <- as.numeric(interaction(mn, mx)) 29 | x <- x[match(unique(int), int),] 30 | return(x) 31 | } 32 | ) %>% 33 | do.call(rbind, .) 34 | 35 | sed_spatial_distance <- sed_long %>% dplyr::left_join( 36 | distance_matrix_spatial_long, by = c("regionA", "regionB") 37 | ) %>% 38 | dplyr::filter( 39 | distance != 0 40 | ) %>% 41 | dplyr::mutate( 42 | relation = paste(regionA, "+", regionB), 43 | time = base::cut( 44 | time, 45 | seq(-2200, -800, 200), labels = paste(seq(-2200, -1000, 200), seq(-2000, -800, 200), sep = " - "), 46 | include.lowest = TRUE, 47 | right = FALSE) 48 | ) %>% 49 | dplyr::group_by( 50 | time, regionA, regionB, distance 51 | ) %>% 52 | dplyr::summarise( 53 | mean_sed = mean(sed, na.rm = TRUE) 54 | ) %>% 55 | dplyr::ungroup() %>% 56 | dplyr::filter( 57 | !is.na(mean_sed) 58 | ) 59 | 60 | regions_factorA <- as.factor(sed_spatial_distance$regionA) 61 | sed_spatial_distance$regionA <- factor(regions_factorA, levels = region_order) 62 | 63 | regions_factorB <- as.factor(sed_spatial_distance$regionB) 64 | sed_spatial_distance$regionB <- factor(regions_factorB, levels = region_order) 65 | 66 | save(sed_spatial_distance, file = "analysis/data/tmp_data/squared_euclidian_distance_over_timeblocks_burial_type.RData") 67 | -------------------------------------------------------------------------------- /analysis/code/02_cultural_distance_scripts/04a_burial_construction_sed_vs_spatial_distance_create_data.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_construction.RData") 4 | load("analysis/data/tmp_data/distance_matrix_spatial_long.RData") 5 | load("analysis/data/tmp_data/region_order.RData") 6 | 7 | 8 | 9 | #### merge sed and spatial distance for 200-years time slots ### 10 | 11 | sed_long <- regions_grid %>% 12 | dplyr::mutate( 13 | regionA = as.character(regionA), 14 | regionB = as.character(regionB) 15 | ) 16 | 17 | distance_matrix_spatial_long %<>% 18 | dplyr::mutate( 19 | regionA = as.character(regionA), 20 | regionB = as.character(regionB) 21 | ) 22 | 23 | sed_long <- lapply( 24 | split(sed_long, f = sed_long$time), 25 | function(x) { 26 | mn <- pmin(x$regionA, x$regionB) 27 | mx <- pmax(x$regionA, x$regionB) 28 | int <- as.numeric(interaction(mn, mx)) 29 | x <- x[match(unique(int), int),] 30 | return(x) 31 | } 32 | ) %>% 33 | do.call(rbind, .) 34 | 35 | sed_spatial_distance <- sed_long %>% dplyr::left_join( 36 | distance_matrix_spatial_long, by = c("regionA", "regionB") 37 | ) %>% 38 | dplyr::filter( 39 | distance != 0 40 | ) %>% 41 | dplyr::mutate( 42 | relation = paste(regionA, "+", regionB), 43 | time = base::cut( 44 | time, 45 | seq(-2200, -800, 200), labels = paste(seq(-2200, -1000, 200), seq(-2000, -800, 200), sep = " - "), 46 | include.lowest = TRUE, 47 | right = FALSE) 48 | ) %>% 49 | dplyr::group_by( 50 | time, regionA, regionB, distance 51 | ) %>% 52 | dplyr::summarise( 53 | mean_sed = mean(sed, na.rm = TRUE) 54 | ) %>% 55 | dplyr::ungroup() %>% 56 | dplyr::filter( 57 | !is.na(mean_sed) 58 | ) 59 | 60 | regions_factorA <- as.factor(sed_spatial_distance$regionA) 61 | sed_spatial_distance$regionA <- factor(regions_factorA, levels = region_order) 62 | 63 | regions_factorB <- as.factor(sed_spatial_distance$regionB) 64 | sed_spatial_distance$regionB <- factor(regions_factorB, levels = region_order) 65 | 66 | save(sed_spatial_distance, file = "analysis/data/tmp_data/squared_euclidian_distance_over_timeblocks_burial_construction.RData") 67 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/06_create_regions_spatial_distance_matrix.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/regions.RData") 4 | load("analysis/data/tmp_data/region_order.RData") 5 | 6 | 7 | 8 | #### establish spatial distance information in tall format #### 9 | 10 | # find region centers 11 | region_centers <- regions %>% 12 | sf::st_centroid() 13 | 14 | distance_matrix_spatial_long <- region_centers %>% 15 | # calculate distance matrix 16 | sf::st_distance() %>% 17 | # normalize distance matrix 18 | magrittr::divide_by(min(.[. != min(.)])) %>% 19 | as.matrix() %>% 20 | tibble::as_tibble() %>% 21 | # set correct names 22 | magrittr::set_colnames(region_centers$NAME) %>% 23 | dplyr::mutate(regionA = region_centers$NAME) %>% 24 | # wide matrix to tall data.frame 25 | tidyr::gather(key = regionB, value = distance, -regionA) %>% 26 | dplyr::mutate( 27 | regionB = factor(regionB, levels = region_order), 28 | distance = as.double(distance) 29 | ) %>% 30 | # creation of distance classes 31 | dplyr::mutate( 32 | distance = base::cut( 33 | distance, 34 | seq(0, 4, 0.4), paste(seq(0, 3.6, 0.4), seq(0.4, 4.0, 0.4), sep = "-"), 35 | include.lowest = TRUE, 36 | right = FALSE) 37 | ) %>% 38 | # rename actually relevant classes 39 | dplyr::mutate( 40 | distance = dplyr::case_when( 41 | distance == "0-0.4" ~ 0, 42 | distance == "0.8-1.2" ~ 1, 43 | distance == "1.2-1.6" ~ 2, 44 | distance == "2-2.4" ~ 3, 45 | distance == "2.8-3.2" ~ 4 46 | ) 47 | ) 48 | 49 | save(distance_matrix_spatial_long, file = "analysis/data/tmp_data/distance_matrix_spatial_long.RData") 50 | 51 | 52 | 53 | #### remove duplicates from distance matrix #### 54 | 55 | mn <- pmin(as.character(distance_matrix_spatial_long$regionA), as.character(distance_matrix_spatial_long$regionB)) 56 | mx <- pmax(as.character(distance_matrix_spatial_long$regionA), as.character(distance_matrix_spatial_long$regionB)) 57 | int <- as.numeric(interaction(mn, mx)) 58 | distance_matrix_spatial_long_half <- distance_matrix_spatial_long[match(unique(int), int),] 59 | 60 | save(distance_matrix_spatial_long_half, file = "analysis/data/tmp_data/distance_matrix_spatial_long_half.RData") 61 | 62 | 63 | 64 | #### transform distance information to wide format #### 65 | 66 | distance_matrix_spatial <- distance_matrix_spatial_long %>% 67 | tidyr::spread(regionA, distance) %>% 68 | dplyr::select( 69 | -regionB 70 | ) %>% 71 | as.matrix() 72 | 73 | save(distance_matrix_spatial, file = "analysis/data/tmp_data/distance_matrix_spatial.RData") 74 | -------------------------------------------------------------------------------- /analysis/code/03_dataset_description_scripts/observations_on_final_dataset.R: -------------------------------------------------------------------------------- 1 | storage_file <- "analysis/data/output_data/sf_desc.txt" 2 | 3 | 4 | 5 | #### total number of graves #### 6 | 7 | load("analysis/data/tmp_data/graves_per_region.RData") 8 | gpr <- graves_per_region 9 | 10 | txtstorage::store("gpr size", nrow(gpr), storage_file) 11 | 12 | 13 | 14 | #### number of graves per regions #### 15 | 16 | load("analysis/data/tmp_data/graves_per_region.RData") 17 | 18 | regions_graves_amounts <- graves_per_region %>% 19 | dplyr::group_by( 20 | region 21 | ) %>% 22 | dplyr::summarise( 23 | n = dplyr::n() 24 | ) %$% 25 | paste(paste0("**", region, "**"), paste0("(", n, ")"), collapse = ", ", sep = " ") 26 | 27 | txtstorage::store("regions graves amounts", regions_graves_amounts, storage_file) 28 | 29 | gprcrosstab_top <- gpr %>% 30 | dplyr::group_by( 31 | region, burial_type, burial_construction 32 | ) %>% 33 | dplyr::summarise( 34 | n = dplyr::n() 35 | ) %>% 36 | dplyr::ungroup() %>% 37 | tidyr::spread( 38 | key = burial_construction, value = n, fill = 0 39 | ) 40 | 41 | gprcrosstab_sum <- gpr %>% 42 | dplyr::group_by( 43 | burial_type, burial_construction 44 | ) %>% 45 | dplyr::summarise( 46 | n = dplyr::n() 47 | ) %>% 48 | dplyr::ungroup() %>% 49 | tidyr::spread( 50 | key = burial_construction, value = n, fill = 0 51 | ) %>% 52 | dplyr::mutate( 53 | region = "Total" 54 | ) 55 | 56 | gprcrosstab <- rbind(gprcrosstab_top, gprcrosstab_sum) 57 | 58 | save( 59 | gprcrosstab, 60 | file = "analysis/data/output_data/gprcrosstab.RData" 61 | ) 62 | 63 | 64 | 65 | #### dates analysis #### 66 | 67 | load("analysis/data/tmp_data/dates_per_region.RData") 68 | dpr <- dates_per_region 69 | 70 | txtstorage::store("dpr size", nrow(dpr), storage_file) 71 | 72 | txtstorage::store( 73 | c( 74 | "dpr sites amount", 75 | "dpr period amount", 76 | "dpr culture amount" 77 | ), 78 | c( 79 | dpr$site %>% unique %>% length(), 80 | dpr$period %>% unique %>% length(), 81 | dpr$culture %>% unique %>% length() 82 | ), 83 | storage_file 84 | ) 85 | 86 | material <- dpr$material %>% table(useNA = "always") %>% as.data.frame() 87 | 88 | txtstorage::store( 89 | c( 90 | "dpr material bone amount", 91 | "dpr material cremated bones amount", 92 | "dpr material charcoal wood amount", 93 | "dpr material other amount", 94 | "dpr material unknown amount" 95 | ), 96 | c( 97 | material$Freq[material$. %in% c("collagen, bone", "cremated bones", "dentin")] %>% sum, 98 | material$Freq[material$. %in% c("cremated bones")], 99 | material$Freq[material$. %in% c("bark", "charcoal", "wood")] %>% sum, 100 | material$Freq[!material$. %in% c("collagen, bone", "cremated bones", "dentin", "bark", "charcoal", "wood") & !is.na(material$.)] %>% sum, 101 | material$Freq[is.na(material$.)] 102 | ), 103 | storage_file 104 | ) 105 | 106 | dpr$species %>% table(useNA = "always") 107 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/01_prepare_spatial_data.R: -------------------------------------------------------------------------------- 1 | #### natural earth data #### 2 | 3 | # land_outline 4 | # land_outline <- rnaturalearth::ne_download( 5 | # scale = 50, type = 'land', category = 'physical' 6 | # ) %>% sf::st_as_sf() 7 | # save(land_outline, file = "analysis/data/input_data/natural_earth_geodata/land_outline.RData") 8 | load("analysis/data/input_data/natural_earth_geodata/land_outline.RData") 9 | save(land_outline, file = "analysis/data/tmp_data/land_outline.RData") 10 | 11 | # countries 12 | # countries <- rnaturalearth::ne_download( 13 | # scale = 50, type = 'countries', category = 'cultural' 14 | # ) %>% sf::st_as_sf() 15 | # save(countries, file = "analysis/data/input_data/natural_earth_geodata/countries.RData") 16 | load("analysis/data/input_data/natural_earth_geodata/countries.RData") 17 | save(countries, file = "analysis/data/tmp_data/countries.RData") 18 | 19 | # rivers 20 | # rivers <- rnaturalearth::ne_download( 21 | # scale = 50, type = 'rivers_lake_centerlines', category = 'physical' 22 | # ) %>% sf::st_as_sf() 23 | # save(rivers, file = "analysis/data/input_data/natural_earth_geodata/rivers.RData") 24 | load("analysis/data/input_data/natural_earth_geodata/rivers.RData") 25 | save(rivers, file = "analysis/data/tmp_data/rivers.RData") 26 | 27 | # lakes 28 | # lakes <- rnaturalearth::ne_download( 29 | # scale = 50, type = 'lakes', category = 'physical' 30 | # ) %>% sf::st_as_sf() 31 | # save(lakes, file = "analysis/data/input_data/natural_earth_geodata/lakes.RData") 32 | load("analysis/data/input_data/natural_earth_geodata/lakes.RData") 33 | save(lakes, file = "analysis/data/tmp_data/lakes.RData") 34 | 35 | 36 | 37 | #### research area #### 38 | 39 | # load manually crafted research area shape file, transform it to 40 | # EPSG:102013 and store the result 41 | research_area <- sf::st_read( 42 | "analysis/data/input_data/research_area_shapefile/research_area.shp", quiet = TRUE 43 | ) %>% 44 | sf::st_transform( 45 | "+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs" 46 | ) 47 | save(research_area, file = "analysis/data/tmp_data/research_area.RData") 48 | 49 | 50 | 51 | #### area #### 52 | 53 | # load natural earth data land outline shape, crop it approximately to 54 | # Europe, transform it to EPSG:102013, crop it to the research area and store the result 55 | land_outline_small <- land_outline %>% 56 | sf::st_crop(xmin = -20, ymin = 35, xmax = 35, ymax = 65) %>% 57 | sf::st_transform( 58 | "+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs" 59 | ) 60 | area <- sf::st_intersection(sf::st_buffer(land_outline_small, 0), research_area) 61 | save(area, file = "analysis/data/tmp_data/area.RData") 62 | 63 | 64 | 65 | #### extended area #### 66 | 67 | # crop land outline to bbox of research area 68 | extended_research_area <- sf::st_bbox(research_area) %>% sf::st_as_sfc() 69 | extended_area <- sf::st_intersection(sf::st_buffer(land_outline_small, 0), extended_research_area) 70 | save(extended_area, file = "analysis/data/tmp_data/extended_area.RData") 71 | -------------------------------------------------------------------------------- /article/index.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and North-western Europe using radiocarbon data 3 | runninghead: Schmid. 4 | author: 5 | - name: Clemens Schmid 6 | num: 1 7 | address: 8 | - num: 1 9 | org: Römisch-Germanisches Zentralmuseum, Leibniz-Forschungsinstitut für Archäologie, Mainz, Germany 10 | corrauth: Clemens Schmid, Römisch-Germanisches Zentralmuseum, Leibniz-Forschungsinstitut für Archäologie, D - 55116 Mainz. 11 | email: clemens@nevrome.de 12 | abstract: European Bronze Age archaeology traditionally focusses on two major dimensions to categorise burials -- although there is an immense variability of attendant phenomena within this spectrum -- flat graves versus burial mounds and cremation versus inhumation. These traits are an indispensable ingredient for common archaeological narratives of sociocultural interaction and cultural evolution. This paper presents a quantitative reconstruction of the general trends in the distribution of Bronze Age burial traditions based on bulk radiocarbon data and employs the resulting time series for the estimation of macro-regional cultural distance. Despite the relatively small amount of input data the trend reconstruction fits to established archaeological observations for prehistoric Europe. The comparison of cultural and spatial distance leads to the remarkable result of no significant permanent correlation, which indicates that the spread of the relevant aspects of burial traditions can not be explained with simple diffusion models. Instead a more complex process of cultural transmission has to be considered. 13 | keywords: Bronze Age, Burial Traditions, Cultural Transmission, Radiocarbon Dating 14 | classoption: 15 | - Afour 16 | - times 17 | bibliography: references.bib 18 | bibliographystyle: apalike 19 | output: 20 | rticles::sage_article: 21 | keep_tex: yes 22 | includes: 23 | in_header: preamble.tex 24 | --- 25 | 26 | ```{r echo=FALSE} 27 | library(magrittr) 28 | 29 | # allow easy dynamic value integration 30 | sf_prep <- "sf_prep.txt" 31 | sf_desc <- "sf_desc.txt" 32 | r <- txtstorage::read 33 | a <- function(x) {r("regions graves amounts", sf_desc) %>% strsplit(", ") %>% unlist %>% magrittr::extract(grepl(x, .))} 34 | ``` 35 | 36 | This is a preprint: the version of the paper that was accepted for publication. Please see the following reference for the final, published version: 37 | 38 | Schmid, C. (2019). Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and Northwestern Europe using radiocarbon data. Adaptive Behavior. https://doi.org/10.1177/1059712319860842 39 | 40 | Please note that the numerical results of the Mantel statistics are not exactly the same here compared to the final, published version. The Mantel test is a nondeterministic algorithm. 41 | 42 | ```{r child = '01_Introduction.Rmd'} 43 | ``` 44 | 45 | ```{r child = '02_Materials_and_Methods.Rmd'} 46 | ``` 47 | 48 | ```{r child = '03_Results.Rmd'} 49 | ``` 50 | 51 | ```{r child = '04_Discussion.Rmd'} 52 | ``` 53 | 54 | ```{r child = '05_Conclusion.Rmd'} 55 | ``` 56 | 57 | ```{r child = '06_Supplementary_Remarks.Rmd'} 58 | ``` 59 | 60 | ```{r child = '07_Technical_Remarks.Rmd'} 61 | ``` 62 | -------------------------------------------------------------------------------- /analysis/code/03_dataset_description_scripts/cultural_distance_overview_tables.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | #### burial_construction & spatial distance: sed - spatial distance #### 4 | 5 | load("analysis/data/tmp_data/mantel_sed_spatial_burial_construction.RData") 6 | load("analysis/data/tmp_data/squared_euclidian_distance_over_timeblocks_burial_construction.RData") 7 | burial_construction_distance <- sed_spatial_distance %>% dplyr::mutate(context = "burial_construction") 8 | burial_construction_mantel <- mantel_test_results 9 | names(burial_construction_mantel)[2:3] <- c("bc-sp: Correlation coefficient", "bc-sp: p-Value") 10 | 11 | 12 | 13 | #### burial_type & spatial distance: sed - spatial distance #### 14 | 15 | load("analysis/data/tmp_data/mantel_sed_spatial_burial_type.RData") 16 | load("analysis/data/tmp_data/squared_euclidian_distance_over_timeblocks_burial_type.RData") 17 | burial_type_distance <- sed_spatial_distance %>% dplyr::mutate(context = "burial_type") 18 | burial_type_mantel <- mantel_test_results 19 | names(burial_type_mantel)[2:3] <- c("bt-sp: Correlation coefficient", "bt-sp: p-Value") 20 | 21 | 22 | 23 | #### distance_and_correlation_table_A #### 24 | 25 | distance_and_correlation_table_A <- rbind( 26 | burial_type_distance, 27 | burial_construction_distance 28 | ) %>% 29 | tidyr::spread(context, mean_sed) %>% 30 | dplyr::select(-regionA, -regionB) %>% 31 | dplyr::group_by(time) %>% 32 | dplyr::summarise( 33 | `bc: Mean distance` = mean(burial_construction, na.rm = TRUE), 34 | `bt: Mean distance` = mean(burial_type, na.rm = TRUE) 35 | ) %>% 36 | dplyr::left_join( 37 | burial_construction_mantel, 38 | by = "time" 39 | ) %>% 40 | dplyr::left_join( 41 | burial_type_mantel, 42 | by = "time" 43 | ) %>% 44 | dplyr::select( 45 | 1,3,6,7,2,4,5 46 | ) %>% 47 | dplyr::mutate_if( 48 | is.numeric, 49 | round, 50 | 3 51 | ) 52 | 53 | # hacky class manipulation: time without sign of years 54 | distance_and_correlation_table_A$time <- factor( 55 | gsub("-(?=[0-9])", "", distance_and_correlation_table_A$time, perl = TRUE), 56 | levels = gsub("-(?=[0-9])", "", levels(distance_and_correlation_table_A$time), perl = TRUE) 57 | ) 58 | 59 | colnames(distance_and_correlation_table_A)[1] <- "Time steps in years calBC" 60 | 61 | save(distance_and_correlation_table_A, file = "analysis/data/output_data/distance_and_correlation_table_A.RData") 62 | 63 | 64 | 65 | #### burial_construction & burial_type: sed - sed #### 66 | 67 | load("analysis/data/tmp_data/mantel_sed_burial_type_burial_construction.RData") 68 | burial_type_burial_construction_mantel <- mantel_test_results 69 | names(burial_type_burial_construction_mantel)[2:3] <- c("bt-bc: Correlation coefficient", "bt-bc: p-Value") 70 | 71 | 72 | 73 | #### burial_construction & burial_type + spatial distance: sed - sed - spatial distance #### 74 | 75 | load("analysis/data/tmp_data/mantel_sed_burial_type_burial_construction_spatial.RData") 76 | burial_type_burial_construction_spatial_mantel <- mantel_test_results 77 | names(burial_type_burial_construction_spatial_mantel)[2:3] <- c("bt-bc+sp: Correlation coefficient", "bt-bc+sp: p-Value") 78 | 79 | 80 | #### distance_and_correlation_table_B #### 81 | 82 | distance_and_correlation_table_B <- burial_type_burial_construction_mantel %>% 83 | dplyr::left_join( 84 | burial_type_burial_construction_spatial_mantel, 85 | by = "time" 86 | ) %>% 87 | dplyr::mutate_if( 88 | is.numeric, 89 | round, 90 | 3 91 | ) 92 | 93 | # hacky class manipulation: time without sign of years 94 | distance_and_correlation_table_B$time <- factor( 95 | gsub("-(?=[0-9])", "", distance_and_correlation_table_B$time, perl = TRUE), 96 | levels = gsub("-(?=[0-9])", "", levels(distance_and_correlation_table_B$time), perl = TRUE) 97 | ) 98 | 99 | colnames(distance_and_correlation_table_B)[1] <- "Time steps in years calBC" 100 | 101 | save(distance_and_correlation_table_B, file = "analysis/data/output_data/distance_and_correlation_table_B.RData") 102 | -------------------------------------------------------------------------------- /analysis/code/03_dataset_description_scripts/observations_during_data_preparation.R: -------------------------------------------------------------------------------- 1 | storage_file <- "analysis/data/output_data/sf_prep.txt" 2 | 3 | 4 | 5 | #### early subsets #### 6 | 7 | load("analysis/data/tmp_data/radonb.RData") 8 | txtstorage::store("size radonb", nrow(radonb), storage_file) 9 | rm(radonb) 10 | 11 | load("analysis/data/tmp_data/dates_calibrated.RData") 12 | txtstorage::store("size dates_calibrated", nrow(dates_calibrated), storage_file) 13 | rm(dates_calibrated) 14 | 15 | load("analysis/data/tmp_data/dates_time_selection.RData") 16 | txtstorage::store("size dates_time_selection", nrow(dates_time_selection), storage_file) 17 | rm(dates_time_selection) 18 | 19 | load("analysis/data/tmp_data/dates_research_selection.RData") 20 | txtstorage::store("size dates_research_selection", nrow(dates_research_selection), storage_file) 21 | txtstorage::store("dates_research_selection variable amount", ncol(dates_research_selection), storage_file) 22 | rm(dates_research_selection) 23 | 24 | load("analysis/data/tmp_data/dates_coordinates.RData") 25 | txtstorage::store("size dates_coordinates", nrow(dates_coordinates), storage_file) 26 | txtstorage::store("dates_coordinates variable amount", ncol(dates_coordinates), storage_file) 27 | rm(dates_coordinates) 28 | 29 | 30 | 31 | #### dates_research_area #### 32 | 33 | load("analysis/data/tmp_data/dates_research_area.RData") 34 | 35 | # size 36 | txtstorage::store("size dates_research_area", nrow(dates_research_area), storage_file) 37 | 38 | # count indiviual labnrs 39 | labnrs_amount <- dates_research_area$labnr %>% unique() %>% length() 40 | txtstorage::store("dates_research_area labnrs amount", labnrs_amount, storage_file) 41 | 42 | # count labnr duplicates without n/a labnrs 43 | labnr_doubles <- dates_research_area[!grepl('n/a', dates_research_area$labnr), ] %>% 44 | dplyr::group_by(labnr) %>% 45 | dplyr::filter(dplyr::n() > 1) %>% 46 | nrow() 47 | txtstorage::store("dates_research_area labnr doubles", labnr_doubles, storage_file) 48 | 49 | # count graves represented by multiple c14 dates 50 | multi_dates_one_grave <- dates_research_area %>% 51 | dplyr::group_by(site, feature) %>% 52 | dplyr::filter(dplyr::n() > 1) %>% 53 | nrow() 54 | txtstorage::store("dates_research_area multi dates one grave", multi_dates_one_grave, storage_file) 55 | 56 | dates_research_area_burial_type_doubles <- dates_research_area %>% 57 | dplyr::group_by(site, feature) %>% 58 | dplyr::filter(dplyr::n() > 1) %>% 59 | dplyr::ungroup() %$% 60 | burial_type %>% table %>% 61 | unclass %>% 62 | paste(names(.), ., collapse = ", ", sep = ": ") 63 | txtstorage::store("dates_research_area burial_type doubles", dates_research_area_burial_type_doubles, storage_file) 64 | 65 | dates_research_area_burial_construction_doubles <- dates_research_area %>% 66 | dplyr::group_by(site, feature) %>% 67 | dplyr::filter(dplyr::n() > 1) %>% 68 | dplyr::ungroup() %$% 69 | burial_construction %>% table %>% 70 | unclass %>% 71 | paste(names(.), ., collapse = ", ", sep = ": ") 72 | txtstorage::store("dates_research_area burial_construction doubles", dates_research_area_burial_construction_doubles, storage_file) 73 | 74 | rm(dates_research_area) 75 | 76 | 77 | 78 | #### dates_prepared #### 79 | 80 | load("analysis/data/tmp_data/dates_prepared.RData") 81 | 82 | # size 83 | txtstorage::store("size dates_prepared", nrow(dates_prepared), storage_file) 84 | 85 | # count dates per feature - get max 86 | max_dates_per_grave <- dates_prepared[grepl("[0-9]", dates_prepared$feature), ] %>% 87 | dplyr::group_by(site, feature) %>% 88 | dplyr::summarise(n = dplyr::n()) %>% 89 | dplyr::ungroup() %$% 90 | max(n) 91 | txtstorage::store("dates_prepared max dates per grave", max_dates_per_grave, storage_file) 92 | 93 | multi_dates_one_grave <- dates_prepared %>% 94 | dplyr::group_by(site, feature) %>% 95 | dplyr::filter(dplyr::n() > 1) 96 | txtstorage::store("dates_prepared multi dates one grave", nrow(multi_dates_one_grave), storage_file) 97 | 98 | with_numbers_in_feature <- multi_dates_one_grave[grepl("[0-9]", multi_dates_one_grave$feature), ] 99 | txtstorage::store("dates_prepared multi dates one grave with numbers", nrow(with_numbers_in_feature), storage_file) 100 | 101 | rm(dates_prepared) 102 | 103 | 104 | 105 | #### graves_prepared #### 106 | 107 | load("analysis/data/tmp_data/graves_prepared.RData") 108 | txtstorage::store("size graves_prepared", nrow(graves_prepared), storage_file) 109 | -------------------------------------------------------------------------------- /analysis/code/04_plot_scripts/sed_region_matrix.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(magrittr) 3 | library(GGally) 4 | 5 | #### load data #### 6 | 7 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_construction.RData") 8 | regions_grid_burial_construction <- regions_grid 9 | regions_grid_burial_construction$variable <- "burial_construction" 10 | load("analysis/data/tmp_data/squared_euclidian_distance_over_time_burial_type.RData") 11 | regions_grid_burial_type <- regions_grid 12 | regions_grid_burial_type$variable <- "burial_type" 13 | load("analysis/data/tmp_data/region_colors.RData") 14 | load("analysis/data/tmp_data/region_order.RData") 15 | 16 | regions_grid <- rbind(regions_grid_burial_construction, regions_grid_burial_type) 17 | 18 | # only for plot: time without sign of years 19 | regions_grid <- regions_grid %>% 20 | dplyr::mutate( 21 | time = time * (-1) 22 | ) 23 | 24 | 25 | 26 | #### manual construction of plots for plot matrix #### 27 | 28 | plot_list <- list() 29 | combinations <- c() 30 | iter <- 1 31 | for (row_region in region_order) { 32 | for (col_region in region_order) { 33 | 34 | if (row_region == col_region) { 35 | plot_list[[iter]] <- ggplot() + 36 | ylim(0,2) + 37 | scale_x_reverse( 38 | breaks = c(2000, 1500, 1000), 39 | limits = c(2200, 800) 40 | ) 41 | } else { 42 | 43 | second_run <- paste(row_region, col_region, sep = ".") %in% combinations 44 | combinations[[iter]] <- paste(col_region, row_region, sep = ".") 45 | 46 | if (!second_run) { 47 | regions_grid_subset <- regions_grid %>% 48 | dplyr::filter( 49 | variable == "burial_construction", 50 | regionA == col_region, 51 | regionB == row_region 52 | ) 53 | plot_starter <- regions_grid_subset %>% 54 | ggplot() + 55 | geom_line( 56 | aes(time, sed, group = variable), 57 | alpha = 0.3, 58 | size = 0.5 59 | ) + 60 | geom_smooth( 61 | aes(time, sed, group = variable, linetype = variable, color = variable), 62 | method = "loess", 63 | span = 0.3, 64 | size = 1, 65 | linetype = "dashed" 66 | ) 67 | } else { 68 | regions_grid_subset <- regions_grid %>% 69 | dplyr::filter( 70 | variable == "burial_type", 71 | regionA == col_region, 72 | regionB == row_region 73 | ) 74 | plot_starter <- regions_grid_subset %>% 75 | ggplot() + 76 | geom_line( 77 | aes(time, sed, group = variable), 78 | alpha = 0.3, 79 | size = 0.5 80 | ) + 81 | geom_smooth( 82 | aes(time, sed, group = variable, linetype = variable, color = variable), 83 | method = "loess", 84 | span = 0.3, 85 | size = 1 86 | ) 87 | } 88 | 89 | plot_list[[iter]] <- plot_starter + 90 | scale_x_reverse( 91 | breaks = c(2000, 1500, 1000), 92 | limits = c(2200, 800) 93 | ) + 94 | scale_y_continuous( 95 | limits = c(0, 2) 96 | ) + 97 | theme_bw() + 98 | scale_colour_manual( 99 | name = "Burial customs", 100 | values = c( 101 | "burial_type" = "#0072B2", 102 | "burial_construction" = "#009E73" 103 | ) 104 | ) 105 | 106 | } 107 | 108 | iter <- iter + 1 109 | } 110 | } 111 | 112 | 113 | 114 | #### combine plots in plot matrix #### 115 | 116 | sed_matrix <- ggmatrix( 117 | plot_list, 118 | nrow = 8, ncol = 8, 119 | xAxisLabels = region_order, 120 | yAxisLabels = region_order, 121 | byrow = FALSE, 122 | switch = "y", 123 | labeller = label_wrap_gen(), 124 | ylab ="Squared Euclidian Distance", 125 | xlab = "Time in years calBC" 126 | ) + theme_bw() + 127 | theme( 128 | axis.text = element_text(size = 15), 129 | axis.text.x = element_text(angle = 45, hjust = 1), 130 | axis.title = element_text(size = 15), 131 | strip.text = element_text(size = 10), 132 | legend.position = "bottom", 133 | panel.border = element_rect(colour = "black", size = 1) 134 | ) 135 | 136 | 137 | sed_matrix %>% 138 | ggsave( 139 | "analysis/figures/sed_region_matrix.jpeg", 140 | plot = ., 141 | device = "jpeg", 142 | scale = 1, 143 | dpi = 300, 144 | width = 330, height = 330, units = "mm", 145 | limitsize = F 146 | ) 147 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/09_calculate_burial_rite_proportions_regions_timeseries.R: -------------------------------------------------------------------------------- 1 | #### load data #### 2 | 3 | load("analysis/data/tmp_data/graves_per_year_and_region_list.RData") 4 | 5 | 6 | 7 | #### calculate per year, per region distribution of ideas #### 8 | 9 | # helper function 10 | fncols <- function(data, cname) { 11 | add <- cname[!cname %in% names(data)] 12 | if (length(add) != 0) {data[add] <- NA_real_} 13 | return(data) 14 | } 15 | 16 | # main loop 17 | proportion_per_region <- graves_per_year_and_region_list %>% 18 | # apply per region data.frame 19 | pbapply::pblapply(function(x) { 20 | 21 | # in case of empty regions or regions with only unknown graves: NULL 22 | if (nrow(x) == 0 | 23 | (all(x$burial_type == "unknown") & 24 | all(x$burial_construction == "unknown"))) 25 | { 26 | 27 | res <- NULL 28 | 29 | # in case of unempty regions 30 | } else { 31 | 32 | #### burial_type: cremation vs. inhumation #### 33 | 34 | bt_basic <- x %>% 35 | dplyr::filter( 36 | burial_type != "unknown" 37 | ) 38 | 39 | if (nrow(bt_basic) == 0) { 40 | bt <- tibble::tibble( 41 | region = character(), 42 | age = integer(), 43 | cremation = double(), 44 | inhumation = double() 45 | ) 46 | } else { 47 | bt <- bt_basic %>% 48 | dplyr::group_by(age, burial_type) %>% 49 | dplyr::summarise( 50 | count = dplyr::n(), region = .$region[1] 51 | ) %>% 52 | dplyr::ungroup() %>% 53 | tidyr::spread( 54 | key = burial_type, value = count 55 | ) %>% 56 | fncols(c("cremation", "inhumation")) %>% 57 | dplyr::mutate_all(dplyr::funs(replace(., is.na(.), 0))) %>% 58 | dplyr::mutate( 59 | cremation = cremation/(cremation + inhumation) 60 | ) %>% 61 | dplyr::mutate( 62 | inhumation = 1 - cremation 63 | ) 64 | } 65 | 66 | #### burial_type: mound vs. flat #### 67 | 68 | bc_basic <- x %>% 69 | dplyr::filter( 70 | burial_construction != "unknown" 71 | ) 72 | 73 | if (nrow(bc_basic) == 0) { 74 | bc <- tibble::tibble( 75 | region = character(), 76 | age = integer(), 77 | mound = double(), 78 | flat = double() 79 | ) 80 | } else { 81 | bc <- bc_basic %>% 82 | dplyr::group_by(age, burial_construction) %>% 83 | dplyr::summarise( 84 | count = dplyr::n(), region = .$region[1] 85 | ) %>% 86 | dplyr::ungroup() %>% 87 | tidyr::spread( 88 | key = burial_construction, value = count 89 | ) %>% 90 | fncols(c("mound", "flat")) %>% 91 | dplyr::mutate_all(dplyr::funs(replace(., is.na(.), 0))) %>% 92 | dplyr::mutate( 93 | mound = mound/(mound + flat) 94 | ) %>% 95 | dplyr::mutate( 96 | flat = 1 - mound 97 | ) 98 | } 99 | 100 | # combine final result 101 | 102 | res <- dplyr::full_join( 103 | bt, bc, by = c("age", "region") 104 | ) %>% 105 | dplyr::mutate_all(dplyr::funs(replace(., is.na(.), 0))) 106 | 107 | } 108 | 109 | # complete result with 0 for years without information 110 | if (nrow(res) < 1401) { 111 | missing_ages <- c(-2200:-800)[!(c(-2200:-800) %in% res$age)] 112 | res <- rbind( 113 | res, 114 | tibble::tibble( 115 | region = res$region[1], 116 | age = missing_ages, 117 | cremation = 0, 118 | inhumation = 0, 119 | mound = 0, 120 | flat = 0 121 | ) 122 | ) 123 | } 124 | 125 | return(res) 126 | }) 127 | 128 | # merge per region information and transform it to a tall data.frame 129 | proportion_per_region_df <- proportion_per_region %>% 130 | do.call(rbind, .) %>% 131 | dplyr::rename( 132 | "timestep" = "age" 133 | ) %>% 134 | tidyr::gather( 135 | idea, proportion, -timestep, -region 136 | ) %>% 137 | dplyr::select( 138 | region, timestep, idea, proportion 139 | ) 140 | 141 | # result for burial type 142 | proportion_development_burial_type <- proportion_per_region_df %>% 143 | dplyr::filter(idea %in% c("cremation", "inhumation")) 144 | 145 | save( 146 | proportion_development_burial_type, 147 | file = "analysis/data/tmp_data/development_proportions_burial_type.RData" 148 | ) 149 | 150 | # result for burial construction 151 | proportion_development_burial_construction <- proportion_per_region_df %>% 152 | dplyr::filter(idea %in% c("flat", "mound")) 153 | 154 | save( 155 | proportion_development_burial_construction, 156 | file = "analysis/data/tmp_data/development_proportions_burial_construction.RData" 157 | ) 158 | 159 | -------------------------------------------------------------------------------- /article/05_Conclusion.Rmd: -------------------------------------------------------------------------------- 1 | # Conclusion {#conclusion} 2 | 3 | *The main trends in the distribution of burial rites in Bronze Age Europe can be detected in bulk radiocarbon data* (Figure \ref{development_burial_type} B and \ref{development_burial_construction} B) and indeed *they allow long-term observations concerning cultural distance* (Figure \ref{sed_region_matrix}, Table \ref{tab:dacta} and \ref{tab:dactb} and Figure \ref{correlationtimeseries} B), although with the low amount of data currently available, *most findings should be taken with great caution* (Table \ref{tab:gprcrosstab}, Figure \ref{development_burial_type} A, \ref{development_burial_construction} A and \ref{correlationtimeseries} A). In this paper sample size is effectively being ignored once proportions of burial rites are computed. 4 | 5 | Even small amounts of radiocarbon dates can be transformed to meaningful regional time series, if they can be linked to the relevant meta information. Although only `r r("gpr size", sf_desc)` graves -- a small fraction of maybe hundreds of thousands burials that can be estimated for the European Bronze Age [@nikulkaArchaologischeDemographieMethoden2016] -- have been available for this analysis, the resulting reconstruction of general burial tradition trends in wast areas of Central, Northern and North-western Europe comes close to the one achieved by literature research. The time series can be employed for cultural distance calculation. They yield the surprising observation that cultural distance and spatial distance do not significantly correlate. Although this result must be treated with caution because of the very small sample size, it seems as if the spread of burial traditions are not simple *Diffusion of Innovation* events as introduced by @rogersDiffusionInnovations1962, but the result of more complex interactions between competing ideas. 6 | 7 | From the point of view of *Cultural complexity* -- the question, which factors accelerate or decelerate the variability of human behaviour [@henrichDemographyCulturalEvolution2004; @mesoudiWhatCumulativeCultural2018; @vaesenPopulationSizeDoes2016] -- the long term dominance fluctuations of one burial rite over the other are remarkable. Its standard explanation models (among others population density and environmental risk) can hardly be applied to stylistic variables. 8 | 9 | Future research is required to untangle these interactions -- of course on the basis of more and more precise data. In this future work the methodology should be refined and extended in several ways. Some important ideas: 10 | 11 | 1. Replacing time slices in the correlation analysis by a moving window approach to get a continuous interaction proxy time series. 12 | 13 | 2. Applying a model based analysis of the idea proportion adoption curve time series and their regional differences to get a better understanding of mutual influence, earliest uptake and laggards. 14 | 15 | 3. Comparing the real world correlation time series with ones constructed from simulated, randomly permuting observations to test the significance of seemingly positive or negative correlation. 16 | 17 | 4. Abolishing the separation into artificial regions for the cultural distance and correlation analysis in favour of an approach based on individual observations [e.g. @loogEstimatingMobilityUsing2017]. 18 | 19 | Finally it is also important to ask what this paper means for the study of human behaviour in general. Two possible answers: 20 | 21 | 1. For this paper burial traditions were the main object of research, but the same approach could be applied to reconstruct other aspects of cultural behaviour. The idea to systematically collect data points that combine spatial and temporal location with simplified meta information about cultural phenomena might be a way to achieve better reproducibility of overarching narratives. Fast and easy *reproducibility* is of crucial importance to achieve scientific progress and it includes the notion of rather technical *preproducibility* [@starkReproducibilityMustCome2018]: Data (and code) must be shared to fuel advances in anthropological theory building [@kitzesPracticeReproducibleResearch2017; @marwickComputationalReproducibilityArchaeological2017; @marwickPackagingData2018]. 22 | 23 | 2. This paper is built upon Cultural transmission and thereby Cultural evolution theory (see section \ref{introduction}). It not just relies on terminology and methodology developed in this field, the process of abstraction necessary to go from radiocarbon dates to cultural distance was also heavily influenced by Evolutionary archaeology. This theoretical framework might be a source of inspiration and methods for other projects. The adoption and adaption of statistical tools and models from population genetics into anthropology was and is a unique characteristic of Cultural Evolution theory [@cavalli-sforzaCulturalTransmissionEvolution1981; @boydCultureEvolutionaryProcess1985; @teltserEvolutionaryArchaeologyMethodological1995; @obrienEvolutionaryArchaeologyTheory1996]. On the other hand, archaeology is explicitly concerned with human behaviour over big areas and long time scales and can reciprocate with a unique perspective [@garveyCurrentPotentialRoles2018]. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Research compendium for 'Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and North-western Europe using radiocarbon data' 2 | 3 | ### Compendium DOI: 4 | 5 | 6 | 7 | The files at the URL above will generate the results as found in the publication. The files hosted at are the development versions and may have changed since the paper was published 8 | 9 | ### Author of this repository: 10 | 11 | [![ORCiD](https://img.shields.io/badge/ORCiD-0000--0003--3448--5715-green.svg)](http://orcid.org/0000-0003-3448-5715) Clemens Schmid () 12 | 13 | ### Published in: 14 | 15 | Schmid, C. (2019). Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and Northwestern Europe using radiocarbon data. Adaptive Behavior. https://doi.org/10.1177/1059712319860842 16 | 17 | A preprint is available here: https://nevrome.de/lt/schmid2019a.pdf 18 | 19 | ### Abstract: 20 | 21 | European Bronze Age archaeology traditionally focusses on two major dimensions to categorise burials -- although there is an immense variability of attendant phenomena within this spectrum -- flat graves versus burial mounds and cremation versus inhumation. These traits are an indispensable ingredient for common archaeological narratives of sociocultural interaction and cultural evolution. This paper presents a quantitative reconstruction of the general trends in the distribution of Bronze Age burial traditions based on bulk radiocarbon data and employs the resulting time series for the estimation of macro-regional cultural distance. Despite the relatively small amount of input data the trend reconstruction fits to established archaeological observations for prehistoric Europe. The comparison of cultural and spatial distance leads to the remarkable result of no significant permanent correlation, which indicates that the spread of the relevant aspects of burial traditions can not be explained with simple diffusion models. Instead a more complex process of cultural transmission has to be considered. 22 | 23 | ### Keywords: 24 | 25 | Bronze Age, Burial Traditions, Cultural Transmission, Radiocarbon Dating 26 | 27 | ### Overview of contents: 28 | 29 | This repository contains text, code and data for the paper. The `analysis` directory contains `code` and `data` to reproduce the preparations, calculations and figure renderings. The `article` directory contains the text for the paper in *.Rmd* format. 30 | 31 | ### How to reproduce: 32 | 33 | As the data and code in this repository are complete and self-contained, it can be reproduced with any R environment (\> version 3.5.0). The necessary package dependencies are documented in the `DESCRIPTION` file and can be installed manually or automatically with `devtools::install()`. If it's not possible any more to construct a working environment with these methods due to technological progress, one can use the Docker image. 34 | 35 | A Docker image is a lightweight GNU/Linux virtual computer that can be run as a piece of software on Windows, Linux, and OSX. To capture the complete computational environment used for this project, I added a Dockerfile that specifies how to make a compatible Docker image and subsequently created this image. It includes all of the software dependencies needed to run the code, including the data and code itself. 36 | 37 | To launch the image, first, [install Docker](https://docs.docker.com/installation/) on your computer and start the Docker daemon. Linux users should take a look at the [post-installation steps](https://docs.docker.com/install/linux/linux-postinstall/). Then download all the image `.tar.part_*` files from the relevant repository (see Compendium DOI). At the command prompt you have to merge these `.tar.part_*` files to one coherent `.tar` archive: 38 | 39 | cat cultransbronze19_docker_image.tar.part_* > cultransbronze19_docker_image.tar 40 | 41 | This image archive then has to be loaded into Docker: 42 | 43 | docker load -i cultransbronze19_docker_image.tar 44 | 45 | With the image loaded you can run it as a container: 46 | 47 | docker run -e PASSWORD=cultransbronze19 -dp 8787:8787 --name cultransbronze19 cultransbronze19 48 | 49 | This will start a server instance of RStudio. You can now open your web browser at localhost:8787 or run `docker-machine ip default` in the shell to find the correct IP address, and log in. 50 | 51 | username: **rstudio** 52 | password: **cultransbronze19** 53 | 54 | Once logged in, use the Files pane (bottom right) to navigate to the script files in the `analysis` folder. 55 | 56 | More information about using RStudio in Docker is available at the [Rocker](https://github.com/rocker-org) [wiki](https://github.com/rocker-org/rocker/wiki/Using-the-RStudio-image) pages. 57 | 58 | I developed and tested the package on this Docker container, so this is the only platform that I'm confident it works on. It was built and stored with: 59 | 60 | docker build -t cultransbronze19 . 61 | docker save -o cultransbronze19_docker_image.tar cultransbronze19 62 | split -d -b 100M cultransbronze19_docker_image.tar "cultransbronze19_docker_image.tar.part_" 63 | 64 | ### Licenses: 65 | 66 | Code: MIT year: 2019, copyright holder: Clemens Schmid 67 | 68 | Data: Please see the license agreements of Radon-B and Natural Earth data 69 | 70 | Text: Please see the license agreements of the Adaptive Behavior journal 71 | -------------------------------------------------------------------------------- /analysis/code/04_plot_scripts/development_burial_type.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(magrittr) 3 | source("analysis/code/helper_functions/geom_grob.R") 4 | library(cowplot) 5 | 6 | ##### load data #### 7 | 8 | load("analysis/data/tmp_data/development_amount_burial_type.RData") 9 | load("analysis/data/tmp_data/region_order.RData") 10 | load("analysis/data/tmp_data/development_proportions_burial_type.RData") 11 | load("analysis/data/tmp_data/graves_per_region.RData") 12 | 13 | 14 | 15 | #### prepare data #### 16 | 17 | amount_devel <- amount_development_burial_type 18 | idea_factor <- as.factor(amount_devel$idea) 19 | amount_devel$idea <- factor(idea_factor, levels = rev(levels(idea_factor))) 20 | 21 | prop <- proportion_development_burial_type 22 | prop$idea <- as.factor(prop$idea) 23 | prop$idea <- factor(prop$idea, levels = rev(levels(prop$idea))) 24 | 25 | region_file_list <- unique(amount_devel$region) %>% gsub(" ", "_", ., fixed = TRUE) 26 | gl <- lapply(region_file_list, function(x) { 27 | img <- png::readPNG(paste0("analysis/data/tmp_data/", x, ".png")) 28 | g <- grid::rasterGrob( 29 | img, interpolate = TRUE, 30 | width = 0.14, height = 1.2 31 | ) 32 | }) 33 | dummy <- tibble::tibble(region = unique(amount_devel$region), grob = gl ) 34 | 35 | # facet labels 36 | number_of_graves_per_region <- graves_per_region %>% 37 | dplyr::filter( 38 | burial_type != "unknown" 39 | ) %>% 40 | dplyr::group_by( 41 | region 42 | ) %>% 43 | dplyr::summarise( 44 | n = dplyr::n() 45 | ) %$% 46 | c(paste0(region, " ", "(n = ", n, ")")) 47 | 48 | names(number_of_graves_per_region) <- levels(graves_per_region$region) 49 | 50 | region_labeller <- function(variable, value){ 51 | return(number_of_graves_per_region[value]) 52 | } 53 | 54 | # only for plot: time without sign of years 55 | amount_devel <- amount_devel %>% 56 | dplyr::ungroup() %>% 57 | dplyr::mutate( 58 | timestep = timestep * (-1) 59 | ) 60 | 61 | prop <- prop %>% 62 | dplyr::mutate( 63 | timestep = timestep * (-1) 64 | ) 65 | 66 | 67 | 68 | #### development_burial_type_A #### 69 | 70 | development_burial_type_A <- ggplot() + 71 | geom_area( 72 | data = amount_devel, 73 | aes(x = timestep, y = n, fill = idea), 74 | position = 'stack', 75 | linetype = "blank", 76 | alpha = 0.8 77 | ) + 78 | facet_wrap(~region, nrow = 8, labeller = region_labeller) + 79 | xlab("Time in years calBC") + 80 | ylab("Amount of graves") + 81 | labs(fill = "Burial customs") + 82 | theme_bw() + 83 | theme( 84 | legend.position = "bottom", 85 | panel.grid.major.x = element_line(colour = "black", size = 0.3), 86 | axis.text = element_text(size = 25), 87 | axis.title = element_text(size = 25), 88 | axis.text.x = element_text(angle = 45, hjust = 1), 89 | strip.text.x = element_text(size = 25), 90 | legend.title = element_text(size = 30, face = "bold"), 91 | legend.text = element_text(size = 30), 92 | panel.border = element_rect(colour = "black", size = 2) 93 | ) + 94 | scale_fill_manual( 95 | values = c( 96 | "cremation" = "#D55E00", 97 | "inhumation" = "#0072B2", 98 | "mound" = "#CC79A7", 99 | "flat" = "#009E73", 100 | "unknown" = "grey85" 101 | ) 102 | ) + 103 | coord_cartesian( 104 | ylim = c(0, 80) 105 | ) + 106 | scale_x_reverse( 107 | breaks = seq(2200, 800, -200), 108 | limits = c(2500, 800) 109 | ) + 110 | NULL 111 | 112 | development_burial_type_A <- development_burial_type_A + 113 | geom_custom( 114 | data = dummy, 115 | aes(grob = grob), 116 | inherit.aes = FALSE, 117 | x = 0.1, y = 0.5 118 | ) 119 | 120 | 121 | 122 | #### development_burial_type_B #### 123 | 124 | development_burial_type_B <- ggplot() + 125 | geom_area( 126 | data = prop, 127 | mapping = aes(x = timestep, y = proportion, fill = idea), 128 | position = 'stack', 129 | linetype = "blank", 130 | alpha = 0.8 131 | ) + 132 | scale_alpha_continuous(range = c(0.0, 0.7)) + 133 | facet_wrap(~region, nrow = 8) + 134 | xlab("Time in years calBC") + 135 | ylab("Proportion of burial customs") + 136 | labs(fill = "Burial customs") + 137 | theme_bw() + 138 | theme( 139 | legend.position = "bottom", 140 | panel.grid.major.x = element_line(colour = "black", size = 0.3), 141 | axis.text = element_text(size = 25), 142 | axis.text.x = element_text(angle = 45, hjust = 1), 143 | axis.title = element_text(size = 25), 144 | strip.text.x = element_text(size = 25), 145 | legend.title = element_text(size = 30, face = "bold"), 146 | legend.text = element_text(size = 30), 147 | panel.border = element_rect(colour = "black", size = 2) 148 | ) + 149 | scale_fill_manual( 150 | values = c( 151 | "cremation" = "#D55E00", 152 | "inhumation" = "#0072B2", 153 | "mound" = "#CC79A7", 154 | "flat" = "#009E73" 155 | ) 156 | ) + 157 | scale_y_continuous( 158 | breaks = c(0, 0.5, 1), 159 | labels = c("0%", "50%", "100%") 160 | ) + 161 | scale_x_reverse( 162 | breaks = seq(2200, 800, -200), 163 | limits = c(2500, 800) 164 | ) 165 | 166 | development_burial_type_B <- development_burial_type_B + 167 | geom_custom( 168 | data = dummy, 169 | aes(grob = grob), 170 | inherit.aes = FALSE, 171 | x = 0.1, y = 0.5 172 | ) 173 | 174 | 175 | 176 | #### combine plots #### 177 | 178 | combined_plot <- plot_grid( 179 | development_burial_type_A, 180 | development_burial_type_B, 181 | labels = c("A", "B"), 182 | nrow = 2, 183 | align = "v", 184 | label_size = 35, 185 | vjust = 1.0, 186 | hjust = 0 187 | ) 188 | 189 | combined_plot %>% 190 | ggsave( 191 | "analysis/figures/development_burial_type.jpeg", 192 | plot = ., 193 | device = "jpeg", 194 | scale = 1, 195 | dpi = 300, 196 | width = 330, height = 910, units = "mm", 197 | limitsize = F 198 | ) 199 | 200 | -------------------------------------------------------------------------------- /analysis/code/04_plot_scripts/development_burial_construction.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(magrittr) 3 | source("analysis/code/helper_functions/geom_grob.R") 4 | library(cowplot) 5 | 6 | ##### load data #### 7 | 8 | load("analysis/data/tmp_data/development_amount_burial_construction.RData") 9 | load("analysis/data/tmp_data/region_order.RData") 10 | load("analysis/data/tmp_data/development_proportions_burial_construction.RData") 11 | load("analysis/data/tmp_data/graves_per_region.RData") 12 | 13 | 14 | 15 | #### prepare data #### 16 | 17 | amount_devel <- amount_development_burial_construction 18 | idea_factor <- as.factor(amount_devel$idea) 19 | amount_devel$idea <- factor(idea_factor, levels = rev(levels(idea_factor))) 20 | 21 | prop <- proportion_development_burial_construction 22 | prop$idea <- as.factor(prop$idea) 23 | prop$idea <- factor(prop$idea, levels = rev(levels(prop$idea))) 24 | 25 | region_file_list <- unique(amount_devel$region) %>% gsub(" ", "_", ., fixed = TRUE) 26 | gl <- lapply(region_file_list, function(x) { 27 | img <- png::readPNG(paste0("analysis/data/tmp_data/", x, ".png")) 28 | g <- grid::rasterGrob( 29 | img, interpolate = TRUE, 30 | width = 0.14, height = 1.2 31 | ) 32 | }) 33 | dummy <- tibble::tibble(region = unique(amount_devel$region), grob = gl ) 34 | 35 | # facet labels 36 | number_of_graves_per_region <- graves_per_region %>% 37 | dplyr::filter( 38 | burial_construction != "unknown" 39 | ) %>% 40 | dplyr::group_by( 41 | region 42 | ) %>% 43 | dplyr::summarise( 44 | n = dplyr::n() 45 | ) %$% 46 | c(paste0(region, " ", "(n = ", n, ")")) 47 | 48 | names(number_of_graves_per_region) <- levels(graves_per_region$region) 49 | 50 | region_labeller <- function(variable, value){ 51 | return(number_of_graves_per_region[value]) 52 | } 53 | 54 | # only for plot: time without sign of years 55 | amount_devel <- amount_devel %>% 56 | dplyr::ungroup() %>% 57 | dplyr::mutate( 58 | timestep = timestep * (-1) 59 | ) 60 | 61 | prop <- prop %>% 62 | dplyr::mutate( 63 | timestep = timestep * (-1) 64 | ) 65 | 66 | 67 | 68 | #### development_burial_construction_A #### 69 | 70 | development_burial_construction_A <- ggplot() + 71 | geom_area( 72 | data = amount_devel, 73 | aes(x = timestep, y = n, fill = idea), 74 | position = 'stack', 75 | linetype = "blank", 76 | alpha = 0.8 77 | ) + 78 | facet_wrap(~region, nrow = 8, labeller = region_labeller) + 79 | xlab("Time in years calBC") + 80 | ylab("Amount of graves") + 81 | labs(fill = "Burial customs") + 82 | theme_bw() + 83 | theme( 84 | legend.position = "bottom", 85 | panel.grid.major.x = element_line(colour = "black", size = 0.3), 86 | axis.text = element_text(size = 25), 87 | axis.title = element_text(size = 25), 88 | axis.text.x = element_text(angle = 45, hjust = 1), 89 | strip.text.x = element_text(size = 25), 90 | legend.title = element_text(size = 30, face = "bold"), 91 | legend.text = element_text(size = 30), 92 | panel.border = element_rect(colour = "black", size = 2) 93 | ) + 94 | scale_fill_manual( 95 | values = c( 96 | "cremation" = "#D55E00", 97 | "inhumation" = "#0072B2", 98 | "mound" = "#CC79A7", 99 | "flat" = "#009E73", 100 | "unknown" = "grey85" 101 | ) 102 | ) + 103 | coord_cartesian( 104 | ylim = c(0, 80) 105 | ) + 106 | scale_x_reverse( 107 | breaks = seq(2200, 800, -200), 108 | limits = c(2500, 800) 109 | ) + 110 | NULL 111 | 112 | development_burial_construction_A <- development_burial_construction_A + 113 | geom_custom( 114 | data = dummy, 115 | aes(grob = grob), 116 | inherit.aes = FALSE, 117 | x = 0.1, y = 0.5 118 | ) 119 | 120 | 121 | 122 | #### development_burial_construction_B #### 123 | 124 | development_burial_construction_B <- ggplot() + 125 | geom_area( 126 | data = prop, 127 | mapping = aes(x = timestep, y = proportion, fill = idea), 128 | position = 'stack', 129 | linetype = "blank", 130 | alpha = 0.8 131 | ) + 132 | scale_alpha_continuous(range = c(0.0, 0.7)) + 133 | facet_wrap(~region, nrow = 8) + 134 | xlab("Time in years calBC") + 135 | ylab("Proportion of burial customs") + 136 | labs(fill = "Burial customs") + 137 | theme_bw() + 138 | theme( 139 | legend.position = "bottom", 140 | panel.grid.major.x = element_line(colour = "black", size = 0.3), 141 | axis.text = element_text(size = 25), 142 | axis.text.x = element_text(angle = 45, hjust = 1), 143 | axis.title = element_text(size = 25), 144 | strip.text.x = element_text(size = 25), 145 | legend.title = element_text(size = 30, face = "bold"), 146 | legend.text = element_text(size = 30), 147 | panel.border = element_rect(colour = "black", size = 2) 148 | ) + 149 | scale_fill_manual( 150 | values = c( 151 | "cremation" = "#D55E00", 152 | "inhumation" = "#0072B2", 153 | "mound" = "#CC79A7", 154 | "flat" = "#009E73" 155 | ) 156 | ) + 157 | scale_y_continuous( 158 | breaks = c(0, 0.5, 1), 159 | labels = c("0%", "50%", "100%") 160 | ) + 161 | scale_x_reverse( 162 | breaks = seq(2200, 800, -200), 163 | limits = c(2500, 800) 164 | ) 165 | 166 | development_burial_construction_B <- development_burial_construction_B + 167 | geom_custom( 168 | data = dummy, 169 | aes(grob = grob), 170 | inherit.aes = FALSE, 171 | x = 0.1, y = 0.5 172 | ) 173 | 174 | 175 | 176 | #### combine plots #### 177 | 178 | combined_plot <- plot_grid( 179 | development_burial_construction_A, 180 | development_burial_construction_B, 181 | labels = c("A", "B"), 182 | nrow = 2, 183 | align = "v", 184 | label_size = 35, 185 | vjust = 1.0, 186 | hjust = 0 187 | ) 188 | 189 | combined_plot %>% 190 | ggsave( 191 | "analysis/figures/development_burial_construction.jpeg", 192 | plot = ., 193 | device = "jpeg", 194 | scale = 1, 195 | dpi = 300, 196 | width = 330, height = 910, units = "mm", 197 | limitsize = F 198 | ) 199 | 200 | -------------------------------------------------------------------------------- /review/review_2.md: -------------------------------------------------------------------------------- 1 | # Associate Editor 2 | 3 | Comments to the Author: 4 | 5 | Dear author, 6 | I agree with the comments of the reviewer and the remaining points have to be addressed before we can accept this paper. As some points imply adding new analyses with different tools, it may not be reasonable to do it in the scope of this paper. But at least a stronger and clearer emphasis on the flaws and weaknesses of the statistical analysis should be done. The alternatives approach proposed by the reviewer should be at the very least mentioned. It is not a problem if the result are, on the overall, not highly significant __as far as__ it's clear in the text. The approach and the methods are already a a valuable contribution to our special issue. I will look forward to receiving a revised manuscript from you. 7 | 8 | # Reviewer: 1 9 | 10 | Comments to the Author: 11 | 12 | The methods adopted in the paper are very innovative and have been rarely implemented to analise large 14C-dates datasets. I am strongly conviced of the quality of the manuscript, that has improved in this second version. 13 | 14 | Only a small remark, the publication year of the paper "Capuzzo G, Boaretto E, Barceló JA" is 2014. 15 | 16 | # Reviewer: 2 17 | 18 | Comments to the Author: 19 | 20 | I read the revised version of the manuscript and I think the authors have addressed most of the issues I raised, and acknowledged others in the text. I am still unconvinced by the creation of the artificial subsets and think that perhaps using temporal distance matrix (see for example Shennan et al 2015 on Evolution and Human Behaviour) might have been a solution, but I also see the point that such approach would not directly explore time-series. Ultimately this is an instance of the so-called MAUP (Modifiable Areal Unit Problem) in geography, and perhaps there are some more nuanced approaches out there. I think for the purpose of this paper acknowledging the problem is more than sufficient. I also still have some issues with how sample size is effectively being ignored once proportions are computed, and I think this should be emphasised more strongly as I expect not everyone would be reading beyond the conclusion section. 21 | 22 | Please find below some further minor comments on the revised text. Overall, I think this is a great piece of work and I will look forward to follow-ups, including the simulation work that was excluded from this manuscript. 23 | 24 | Page 2, Column 1, Line 29. ‘simplify survival’ → increase? 25 | 26 | Page 2, Column 1, Line 42. ‘seemlingly random’ This is one of those tricky phrasing that has different meaning depending on the readership. ‘Random’ to me almost equals to unbiased transmission with drift, and stating that it is ‘seemlingly’ reads as if in reality this is not the case. This is perfectly fine, but it is slightly at odds with the definition of ‘style’ and the implicit assumption of neutrality. I would consider rephrasing, just to avoid potential misunderstandings. 27 | 28 | Page 2, Column 2, Line 41. the definition of drift here is more focused on its consequence. The fixation scenario presented applies only in regimes with no mutation/innovation. Perhaps specify that with no innovation a single trait will dominate by chance alone due to chance alone? 29 | 30 | Page 3, Column 1, Lines 2-6. Great! 31 | 32 | Page 3, Column 2, Line 59. ‘the region are circular’ Why this shape if it causes overlap? Why not hexagons? 33 | 34 | Page 5, Figure 3. Just an idea for a follow-up study. Given these are effectively adoption curves, one could fit a logistic model to assess differences in the rate of adoption and estimates on the timing of earliest uptake. It would be also very interesting to determine whether indeed there is a long-tail in southern Germany and what this means (cf. Henrich 2001 on American Anthropologist, but see also recent debates on adoption curves, e.g. https://www.biorxiv.org/content/biorxiv/early/2017/11/16/159038.full.pdf). Food for thoughts. 35 | 36 | Page 5, Column 1, Lines 56-. Please specify the R package used for the Mantel and Partial Mantel Tests. 37 | 38 | Page 5. I still think a permutation test would be more robust in this case. One could compare the observed correlation between two pairs of proportion time series against a simulation set where each iteration is the measured correlation between the proportion time-series of two artificial sets generated by randomly permuting the location label of each radiocarbon date. Pairs with a smaller number of dates will generate a wider range of correlation values and will be harder to test. One could adopt a more sophisticated solution by permuting groups of dates that occurred together in order to handle sample interdependence. Might be worth considering doing this for a follow-up study. 39 | 40 | Page 6, Column 2, Lines 46-49. ‘If one believes the sample, then a sudden, radical change from burial in flat graves to hill graves took place in Southern Germany at the beginning of the Middle Bronze Age.’ The sample size here is 8 dates. I appreciate the cautionary ‘if one believes the sample’ but this is a bit of a stretch to say the least, and readers that are numerically less literate might be misled. The same applies to other contexts with extremely small sample sizes and I think adding confidence intervals to those proportions would help. 41 | 42 | Table 3 & Figure 6. The figure nicely summarises the trend detailed on Table 3, but does not distinguish instances where the correlation were identified as signficant vs those that were not. Indeed in no cases the analysis shows a signficant correlation under the Partial Mantel test, whilst only few chronological blocks are showing signficant correlations. I suggest highlighting this by perhaps changing the the point symbology. It is also worth noting that if anything there is a bias towards type I error given: a) that we are dealing with multiple testing; and b) these analyses do not take into account sample sizes which are often very small. P-values are not the core issue here, but rather the fact that some way to at least visually convey this uncertainty is much needed. 43 | 44 | Page 11, Column 1, line 54. Yes, but none of the negative correlation are statistically signficant! 45 | -------------------------------------------------------------------------------- /article/01_Introduction.Rmd: -------------------------------------------------------------------------------- 1 | # Introduction {#introduction} 2 | 3 | The cultural-historical evolution of archaeological cultures and ethnic groups during the European Bronze Age is complex, and its reconstruction an ongoing endeavour of archaeology. Within this history of constant emergence, displacement and demise many different forms of burial traditions were practised. Most of them can be distinguished by the criteria *construction of the grave* and *treatment of the body*: Bronze Age burials are either flat graves or part of a burial mound, and they contain either untreated or cremated human remains. 4 | 5 | The classic narrative of the development of these rites in Europe presented e.g. by @hardingEuropeanSocietiesBronze2000a following @hauslerBestattungssittenFruhenBronzezeit1977; @hauslerGrabUndBestattungssitten1994 and @hauslerTotenorientierungUndGeographischer1996 can be summarised as follows: In the Early and Middle Bronze Age inhumations dominated in different variations. Cremation burials in this time only occurred in the Hungarian lowlands. Burial mounds were concentrated in parts of the Balkans as well as in Eastern, Western and Northern Europe, while in Central and Southern Europe flat graves -- mostly inhumations -- predominated. In the Middle Bronze Age, barrows gained importance in Western and Central Europe. This observation is highly linked to the emergence of the *Tumulus culture* in Central Europe. In the Late Bronze Age, the Urnfield period, cremation became the most common burial custom in the context of *Urnfield culture*. Harding's narrative is, even when taking into account its enormous simplification, partially misleading. Cremation, for example, was a lot more common already in the Early and Middle Bronze Age, though not in the context of the later Urnfield culture (e.g. in the Benelux area [@fokkensBronzeAgeLow2013] or Great-Britain [@robertsBritainIrelandBronze2013]). 6 | 7 | How can major misconceptions like this arise and persist in European archaeology? Beyond missing data due to preservation and research history, another reason might be a lack of unified data repositories and universally acknowledged methods to measure the spatial and temporal distribution of cultural phenomena. Instead of directly querying archives with quantitative information, the typical process for the creation of large-scale syntheses is still to manually excerpt the literature of all relevant, local research traditions. The present article, in contrast, explores the former strategy. The first major question therefore is: *Can the main trends in the distribution of burial rites in Bronze Age Europe be detected in openly available bulk radiocarbon data?* 8 | 9 | Similar methodology was already the subject of promising, but only regional research in Central and South-Western Europe with focus on Catalonia and Switzerland [@capuzzoCulturalChangesSecond2015; @capuzzoInhumacionCremacionNordeste2017; @capuzzoSpacetemporalAnalysisRadiocarbon2014]. This approach based on the dedicated radiocarbon database EUBAR [@capuzzoEUBARDatabase14C2013] aimed to explore the diffusion of the cremation burial tradition in the Middle and Late Bronze Age and set a precedent for a more reproducible and statistically sound research practice in Bronze Age archaeology. 10 | 11 | If radiocarbon data allows to reconstruct the diffusion of burial traditions, then the quantitative comparison of macro regional trends could also pave the way for an analysis of interaction intensity on a long-term continental scale. The second main question: *How does the cultural distance between regions that results from changes in burial traditions develop, and how is this cultural distance related to spatial distance?* 12 | 13 | Burial traditions are a ritual behaviour that is transmitted between generations. They are therefore suitable for study using methods of *Cultural transmission theory*, a special aspect of *Cultural evolution theory* concerned with the spread of ideas in human populations [@creanzaCulturalEvolutionaryTheory2017]. This theoretical framework permits the comparison of behaviour across spatial, temporal and cultural boundaries, because it assumes a secondary heredity system in humans: *Social learning* with transmission, selection and mutation of ideas [@henrichDualinheritanceTheoryEvolution2007; @lymanChronometersUnitsEarly2000; @lymanCultureHistoricalBiological2001; @lymanRiseFallCulture1997; @obrienEpistemologicalNatureArchaeological2002]. 14 | 15 | *Evolutionary archaeology*, the branch of archaeology that explicitly adopted Cultural evolution theory, established an important distinction of cultural behaviour in *function* and *style* [@dunnell1978style] which is relevant for burial traditions. Some types of human behaviour increase the chances of survival, like specific hunting techniques, superior tools or sowing more fruitful crops. Without resorting to the inappropriate simplifications of *Evolutionism*, their prevalence generally happens to increase over time. On the other hand, some behaviours are not related to survival and reproductive capacity, such as ceramic decorations, traditional costume fashion or jewellery design. Despite or because their seemingly subordinate importance, these characteristics often pass through a breathtakingly fast development. Burial traditions can be described as a special form of these *stylistic traits*. Special because of their strong dependence on religious and spiritual beliefs and their connection with the emotionally stirring topic of death, but still subject to sometimes rapid fashion changes. 16 | 17 | Of course in reality most behaviour is not unambiguously stylistic or functional. Burial rites cause costs regarding working time and material to a varying extent. These expenses might have been influenced by or had their effect on the human-nature relation: Pyres, for example, require a significant amount of wood and the erection of barrows much workforce. Still, it can be expected that these functional disadvantages were not critical most of the time for burial traditions -- at least regarding the general decision which ritual is performed. Most probably they influenced the magnitude of invested energy for a burial, just like the level of grief [@macdonaldGriefBurialAmerican2001] or the representational intentions of the burying relatives [@henrichEvolutionCostlyDisplays2009]. 18 | 19 | @dunnell1978style postulates that the distribution and emergence of stylistic cultural traits behave randomly on a population scale level. The stochastic processes that are at work are an important object of investigation and discussed as *Neutral Transmission* or *Stylistic variability* [@bentleyRandomDriftCulture2004; @lipoNeutralityStyleDrift2001; @neimanStylisticVariationEvolutionary1995; @porcicSimulatingCulturalTransmission2014; @porcicExploringEffectsAssemblage2015; @rogersNaturalSelectionCultural2008; @shennanCeramicStyleChange2001]. @neimanStylisticVariationEvolutionary1995 takes a closer look at these processes and develops a simple framework for the simulation of non-functional idea propagation. He identifies the essential phenomena *drift* (i.e. in case of multiple, equivalent traits in a population with no mutation or innovation, a single trait will dominate over time due to chance alone) and *flow* (i.e. intergroup transmission) in population genetics to be also relevant for cultural traits in archaeology. Furthermore, he implements a measure of cultural distance to apply his theoretical insights to real-world data. This workflow was an important methodological inspiration for the burial rites data examination in this paper. 20 | 21 | In the following sections I will (1) *explain how radiocarbon data with relevant meta information can be transformed to macro regional time series of burial traditions*, (2) *explore how these time series compare to traditional archaeological narratives* and (3) *construct and contextualise cultural distances between macro regions over time in relation to spatial distance*. 22 | -------------------------------------------------------------------------------- /review/review_1.md: -------------------------------------------------------------------------------- 1 | # Reviewer: 1 2 | 3 | Comments to the Author: 4 | 5 | A lot of work has been already done in quantifying changes in funerary practices during the Bronze Age in central and south-western Europe through the analysis of radiocarbon-dated archaeological contexts. I recommend citing these works in the paper, since the adopted approach is similar. 6 | 7 | - Capuzzo G, Barceló JA. 2015. Cultural changes in the 2nd millennium BC: a Bayesian examination of radiocarbon evidence from Switzerland and Catalonia. World Archaeology 47 (4) Special Issue: Bayesian approaches to Prehistoric Chronologies:622-641. 8 | - Capuzzo G, López Cachero FJ. 2017. De la inhumación a la cremación en el nordeste peninsular: cronología y sociedad. In: Barceló JA, Bogdanovic I, Morell B, editors. Iber-Crono 2016. Cronometrías Para la Historia de la Península Ibérica (Chronometry for the History of the Iberian Peninsula), Barcelona (Spain), 17-19 October 2016:192-208. 9 | - Capuzzo G, Barceló JA (in press). Cremation burials in Central and Western Europe: quantifying an adoption of innovation in the 2nd millennium BC. In: Kneisel J, Nakoinz O, Barcelo J, editors. Turning Points and Change in Bronze Age Europe (2400 – 800 BC). Modes of change – inhumation versus cremation in Bronze Age burial rites. Proceedings of the International Workshop "Socio-Environmental Dynamics over the Last 12,000 Years: The Creation of Landscapes IV (24th-27th March 2015) in Kiel. Universitätsforschungen zur Prähistorischen Archäologie 10 | - Capuzzo G. 2014. Space-temporal Analysis of Radiocarbon Evidence and Associated Archaeological Record: from Danube to Ebro Rivers and from Bronze to Iron Ages. Ph.D. thesis, Autonomous University of Barcelona. 11 | 12 | In the paper, it’s very high the amount of data, for which the archaeological information regarding the type of burial and funerary rite is lacking. At table 1, page 4, we can clearly detect that for 60% of the dates associated to cremation burials we have no information regarding the type of funerary structure. For 37% of the inhumations, no information about the funerary structure is available. Moreover, for 32% of the dataset (559 radiocarbon dates out of 1701) we do not have any kind of information regarding neither the funerary rite nor the burial structure. This lack of data obliges the author to consider carefully the results reached in the paper. It’s relevant to highlight all the biases of the prosed research and how the conclusion can be misleading due to the quality of available data. In particular, when the statistical analyses carried out on data aim to explore in the details the cultural distance among the different regions. 13 | 14 | There are some typing error in the manuscript: 15 | 16 | Line 28 page 2: can be described 17 | 18 | Line 58 page 4: How should the correlation 19 | 20 | Line 2 page 5: Listed are the overall 21 | 22 | I advise the author to review carefully the text. 23 | 24 | At lines 48-50, page 2, the bibliographic reference to Dunnell is missing. 25 | 26 | Regarding the images, it would be preferable not to use negative number in order to indicate years BC. 27 | 28 | # Reviewer: 2 29 | 30 | Comments to the Author: 31 | 32 | I had the chance to read the manuscript entitled “Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and North-western Europe using radiocarbon data” authored by C. Schimd. This is an interesting paper that combines empirical analysis of Bronze age burial sites across Europe with a computer simulation of intergroup cultural transmission. The manuscript is well written, I enjoyed reading it, and think that the core findings are definitely of interest for archaeologist working on Bronze age Europe and for those interested in the application of cultural evolutionary framework. I am thus keen to recommend its publication, although I think several issues needs to be addressed before this. Firstly, my impression is that the author is trying to squeeze perhaps a bit too much in a single paper. I felt this was particularly the case of the computer simulation model which is almost thrown in in the mix, without much discussion on model parameters (see below). I would be tempted to suggest removing this entirely and include this into another paper. Secondly, I feel like the empirical analyses have too much preprocessing. The raw data provides spatial and temporal coordinates of individual burials, yet these are combined spatially and chronologically first and analysed as aggregates. As a consequence: 1) there is a substantial loss of spatial information; 2) sampling error is effectively disregarded (i.e. mantel tests are based on proportion values that are calculated for regions with very different samples sizes) and strictly speaking the samples are also non-independent (i.e. a large site with multiple burials can strongly bias the proportions of a particular region); and 3) there is an increased risk of ecological fallacy/Simpson’s paradox. I take this aggregation provides a direct mapping to existing literature, but I am not convinced that this is worth sacrificing so much. Thirdly, the author implies that the scripts used for his analysis are supplied but there are no links on the article to any repository and I did not find any electronic supplementary material. As the author is well aware, we need to do our best to make our work fully reproducible. 33 | 34 | Minor points: 35 | 36 | Page 1, Column 2, Lines 52-43: “Do time series ... spatial distance”. I think this question should be phrased better. Eg. What does “meaningful” mean in this context? 37 | 38 | Page 2, Column 1, Line 9: “[...] adaptive behaviour”. Not necessarily. 39 | 40 | Page 2, Column 1, Line 15: “explicitly adopted the terminology of Cultural evolution”. This reads as if only the terminology is adopted? Rephrase? 41 | 42 | Page 2, Column 1, Lines 58. Not sure what “random dominance of similar traits” means - should be rephrased. 43 | 44 | Page 3, Column 1, Line 33. Please provide a link to the repository with the code. 45 | 46 | Page 3, Column 2, Lines 40-44. The definition of these regions seems rather arbitrary and necessary. Why create such an artificial unit when the spatial coordinates are available? 47 | 48 | Page 3, Column 2, Line 60. “For the remaining 154 dates...”. I assume these dates were excluded as we don’t know whether they are terrestrial or marine? Also, the paragraph mentions “bones and teeth”, are there any risks of aquatic diet determining a reservoir effect? 49 | Page 4, Column 1, Lines 57-59. Why not use directly the summed probabilities? 50 | 51 | Page 4, Columns 1-2, Lines 58-60; 1-8. This is a major issue. Perhaps it is worth bootstrap confidence interval for these proportions? This way both sample size and sample independence could be tackled. Also, please provide the sample size for each region. 52 | 53 | Page 4, Column 2, Lines 43-56. I think it is worth computing partial mantel tests so that the correlation between burial type and construction can take into account geography. 54 | 55 | Page 5, Column 1, Line 24. Perhaps worth making this a subsection? 56 | 57 | Page 5, Column 1, Lines 24-60. I have several issues with this model. The idea here is to emulate the observed data so we can build expectations that can be directly compared against empirical patterns. But I do find several issues: 1) How is Ng=100 justified? This seems a somewhat arbitrary number for a parameter that is likely going to play a significant role in the amount of drift in the system? 2) I understand each time-step is 20 years. Why? I assume this is related to generation length but this ought to be discussed; 3) Is the model supposed to reach an equilibrium state? If this is the case I don’t think 70 time-steps and Ng=100 is sufficient for this. If the answer is no, the initial condition of the system shouldn’t be random and perhaps be informed from the empirical data. 58 | 59 | Figure 3. These are very nice plots - I would add the sample sizes for each region though. 60 | 61 | Figure 6. I find these plots a bit messy and with too much information. I also don’t see much the point of testing for significance the results of each simulation run - they are effectively samples from the same generative process so I think testing them does not make much sense? 62 | 63 | -------------------------------------------------------------------------------- /article/03_Results.Rmd: -------------------------------------------------------------------------------- 1 | # Results {#results} 2 | 3 | ## Time series {#time-series-results} 4 | 5 | Figure \ref{development_burial_type} B and \ref{development_burial_construction} B show the region-wise time series of proportional trait prevalence. They are based on very (!) small sample quantities (Figure \ref{development_burial_type} A and \ref{development_burial_construction} A) and are therefore not statistically significant. Despite this obvious limitation it's possible to conduct a thought experiment and consider these results in isolation. A comparison with published archaeological observations based on literature study is provided in section \ref{discussion}. Carrying out this experiment yields the following narrative: \newline 6 | 7 | *The overall picture is that during the Bronze Age in Europe there was a trend away from body burial towards cremation. Around 2200 calBC cremation burials were almost unknown in Poland, Southern Germany, Northeastern France and Northern Germany. In the Northwest, in Great Britain and the Benelux area, and in the Southeast, in Austria and the Czech Republic, however, there were early cremation traditions. These contexts could be discussed as areas of origin of the later omnipresent phenomenon. While cremation burials lost importance in Austria and the Czech Republic as well as in the Benelux region during the Early Bronze Age and only regained relevance there in the Middle Bronze Age, their share increased steadily in England. Inhumation and cremation were balanced here for a long time. The situation was similar in Southern Scandinavia, where the proportion of cremation burials was much lower until the Late Bronze Age. In Poland and Southern Germany, cremation became relatively suddenly and completely established with the beginning of the Late Bronze Age. In Northeastern France and Northern Germany this change took place already in the Middle Bronze Age. In both contexts inhumation continued to play an important role.* 8 | 9 | *With regard to the question of grave mound construction the picture is considerably more heterogeneous. In Austria and the Czech Republic flat graves were the dominant form of burial until the Late Bronze Age, but mounds became more relevant from the Middle Bronze Age onwards. In Poland mounds and flat graves remained in balance until the Middle Bronze Age, when the latter finally prevailed. The amount of data from Southern Germany and Northeastern France is extraordinarily small: If one believes the sample, then a sudden, radical change from burial in flat graves to hill graves took place in Southern Germany at the beginning of the Middle Bronze Age. In Northeastern France there were no flat graves in the Bronze Age. Northern Germany underwent a development from the dominance of flat graves in the Early Bronze Age, a short phase of increasing mound construction in the Middle Bronze Age followed by renewed dominance of the flat grave custom in the Late Bronze Age. A similar development can be observed in Southern Scandinavia: Flat graves clearly predominated, but were increasingly -- almost completely -- replaced by mounds, until burial in flat graves became more frequent again at the end of the Bronze Age. Burial mounds were dominant throughout the Benelux region, but in the Early and Late Bronze Ages flat graves also occurred to a significant extent. In England flat graves were a short phenomenon in the Early Bronze Age, which did not recur later.* \newline 10 | 11 | ## Cultural distance 12 | 13 | Beyond the simple comparison of archaeological knowledge and information derived from Radon-B, Figure \ref{sed_region_matrix} shows the time series of squared Euclidean distance for each region-region relationship. The majority of the curves in its top right half for *burial type* correspond to expectations: At the beginning of the Bronze Age, inhumation is widespread throughout the study area, so the Euclidean distance at 2200 calBC is small in almost every region-region relationship. Only the Benelux countries, where the share of cremation is already high in the Early Bronze Age, are excluded. From the Middle Bronze Age onwards, but especially at the transition to the Late Bronze Age, the transition to the dominance of cremation took place all over Europe. The SED values increase in this period and show clear peaks or several successive maxima. This rise is a consequence of the time lag in the transition processes as depicted in Radon-B: It is different in every region. At the end of the Late Bronze Age, the average SED is approaching zero again, as burial by cremation dominates in almost all of Europe. The early and complete adoption of the cremation rite in the Benelux area, as depicted in Radon-B, clearly sets it apart from the other regions. England, on the other hand, with its slow, gradual transition from inhumation to cremation, stands out due to its consistently moderate distances to all other regions. It remains without accentuated minima and maxima. The situation for *burial construction* is more complicated, as can be seen from the plots in the bottom right corner of Figure \ref{sed_region_matrix}. The distance does not seem to follow a general trend, but a multitude of local and temporally limited phenomena. This heterogeneity is of course also due to how correctly or incorrectly the proxy calculated from Radon-B depicts developments in the real world. In the Middle Bronze Age, the Tumulus culture should bring about a fundamental reduction of the SED for almost all region-region relationships -- this effect is indeed weakly visible. 14 | 15 | Table \ref{tab:dactb} and Figure \ref{correlationtimeseries} show that the distance networks of *burial type* and *burial construction* are not equivalent. There is also no significant negative correlation. The degree of agreement between two regions in the question of inhumation and cremation is therefore not suitable for predicting the similarity in the dominance of flat or mound graves. Only for the time slot at the transition to the Middle Bronze Age from 1800 to 1600 calBC the 5% significance level of the Mantel test is almost undercut, thus suggesting a statistically significant relationship. This moment of strong correlation is though not induced by similarity along the spatial dimension alone: The effect is still partially visible in the result of the Partial Mantel test, where the spatial distance is artificially counterbalanced. 16 | 17 | For the relationship between the SED networks and the spatial distance network several observations result from Table \ref{tab:dacta} and Figure \ref{correlationtimeseries}: 18 | 19 | For the variable *burial type* an exception with significant correlation between the distance measures only reveals itself for the Early Bronze Age time slot 2000 to 1800 calBC. In the Early Bronze Age, long before the universal switch to the Urnfield burial tradition, large regions directly adjacent to each other tend to see the same developments. In the Middle Bronze Age the SED developments of the *burial type* variable undergo the peaks already observed. The correlation between cultural and spatial distance during these peaks is low and even tilts between 1600 and 1400 calBC into the negative -- but not significantly. The cultural distance between several geographically distant regions is then smaller than between several directly adjacent regions. 20 | 21 | Looking at the SED network of *burial construction*, a slightly different conclusions can be drawn: The distance values here are larger, and the SED differences within the individual spatial distance classes are clearly more accentuated. As well as in *burial type* the Early Bronze Age is by far the phase with the most substantial spatial correlation. But it is only significant for the time slot between 2000 and 1400 calBC. There is no time period with negative mean correlation for *burial construction* cultural distance and spatial distance, but also here the correlation coefficient approaches zero in the Late Bronze Age. These latter results in particular, however, are based on unsatisfactory few observations. 22 | 23 | In general, cultural distance as defined here does not seem to correlate strongly with spatial distance, especially in the Middle and Late Bronze Age. However, this hypothesis is not conclusive at the moment as it is derived from a very small sample size. 24 | -------------------------------------------------------------------------------- /article/06_Supplementary_Remarks.Rmd: -------------------------------------------------------------------------------- 1 | # Supplementary Remarks 2 | 3 | ## Data quality {#data-quality-discussion} 4 | 5 | The **A** sections of the figures \ref{development_burial_type} and \ref{development_burial_construction} with absolute grave numbers per region and year indicate areas and periods with a lot and others with few points of data. For some there is not enough information to make any decision about the relative dominance and for many the general relevance and accuracy of the resulting time series can be questioned. There are a variety of reasons for this. These should also be considered for future data acquisition in Radon-B and beyond. 6 | 7 | 1. The data in Radon-B depend on the projects and interests of the participating researchers: It was collected as needed for individual regions rather than systematically for all of Europe. 8 | 9 | 2. The availability of ^14^C dates for a region and period in the literature depends on whether a modern research project took place within this context. Besides the research interests of researchers and institutions, there are also political reasons why an area might be better or worse explored. 10 | 11 | 3. Different research traditions in archaeology considered ^14^C data in the past more or less essential for the reconstruction of absolute chronology. In various Metal Age contexts, ^14^C data provide inferior precision in comparison to relative chronological classifications - e.g. by fibula typology - and are therefore used only sporadically to create absolute chronological fix points. Dendrochronological dating is preferred in waterlogged deposits and whenever the necessary woods are available. ^14^C calibration curves form plateaus in some periods, which significantly limit the possible dating precision. If such an effect is known, then often no dates are commissioned at all. 12 | 13 | 4. ^14^C dating requires a small but sufficiently contextualised amount of organic finds and short-lived sample materials such as bones of terrestrial organisms or charred cereal grains are preferred. The majority of ^14^C data for this paper comes from bones and teeth. However, their preservation is subject to huge differences depending on the soil [@brockPrescreeningTechniquesIdentification2010; @gordonSoilPHBone1981; @nielsen-marshBoneDiagenesisEuropean2007]. In many mineral soil contexts no sufficiently good, dateable material is available. This situation can affect entire regions, if, for example, poor bone preservation prevails as a result of lime-deficient soils. 14 | 15 | 5. In very few regions and periods of the European Bronze Age the number of excavated graves is sufficiently big to assume that a statistically relevant sample of the burial culture of the entire population is documented. Instead, it is evident in most contexts that only the burials of certain social groups, genders or ethnic groups were recorded. The quantity and nature of the known graves cannot be representative. In this case it can be expected that other burial rituals were practised, which left no archaeologically visible remains. These rituals are invisible in the ^14^C data from Radon-B. 16 | 17 | Concerning the primary variables *burial type* and *burial construction*, further special effects must be taken into account: 18 | 19 | The disturbance and robbery of graves was a widespread phenomenon in history and prehistory. Burial mounds were usually attacked more severely than flat graves due to their better visibility and could, therefore, be under-represented in Radon-B. In many places, they were also the subject of expeditions in the early days of archaeology at the end of the 19th and beginning of the 20th century. Of course, these excavations did not yield ^14^C-dates. Irrespective of this, it can be assumed that a large part of the burial mounds erected in the Bronze Age was destroyed by agricultural activity. Ploughing could also result in an under-representation of the archaeological findings [@hardingEuropeanSocietiesBronze2000a]. On the other hand, if a burial mound is still present, it is also more readily visible and recognised by archaeologists today: Mounds are often clearly identifiable in aerial photographs or digital terrain models, while flat graves are much more difficult to observe with modern remote sensing methods. It is difficult to estimate the impact of these effects in detail, but an over-representation of mounds seems more likely than an over-representation of flat graves. 20 | 21 | The dating of cremation graves on bone remains methodically differs from the dating of inhumations because it is based on the extraction of the mineral, not the organic, fraction in the bone [@lantingDatingCrematedBones2001]. The underlying chemical method was developed later, has only been used more frequently in the past 15 years and is associated with some particular difficulties [@olsenCharacterisationBlindTesting2008; @strydonck14CDatingCremated2009]. Burnt bone is generally more susceptible to weathering than unburned bone. An under-representation of cremation graves in current data collections is, therefore, more plausible. 22 | 23 | Another aspect to consider concerning the data quality is the temporal accuracy of radiocarbon dating. Ideally each radiocarbon date represents the exact point in time of the creation of the respective grave. Unfortunately several natural and cultural effects can cause a (partially systematic) offset between the radiocarbon date and the burial ceremony, including the *Marine reservoir effect* [@Ascough2005], the *Old wood effect* [@OLSEN201330], the *Human ^14^C-residence ("adult") effect* [@Hedges2007] or cultural practices like a secondary treatment of the body or the deposition of burial objects that are already ancient at the time of the funeral. These effects can have strong influence on the accuracy of the dating information, but can only be explored for each grave individually. In the present paper they therefore had to be ignored. 24 | 25 | ## Data meaning {#data-meaning-discussion} 26 | 27 | This paper is based on ^14^C dates which were prepared for the dating of graves. There is a semantic divisiveness between great, theoretical archaeology, which wants to develop comprehensive narratives and only pay quantitative attention to the individual case, and the on-site research or emergency excavation, which has to dedicate a measure of respect and sometimes a lot of time to each grave. 28 | 29 | In this paper, ^14^C data are converted into a proxy of calibrated density distributions within artificial working regions. An endeavour which is completely detached from the individual context. In contrast, a single ^14^C date on a grave is usually used to attribute a feature to the absolute chronological context or to better describe the relative development within a site. The questions underlying the creation of a ^14^C date are therefore fundamentally different from those imposed here. 30 | 31 | The superordinate, large perspective also tries to simplify and categorize the parameters associated with a single burial. Radon-B anticipated this step by providing the variables *burial type* and *burial construction* that can be reduced to three categories each. This is extremely useful on the one hand, but also questionable on the other. The respective contexts can be multifarious: similar rituals in different cultural contexts can have different meanings. For this paper, it is assumed -- with reference to *Cultural Evolution Theory* -- that despite this restriction, behaviour such as burning the dead or burying in burial mounds can be passed on across cultural and ethnic group boundaries through imitation and teaching. To put it provocatively: cremation burial in the Hungarian Early Bronze Age is a manifestation of the same idea as cremation in the Northern Late Bronze Age. This is a working hypothesis, but may be questioned. 32 | 33 | The meaning of the data in Radon-B is thus manipulated in at least three ways for the purpose of this paper: By concentrating on the dated grave in contrast to the ^14^C date, it detaches itself from the actual content of the database. By creating artificial time steps and investigation regions, the cultural-historical context of the grave is dissolved. By creating the relative development proxies, the individual grave loses its context. The present paper is a secondary use of Radon-B. A better dataset should be grave-related, not date-related, and should contain much more meta-information for each grave. 34 | 35 | -------------------------------------------------------------------------------- /review/answer_to_review_2.md: -------------------------------------------------------------------------------- 1 | # Reviewer: 1 2 | 3 | Comments to the Author: 4 | 5 | > The methods adopted in the paper are very innovative and have been rarely implemented to analise large 14C-dates datasets. I am strongly conviced of the quality of the manuscript, that has improved in this second version. 6 | 7 | Great! 8 | 9 | > Only a small remark, the publication year of the paper "Capuzzo G, Boaretto E, Barceló JA" is 2014. 10 | 11 | Fixed. 12 | 13 | # Reviewer: 2 14 | 15 | Comments to the Author: 16 | 17 | > I read the revised version of the manuscript and I think the authors have addressed most of the issues I raised, and acknowledged others in the text. I am still unconvinced by the creation of the artificial subsets and think that perhaps using temporal distance matrix (see for example Shennan et al 2015 on Evolution and Human Behaviour) might have been a solution, but I also see the point that such approach would not directly explore time-series. Ultimately this is an instance of the so-called MAUP (Modifiable Areal Unit Problem) in geography, and perhaps there are some more nuanced approaches out there. I think for the purpose of this paper acknowledging the problem is more than sufficient. 18 | 19 | Thank you very much for your review. You gave me some great ideas how this problem could be approached in a better way and your review will be the first thing I will go to, when I have the opportunity to continue the work on this front. For measuring the degree of interaction in a better way and without artificial regions, I recently got some inspiration from a paper by Loog et al 2017: 20 | 21 | Loog, L., Lahr, M. M., Kovacevic, M., Manica, A., Eriksson, A., & Thomas, M. G. (2017). Estimating mobility using sparse data: Application to human genetic variation. Proceedings of the National Academy of Sciences, 114(46), 12213–12218. https://doi.org/10.1073/pnas.1703642114 22 | 23 | Two major take aways: (1) Their mobility estimator could be used for a better, region independent statistic for the general degree of interaction. (2) I could as well use a moving window instead of 200 years time slices (Figure 6). 24 | 25 | I added some sentences in the conclusion to give an outlook on future work. 26 | 27 | > I also still have some issues with how sample size is effectively being ignored once proportions are computed, and I think this should be emphasised more strongly as I expect not everyone would be reading beyond the conclusion section. 28 | 29 | I made some major changes to the conclusion to make this very clear. 30 | 31 | > Please find below some further minor comments on the revised text. Overall, I think this is a great piece of work and I will look forward to follow-ups, including the simulation work that was excluded from this manuscript. 32 | 33 | > Page 2, Column 1, Line 29. ‘simplify survival’ → increase? 34 | 35 | Rephrased. 36 | 37 | > Page 2, Column 1, Line 42. ‘seemlingly random’ This is one of those tricky phrasing that has different meaning depending on the readership. ‘Random’ to me almost equals to unbiased transmission with drift, and stating that it is ‘seemlingly’ reads as if in reality this is not the case. This is perfectly fine, but it is slightly at odds with the definition of ‘style’ and the implicit assumption of neutrality. I would consider rephrasing, just to avoid potential misunderstandings. 38 | 39 | You're right. I thought a lot about this and finally decided to simply remove the term "seemlingly random". In my opinion the binary distinction between style and function reaches its limit with burial traditions. In many cultural contexts, death and funerals are strongly reflected. Much more thought is given to this than to patterns on pots. The simulation paper will have to look at this difference more carefully, because there the neutrality is an even more important assumption. 40 | 41 | > Page 2, Column 2, Line 41. the definition of drift here is more focused on its consequence. The fixation scenario presented applies only in regimes with no mutation/innovation. Perhaps specify that with no innovation a single trait will dominate by chance alone due to chance alone? 42 | 43 | Rephrased. Added the important "no mutation or innovation" conditions. 44 | 45 | > Page 3, Column 1, Lines 2-6. Great! 46 | 47 | > Page 3, Column 2, Line 59. ‘the region are circular’ Why this shape if it causes overlap? Why not hexagons? 48 | 49 | This is true. I added a sentence to point this out. For this paper I will use the established regions, because changing them at this point would render the area discussions useless. In the future more data might be available and it should be possible to establish an a lot more fine grained, hexagonal or rectangular region grid. 50 | 51 | > Page 5, Figure 3. Just an idea for a follow-up study. Given these are effectively adoption curves, one could fit a logistic model to assess differences in the rate of adoption and estimates on the timing of earliest uptake. It would be also very interesting to determine whether indeed there is a long-tail in southern Germany and what this means (cf. Henrich 2001 on American Anthropologist, but see also recent debates on adoption curves, e.g. https://www.biorxiv.org/content/biorxiv/early/2017/11/16/159038.full.pdf). Food for thoughts. 52 | 53 | Well noted. Thank you! Incidentally for Southern Germany there is a paper by Frank Falkenstein that reconstructed the adoption rate of these burial traditions based on archaeologically dated graves: 54 | 55 | Falkenstein, F. (2017). Zum Wandel der Bestattungssitten von der Hügelgräber- zur Urnenfelderkultur in Süddeutschland. In Brandherm, D. and Nessel, B., editors, Phasenübergänge Und Umbrüche Im Bronzezeitlichen 56 | Europa, number 297 in UPA, pages 77–96. Bonn. 57 | https://www.academia.edu/36327050/Zum_Wandel_der_Bestattungssitten_von_der_H%C3%BCgelgr%C3%A4ber-_zur_Urnenfelderkultur_in_S%C3%BCddeutschland 58 | 59 | > Page 5, Column 1, Lines 56-. Please specify the R package used for the Mantel and Partial Mantel Tests. 60 | 61 | Done. ecodist::mantel() 62 | 63 | > Page 5. I still think a permutation test would be more robust in this case. One could compare the observed correlation between two pairs of proportion time series against a simulation set where each iteration is the measured correlation between the proportion time-series of two artificial sets generated by randomly permuting the location label of each radiocarbon date. Pairs with a smaller number of dates will generate a wider range of correlation values and will be harder to test. One could adopt a more sophisticated solution by permuting groups of dates that occurred together in order to handle sample interdependence. Might be worth considering doing this for a follow-up study. 64 | 65 | Well noted for the follow-up study. I also mention this approach now in the conclusion. 66 | 67 | > Page 6, Column 2, Lines 46-49. ‘If one believes the sample, then a sudden, radical change from burial in flat graves to hill graves took place in Southern Germany at the beginning of the Middle Bronze Age.’ The sample size here is 8 dates. I appreciate the cautionary ‘if one believes the sample’ but this is a bit of a stretch to say the least, and readers that are numerically less literate might be misled. The same applies to other contexts with extremely small sample sizes and I think adding confidence intervals to those proportions would help. 68 | 69 | I modified the small, introductory paragraph of this section to make it clear, that this is a thought experiment based on a very small amount of data. I also set the narrative in italics. 70 | 71 | > Table 3 & Figure 6. The figure nicely summarises the trend detailed on Table 3, but does not distinguish instances where the correlation were identified as signficant vs those that were not. Indeed in no cases the analysis shows a signficant correlation under the Partial Mantel test, whilst only few chronological blocks are showing signficant correlations. I suggest highlighting this by perhaps changing the the point symbology. It is also worth noting that if anything there is a bias towards type I error given: a) that we are dealing with multiple testing; and b) these analyses do not take into account sample sizes which are often very small. P-values are not the core issue here, but rather the fact that some way to at least visually convey this uncertainty is much needed. 72 | 73 | To address this issue I modified Figure 6. I added... 74 | 75 | 1. ... an additional graph Figure 6 A that shows the medians (with an lower to upper quartile range ribbon) of the graves per year and region. 76 | 77 | 2. ... an indication of the mean of this medians for each 200 years time window in Figure 6 B. The square markers show, on how much data the correlation observations are based. 78 | 79 | 3. ... an indication of the p-Values in Figure 6 B to show which correlations are significant. 80 | 81 | I also modified the description of this figure in the Materials and Methods as well as in the Results and the Discussion sections accordingly. I believe these changes are sufficient to visually convey the underlying uncertainty. 82 | 83 | > Page 11, Column 1, line 54. Yes, but none of the negative correlation are statistically signficant! 84 | 85 | Rephrased to address this. 86 | -------------------------------------------------------------------------------- /analysis/code/04_plot_scripts/map.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(sf) 3 | library(cowplot) 4 | library(magrittr) 5 | 6 | #### load data #### 7 | 8 | load("analysis/data/tmp_data/land_outline.RData") 9 | load("analysis/data/tmp_data/rivers.RData") 10 | load("analysis/data/tmp_data/lakes.RData") 11 | load("analysis/data/tmp_data/countries.RData") 12 | research_area <- sf::st_read("analysis/data/input_data/research_area_shapefile/research_area.shp", quiet = TRUE) 13 | load("analysis/data/tmp_data/regions.RData") 14 | load("analysis/data/tmp_data/dates_coordinates.RData") 15 | load("analysis/data/tmp_data/region_order.RData") 16 | load("analysis/data/tmp_data/region_colors.RData") 17 | load("analysis/data/tmp_data/distance_matrix_spatial_long_half.RData") 18 | 19 | dates_coordinates_sf <- dates_coordinates %>% sf::st_as_sf( 20 | coords = c("lon", "lat"), 21 | crs = 4326 22 | ) 23 | 24 | 25 | 26 | #### map_A #### 27 | 28 | xlimit_A <- c(-1600000, 1300000) 29 | ylimit_A <- c(300000, 3800000) 30 | 31 | map_A <- ggplot() + 32 | geom_sf( 33 | data = land_outline, 34 | fill = "white", colour = "black", size = 0.7 35 | ) + 36 | geom_sf( 37 | data = rivers, 38 | fill = NA, colour = "black", size = 0.2 39 | ) + 40 | geom_sf( 41 | data = lakes, 42 | fill = NA, colour = "black", size = 0.2 43 | ) + 44 | geom_sf( 45 | data = dates_coordinates_sf, 46 | mapping = aes( 47 | color = burial_type, 48 | shape = burial_construction, 49 | size = burial_construction 50 | ), 51 | show.legend = "point" 52 | ) + 53 | geom_sf( 54 | data = research_area, 55 | fill = NA, colour = "red", size = 0.8 56 | ) + 57 | theme_bw() + 58 | coord_sf( 59 | xlim = xlimit_A, ylim = ylimit_A, 60 | crs = st_crs("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 61 | ) + 62 | scale_shape_manual( 63 | values = c( 64 | "flat" = "\u268A", 65 | "mound" = "\u25E0", 66 | "unknown" = "\u2715" 67 | ) 68 | ) + 69 | scale_size_manual( 70 | values = c( 71 | "flat" = 12, 72 | "mound" = 12, 73 | "unknown" = 6 74 | ) 75 | ) + 76 | scale_color_manual( 77 | values = c( 78 | "cremation" = "#D55E00", 79 | "inhumation" = "#0072B2", 80 | "mound" = "#CC79A7", 81 | "flat" = "#009E73", 82 | "unknown" = "darkgrey" 83 | ) 84 | ) + 85 | theme( 86 | legend.position = "bottom", 87 | legend.title = element_text(size = 30, face = "bold"), 88 | axis.title = element_blank(), 89 | axis.text = element_blank(), 90 | legend.text = element_text(size = 30), 91 | panel.grid.major = element_line(colour = "black", size = 0.3), 92 | panel.border = element_rect(colour = "black", size = 2), 93 | legend.box = "vertical" 94 | ) + 95 | guides( 96 | color = guide_legend(title = "Burial type", override.aes = list(size = 10), nrow = 1, byrow = TRUE), 97 | shape = guide_legend(title = "Burial construction", override.aes = list(size = 10), nrow = 1, byrow = TRUE), 98 | size = FALSE 99 | ) 100 | 101 | map_A %>% 102 | ggsave( 103 | "analysis/figures/map_graves.jpeg", 104 | plot = ., 105 | device = "jpeg", 106 | scale = 1, 107 | dpi = 300, 108 | width = 330, height = 420, units = "mm", 109 | limitsize = F 110 | ) 111 | 112 | 113 | 114 | #### map_B #### 115 | 116 | region_centers <- regions %>% 117 | sf::st_centroid() 118 | 119 | sfc_as_cols <- function(x, names = c("x","y")) { 120 | stopifnot(inherits(x,"sf") && inherits(sf::st_geometry(x),"sfc_POINT")) 121 | ret <- do.call(rbind,sf::st_geometry(x)) 122 | ret <- tibble::as_tibble(ret) 123 | stopifnot(length(names) == ncol(ret)) 124 | ret <- setNames(ret,names) 125 | dplyr::bind_cols(x,ret) 126 | } 127 | 128 | region_centers %>% 129 | sfc_as_cols() %>% 130 | dplyr::select( 131 | NAME, x, y 132 | ) 133 | 134 | region_labels <- as.data.frame(sf::st_coordinates(region_centers)) 135 | region_labels$NAME <- region_centers$NAME 136 | 137 | ex <- raster::extent(regions) 138 | 139 | xlimit_B <- c(ex[1], ex[2]) 140 | ylimit_B <- c(ex[3], ex[4]) 141 | 142 | map_B <- ggplot() + 143 | geom_sf( 144 | data = land_outline, 145 | fill = "white", colour = "black", size = 0.7 146 | ) + 147 | geom_sf( 148 | data = countries, 149 | fill = NA, colour = "black", size = 0.2 150 | ) + 151 | geom_sf( 152 | data = regions, 153 | mapping = aes( 154 | colour = NAME, 155 | fill = NAME 156 | ), 157 | alpha = 0.3, size = 2.5 158 | ) + 159 | geom_sf( 160 | data = research_area, 161 | fill = NA, colour = "red", size = 0.8 162 | ) + 163 | shadowtext::geom_shadowtext( 164 | data = region_labels, 165 | mapping = aes(X, Y, label = NAME), 166 | colour = "black", 167 | bg.colour = "white", 168 | size = 9, 169 | angle = 45 170 | ) + 171 | theme_bw() + 172 | coord_sf( 173 | xlim = xlimit_B, ylim = ylimit_B, 174 | crs = st_crs("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 175 | ) + 176 | scale_color_manual( 177 | values = region_colors, 178 | breaks = region_order, 179 | labels = region_order 180 | ) + 181 | scale_fill_manual( 182 | values = region_colors, 183 | breaks = region_order, 184 | labels = region_order 185 | ) + 186 | theme( 187 | legend.position = "bottom", 188 | axis.title = element_blank(), 189 | axis.text = element_blank(), 190 | panel.grid.major = element_line(colour = "black", size = 0.3), 191 | axis.ticks = element_blank(), 192 | panel.border = element_rect(colour = "black", size = 2) 193 | ) + 194 | guides( 195 | color = FALSE, 196 | shape = FALSE, 197 | size = FALSE, 198 | fill = FALSE 199 | ) 200 | 201 | 202 | 203 | #### map_C #### 204 | 205 | distance_lines <- distance_matrix_spatial_long_half %>% 206 | dplyr::left_join( 207 | region_centers, 208 | by = c("regionA" = "NAME") 209 | ) %>% 210 | dplyr::left_join( 211 | region_centers, 212 | by = c("regionB" = "NAME"), 213 | suffix = c("_regionA", "_regionB") 214 | ) %>% 215 | dplyr::rowwise() %>% 216 | dplyr::mutate( 217 | x_a = st_coordinates(geometry_regionA)[,1], 218 | y_a = st_coordinates(geometry_regionA)[,2], 219 | x_b = st_coordinates(geometry_regionB)[,1], 220 | y_b = st_coordinates(geometry_regionB)[,2] 221 | ) %>% 222 | dplyr::ungroup() %>% 223 | dplyr::select( 224 | regionA, regionB, distance, x_a, y_a, x_b, y_b 225 | ) %>% 226 | dplyr::filter( 227 | regionA != regionB 228 | ) 229 | 230 | xlimit <- c(ex[1], ex[2]) 231 | ylimit <- c(ex[3], ex[4]) 232 | 233 | map_C <- ggplot() + 234 | geom_sf( 235 | data = land_outline, 236 | fill = "white", colour = "black", size = 0.7 237 | ) + 238 | geom_sf( 239 | data = countries, 240 | fill = NA, colour = "black", size = 0.2 241 | ) + 242 | geom_curve( 243 | data = distance_lines, 244 | mapping = aes( 245 | x = x_a, y = y_a, xend = x_b, yend = y_b, 246 | size = distance 247 | ), 248 | alpha = 0.5, 249 | curvature = 0.2, 250 | colour = "black" 251 | ) + 252 | scale_size_continuous( 253 | range = c(5, 0.5) 254 | ) + 255 | geom_sf( 256 | data = region_centers, 257 | mapping = aes( 258 | colour = NAME 259 | ), 260 | fill = NA, size = 16 261 | ) + 262 | geom_sf( 263 | data = research_area, 264 | fill = NA, colour = "red", size = 0.8 265 | ) + 266 | theme_bw() + 267 | coord_sf( 268 | xlim = xlimit, ylim = ylimit, 269 | crs = st_crs("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 270 | ) + 271 | theme( 272 | legend.position = "bottom", 273 | legend.box = "vertical", 274 | legend.title = element_text(size = 30, face = "bold"), 275 | legend.text = element_text(size = 15), 276 | axis.title = element_blank(), 277 | axis.text = element_blank(), 278 | panel.grid.major = element_line(colour = "black", size = 0.3), 279 | axis.ticks = element_blank(), 280 | panel.border = element_rect(colour = "black", size = 2) 281 | ) + 282 | guides( 283 | # color = guide_legend(title = "Regions", override.aes = list(shape = 1, size = 10), nrow = 4, byrow = TRUE), 284 | # size = guide_legend(title = "Spatial closeness", nrow = 1, byrow = TRUE), 285 | color = FALSE, 286 | size = FALSE, 287 | shape = FALSE 288 | ) + 289 | scale_color_manual( 290 | values = region_colors, 291 | breaks = region_order, 292 | labels = region_order 293 | ) 294 | 295 | 296 | 297 | #### combine maps #### 298 | 299 | combined_map <- plot_grid( 300 | map_B, 301 | map_C, 302 | labels = c("A", "B"), 303 | rel_heights = c(1, 1), 304 | nrow = 2, 305 | align = "h", 306 | axis = "lr", 307 | label_size = 35 308 | ) 309 | 310 | combined_map %>% 311 | ggsave( 312 | "analysis/figures/map_regions.jpeg", 313 | plot = ., 314 | device = "jpeg", 315 | scale = 1, 316 | dpi = 300, 317 | width = 330, height = 440, units = "mm", 318 | limitsize = F 319 | ) 320 | -------------------------------------------------------------------------------- /analysis/code/01_data_preparation_scripts/02_prepare_c14_data.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | #### set constants #### 4 | 5 | # c14 reference zero 6 | bol <- 1950 7 | # 2sigma range probability threshold 8 | threshold <- (1 - 0.9545) / 2 9 | 10 | 11 | 12 | #### data download #### 13 | 14 | # radonb <- c14bazAAR::get_RADONB() 15 | # save(radonb, file = "analysis/data/input_data/radonb_04.02.2019/radonb.RData") 16 | load("analysis/data/input_data/radonb_04.02.2019/radonb.RData") 17 | save(radonb, file = "analysis/data/tmp_data/radonb.RData") 18 | 19 | 20 | 21 | #### 14C calibration #### 22 | 23 | load("analysis/data/tmp_data/radonb.RData") 24 | 25 | dates <- radonb %>% 26 | tibble::as_tibble() %>% 27 | # remove dates without age 28 | dplyr::filter(!is.na(c14age) & !is.na(c14std)) %>% 29 | # remove dates outside of theoretical calibration range 30 | dplyr::filter(!(c14age < 71) & !(c14age > 46401)) 31 | 32 | dates_calibrated <- dates %>% 33 | dplyr::mutate( 34 | # add list column with the age density distribution for every date 35 | calage_density_distribution = Bchron::BchronCalibrate( 36 | ages = dates$c14age, 37 | ageSds = dates$c14std, 38 | calCurves = rep("intcal13", nrow(dates)), 39 | eps = 1e-06 40 | ) %>% 41 | # transform BchronCalibrate result to a informative tibble 42 | # this tibble includes the years, the density per year, 43 | # the normalized density per year and the information, 44 | # if this year is in the two_sigma range for the current date 45 | pbapply::pblapply( 46 | function(x) { 47 | x$densities %>% cumsum -> a # cumulated density 48 | bottom <- x$ageGrid[which(a <= threshold) %>% max] 49 | top <- x$ageGrid[which(a > 1-threshold) %>% min] 50 | tibble::tibble( 51 | age = x$ageGrid, 52 | dens_dist = x$densities, 53 | norm_dens = x$densities/max(x$densities), 54 | two_sigma = x$ageGrid >= bottom & x$ageGrid <= top 55 | ) 56 | } 57 | ) 58 | ) 59 | 60 | 61 | 62 | #### transform calBP age to calBC #### 63 | 64 | dates_calibrated$calage_density_distribution %<>% lapply( 65 | function(x) { 66 | x$age = -x$age + bol 67 | return(x) 68 | } 69 | ) 70 | 71 | save(dates_calibrated, file = "analysis/data/tmp_data/dates_calibrated.RData") 72 | 73 | # test plot to check the calibration result 74 | # library(ggplot2) 75 | # dates_calibrated$calage_density_distribution[[3]] %>% 76 | # ggplot() + 77 | # geom_point(aes(age, norm_dens, color = two_sigma)) 78 | 79 | 80 | 81 | #### filter time #### 82 | 83 | load("analysis/data/tmp_data/dates_calibrated.RData") 84 | 85 | # add artifical date id 86 | dates_calibrated <- dates_calibrated %>% 87 | dplyr::mutate( 88 | date_id = 1:nrow(.) 89 | ) 90 | 91 | # filter dates to only include dates in time range of interest 92 | dates_time_selection <- dates_calibrated %>% 93 | dplyr::mutate( 94 | in_time_of_interest = 95 | purrr::map(calage_density_distribution, function(x){ 96 | any( 97 | x$age >= -2200 & 98 | x$age <= -800 & 99 | x$two_sigma 100 | ) 101 | } 102 | ) 103 | ) %>% 104 | dplyr::filter( 105 | in_time_of_interest == TRUE 106 | ) %>% 107 | dplyr::select(-in_time_of_interest) 108 | 109 | save(dates_time_selection, file = "analysis/data/tmp_data/dates_time_selection.RData") 110 | 111 | 112 | 113 | #### select dates relevant for the research question #### 114 | 115 | load("analysis/data/tmp_data/dates_time_selection.RData") 116 | 117 | dates_research_selection <- dates_time_selection %>% 118 | # reduce variable selection to necessary information 119 | dplyr::select( 120 | -sourcedb, -c13val, -country, -shortref 121 | ) %>% 122 | # filter by relevant sitetypes 123 | dplyr::filter( 124 | sitetype %in% c( 125 | "Grave", "Grave (mound)", "Grave (flat) inhumation", 126 | "Grave (cremation)", "Grave (inhumation)", "Grave (mound) cremation", 127 | "Grave (mound) inhumation", "Grave (flat) cremation", "Grave (flat)", 128 | "cemetery" 129 | ) 130 | ) %>% 131 | # transform sitetype field to tidy data about burial_type and burial_construction 132 | dplyr::mutate( 133 | burial_type = ifelse( 134 | grepl("cremation", sitetype), "cremation", 135 | ifelse( 136 | grepl("inhumation", sitetype), "inhumation", 137 | "unknown" 138 | ) 139 | ), 140 | burial_construction = ifelse( 141 | grepl("mound", sitetype), "mound", 142 | ifelse( 143 | grepl("flat", sitetype), "flat", 144 | "unknown" 145 | ) 146 | ) 147 | ) %>% 148 | # reduce variable selection to necessary information 149 | dplyr::select( 150 | -sitetype 151 | ) 152 | 153 | save(dates_research_selection, file = "analysis/data/tmp_data/dates_research_selection.RData") 154 | 155 | 156 | 157 | #### remove dates without coordinates #### 158 | 159 | load("analysis/data/tmp_data/dates_research_selection.RData") 160 | 161 | dates_coordinates <- dates_research_selection %>% dplyr::filter( 162 | !is.na(lat) & !is.na(lon) 163 | ) 164 | 165 | save(dates_coordinates, file = "analysis/data/tmp_data/dates_coordinates.RData") 166 | 167 | 168 | 169 | #### crop date selection to research area #### 170 | 171 | load("analysis/data/tmp_data/dates_coordinates.RData") 172 | load("analysis/data/tmp_data/research_area.RData") 173 | 174 | # transform data to sf and the correct CRS 175 | dates_sf <- dates_coordinates %>% sf::st_as_sf(coords = c("lon", "lat")) 176 | sf::st_crs(dates_sf) <- 4326 177 | dates_sf %<>% sf::st_transform("+proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs") 178 | 179 | # get dates within research area 180 | dates_research_area <- sf::st_intersection(dates_sf, research_area) %>% 181 | sf::st_set_geometry(NULL) %>% 182 | dplyr::select(-id) 183 | 184 | # add lon and lat columns again 185 | dates_research_area %<>% 186 | dplyr::left_join( 187 | dates_coordinates[, c("date_id", "lat", "lon")], by = "date_id" 188 | ) 189 | 190 | save(dates_research_area, file = "analysis/data/tmp_data/dates_research_area.RData") 191 | 192 | 193 | 194 | #### remove labnr duplicates #### 195 | 196 | load("analysis/data/tmp_data/dates_research_area.RData") 197 | 198 | # identify dates without correct labnr 199 | ids_incomplete_labnrs <- dates_research_area$date_id[grepl('n/a', dates_research_area$labnr)] 200 | 201 | # remove labnr duplicates, except for those with incorrect labnrs 202 | duplicates_removed_dates_research_area_ids <- dates_research_area %>% 203 | dplyr::filter( 204 | !(date_id %in% ids_incomplete_labnrs) 205 | ) %>% 206 | dplyr::select(-calage_density_distribution) %>% 207 | c14bazAAR::as.c14_date_list() %>% 208 | c14bazAAR::remove_duplicates() %$% 209 | date_id 210 | 211 | # merge removed selection with incorrect labnr selection 212 | dates_prepared <- dates_research_area %>% 213 | dplyr::filter( 214 | date_id %in% c(duplicates_removed_dates_research_area_ids, ids_incomplete_labnrs) 215 | ) 216 | 217 | save(dates_prepared, file = "analysis/data/tmp_data/dates_prepared.RData") 218 | 219 | 220 | 221 | #### merge dates if multiple dates for one grave #### 222 | 223 | load("analysis/data/tmp_data/dates_prepared.RData") 224 | 225 | # merge information 226 | graves_prepared <- dates_prepared %>% 227 | dplyr::group_by(site, feature) %>% 228 | dplyr::do(res = tibble::as_tibble(.)) %$% 229 | res %>% 230 | pbapply::pblapply(function(x){ 231 | 232 | # check if there are multiple dates for one feature and if there's 233 | # a number in the feature variable 234 | if (nrow(x) > 1 & grepl("[0-9]", x$feature[1])) { 235 | 236 | # remove list column and apply data.frame merging function 237 | res <- x %>% 238 | dplyr::select(-calage_density_distribution) %>% 239 | dplyr::group_by(site) %>% 240 | dplyr::summarise_all( 241 | .funs = list(~c14bazAAR:::compare_and_combine_data_frame_values(.)) 242 | ) %>% 243 | dplyr::ungroup() 244 | 245 | # combine density distribution data.frames 246 | res$calage_density_distribution <- list(x$calage_density_distribution %>% purrr::reduce( 247 | function(a, b) { 248 | dplyr::full_join(a, b, by = "age") %>% 249 | dplyr::transmute( 250 | age = age, 251 | dens_dist = purrr::map2_dbl(dens_dist.x, dens_dist.y, function(n, m){sum(n, m, na.rm = T)}), 252 | norm_dens = dens_dist/max(dens_dist), 253 | two_sigma = (two_sigma.x | two_sigma.y) %>% ifelse(is.na(.), FALSE, .) 254 | ) 255 | } 256 | )) 257 | 258 | return(res) 259 | } else { 260 | return(x) 261 | } 262 | 263 | }) %>% 264 | do.call(rbind, .) %>% 265 | # replace missing values (NA) in the major variables 266 | dplyr::mutate( 267 | burial_type = tidyr::replace_na(burial_type, "unknown"), 268 | burial_construction = tidyr::replace_na(burial_construction, "unknown") 269 | ) %>% 270 | # remove graves without coordinates 271 | dplyr::filter( 272 | !is.na(lat) & !is.na(lon) 273 | ) 274 | 275 | save(graves_prepared, file = "analysis/data/tmp_data/graves_prepared.RData") 276 | -------------------------------------------------------------------------------- /review/proof_preparation_communication_1.md: -------------------------------------------------------------------------------- 1 | # Author affiliation 2 | 3 | The author affiliation changed in the meantime. I'm not working any longer at the Römisch-Germanisches Zentralmuseum. Instead, my affiliation is as follows: 4 | 5 | Clemens Schmid 6 | Institute of Archaeological Sciences 7 | University of Bern 8 | Mittelstrasse 43 9 | 3012 Bern, Switzerland 10 | 11 | The Email is correct and stays the same: clemens@nevrome.de 12 | 13 | # Permissions for the reproduction of artworks 14 | 15 | All artwork in this paper was prepared by me and I do not need any permissions. 16 | 17 | # Acknowledgement, funding and conflict of interest statements 18 | 19 | I hereby confirm that the acknowledgement, funding and conflict of interest statements are accurate. 20 | 21 | # Remarks of the Production Editor 22 | 23 | ## 1 Please check whether the caption of Figure 4 is correct as set. 24 | 25 | The caption is correct. 26 | 27 | ## 2 Please provide the significance of bold value in Table 3. 28 | 29 | I do not understand what you mean by significance or what might be missing here. In Table 2 and Table 3 all p-Values < 0.1 are printed bold. They indicate observations that are significant to a certain degree. The bold value in Table 3 already is a p-Value. 30 | 31 | ## 3 Please check whether the caption of Table 3 is correct as set. 32 | 33 | Yes, this is correct as set (see below). 34 | 35 | ## 4 Please provide photograph for the author ‘Clemens Schmid’. 36 | 37 | You'll find a picture attached to this email. 38 | 39 | ## 5 Please provide a 2-3 sentence biography for ‘Clemens Schmid’. 40 | 41 | You'll find that attached, too. 42 | 43 | ## 6 Please provide English translation for all the foreign-language titles in the references. 44 | 45 | The following translations were made by me and were not confirmed by the authors of these references: 46 | 47 | - Dabrowski, J. (2004). **Aeltere bronzezeit in Polen**. Warszawa, Poland: Wydawn. Instytutu Archeologii i Etnologii PAN. -> **Early Bronze Age in Poland**. 48 | 49 | - Falkenstein, F. (2017). **Zum Wandel der Bestattungssitten von der Hügelgräber- zur Urnenfelderkultur in Süddeutschland**. In D. Brandherm, & B. Nessel (Eds.), **Phasenübergänge Und Umbrüche Im Bronzezeitlichen Europa** (pp. 77–96). Bonn, Germany: Universitätsforschungen zur prähistorischen Archäologie. -> **On the change of burial customs from Tumulus to Urnfield culture in Southern Germany**, **Phase transitions and upheavals in Bronze Age Europe** 50 | 51 | - Häusler, A. (1977). **Die Bestattungssitten der frühen Bronzezeit zwischen Rhein und oberer Wolga, ihre Voraussetzungen und ihre Beziehungen**. Zeitschrift für Archäologie, 11, 13–48. -> **The burial rites of the early Bronze Age between the Rhine and Upper Volga, their prerequisites and relationships** 52 | 53 | - Häusler, A. (1994). **Grab-und Bestattungssitten des Neolithikums und der frühen Bronzezeit in Mitteleuropa**. Zeitschrift für Archäologie, 28, 23–61. -> **Grave and burial rites of the Neolithic and Early Bronze Age in Central Europe** 54 | 55 | - Häusler, A. (1996). **Totenorientierung und geographischer Raum**. In S. Ostritz, & R. Einicke (Eds.), Terra et Praehistoria. Festschrift Für Klaus-Dieter Jäger, number 9 in Beiträge zur Ur- und Frühgeschichte Mitteleuropas (pp. 61–92). Wilkau-Hasslau, Germany: Beier & Beran. -> **Grave orientation and geographical space** 56 | 57 | - Hofmann, K. P. (2008). **Der rituelle Umgang mit dem Tod: Untersuchungen zu bronze- und früheisenzeitlichen Brandbestattungen im Elbe-Weser-Dreieck** (Number 32 in Schriftenreihe des Landschaftsverbandes der ehemaligen Herzogtümer). Oldenburg, Germany: Bremen & Verden. -> **The ritual processing of death: Studies on Bronze Age and Early Iron Age burials in the Elbe-Weser Triangle** 58 | 59 | - Kimmig, W. (1964). **Seevölkerbewegung und Urnenfelderkultur: ein archäologisch-historischer Versuch** (Beihefte der Bonner Jahrbücher). Cologne, Germany: Böhlau Verlag -> **Sea Peoples Invasion and Urnfield Culture: An archaeological-historical experiment** 60 | 61 | - Müller-Scheeßel, N. (2009). **Variabilität und Wandel von Bestattungspraktiken am Beispiel des hallstattzeitlichen Gräberfeldes von Schirndorf**. Ethnographisch-archäologische Zeitschrift, 50, 519–537. -> **Variability and change of burial traditions based on the example of the Hallstatt cemetery of Schirndorf** 62 | 63 | - Nikulka, F. (2016). **Archäologische Demographie: Methoden, Daten und Bevölkerung der europäischen Bronze- und Eisenzeiten**. Leiden, The Netherlands: Sidestone Press. -> **Archaeological Demography: Methods, Data and Population of the European Bronze and Iron Ages** 64 | 65 | - Schmid, C. (2018). **Ein computerbasiertes Cultural Evolution Modell zur Ausbreitungsdynamik europäisch-bronzezeitlicher Bestattungssitten** (Master’s thesis). Christian-Albrechts Universität, Kiel, Germany. -> **A computer-based Cultural Evolution model for the expansion dynamics of European Bronze Age burial rites** 66 | 67 | ## 7 Please provide page range and publisher details for ‘Henrich & McElreath, 2007’. 68 | 69 | The correct bibtex string for that reference should be: 70 | 71 | ``` 72 | @Article{henrichDualinheritanceTheoryEvolution2007, 73 | title = {Dual-Inheritance Theory: The Evolution of Human Cultural Capacities and Cultural Evolution}, 74 | shorttitle = {Dual-Inheritance Theory}, 75 | doi = {10.1093/oxfordhb/9780198568308.013.0038}, 76 | language = {en}, 77 | journal = {Oxford Handbook of Evolutionary Psychology}, 78 | author = {Joseph Henrich and Richard McElreath}, 79 | editor = {Louise Barrett and Robin Dunbar}, 80 | month = {apr}, 81 | year = {2007}, 82 | publisher = "Oxford University Press", 83 | pages = {555-570}, 84 | } 85 | ``` 86 | 87 | ## 8 Please provide missing Handling Editor. 88 | 89 | The main editor I had contact with was: 90 | 91 | Tom Froese (DPhil, MEng) 92 | Editor-in-Chief, Adaptive Behavior 93 | Coordinator, "4E Cognition Group” 94 | Principal Investigator, Institute for Applied Mathematics and Systems Research (IIMAS) 95 | National Autonomous University of Mexico (UNAM) 96 | Center for the Sciences of Complexity (C3), UNAM 97 | E-Mail: t.froese@gmail.com 98 | Web: http://froese.wordpress.com 99 | 100 | Or do you mean the special issue editors? 101 | 102 | # Other corrections 103 | 104 | - General observation: You decided to write some proper nouns (?) *with* capital letters at the beginning and others *without*. See for example on page 2: **cultural evolution** vs **Neutral Transmission** vs. **Stylistic variability**. In the title of the paper you corrected my spelling from **Cultural Transmission** to **cultural transmission**. What do you suggest to standardize the spelling of these terms? There are also proper nouns in the conclusion (e.g., **Cultural complexity**) that are not indicated as such at all. No capital letters, no italics. How to deal with these? 105 | 106 | ## Introduction 107 | 108 | - Page 2, Column 2, Paragraph 1, Line 4: **Evolutionism** should be put in italics 109 | 110 | - Page 2, Column 2, Paragraph 1, Line 7: I would like to replace **capacity,for example, ceramic** with **capacity, such as ceramic** 111 | 112 | ## Materials and Methods 113 | 114 | - Page 3, Column 1, Paragraph 2, Line 4: **Repository** -> **repository** 115 | 116 | - Page 4, Column 2, Paragraph 4, Line 1: The first **The** in **The 1160 dates were** has to be removed. This sentence could also be replaced with **Of the 1701 dates, 1160 were measured on** 117 | 118 | - Page 5, Column 1, Paragraph 1, Line 1: **burial type** and **burial construction** should be put in italics 119 | 120 | - Page 6, Column 2, Paragraph 3, Line 7: Missing full stop at the end of the paragraph 121 | 122 | - Page 6, Column 2, Paragraph 5, Line 4: Missing plural form. **1400/200 = 7 section** -> **1400/200 = 7 sections** 123 | 124 | - Page 6, Column 2, Paragraph 5, Line 12: No space after the R function name. **mantel ()** -> **mantel()** 125 | 126 | - Page 6, Column 2, Paragraph 5, Line 12: Missing space: **Table 3– C** -> **Table 3 – C** 127 | 128 | ## Results 129 | 130 | - Page 8-9: The though experiment in 3.1 should be put in italics or highlighted in another way. The reviewers specifically asked me to indicate the special nature of these paragraphs 131 | 132 | - Page 9, Column 2, Paragraph 3, Line 7: Please replace **developed** with **calculated**. **how correctly or incorrectly the proxy developed from Radon-B** -> **how correctly or incorrectly the proxy calculated from Radon-B** 133 | 134 | - Page 10, Column 1, Paragraph 2, Line 3: This small paragraph should end in a colon. **For the relationship between the SED networks and the spatial distance network, several observations result from Table 2 and Figure 6:** 135 | 136 | ## Discussion 137 | 138 | - Page 10, Column 1, Paragraph 6, Line 1: I would like to introduce this question in a slightly different way: **One major question asked in this article was, "If the main trends** -> **One major question asked in this article was, if "the main trends** 139 | 140 | - Page 10, Column 2, Paragraph 2, Line 10: You corrected **reaches** to **reach**, but I'm not sure if this is correct. I believe it should be **Diachronically, the amount of data is consistently low and reaches a minimum in the Middle Bronze Age.**. But maybe I'm wrong 141 | 142 | - Page 11, Column 2, Paragraph 1, Line 1: Missing space: **Lower Saxony.Some** -> **Lower Saxony. Some** 143 | 144 | - Page 11, Column 2, Paragraph 2, Line 4: The specific denomination **large parts of East of Southern Sweden** is overly complicated and can be replaced with only **large parts of Southern Sweden** 145 | 146 | - Page 12, Column 2, Paragraph 1, Line 3: Instead of **the second one had a larger scope** it's better to say **the second one has a larger scope** 147 | 148 | - Page 12, Column 2, Paragraph 5, Line 2: Plural: **another purpose and its application in this context** -> **another purpose and their application in this context** 149 | 150 | ## Conclusion 151 | 152 | - Page 13, Column 2, Paragraph 2, Line 1: **Cultural complexity** should be treated as a proper noun and put in italics. 153 | 154 | ## Supplementary remarks 155 | 156 | - Page 14, Column 2, Paragraph 2, Line 9: Please replace **further, deviant burial rituals** with **other burial rituals** 157 | 158 | - Page 14, Column 2, Paragraph 3: This paragraph should end in a colon. **Concerning the primary variables burial type and burial construction, further special effects must be taken into account:** 159 | 160 | - Page 15, Column 1, Paragraph 5, Line 11: Please replace **despite this restriction, actions such as** with **despite this restriction, behaviour such as** 161 | 162 | ## Acknowledgements 163 | 164 | - Page 15, Column 2, Paragraph 3, Line 13: Please remove the **C++** in **valuable C++ code review by Benny Baumann**, so that it becomes **valuable code review by Benny Baumann** 165 | 166 | ## Figure and table captions 167 | 168 | - Figure 3 & 4: I made a mistake here. n is not the number of **dates**, but the number of **graves**. The last sentence therefore has to be changed to **n in the facet labels equals the total number of available graves with information for the variable (cf. Table 1).** 169 | 170 | - Figure 5: Wrong minus symbol: **Plot matrix of the region–region-squared Euclidean distance time series.** should be changed to **Plot matrix of the region–region squared Euclidean distance time series.** 171 | 172 | - Table 2: Why is **(A)** put in bold? 173 | 174 | - Table 3: The title should mention that these are the results for the **cultural** distances: **Results for the correlation of the two cultural distances.** 175 | -------------------------------------------------------------------------------- /analysis/code/04_plot_scripts/correlation_time_series.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | library(ggplot2) 3 | library(cowplot) 4 | 5 | #### load and prepare grave amount time series data ### 6 | 7 | load("analysis/data/tmp_data/development_amount_burial_construction.RData") 8 | load("analysis/data/tmp_data/development_amount_burial_type.RData") 9 | 10 | data_amount_range_burial_construction <- amount_development_burial_construction %>% 11 | dplyr::ungroup() %>% 12 | dplyr::filter( 13 | idea != "unknown" 14 | ) %>% 15 | dplyr::group_by(region, timestep) %>% 16 | dplyr::summarise( 17 | sum_n = sum(n) 18 | ) %>% 19 | dplyr::ungroup() %>% 20 | dplyr::group_by(timestep) %>% 21 | dplyr::summarise( 22 | min_n = min(sum_n), 23 | max_n = max(sum_n), 24 | median_n = median(sum_n), 25 | first_quartile_n = quantile(sum_n)[2], 26 | third_quartile_n = quantile(sum_n)[4] 27 | ) 28 | 29 | data_amount_range_burial_type <- amount_development_burial_type %>% 30 | dplyr::ungroup() %>% 31 | dplyr::filter( 32 | idea != "unknown" 33 | ) %>% 34 | dplyr::group_by(region, timestep) %>% 35 | dplyr::summarise( 36 | sum_n = sum(n) 37 | ) %>% 38 | dplyr::ungroup() %>% 39 | dplyr::group_by(timestep) %>% 40 | dplyr::summarise( 41 | min_n = min(sum_n), 42 | max_n = max(sum_n), 43 | median_n = median(sum_n), 44 | first_quartile_n = quantile(sum_n)[2], 45 | third_quartile_n = quantile(sum_n)[4] 46 | ) 47 | 48 | 49 | 50 | #### prepare mean grave amounts for the correlation plot #### 51 | 52 | mean_median_burial_construction <- data_amount_range_burial_construction %>% 53 | dplyr::mutate( 54 | time = cut( 55 | timestep, 56 | breaks = seq(-2200, -800, 200), 57 | labels = paste(seq(2200, 1000, -200), "-", seq(2000, 800, -200)), 58 | right = FALSE, 59 | include.lowest = TRUE 60 | ) 61 | ) %>% 62 | dplyr::group_by(time) %>% 63 | dplyr::summarise( 64 | mean_median_n = mean(median_n) 65 | ) 66 | 67 | mean_median_burial_type <- data_amount_range_burial_type %>% 68 | dplyr::mutate( 69 | time = cut( 70 | timestep, 71 | breaks = seq(-2200, -800, 200), 72 | labels = paste(seq(2200, 1000, -200), "-", seq(2000, 800, -200)), 73 | right = FALSE, 74 | include.lowest = TRUE 75 | ) 76 | ) %>% 77 | dplyr::group_by(time) %>% 78 | dplyr::summarise( 79 | mean_median_n = mean(median_n) 80 | ) 81 | 82 | mean_median_both <- rbind(mean_median_burial_construction, mean_median_burial_type) %>% 83 | dplyr::group_by(time) %>% 84 | dplyr::summarise( 85 | mean_median_n = mean(mean_median_n) 86 | ) 87 | 88 | 89 | 90 | #### remove negative sign #### 91 | 92 | data_amount_range_burial_construction %<>% dplyr::mutate(timestep = -timestep) 93 | data_amount_range_burial_type %<>% dplyr::mutate(timestep = -timestep) 94 | 95 | 96 | 97 | #### data amount plot #### 98 | 99 | data_amount_plot <- ggplot() + 100 | geom_ribbon( 101 | data = data_amount_range_burial_type, 102 | mapping = aes( 103 | x = timestep, 104 | ymin = first_quartile_n, 105 | ymax = third_quartile_n 106 | ), 107 | fill = "#0072B2", 108 | alpha = 0.25 109 | ) + 110 | geom_ribbon( 111 | data = data_amount_range_burial_construction, 112 | mapping = aes( 113 | x = timestep, 114 | ymin = first_quartile_n, 115 | ymax = third_quartile_n 116 | ), 117 | fill = "#009E73", 118 | alpha = 0.25 119 | ) + 120 | geom_line( 121 | data = data_amount_range_burial_type, 122 | mapping = aes( 123 | x = timestep, 124 | y = median_n 125 | ), 126 | colour = "#0072B2", 127 | size = 1.5 128 | ) + 129 | geom_line( 130 | data = data_amount_range_burial_construction, 131 | mapping = aes( 132 | x = timestep, 133 | y = median_n 134 | ), 135 | linetype = "dashed", 136 | colour = "#009E73", 137 | size = 1.5 138 | ) + 139 | theme_bw() + 140 | ylab("Graves per region") + 141 | xlab("") + 142 | scale_x_reverse( 143 | limits = c(2200, 800), expand = c(0, 0), 144 | position = "top", 145 | breaks = seq(2000, 1000, -200), 146 | minor_breaks = NULL 147 | ) + 148 | theme( 149 | axis.text = element_text(size = 25), 150 | axis.text.x = element_text(angle = 45, hjust = 0), 151 | axis.title = element_text(size = 25), 152 | plot.title = element_text(size = 25, face = "bold"), 153 | panel.border = element_rect(colour = "black", size = 2), 154 | plot.margin = unit(c(1,1,1,2), "lines") 155 | ) 156 | 157 | 158 | 159 | #### load and prepare correlation data ### 160 | 161 | load("analysis/data/tmp_data/mantel_sed_spatial_burial_type.RData") 162 | mantel_burial_type_spatial <- mantel_test_results 163 | load("analysis/data/tmp_data/mantel_sed_spatial_burial_construction.RData") 164 | mantel_burial_construction_spatial <- mantel_test_results 165 | load("analysis/data/tmp_data/mantel_sed_burial_type_burial_construction.RData") 166 | mantel_burial_construction_burial_type <- mantel_test_results 167 | load("analysis/data/tmp_data/mantel_sed_burial_type_burial_construction_spatial.RData") 168 | mantel_burial_type_burial_construction_spatial <- mantel_test_results 169 | 170 | mantel_burial_type_spatial %<>% 171 | dplyr::mutate( 172 | context = "A: type & spatial distance" 173 | ) 174 | mantel_burial_construction_spatial %<>% 175 | dplyr::mutate( 176 | context = "B: construction & spatial distance" 177 | ) 178 | mantel_burial_construction_burial_type %<>% 179 | dplyr::mutate( 180 | context = "C: type & construction distance" 181 | ) 182 | mantel_burial_type_burial_construction_spatial %<>% 183 | dplyr::mutate( 184 | context = "D: type & construction + spatial distance" 185 | ) 186 | 187 | mantel <- rbind( 188 | mantel_burial_type_spatial, 189 | mantel_burial_construction_spatial, 190 | mantel_burial_construction_burial_type, 191 | mantel_burial_type_burial_construction_spatial 192 | ) 193 | 194 | # hacky class manipulation: time without sign of years 195 | mantel$time <- factor( 196 | gsub("-(?=[0-9])", "", mantel$time, perl = TRUE), 197 | levels = gsub("-(?=[0-9])", "", levels(mantel$time), perl = TRUE) 198 | ) 199 | 200 | 201 | 202 | #### statistical significance #### 203 | 204 | # establish significance classes and create subsets only with significant results 205 | mantel <- mantel %>% 206 | dplyr::mutate( 207 | signif_class = cut( 208 | mantel$signif, 209 | breaks = c(0, 0.05, 0.1, 1), 210 | labels = c("p < 0.05", "p < 0.1", "p > 0.1 (not significant)"), 211 | ordered_result = TRUE 212 | ) 213 | ) 214 | 215 | signifs_0.05 <- mantel %>% dplyr::filter( 216 | signif_class == "p < 0.05" 217 | ) 218 | 219 | signifs_0.1 <- mantel %>% dplyr::filter( 220 | signif_class == "p < 0.1" 221 | ) 222 | 223 | 224 | 225 | #### add mean median of the grave per year number to the mantel results #### 226 | 227 | mantel_B <- mantel %>% dplyr::filter( 228 | context == "B: construction & spatial distance" 229 | ) %>% 230 | dplyr::left_join( 231 | mean_median_burial_construction, by = c("time") 232 | ) 233 | 234 | mantel_A <- mantel %>% dplyr::filter( 235 | context == "A: type & spatial distance" 236 | ) %>% 237 | dplyr::left_join( 238 | mean_median_burial_type, by = c("time") 239 | ) 240 | 241 | mantel_C <- mantel %>% dplyr::filter( 242 | context == "C: type & construction distance" 243 | ) %>% 244 | dplyr::left_join( 245 | mean_median_both, by = c("time") 246 | ) 247 | 248 | mantel_D <- mantel %>% dplyr::filter( 249 | context == "D: type & construction + spatial distance" 250 | ) %>% 251 | dplyr::left_join( 252 | mean_median_both, by = c("time") 253 | ) 254 | 255 | mantel <- rbind(mantel_A, mantel_B, mantel_C, mantel_D) 256 | 257 | 258 | 259 | #### correlation time series plot #### 260 | 261 | correlation_time_series_plot <- ggplot() + 262 | geom_hline( 263 | yintercept = 0, 264 | colour = "red", 265 | size = 2 266 | ) + 267 | geom_point( 268 | data = mantel, 269 | mapping = aes( 270 | x = time, 271 | y = statistic, 272 | colour = context, 273 | alpha = mean_median_n 274 | ), 275 | size = 8, 276 | shape = 15 277 | ) + 278 | geom_point( 279 | data = mantel, 280 | mapping = aes( 281 | x = time, 282 | y = statistic, 283 | colour = context 284 | ), 285 | size = 3 286 | ) + 287 | geom_line( 288 | data = mantel, 289 | mapping = aes( 290 | x = time, 291 | y = statistic, 292 | colour = context, 293 | group = context, 294 | linetype = context, 295 | size = context 296 | ) 297 | ) + 298 | geom_point( 299 | data = signifs_0.05, 300 | mapping = aes( 301 | x = time, 302 | y = statistic 303 | ), 304 | shape = 0, 305 | size = 8, 306 | stroke = 2, 307 | colour = "red" 308 | ) + 309 | annotate( 310 | geom = "text", 311 | x = "1800 - 1600", y = 0.48, 312 | label = "p < 0.05", 313 | color = "red", 314 | size = 8 315 | ) + 316 | geom_point( 317 | data = signifs_0.1, 318 | mapping = aes( 319 | x = time, 320 | y = statistic 321 | ), 322 | shape = 0, 323 | size = 8, 324 | stroke = 2, 325 | colour = "orange" 326 | ) + 327 | annotate( 328 | geom = "text", 329 | x = "1600 - 1400", y = 0.4, 330 | label = "p < 0.1", 331 | color = "orange", 332 | size = 8 333 | ) + 334 | guides( 335 | fill = guide_legend(override.aes = list(size = 15)), 336 | colour = guide_legend(override.aes = list(shape = NA), order = 1), 337 | linetype = guide_legend(order = 1), 338 | size = guide_legend(order = 1), 339 | alpha = guide_legend(order = 2) 340 | ) + 341 | scale_colour_manual( 342 | name = "Distance correlations", 343 | values = c( 344 | "A: type & spatial distance" = "#0072B2", 345 | "B: construction & spatial distance" = "#009E73", 346 | "C: type & construction distance" = "black", 347 | "D: type & construction + spatial distance" = "black" 348 | ) 349 | ) + 350 | scale_alpha_continuous( 351 | name = expression(bold(frac(Graves,Region%*%Year))) 352 | ) + 353 | scale_linetype_manual( 354 | name = "Distance correlations", 355 | values = c( 356 | "A: type & spatial distance" = "solid", 357 | "B: construction & spatial distance" = "dashed", 358 | "C: type & construction distance" = "dotted", 359 | "D: type & construction + spatial distance" = "dotted" 360 | ) 361 | ) + 362 | scale_size_manual( 363 | name = "Distance correlations", 364 | values = c( 365 | "A: type & spatial distance" = 2, 366 | "B: construction & spatial distance" = 2, 367 | "C: type & construction distance" = 2, 368 | "D: type & construction + spatial distance" = 1 369 | ) 370 | ) + 371 | theme_bw() + 372 | theme( 373 | legend.title = element_text(size = 25, face = "bold"), 374 | legend.text = element_text(size = 25), 375 | legend.position = c(0.45, -0.52), 376 | legend.direction = "vertical", 377 | legend.box = "horizontal", 378 | legend.key.width = unit(5, "line"), 379 | legend.key.height = unit(2, "line"), 380 | axis.text = element_text(size = 25), 381 | axis.text.x = element_text(angle = 45, hjust = 1), 382 | axis.title = element_text(size = 25), 383 | plot.title = element_text(size = 25, face = "bold"), 384 | panel.border = element_rect(colour = "black", size = 2), 385 | plot.margin = unit(c(1,1,15,2), "lines") 386 | ) + 387 | ylab("Correlation coefficient") + 388 | xlab("Time steps in years calBC") 389 | 390 | 391 | 392 | #### combine plots #### 393 | 394 | combined_plot <- plot_grid( 395 | data_amount_plot, 396 | correlation_time_series_plot, 397 | labels = c("A", "B"), 398 | nrow = 2, 399 | rel_heights = c(1, 3), 400 | align = "v", 401 | label_size = 35, 402 | vjust = 1.5, 403 | hjust = 0 404 | ) 405 | 406 | ggsave( 407 | "analysis/figures/correlation_time_series.jpeg", 408 | plot = combined_plot, 409 | device = "jpeg", 410 | scale = 1, 411 | dpi = 300, 412 | width = 300, height = 400, units = "mm", 413 | limitsize = F 414 | ) 415 | -------------------------------------------------------------------------------- /review/answer_to_review_1.md: -------------------------------------------------------------------------------- 1 | # Reviewer: 1 2 | 3 | ## Comments to the Author: 4 | 5 | > A lot of work has been already done in quantifying changes in funerary practices during the Bronze Age in central and south-western Europe through the analysis of radiocarbon-dated archaeological contexts. I recommend citing these works in the paper, since the adopted approach is similar. 6 | 7 | > - Capuzzo G, Barceló JA. 2015. Cultural changes in the 2nd millennium BC: a Bayesian examination of radiocarbon evidence from Switzerland and Catalonia. World Archaeology 47 (4) Special Issue: Bayesian approaches to Prehistoric Chronologies:622-641. 8 | > - Capuzzo G, López Cachero FJ. 2017. De la inhumación a la cremación en el nordeste peninsular: cronología y sociedad. In: Barceló JA, Bogdanovic I, Morell B, editors. Iber-Crono 2016. Cronometrías Para la Historia de la Península Ibérica (Chronometry for the History of the Iberian Peninsula), Barcelona (Spain), 17-19 October 2016:192-208. 9 | > - Capuzzo G, Barceló JA (in press). Cremation burials in Central and Western Europe: quantifying an adoption of innovation in the 2nd millennium BC. In: Kneisel J, Nakoinz O, Barcelo J, editors. Turning Points and Change in Bronze Age Europe (2400 – 800 BC). Modes of change – inhumation versus cremation in Bronze Age burial rites. Proceedings of the International Workshop "Socio-Environmental Dynamics over the Last 12,000 Years: The Creation of Landscapes IV (24th-27th March 2015) in Kiel. Universitätsforschungen zur Prähistorischen Archäologie 10 | > - Capuzzo G. 2014. Space-temporal Analysis of Radiocarbon Evidence and Associated Archaeological Record: from Danube to Ebro Rivers and from Bronze to Iron Ages. Ph.D. thesis, Autonomous University of Barcelona. 11 | 12 | I was not aware of this work and added a paragraph in the introduction to reference it. It is indeed relevant. 13 | 14 | > In the paper, it’s very high the amount of data, for which the archaeological information regarding the type of burial and funerary rite is lacking. At table 1, page 4, we can clearly detect that for 60% of the dates associated to cremation burials we have no information regarding the type of funerary structure. For 37% of the inhumations, no information about the funerary structure is available. Moreover, for 32% of the dataset (559 radiocarbon dates out of 1701) we do not have any kind of information regarding neither the funerary rite nor the burial structure. This lack of data obliges the author to consider carefully the results reached in the paper. It’s relevant to highlight all the biases of the prosed research and how the conclusion can be misleading due to the quality of available data. In particular, when the statistical analyses carried out on data aim to explore in the details the cultural distance among the different regions. 15 | 16 | This is true and I tried to emphasise the limitations of the data in the discussion. The challenges are not confined on the amount of data, but also concern its meaning and origin. The supplementary remarks cover these problems in detail. 17 | 18 | I now modified the Figures 3&4 as well as the Table 1 to provide an overview over the actual amount of data available. I have also added several short comments/sentences in various sections of the paper to better address the small sample size issue. 19 | 20 | ## There are some typing error in the manuscript: 21 | 22 | > Line 28 page 2: can be described 23 | 24 | Fixed. 25 | 26 | > Line 58 page 4: How should the correlation 27 | 28 | Fixed. 29 | 30 | > Line 2 page 5: Listed are the overall 31 | 32 | Fixed. 33 | 34 | > I advise the author to review carefully the text. 35 | 36 | > At lines 48-50, page 2, the bibliographic reference to Dunnell is missing. 37 | 38 | Fixed. 39 | 40 | > Regarding the images, it would be preferable not to use negative number in order to indicate years BC. 41 | 42 | Done. 43 | 44 | # Reviewer: 2 45 | 46 | ## Comments to the Author: 47 | 48 | > I had the chance to read the manuscript entitled “Evaluating Cultural Transmission in Bronze Age burial rites of Central, Northern and North-western Europe using radiocarbon data” authored by C. Schimd. This is an interesting paper that combines empirical analysis of Bronze age burial sites across Europe with a computer simulation of intergroup cultural transmission. The manuscript is well written, I enjoyed reading it, and think that the core findings are definitely of interest for archaeologist working on Bronze age Europe and for those interested in the application of cultural evolutionary framework. I am thus keen to recommend its publication, although I think several issues needs to be addressed before this. 49 | 50 | > Firstly, my impression is that the author is trying to squeeze perhaps a bit too much in a single paper. I felt this was particularly the case of the computer simulation model which is almost thrown in in the mix, without much discussion on model parameters (see below). I would be tempted to suggest removing this entirely and include this into another paper. 51 | 52 | After careful deliberation, I decided to follow this advice. The simulation (1) does not add information that would be absolutely essential for the core topics, (2) reduces the overall comprehensibility due to the terminology that has to be introduced to describe it and (3) cannot be adequately presented and discussed here without overstraining the initial scope of the paper. 53 | 54 | I removed the simulation here. A future paper will present it together with other simulation approaches. 55 | 56 | > Secondly, I feel like the empirical analyses have too much preprocessing. The raw data provides spatial and temporal coordinates of individual burials, yet these are combined spatially and chronologically first and analysed as aggregates. As a consequence: 1) there is a substantial loss of spatial information; 2) sampling error is effectively disregarded (i.e. mantel tests are based on proportion values that are calculated for regions with very different samples sizes) and strictly speaking the samples are also non-independent (i.e. a large site with multiple burials can strongly bias the proportions of a particular region); and 3) there is an increased risk of ecological fallacy/Simpson’s paradox. I take this aggregation provides a direct mapping to existing literature, but I am not convinced that this is worth sacrificing so much. 57 | 58 | The decision to create discrete spatial area classes is necessary to establish subsets of dates that can be used for time series calculation. I'm not aware of a methodological approach where time series could be constructed without some sort of aggregation. The equal area size approach applied here for the region definition causes their size to be very big due to the currently overall small amount of data. I expect this to change in the future and the analysis can be redone then with more samples and much smaller areas. 59 | 60 | So: The criticism listed here is valid and I added it in the *Discussion* section. I considered a complete revision of the time series construction methodology, but since I (1) am still convinced that it is scientifically sound and reproducible, and (2) do not know a fundamentally better approach that avoids these risks completely, I suggest publishing as it is for the community of practice to discuss and improve. 61 | 62 | > Thirdly, the author implies that the scripts used for his analysis are supplied but there are no links on the article to any repository and I did not find any electronic supplementary material. As the author is well aware, we need to do our best to make our work fully reproducible. 63 | 64 | This is a result of miscommunication with the special issue editors. I added links to the relevant repositories now. 65 | 66 | ## Minor points: 67 | 68 | > Page 1, Column 2, Lines 52-43: “Do time series ... spatial distance”. I think this question should be phrased better. Eg. What does “meaningful” mean in this context? 69 | 70 | Rephrased. 71 | 72 | > Page 2, Column 1, Line 9: “[...] adaptive behaviour”. Not necessarily. 73 | 74 | Rephrased. 75 | 76 | > Page 2, Column 1, Line 15: “explicitly adopted the terminology of Cultural evolution”. This reads as if only the terminology is adopted? Rephrase? 77 | 78 | Rephrased. 79 | 80 | > Page 2, Column 1, Lines 58. Not sure what “random dominance of similar traits” means - should be rephrased. 81 | 82 | Rephrased. 83 | 84 | > Page 3, Column 1, Line 33. Please provide a link to the repository with the code. 85 | 86 | Done. 87 | 88 | > Page 3, Column 2, Lines 40-44. The definition of these regions seems rather arbitrary and necessary. Why create such an artificial unit when the spatial coordinates are available? 89 | 90 | Please see the reply above. 91 | 92 | > Page 3, Column 2, Line 60. “For the remaining 154 dates...”. I assume these dates were excluded as we don’t know whether they are terrestrial or marine? Also, the paragraph mentions “bones and teeth”, are there any risks of aquatic diet determining a reservoir effect? 93 | 94 | These dates were not excluded to avoid further reduction of the amount of data. It is not possible to consider these dating effects on this scale, as it would require to study all radiocarbon dates and their archaeological context individually. I agree that it might be necessary to do so, but this is not an endeavour that can be undertaken without long-term project funding. Marine reservoir effect is only one of the possible problems relevant here in addition to the Old wood effect or the human 14C-residence ("adult") effect. Not to mention cultural phenomena like secondary treatment of the body. I added a paragraph about this in the *Data quality* section. 95 | 96 | > Page 4, Column 1, Lines 57-59. Why not use directly the summed probabilities? 97 | 98 | This is a good idea and I will try this in the future. For this paper I decided not to do so, to increase the readability of the time series of absolute amounts (Figure 3&4 A). Each grave represents the presence of an idea during a certain period of time and the presence of this idea may very well be assumed before and after the event of the actual burial. 99 | 100 | > Page 4, Columns 1-2, Lines 58-60; 1-8. This is a major issue. Perhaps it is worth bootstrap confidence interval for these proportions? This way both sample size and sample independence could be tackled. Also, please provide the sample size for each region. 101 | 102 | I'm very interested in methods to assign a measure of confidence to the results for individual regions and times. Figure 3&4 are deliberately constructed to juxtapose the relative proportion with the amount of graves available. I understand this as an object of future research. I reworked Table 1 and Figure 3&4 for a better presentation of the sample size per region. 103 | 104 | > Page 4, Column 2, Lines 43-56. I think it is worth computing partial mantel tests so that the correlation between burial type and construction can take into account geography. 105 | 106 | A good idea! Done. I split Table 2 to present the results, added them to the new version of Figure 6 and addressed them in the text. 107 | 108 | > Page 5, Column 1, Line 24. Perhaps worth making this a subsection? 109 | 110 | I removed the simulation. See my reply above. 111 | 112 | > Page 5, Column 1, Lines 24-60. I have several issues with this model. The idea here is to emulate the observed data so we can build expectations that can be directly compared against empirical patterns. But I do find several issues: 1) How is Ng=100 justified? This seems a somewhat arbitrary number for a parameter that is likely going to play a significant role in the amount of drift in the system? 2) I understand each time-step is 20 years. Why? I assume this is related to generation length but this ought to be discussed; 3) Is the model supposed to reach an equilibrium state? If this is the case I don’t think 70 time-steps and Ng=100 is sufficient for this. If the answer is no, the initial condition of the system shouldn’t be random and perhaps be informed from the empirical data. 113 | 114 | I will consider this important questions in a future publication. 115 | 116 | > Figure 3. These are very nice plots - I would add the sample sizes for each region though. 117 | 118 | Done. 119 | 120 | > Figure 6. I find these plots a bit messy and with too much information. I also don’t see much the point of testing for significance the results of each simulation run - they are effectively samples from the same generative process so I think testing them does not make much sense? 121 | 122 | Figure 6 is much simpler now without simulation results. It only contains time series of distance correlation. 123 | -------------------------------------------------------------------------------- /article/04_Discussion.Rmd: -------------------------------------------------------------------------------- 1 | # Discussion {#discussion} 2 | 3 | ## Time series {#time-series-discussion} 4 | 5 | One major question asked in this paper was, if *the main trends in the distribution of burial rites in Bronze Age Europe can be detected in openly available bulk radiocarbon data?*. This is the case. The narrative in section \ref{time-series-results} is surprisingly similar to the one presented by @hardingEuropeanSocietiesBronze2000a. The following paragraphs contain a short evaluation of the time series in Figure \ref{development_burial_type} and \ref{development_burial_construction} in the light of the archaeological state of research for each region. 6 | 7 | `r a("Southeastern Central Europe")`^[Amount of graves in Radon-B for this region.]: 8 | The artificial circular region *Southeastern Central Europe* comprises the eastern part of Austria (Upper Austria, Lower Austria, Styria, Burgenland), the northwest of Hungary, Western Slovakia, Moravia and large parts of Bohemia (Figure \ref{map_regions} A). The density of ^14^C data on graves in Radon-B is low -- dates are available from the various regions, but large areas are without evidence. Diachronically the amount of data is consistently low and reaches a minimum in the Middle Bronze Age. While there is a constant flow of information for the variable *burial type*, the number of graves without information on *burial construction* increases in the Late Bronze Age to such an extent that no meaningful overview can be derived. The region intersects diverse geographical and cultural areas complicating the comparison with archaeological observations. In the southeast of Central Europe, cremation and inhumation already existed side by side in the Early Bronze Age, and the local tradition remained stable in this respect also due to the expansion of the burial mound tradition in the Middle Bronze Age -- with a slight overall increase in cremation graves. The Urnfield period brought the transition to the absolute dominance of cremation burial. The development of the *burial type* variable in the Radon-B proxy shows this development correctly. The information from ^14^C data on *burial construction* also correctly traces the relevance of flat burials in the Early Bronze Age but then overemphasises them in the Middle Bronze Age compared to the construction of burial mounds. In the Late Bronze Age, burials on flat burial grounds were frequent, although burial mounds of the Tumulus Culture were still present and in use. This impact does not become clear in the Radon-B data -- indeed due to the small number of dates [@lubosCzechLandsAustria2013; @markovaSlovakiaHungary2013]. 9 | 10 | `r a("Poland")`: 11 | The region *Poland* completely covers the centre and western part of today's Poland. However, the ^14^C data from this region are almost exclusively from the voivodships of Kajuwien-Pommern, Lodsch and Lower Silesia. The amount of data is small, with significantly more data from the Early Bronze Age up to about 1700 calBC. Almost no information is available from the Middle and Late Bronze Ages. This lack of dates applies to both the *burial type* and the *burial construction* variables, the former being slightly better documented. The relative development of *burial type* approximates the *real* conditions -- i.e. according to the classical, archaeological narrative: inhumations were significantly more frequent in western Poland until the Late Bronze Age, while cremations did rarely occur before the Urnfield Period. In contrast, it misrepresents *burial construction*: burial mounds also played an important role in Middle Bronze Age Poland [@czebreszukBronzeAgePolish2013; @dabrowskiAeltereBronzezeitPolen2004]. 12 | 13 | `r a("Southern Germany")`: 14 | The artificial region *Southern Germany* covers Bavaria but also includes most of Baden-Württemberg and Thuringia as well as extensive areas in Moravia and western Austria. No ^14^C dates are available from the latter regions, the majority of the available data comes from Upper Palatinate, Lower Bavaria and Swabia as well as (in Württemberg) the administrative district of Tübingen. For the Early Bronze Age, Radon-B preserves a remarkable amount of data from Southern Germany, but this amount decreases in the course of the Middle Bronze Age and leaves the Late Bronze Age almost without dated graves. The *burial type* variable is well understood -- although disproportionately much more of the early inhumations were recorded than Urnfield burials. This wealth of information contrasts sharply with the situation regarding the *burial construction* variable, for which almost no information from this area is available throughout the Bronze Age. If one considers the relative development calculated from Radon-B and compares it with the archaeological literature, then a reasonable agreement can be found for *burial type*. Inhumation dominated for a long time but was then replaced by cremation from the Middle Bronze Age onwards and massively in the Late Bronze Age. The calculated proportions for *burial construction* are based on a negligibly small amount of data, but the proxy still indicates the right tendency for the Early and Middle Bronze Age: Flat graves replaced mounds. The dataset does not allow any statements about the Late Bronze Age [@falkensteinWandelBestattungssittenHugelgraber2017; @jockenhovelGermanyBronzeAge2013]. 15 | 16 | `r a("Northeastern France")`: 17 | *Northeastern France* comprises the French administrative regions Grand-Est and Bourgogne-Franche-Comté, the east of the German Baden-Württemberg, Rhineland-Palatinate and Saarland, as well as Luxembourg and Wallonia in Belgium. Accumulations of ^14^C data are only available from Württemberg and towards the Paris Basin. The amount of data is low overall, but very low in the Early and Middle Bronze Age. For *burial type* limited statements are possible after this time window, *burial construction*, on the other hand, must remain obscure. The prediction of the relative development of these variables is error-prone: The parallel existence of cremation and inhumation in the Early and Middle Bronze Age is correctly reflected, but this situation already existed in the Early Bronze Age and indeed developed more nuanced than the proxy might suggest. Contrary to the derivation from the ^14^C ratios, flat graves were quite common in Northeastern France [@mordantBronzeAgeFrance2013]. 18 | 19 | `r a("Northern Germany")`: 20 | The artificial region *Northern Germany* includes all federal states in East Germany, but also large parts of Lower Saxony and Schleswig-Holstein. The ^14^C data for this region come mainly from Saxony-Anhalt and neighbouring regions in Thuringia, Saxony and Lower Saxony. Also from the area north of Bremen some data are documented in Radon-B. The database does not contain as many dated graves from any other region as from Northern Germany. Most of them date back to the Early Bronze Age, while the Middle Bronze Age from about 1800 to 1400 calBC seems barren. Only for the Late Bronze Age, there is a significant number of data documented again. The meta information on *burial type* and *burial construction* trace this development to the same extent. Since in Northern Germany influences from all four cardinal directions come together and contribute significantly to the formation of local cultural phenomena, it is difficult to estimate the overall development of the primary variables. The ^14^C proxy correctly represents *burial site* insofar as inhumations dominated in the Early Bronze Age and were later on replaced by cremations especially in the North from the Middle Bronze Age onwards. In the Late Bronze Age though, cremation was more dominant than the dataset suggests. Concerning *burial construction*, the current Radon-B stock records the fundamental dominance of flat graves well, but attributes more relevance to them in the Early and Middle Bronze Age than it is usual in the archaeological assessment of the context [@hofmannRituelleUmgangMit2008; @jockenhovelGermanyBronzeAge2013]. 21 | 22 | `r a("Southern Scandinavia")`: 23 | The region *Southern Scandinavia* includes all of Denmark with Jutland, Funen, Zeeland and all smaller islands as well as large parts of Southern Sweden, and coastal regions in Schleswig-Holstein and Mecklenburg-Western Pomerania. The ^14^C data are very well distributed across Jutland, Funen and the Swedish Skåne region. Since the Bronze Age in Scandinavia begins later than in Central Europe and is measured by another chronological system, the diachronic developments cannot merely be compared through the tripartite structure of the Early, Middle and Late Bronze Ages. The period which is labelled Early Bronze Age in Central Europe corresponds to the Scandinavian Late Neolithic. The majority of data from Scandinavia are from the period IB onwards. In this respect, the data density for almost the entire Bronze Age is good -- also with regard to the two variables *burial type* and *burial construction*. The Late Neolithic from 2200 calBC is a desideratum. If one carries out the necessary mental shift -- the Central European Middle Bronze Age corresponds to the Nordic Early Bronze Age -- and compares the proxy of the relative grave form development with the archaeological observations, then one finds a substantial agreement: inhumations were the rule in periods I and II (about 1800-1300 calBC), but cremations also occurred sporadically. From period III onwards cremation burials gained the upper hand. In the Scandinavian Early Bronze Age burials in burial mounds dominated. In the Late Bronze Age, flat grave fields began to occur [@thraneScandinavia2013]. 24 | 25 | `r a("Benelux")`: 26 | The Benelux region includes the Netherlands, Northern Belgium and large parts of Lower Saxony and North Rhine-Westphalia. All these regions have ^14^C data on graves in Radon-B, but the data density in Belgium and the Netherlands is much higher. As in Southern Scandinavia, the Early Bronze Age is under-represented in the Benelux region as opposed to the Middle and Late Bronze Age, although in a slightly weaker form. While the information density of the *burial type* variable follows this course, *burial construction* is almost undocumented in the Late Bronze Age. As in the *Southern Germany* region, there is a serious difference between the information density of both variables. If one considers the relative development of the variables as they can be derived from the burial data in comparison to the archaeological state of research, there is both deviation as well as agreement. Here, too, the study region includes different cultural phenomena with highly different burial customs: In the north and east of the Benelux region inhumations were the rule until the Late Bronze Age, while cremation dominated earlier south of the Meuse. The Radon-B proxy seems to overemphasise the dominance of cremation in the whole area. The relevance of burial mounds in the Early and Middle Bronze Age, on the other hand, is correctly reflected, and the mixture between mounds and flat graves in the context of urnfields, often resulting from the continued use of existing grave monuments, is also visible [@arnoldussenBronzeAgeSettlements2008; @drenthMoundsDeadFuneray2005; @lohofTraditionChangeBurial1994]. 27 | 28 | `r a("England")`: 29 | The *England* region stretches across England up to York and Liverpool, incorporating parts of Wales and leaving out Cornwall and Devon in the Southwest. It also touches a narrow coastal strip on the mainland, from which no ^14^C data are documented. The available data are concentrated in the southeast of Britain but are well distributed there. The diachronic data availability is relatively good in the Early and Middle Bronze Age but then decreases in the Late Bronze Age. *burial type* and *burial construction* behave accordingly. The relative development derived from the ^14^C data indicates the correct trend for *burial type*: Cremation graves became more and more important during the Bronze Age, while inhumations appeared for a long time in parallel. However, the dataset emphasises the occurrence of cremation graves too much. Concerning the variables *burial construction*, the dominance of burial mounds corresponds perfectly to the archaeological narrative, but -- especially in the Late Bronze Age -- flat cemeteries also occurred, which the data set wrongly excludes [@robertsBritainIrelandBronze2013]. 30 | 31 | ## Cultural distance 32 | 33 | The second important question posed for this paper was, *how cultural distance between regions develops, and how it is related to spatial distance?* While the idea behind the first question was rather technical -- reproducing already available information in a quantitative way -- the second one has a larger scope. The quantitative representation of an archaeological narrative paths the way for a diverse set of methods to be applied and the analysis undertaken here is merely the beginning. Unfortunately, the small sample size makes it very difficult to obtain meaningful, significant results in this context. 34 | 35 | Concerning the question of cultural distance, the expectation based on Cultural transmission theory was a clear correlation of the "cultural" SED distances for both variables *burial type* and *burial construction* with spatial distance. As the European Bronze Age is usually depicted as a period of trade, travel and exchange [e.g. @kristiansenRiseBronzeAge2005; @sherrattWhatWouldBronzeAge1993] there was no reason to expect something else than Tobler's famous First Law of Geography: "everything is related to everything else, but near things are more related than distant things." [@toblerComputerMovieSimulating1970]. 36 | 37 | Against this background, the observation that there does not seem to be permanent, significant positive correlation neither in between the variables nor with spatial distance is all the more astonishing (Table \ref{tab:dacta} and \ref{tab:dactb}, Figure \ref{correlationtimeseries} B). Only for certain periods of time this correlation is visible in the Radon-B data. The *burial construction* distance generally shows a higher degree of correlation with spatial distance than the *burial type* distance, which even seems to behave in an opposing manner: negative correlation (not statistically significant!). If one assumes the reconstructed timelines of cultural similarity intensity to be correct, than one has to explain a rise (between 2200 and 2000 calBC) and a decline (after 2000 calBC) of cultural-spatial-distance correlation. There are several reasons why any interpretation of this observation is difficult so far: 38 | 39 | 1. The amount, distribution and quality of the data as discussed in section \ref{data-quality-discussion} question the credibility of the cultural distance calculation. The macro regions have to be very big due to a lack of data and don't represent the cultural heterogeneity of Bronze Age Europe appropriately. The differences in the number of available dates -- sample size -- per region introduce sampling error. The samples are also non-independent, as large sites with multiple burials can strongly bias the proportions of a particular region. Furthermore the region size also causes strong risk of Simpson’s paradox (i.e. a trend appears in several different groups of data but disappears or reverses when these groups are combined). 40 | 41 | 2. The data used for this analysis was collected for another purpose and their application in this context requires a problematic shift in data meaning as explained in section \ref{data-meaning-discussion}. 42 | 43 | 3. All observations of cultural distance in this paper are based on only the two variables *burial type* and *burial construction*. This is by far not enough for any overarching conclusions about the general state of society in the Bronze Age. 44 | 45 | Keeping this in mind, the surprising result still can be discussed. One interpretation might be, that the Early Bronze Age was a time of rising cultural exchange and religious homogenization, while in later periods different domains secluded themselves more strongly. The negative correlation of *burial type* in the Late Bronze Age could indicate long distance contacts that explicitly excluded certain intermediate regions of Central Europe. The rise of the Tumulus Culture in the Middle Bronze Age might have cushioned this effect for the variable *burial construction* and introduced more variability for a -- at that time -- less important aspect *burial type*. The latter may have been of subordinate relevance in the Tumulus culture context. With the rise of the Urnfield culture this phenomenon could have been reversed as *burial type* became an expression of something that could have been one of the first formalized religions in Europe: The spread of the Urnfield Culture was an extraordinary development and possibly accompanied by a structured, religious dogma built up around the symbolic content of cult wagons, sun barks and waterfowl [@bilicSwanChariotSolar2016; @kimmig_seevolkerbewegung_1964; @molloy_european_2018]. Of course these explanations could, if correct, only be considered on a big scale. For individual regions and sites specific ideological, social or even economic considerations might have been much more critical for the decision which burial tradition to adopt [@barrett_monumentality_1990; @fokkens_genesis_1997-1; @muller-scheesel_variabilitat_2009]. 46 | -------------------------------------------------------------------------------- /latex_template/sagej.cls: -------------------------------------------------------------------------------- 1 | %--------------------------------------------------------------------------- 2 | %Please be aware that the use of this LaTeX class file is governed by the 3 | %following conditions: 4 | % 5 | % based on the original LaTeX ARTICLE DOCUMENT STYLE 6 | % Copyright (C) 1988, 1989 by Leslie Lamport 7 | % 8 | % Copyright (c) 2013 SAGE Publications. All rights reserved. 9 | % 10 | %Rules of Use 11 | % 12 | %% You are NOT ALLOWED to change this file. 13 | % 14 | % 15 | %This class file is made available for use by authors who wish to prepare an 16 | %article for publication in a SAGE Publications journal. 17 | %The user may not exploit any part of the class file commercially. 18 | % 19 | %This class file is provided on an `as is' basis, without warranties of any 20 | %kind, either expressed or implied, including but not limited to warranties of 21 | %title, or implied warranties of merchantablility or fitness for a 22 | %particular purpose. There will be no duty on the author[s] of the software 23 | %or SAGE Publications to correct any errors or defects in the software. 24 | %Any statutory rights you may have remain unaffected by your acceptance of 25 | %these rules of use. 26 | %--------------------------------------------------------------------------- 27 | % 28 | % Created by Alistair Smith, Sunrise Setting Ltd, 27 July 2013 29 | % 30 | % sagej.cls --- For SAGE Publications 31 | % 32 | % 9/6/15 Endnote bug fix. 33 | % 24/6/15 Add "comma" to vancouver natbib line; remove figure extension; Review option added. 34 | % 14/1/17 SAGE graphic removed and replaced by drawn box. 35 | 36 | \def\update{2017/01/17 v1.20} 37 | 38 | \newcommand{\journalclass}{sagej.cls} 39 | \newcommand{\journalclassshort}{sagej} 40 | %\newcommand{\DOI}{XXX} 41 | 42 | \NeedsTeXFormat{LaTeX2e} 43 | \ProvidesClass{sagej}[\update\ \journalclass] 44 | 45 | %\newcommand\hmmax{0} 46 | 47 | \newif\if@timesfont 48 | \DeclareOption{times}{% 49 | \@timesfonttrue} 50 | 51 | \newif\if@doublespace 52 | \DeclareOption{doublespace}{% 53 | \@doublespacetrue} 54 | 55 | \newif\if@sageh 56 | \DeclareOption{sageh}{% 57 | \@sagehtrue} 58 | 59 | \newif\if@sagev 60 | \DeclareOption{sagev}{% 61 | \@sagevtrue} 62 | 63 | \newif\if@sageapa 64 | \DeclareOption{sageapa}{% 65 | \@sageapatrue} 66 | 67 | %Setup the trim and text areas 68 | \newif\if@shortAfour 69 | \DeclareOption{shortAfour}{% 70 | \@shortAfourtrue} 71 | 72 | \newif\if@Afour 73 | \DeclareOption{Afour}{% 74 | \@Afourtrue} 75 | 76 | \newif\if@MCfour 77 | \DeclareOption{MCfour}{% 78 | \@MCfourtrue} 79 | 80 | \newif\if@PCfour 81 | \DeclareOption{PCfour}{% 82 | \@PCfourtrue} 83 | 84 | \newif\if@Royal 85 | \DeclareOption{Royal}{% 86 | \@Royaltrue} 87 | 88 | \newif\if@Crown 89 | \DeclareOption{Crown}{% 90 | \@Crowntrue} 91 | 92 | \newif\if@Review 93 | \DeclareOption{Review}{% 94 | \@Reviewtrue} 95 | 96 | \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} 97 | \ProcessOptions 98 | \LoadClass{article} 99 | 100 | \if@timesfont 101 | \RequirePackage{times} 102 | \usepackage[scaled=.95]{helvet} 103 | \fi 104 | \if@doublespace 105 | \RequirePackage[onehalfspacing]{setspace} 106 | \fi 107 | 108 | \RequirePackage{graphicx} 109 | \RequirePackage{latexsym,ifthen,rotating,calc,textcase,booktabs,color,endnotes} 110 | \RequirePackage{amsfonts,amssymb,amsbsy,amsmath,amsthm} 111 | %\RequirePackage{bm} 112 | \RequirePackage[errorshow]{tracefnt} 113 | 114 | \@twosidetrue 115 | \flushbottom 116 | \frenchspacing 117 | 118 | \let\sagesf\sf 119 | \if@PCfour 120 | \let\sagesf\rm 121 | \fi 122 | 123 | %papersize={width,height} 124 | \if@shortAfour 125 | \usepackage[text={170.5mm,226mm},% 126 | papersize={210mm,280mm},% 127 | columnsep=12pt,% 128 | headsep=21pt,% 129 | centering]{geometry} 130 | \usepackage{ftnright} 131 | \fi 132 | 133 | %papersize={width,height} 134 | \if@Afour 135 | \usepackage[text={174mm,258mm},% 136 | papersize={210mm,297mm},% 137 | columnsep=12pt,% 138 | headsep=21pt,% 139 | centering]{geometry} 140 | \usepackage{ftnright} 141 | \fi 142 | 143 | %papersize={width,height} 144 | \if@MCfour 145 | \usepackage[text={151.5mm,196mm},% 146 | papersize={189mm,246mm},% 147 | columnsep=12pt,% 148 | headsep=21pt,% 149 | centering]{geometry} 150 | \usepackage{ftnright} 151 | \fi 152 | 153 | %papersize={width,height} 154 | \if@PCfour 155 | \usepackage[text={138mm,198mm},% 156 | papersize={170mm,242mm},% 157 | columnsep=12pt,% 158 | headsep=21pt,% 159 | centering]{geometry} 160 | \usepackage{ftnright} 161 | \fi 162 | 163 | %papersize={width,height}%single column 164 | \if@Royal 165 | \usepackage[text={124mm,185mm},% 166 | papersize={156mm,234mm},% 167 | columnsep=12pt,% 168 | headsep=21pt,% 169 | centering]{geometry} 170 | \fi 171 | 172 | %papersize={width,height}%single column 173 | \if@Crown 174 | \usepackage[text={146.5mm,183mm},% 175 | papersize={7.25in,9.5in},% 176 | columnsep=12pt,% 177 | headsep=21pt,% 178 | centering]{geometry} 179 | \fi 180 | 181 | %For Review Single column, 12pt 182 | \if@Review 183 | \usepackage[text={124mm,185mm},% 184 | papersize={156mm,234mm},% 185 | columnsep=12pt,% 186 | headsep=21pt,% 187 | centering]{geometry} 188 | \renewcommand{\normalsize}{\fontsize{12}{14pt}\selectfont} 189 | \fi 190 | 191 | \parindent 1em 192 | 193 | \hyphenpenalty=1000 194 | \pretolerance=8000 195 | \tolerance=9500 196 | \hbadness=8000 197 | \vbadness=9000 198 | \displaywidowpenalty=0 199 | \clubpenalty=10000 200 | \widowpenalty=10000 201 | \lefthyphenmin=3% 202 | \righthyphenmin=3% 203 | \brokenpenalty=10000% 204 | 205 | \thinmuskip = 3mu 206 | \medmuskip = 4mu 207 | \thickmuskip = 5mu 208 | 209 | \setcounter{topnumber}{10} 210 | \def\topfraction{1} 211 | \setcounter{bottomnumber}{10} 212 | \def\bottomfraction{0.8} 213 | \setcounter{totalnumber}{10} 214 | \def\textfraction{0} 215 | \renewcommand{\floatpagefraction}{0.95} 216 | \setcounter{dbltopnumber}{10} 217 | \renewcommand{\dblfloatpagefraction}{0.95} 218 | \renewcommand{\dbltopfraction}{1} 219 | 220 | \renewcommand\small{% 221 | \@setfontsize\small\@ixpt{10.5}% 222 | \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ 223 | \abovedisplayshortskip \z@ \@plus2\p@ 224 | \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ 225 | \def\@listi{\leftmargin\leftmargini 226 | \topsep 4\p@ \@plus2\p@ \@minus2\p@ 227 | %\parsep 2\p@ \@plus\p@ \@minus\p@ 228 | \itemsep \parsep}% 229 | \belowdisplayskip \abovedisplayskip 230 | } 231 | \newcommand{\refsize}{\fontsize{9}{12pt}\selectfont} 232 | \renewcommand{\footnotesize}{\fontsize{8}{10pt}\selectfont} 233 | \renewcommand{\scriptsize}{\fontsize{7.0}{8.5pt}\selectfont} 234 | \renewcommand{\large}{\fontsize{12}{14pt}\selectfont} 235 | \newcommand{\titlesize}{\fontsize{18.0}{20pt}\selectfont} 236 | 237 | \newbox\absbox 238 | \def\abstract{\lrbox\absbox\minipage{\textwidth}% 239 | \sagesf\normalsize% 240 | \section*{\normalsize Abstract}\vskip -1.5mm% 241 | } 242 | \def\endabstract{\endminipage\endlrbox} 243 | 244 | \def\keywords#1{% 245 | \gdef\@keywords{\begin{minipage}{\textwidth}{\normalsize\sagesf \textbf{Keywords}}\\ \parbox[t]{\textwidth}{#1}\end{minipage}}} 246 | \let\@keywords\@empty 247 | 248 | \skip\footins 20pt plus 8pt 249 | %\gdef\footnoterule{} 250 | \def\footnoterule{\kern-3\p@ 251 | \hrule \@width \columnwidth \kern 3mm} 252 | 253 | \renewcommand{\thefootnote}{\fnsymbol{footnote}} 254 | \long\def\@makefntext#1{\parindent 1em% 255 | \noindent{$\m@th^{\@thefnmark}$}#1} 256 | 257 | \newcommand{\email}[1]{% 258 | \gdef\@email{% 259 | \footnotetext[0]{\sagesf Email: #1}}} 260 | \let\@email\@empty 261 | 262 | \def\corrauth#1{\gdef\@corrauth{% 263 | \footnotetext[0]{\par\vskip-3pt\sagesf\noindent\textbf{Corresponding author:}\\ #1}}} 264 | \let\@corrauth\@empty 265 | 266 | \def\affiliation#1{% 267 | \gdef\@affiliation{% 268 | \footnotetext[0]{\sagesf #1}}} 269 | \let\@affiliation\@empty 270 | 271 | \def\affilnum#1{${}^{\text{{#1}}}$} 272 | 273 | \renewcommand\maketitle{\par 274 | \begingroup 275 | \if@twocolumn 276 | \ifnum \col@number=\@ne 277 | \@maketitle 278 | \else 279 | \twocolumn[\@maketitle]% 280 | \fi 281 | \else 282 | \newpage 283 | \global\@topnum\z@ % Prevents figures from going at top of page. 284 | \@maketitle 285 | \fi 286 | \thispagestyle{title}\label{FirstPage}\@affiliation\@corrauth\@email% 287 | \endgroup 288 | %\setcounter{footnote}{0}% 289 | \global\let\affiliation\relax 290 | \global\let\thanks\relax 291 | \global\let\maketitle\relax 292 | \global\let\@maketitle\relax 293 | \global\let\@thanks\@empty 294 | \global\let\@author\@empty 295 | \global\let\@date\@empty 296 | \global\let\@title\@empty 297 | \global\let\@affiliation\@empty 298 | \global\let\title\relax 299 | \global\let\author\relax 300 | \global\let\date\relax 301 | \global\let\and\relax 302 | } 303 | \def\@maketitle{% 304 | \if@Royal 305 | \vspace*{-20pt} 306 | \fi 307 | \if@Crown 308 | \vspace*{-20pt} 309 | \fi 310 | \vspace*{-34pt}% 311 | \null% 312 | \begin{center} 313 | \if@PCfour 314 | \begin{rm} 315 | \else 316 | \begin{sf} 317 | \fi 318 | \begin{minipage}[t]{\textwidth-57.625mm} 319 | \vskip 12.5pt% 320 | {\raggedright\titlesize\textbf{\@title} \par}% 321 | \vskip 1.5em% 322 | \vskip 12.5mm% 323 | \end{minipage}\hspace{15mm}\begin{minipage}[t]{42.625mm} 324 | \hbox{}\scriptsize\journalname\\ 325 | \hbox{}\volumenumber(\issuenumber):\startpage--\endpage\\ 326 | \hbox{}\copyright The Author(s) \volumeyear\\ 327 | \hbox{}Reprints and permission:\\ 328 | \hbox{}sagepub.co.uk/journalsPermissions.nav\\ 329 | \hbox{}DOI: 10.1177/ToBeAssigned\\ 330 | \hbox{}www.sagepub.com/\\[2.3pt] 331 | %\hbox{}\includegraphics[height=4mm]{SAGE_Logo} 332 | \hbox{}{\fboxsep 1.5pt\framebox[14mm]{{\normalsize SAGE}}} 333 | \end{minipage} 334 | {\par\large% 335 | \if@Royal 336 | \vspace*{6mm} 337 | \fi 338 | \if@Crown 339 | \vspace*{6mm} 340 | \fi% 341 | \lineskip .5em% 342 | {\raggedright\textbf{\@author} 343 | \par}} 344 | \vskip 40pt% 345 | {\noindent\usebox\absbox\par} 346 | {\vspace{20pt}% 347 | % 348 | {\noindent\normalsize\@keywords}\par} 349 | \if@PCfour 350 | \end{rm} 351 | \else 352 | \end{sf} 353 | \fi 354 | \end{center} 355 | \if@Royal 356 | \vspace*{-4.5mm} 357 | \fi 358 | \if@Crown 359 | \vspace*{-4.5mm} 360 | \fi 361 | \vspace{22pt} 362 | \par% 363 | } 364 | 365 | \def\startpage{\pageref{FirstPage}} 366 | \def\endpage{\pageref{LastPage}} 367 | \def\volumeyear{0000} 368 | \def\volumenumber{XX} 369 | \def\issuenumber{X} 370 | \def\journalname{Journal Title} 371 | 372 | \def\runninghead#1{\markboth{{#1}}{}} 373 | 374 | \def\ps@title{% 375 | \def\@oddhead{\parbox{\textwidth}{\mbox{}\\[-1pt]% 376 | \noindent\rule{\textwidth}{0.5pt}% 377 | }}% 378 | \let\@evenhead\@oddhead 379 | \def\@oddfoot{\parbox[t]{\textwidth}{% 380 | {\scriptsize{\it Prepared using \textsf{\journalclass} [Version: \update]}}}} 381 | \let\@evenfoot\@oddfoot} 382 | 383 | \def\ps@sagepage{% 384 | \let\@mkboth\@gobbletwo 385 | \def\@evenhead{\parbox{\textwidth}{% 386 | \normalsize\sagesf\thepage\hfill\itshape\journalname\ \volumenumber(\issuenumber)\\[-6pt] 387 | \noindent\rule{\textwidth}{0.25pt}}} 388 | \def\@oddhead{\parbox{\textwidth}{% 389 | \normalsize\sagesf{\itshape{\leftmark}}\hfill\thepage\\[-6pt] 390 | \noindent\rule{\textwidth}{0.25pt}}} 391 | \def\@evenfoot{\parbox[t]{\textwidth}{% 392 | \scriptsize{\it Prepared using \textsf{\journalclass}}}} 393 | \def\@oddfoot{\@evenfoot} 394 | } 395 | 396 | %\renewcommand{\@seccntformat}[1]{{\csname the#1\endcsname.}\hspace{0.5em}} 397 | \setcounter{secnumdepth}{-2} 398 | 399 | \newdimen\@bls 400 | \@bls=\baselineskip 401 | 402 | \renewcommand\section{\@startsection {section}{1}{\z@}% 403 | {1.2\@bls plus .3\@bls minus .1\@bls}% 404 | {5pt\@afterindentfalse}% 405 | {\sagesf\large\bfseries\raggedright}} 406 | \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% 407 | {0.9\@bls plus .3\@bls minus .1\@bls}% 408 | {4pt\@afterindentfalse}% 409 | {\sagesf\large\itshape\raggedright}} 410 | \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% 411 | {0.5\@bls plus .3\@bls minus .1\@bls}% 412 | {-0.5em\@afterindentfalse}% 413 | {\sagesf\normalsize\itshape}} 414 | \renewcommand\paragraph{\@startsection{paragraph}{4}{1em}% 415 | {0.3\@bls plus .3\@bls minus .1\@bls}% 416 | {-0.5em\@afterindentfalse}% 417 | {\sagesf\normalsize\itshape}} 418 | 419 | \def\enumerate{\ifnum \@enumdepth >3 \@toodeep\else 420 | \advance\@enumdepth \@ne 421 | \edef\@enumctr{enum\romannumeral\the\@enumdepth}\list 422 | {\csname label\@enumctr\endcsname}{\usecounter 423 | {\@enumctr}\itemsep 0pt\parsep 0pt 424 | \def\makelabel##1{\hss\llap{##1}}}\fi} 425 | 426 | \let\endenumerate =\endlist 427 | 428 | \def\itemize{\ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne 429 | \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% 430 | \list{\csname\@itemitem\endcsname}{\itemsep 0pt\parsep 0pt 431 | \def\makelabel##1{\hss\llap{##1}}}\fi} 432 | 433 | \let\enditemize =\endlist 434 | 435 | \RequirePackage{caption} 436 | \DeclareCaptionLabelSeparator{sageperiod}{.\hspace*{1ex}} 437 | \captionsetup[figure]{font=small,labelfont={sf,bf},textfont=sf,labelsep=sageperiod,justification=raggedright,singlelinecheck=false} 438 | \captionsetup[table]{position=top,labelsep=sageperiod,font=small,labelfont={sf,bf},textfont=sf,justification=raggedright,skip=2pt,singlelinecheck=false} 439 | 440 | \def\@begintheorem#1#2[#3]{% 441 | \deferred@thm@head{\the\thm@headfont \thm@indent 442 | \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}% 443 | \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}% 444 | \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}% 445 | \thm@swap\swappedhead\thmhead{#1}{#2\the\thm@headpunct}{#3}% 446 | %\the\thm@headpunct 447 | \thmheadnl % possibly a newline. 448 | \hskip\thm@headsep 449 | }% 450 | \ignorespaces} 451 | 452 | \def\thmhead@plain#1#2#3{% 453 | \thmname{#1}\thmnumber{\@ifnotempty{#1}{ }{#2}}% 454 | \thmnote{ {\the\thm@notefont #3. }}} 455 | 456 | \newenvironment{acks}[1]% 457 | {\subsection*{\normalsize\sagesf\bfseries Acknowledgements}\begin{refsize}\noindent #1}% 458 | {\end{refsize}} 459 | 460 | \newenvironment{funding}[1]% 461 | {\subsection*{\normalsize\sagesf\bfseries Funding}\begin{refsize}\noindent #1}% 462 | {\end{refsize}} 463 | 464 | \newenvironment{sm}[1]% 465 | {\subsection*{\normalsize\sagesf\bfseries Supplemental material}\begin{refsize}\noindent #1}% 466 | {\end{refsize}} 467 | 468 | \newenvironment{dci}[1]% 469 | {\subsection*{\normalsize\sagesf\bfseries Declaration of conflicting interests}\begin{refsize}\noindent #1}% 470 | {\end{refsize}} 471 | 472 | \newenvironment{biog}[1]% 473 | {\subsection*{\normalsize\sagesf\bfseries Author biography}\begin{refsize}\noindent #1}% 474 | {\end{refsize}} 475 | 476 | \newenvironment{biogs}[1]% 477 | {\subsection*{\normalsize\sagesf\bfseries Author Biographies}\begin{refsize}\noindent #1}% 478 | {\end{refsize}} 479 | 480 | %Endnotes 481 | \def\enotesize{\refsize} 482 | 483 | \def\enoteheading{\subsection*{\normalsize\sagesf\bfseries\notesname}% 484 | \mbox{}\par\vskip-\baselineskip} 485 | 486 | %\renewcommand\makeenmark{\theenmark.\hspace{0.75em}} 487 | 488 | \renewcommand{\enoteformat}{% 489 | \rightskip\z@ \leftskip15pt \parindent=0pt 490 | \leavevmode{\makebox[0cm][r]{% 491 | \hbox to15pt{\@theenmark.\hfill}}}} 492 | 493 | 494 | \newtheoremstyle{sage} 495 | {6pt plus 2pt minus 2pt}% space above 496 | {6pt plus 2pt minus 2pt}% space below 497 | {\it}% Body font 498 | {}% Indent amount 499 | {\bfseries}% Theorem head font 500 | {.}% Punctuation after theorem head 501 | {0.75em}% Space after theorem head 502 | {}% Theorem head spec 503 | 504 | \theoremstyle{sage} 505 | 506 | \renewenvironment{proof}[1][\proofname]{\par 507 | %AS\pushQED{\qed}% 508 | \normalfont \topsep6\p@\@plus6\p@\relax 509 | \trivlist 510 | \item[\hskip\labelsep 511 | \bfseries 512 | #1\@addpunct{.}]\ignorespaces 513 | }{% 514 | %AS\popQED 515 | \endtrivlist\@endpefalse 516 | } 517 | 518 | %\renewenvironment{thebibliography}{% 519 | %\section*{\normalsize\refname} 520 | %\list{}{\topsep=0\p@\parsep=0\p@ 521 | %\partopsep=0\p@\itemsep=1\p@\labelsep=0\p@\itemindent=-20\p@ 522 | %\labelwidth=0\p@\leftmargin=20\p@ 523 | %}\refsize\rm 524 | %\def\newblock{\ } 525 | %\sloppy\clubpenalty4000\widowpenalty4000 526 | %\sfcode`\.=1000\relax}{\endlist} 527 | 528 | \if@sageh 529 | \usepackage{natbib} 530 | \bibpunct{(}{)}{;}{}{}{,} 531 | \setlength{\bibsep}{1pt} 532 | \setlength{\bibhang}{16pt} 533 | \renewcommand{\bibfont}{\refsize} 534 | \renewcommand\refname{{\normalsize References}} 535 | \fi 536 | 537 | \if@sagev 538 | \usepackage[super,sort&compress,comma]{natbib} 539 | %\bibpunct{(}{)}{;}{}{}{,} 540 | \renewcommand{\bibnumfmt}[1]{#1.} 541 | \setlength{\bibsep}{0pt} 542 | %\setlength{\bibhang}{20pt} 543 | \renewcommand{\bibfont}{\refsize} 544 | \renewcommand\refname{{\normalsize References}} 545 | \fi 546 | 547 | \if@sageapa 548 | %\usepackage{apalike} 549 | \usepackage{natbib} 550 | \let\bibhang\relax 551 | \usepackage{mslapa} 552 | \setlength{\bibhang}{16pt} 553 | \@ifundefined{chapter}{\def\thebibliography#1{\section*{\refname}\list 554 | {\relax}{\setlength{\labelsep}{0em} 555 | \setlength{\itemindent}{-\bibhang} 556 | \setlength{\leftmargin}{\bibhang} 557 | \setlength{\itemsep}{0pt} 558 | \parsep 0pt}%AS 559 | \def\newblock{\hskip .11em plus .33em minus .07em} 560 | \sloppy\clubpenalty4000\widowpenalty4000 561 | \sfcode`\.=1000\relax}}% 562 | \fi 563 | 564 | \AtEndDocument{% 565 | \label{LastPage}} 566 | 567 | \pagestyle{sagepage} 568 | 569 | \if@shortAfour 570 | \twocolumn 571 | \fi 572 | 573 | \if@Afour 574 | \twocolumn 575 | \fi 576 | 577 | \if@MCfour 578 | \twocolumn 579 | \fi 580 | 581 | \if@PCfour 582 | \twocolumn 583 | \fi 584 | 585 | \normalsize 586 | \sloppy 587 | --------------------------------------------------------------------------------