# aus: Steven P. Sanderson, in R-bloggers, 6.4.2023
# Funktion bauen Ziel: die Namen der Blätter herausfinden
<- function(filename) {
excel_sheet_reader <- excel_sheets(filename)
sheets <- lapply(sheets, function(X) read_excel(filename, sheet = X))
x names(x) <- sheets
x }
R-Code zu: ‘Rezension zu: Sorg, M. (2022). Fibelausstattung und Lebensalter in der Merowingerzeit: Studien zu Abnutzung und Gebrauch frühmittelalterlicher Bügelfibeln. (RGA Ergänzungbände, 129). Berlin: de Gruyter.’
Archäologische Informationen, 46, 2023
Daten herunterladen
Die Daten sind als Open Data auf der Website des Buches von M. Sorg (2022) beim de Gruyter Verlag hinterlegt: https://www.degruyter.com/document/doi/10.1515/9783110754810/html?lang=de Für diese Rezension nutze ich die Daten namens “Datenstudie”, wohinter sich eine Excel-Tabelle mit 13 Datenblättern verbirgt. Die Datei habe ich in meinem via RStudio eingerichteten Projektordner gespeichert, mit der Benennung “Sorg-M_2022_Fibelausstattung.xlsx”.
Daten einlesen
Die publizierten Daten werden als Excel-Tabelle mit 13 Blättern angeboten. Die klassische Möglichkeit des Einlesen nach “R” ist es, in der Ausgangsdatei unter Excel reihum alle Blätter bis auf eines löschen und anschließend je ein einzelnes Blätter als einen neuen Datensatz zu speichern. Etwas bequemer ist es, dies auf einen Rutsch mit “R” erledigen. Wie? - das zeigen die folgenden Codeblöcke.
Anschließend wende ich diese Funktion an. Da ich innerhalb von RStudio mit einem Projekt arbeite, bedarf ein keiner Angabe eines Dateipfades, sondern lediglich der Nennung des Dateinamens.
Caveat: Die Daten bei Sorg sind “ungeschickt” abgelegt. In unserem Fall ist die Länge der Bügelfibeln zwar als Zahl geschrieben, als im Textformat abgelegt. Man könnte dies in Excel leichthin korrigieren, aber die Datei ist mit einem Passwort geschützt (!). Daher habe ich die Länge der Fibeln auf ein neues Blatt namens “lang” kopiert, die Spalte als Zahl formatiert und lese dieses Blatt zusätzlich mit ein.
library(readxl)
# library(writexl)
library(dplyr)
#
<- excel_sheets("Sorg-M_2022_Fibelausstattung.xlsx")
sheets sheets
[1] "Gräber" "Fibeln"
[3] "lang" "Bügelfibeln"
[5] "Gleicharmige Fibeln" "Pferdchenfibeln"
[7] "Rautenfibeln" "Scheibenfibeln, Blech"
[9] "Scheibenfibeln, gegossen" "Scheibenfibeln, Granat"
[11] "S-Fibeln" "Tierfibeln"
[13] "Vogelfibeln" "Zikadenfibeln"
#
<- excel_sheet_reader("Sorg-M_2022_Fibelausstattung.xlsx")
Sorg_sheets Sorg_sheets
$Gräber
# A tibble: 3,618 × 25
ID Gräberfeld Grabnummer Beraubung Störung `Fibeln vorhanden`
<dbl> <chr> <chr> <chr> <chr> <chr>
1 796 Aldingen Aldi1 <NA> <NA> Ja
2 797 Aldingen Aldi11 <NA> <NA> Ja
3 771 Aldingen Aldi12 ja antik Ja
4 798 Aldingen Aldi15 <NA> <NA> Ja
5 875 Aldingen Aldi17 <NA> <NA> Nein
6 799 Aldingen Aldi18 <NA> <NA> Ja
7 874 Aldingen Aldi3 <NA> <NA> Nein
8 769 Aldingen Aldi8 <NA> <NA> Ja
9 770 Aldingen Aldi9 <NA> <NA> Ja
10 2574 Altenerding Alte10 ? ? Nein
# ℹ 3,608 more rows
# ℹ 19 more variables: `Anzahl Fibeln` <dbl>, Vierfibelkombination <chr>,
# `Typ Fibel 1` <chr>, `Typ Fibel 2` <chr>, `Typ Fibel 3` <chr>,
# `Typ Fibel 4` <chr>, `Typ Fibel 5` <chr>,
# `Abnutzungsgrad je Grab, exakt` <dbl>,
# `Abnutzungsgrad je Grab, gerundet` <dbl>,
# `Abnutzungsgrad je Grab, ganze Zahl` <dbl>, …
$Fibeln
# A tibble: 836 × 22
ID Grabkürzel Fibelnummer Fibeltyp Aufnahme `Abnutzung laut Bearbeiter`
<dbl> <chr> <dbl> <chr> <chr> <chr>
1 755 Aldi1 1 Bügelfibel Ja Nadel fehlt, sonst gut erha…
2 756 Aldi1 2 Bügelfibel Ja Nadel fehlt, sonst gut erha…
3 757 Aldi1 3 Vogelfibel Ja Nadel und Teile der Spiralk…
4 758 Aldi1 4 Vogelfibel Ja Nadel und Teile der Spiralk…
5 759 Aldi11 1 Bügelfibel Ja Nadelhalter wenig abgenutzt…
6 760 Aldi11 2 Bügelfibel Ja Nadelhalter wenig abgenutzt…
7 721 Aldi12 1 Tierfibel Ja Abnutzungsspuren
8 761 Aldi15 1 Bügelfibel Ja An Bügel und Knöpfen Abnutz…
9 762 Aldi15 2 Bügelfibel Ja An Bügel und Knöpfen Abnutz…
10 763 Aldi18 1 Bügelfibel Ja Starke Abnutzungsspuren am …
# ℹ 826 more rows
# ℹ 16 more variables: `Gesamtabnutzung, exakt` <dbl>,
# `Gesamtabnutzung, gerundet` <dbl>, `Gesamtabnutzung, ganze Zahl` <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>,
# `Gesamtabnutzung, gleichmäßig verteilt` <dbl>,
# `Anzahl der untersuchten Areale` <dbl>, Gewicht <dbl>, Länge <chr>,
# Vierfibelkombination <chr>, `Lage Fibel 1` <chr>, `Lage Fibel 2` <chr>, …
$lang
# A tibble: 836 × 1
lang
<dbl>
1 7.8
2 7.9
3 2.5
4 2.5
5 7.5
6 7.5
7 2.35
8 7.1
9 7.2
10 4.6
# ℹ 826 more rows
$Bügelfibeln
# A tibble: 208 × 26
ID Grabnummer Fibelnummer Fußkopf `Kanten Fußkopf` `Querlaufender Grat`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 172 Aldi1 1 NA NA NA
2 173 Aldi1 2 NA NA NA
3 174 Aldi11 1 1 1 NA
4 175 Aldi11 2 2 1 NA
5 228 Aldi15 1 NA NA NA
6 229 Aldi15 2 NA NA NA
7 231 Aldi18 1 3 3 NA
8 232 Aldi18 2 3 3 NA
9 161 Aldi8 1 NA NA NA
10 162 Aldi9 1 3 3 3
# ℹ 198 more rows
# ℹ 20 more variables: Fuß <dbl>, `Grat am Fuß` <dbl>, `Kanten Fuß` <dbl>,
# Bügel <dbl>, Bügelhöchstpunkt <dbl>, `Kanten Bügel` <dbl>,
# `Übergang Bügel-Kopf` <dbl>, Kopffläche <dbl>, `Kanten Kopf` <dbl>,
# Knöpfe <dbl>, `Zonenknopf-Band` <dbl>, `Fuß Rückseite` <dbl>,
# `Bügel Rückseite` <dbl>, `Kopfplatte Rückseite` <dbl>, Nadelrast <dbl>,
# Nadelhalter <dbl>, Nadel <dbl>, …
$`Gleicharmige Fibeln`
# A tibble: 8 × 15
ID Grabnummer Fibelnummer `Arm 1` Bügel Bügelhöchstpunkt `Arm 2` Kanten
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 Kirch134 1 2 2 3 2 2
2 2 Wein711 1 3 3 4 3 3
3 3 MüPerl27 1 2 3 NA 2 2
4 4 MüPerl27 2 2 2 NA 2 2
5 NA <NA> NA NA NA NA NA NA
6 NA <NA> NA NA NA NA NA NA
7 NA <NA> NA NA NA NA NA NA
8 NA <NA> NA NA NA NA NA NA
# ℹ 7 more variables: Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>,
# Nadel <dbl>, `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>,
# `Abnutzung insgesamt` <dbl>, `Anzahl von Werten` <chr>
$Pferdchenfibeln
# A tibble: 14 × 18
ID Grabnummer Fibelnummer `Kopf+Hals` Körper Vorderbeine Hinterbeine
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 Alte117 3 3 2 3 3
2 2 Alte117 4 3 2 2 3
3 15 Meng11 1 4 4 4 4
4 3 MüPerl3 1 3 3 3 3
5 4 MüPerl3 2 3 3 3 3
6 11 Nere96 2 3 2 2 2
7 13 Nere96 3 3 2 3 3
8 9 Wein111 3 2 2 2 2
9 10 Wein111 4 2 2 2 2
10 7 Wein242 3 4 3 3 3
11 8 Wein242 4 4 3 3 3
12 NA <NA> <NA> NA NA NA NA
13 NA <NA> <NA> NA NA NA NA
14 NA <NA> <NA> NA NA NA NA
# ℹ 11 more variables: Standfläche <dbl>, Schwanz <dbl>, Reiter <dbl>,
# Kanten <dbl>, Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>,
# Nadel <dbl>, `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>,
# Gesamtabnutzung <dbl>, `Anzahl von Werten` <chr>
$Rautenfibeln
# A tibble: 22 × 16
ID Grabnummer Fibelnummer `Ecke 1` `Ecke 2` `Ecke 3` `Ecke 4` Fläche
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 9 AschB10 1 2 2 2 2 2
2 7 AschW3 1 2 2 2 NA 2
3 8 AschW3 2 2 3 2 NA 2
4 5 Aubi223 1 3 3 3 3 1
5 6 Aubi383 1 3 3 3 3 3
6 17 Meng38 B 1 3 4 NA NA 3
7 18 Meng38 B 2 3 4 NA NA 2
8 19 Meng50 1 3 3 3 3 2
9 1 Peig39 2 3 2 3 3 3
10 2 Peig88 1 2 2 2 2 2
# ℹ 12 more rows
# ℹ 8 more variables: Kanten <dbl>, Rückseite <dbl>, Nadelrast <dbl>,
# Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl der Werte` <chr>
$`Scheibenfibeln, Blech`
# A tibble: 62 × 16
ID Grabnummer Fibelnummer Fläche Mittelbuckel `Kante oben` `Kante rechts`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 16 AschB255 1 2 3 2 NA
2 17 AschB292 1 2 3 3 NA
3 18 AschB292 2 NA NA 2 3
4 61 Aubi505 1 NA NA NA NA
5 13 Aubi756 1 3 NA 3 NA
6 11 Ditt119 1 3 4 3 3
7 10 Ditt144 1 3 3 4 3
8 6 Ditt148 1 NA NA NA NA
9 4 Ditt167 1 4 NA 3 3
10 3 Ditt175 1 NA NA NA NA
# ℹ 52 more rows
# ℹ 9 more variables: `Kante unten` <dbl>, `Kante links` <dbl>,
# Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
$`Scheibenfibeln, gegossen`
# A tibble: 40 × 19
ID Grabnummer Fibelnummer `Fläche oben` `Fläche rechts` `Fläche unten`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 11 Alte1346 1 2 NA NA
2 1 Alte213 1 2 NA NA
3 6 Alte289 1 2 NA NA
4 7 Alte289 2 2 NA NA
5 2 Alte322 1 1 NA NA
6 3 Alte322 2 1 NA NA
7 4 Alte350 1 NA NA NA
8 5 Alte545 1 2 NA NA
9 9 Alte625 3 1 NA NA
10 10 Alte625 4 1 NA NA
# ℹ 30 more rows
# ℹ 13 more variables: `Fläche links` <dbl>, Buckel <dbl>, `Kante oben` <dbl>,
# `Kante rechts` <dbl>, `Kante unten` <dbl>, `Kante links` <dbl>,
# Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl der Werte` <chr>
$`Scheibenfibeln, Granat`
# A tibble: 103 × 16
ID Grabnummer Fibelnummer Fläche Mittelfeld `Kante oben` `Kante rechts`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 9 Alte1175 1 3 3 2 2
2 10 Alte1175 2 2 NA 2 2
3 3 Alte128 1 3 3 3 3
4 4 Alte128 2 3 3 3 3
5 1 Alte21 1 3 NA 2 2
6 32 Alte256 4 2 NA 3 3
7 2 Alte54 1 2 3 3 3
8 11 Alte762 1 3 1 3 4
9 12 Alte762 2 3 2 2 3
10 5 Alte813 1 1 NA 3 3
# ℹ 93 more rows
# ℹ 9 more variables: `Kante unten` <dbl>, `Kante links` <dbl>,
# Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
$`S-Fibeln`
# A tibble: 114 × 17
ID Grabnummer Fibelnummer `oberes Ende` `Spitze oberes Ende`
<dbl> <chr> <dbl> <dbl> <dbl>
1 20 Alte1147 1 2 2
2 21 Alte1147 2 2 3
3 22 Alte1148 1 1 2
4 23 Alte1148 2 2 3
5 4 Alte1237 3 3 3
6 25 Alte1253 2 2 3
7 2 Alte127 2 3 3
8 3 Alte127 1 3 3
9 26 Alte1289 1 2 2
10 27 Alte1289 2 2 2
# ℹ 104 more rows
# ℹ 12 more variables: `Diagonales Band` <dbl>, `Grat diagonales Band` <dbl>,
# `Unteres Ende` <dbl>, `Spitze unteres Ende` <dbl>, Kanten <dbl>,
# Rückseite <dbl>, Nadelrast <dbl>, Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkontruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
$Tierfibeln
# A tibble: 11 × 17
ID Grabnummer Fibelnummer `Kopf+Maul` Hals Körper Vorderbeine Hinterbeine
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 7 Aldi12 1 2 1 2 1 3
2 1 Alte31 3 1 1 1 1 1
3 2 Alte31 4 NA NA NA NA 4
4 3 AschW11 5 3 3 3 3 3
5 8 Nere143 2 1 2 1 2 2
6 4 Wein740 1 3 NA 3 3 3
7 5 Wein740 2 3 3 3 3 3
8 6 Wein745 1 3 3 3 3 3
9 NA <NA> NA NA NA NA NA NA
10 NA <NA> NA NA NA NA NA NA
11 NA <NA> NA NA NA NA NA NA
# ℹ 9 more variables: Schwanz <dbl>, Kanten <dbl>, Rückseite <dbl>,
# Nadelrast <dbl>, Nadelhalter <dbl>, Nadel <lgl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
$Vogelfibeln
# A tibble: 119 × 17
ID Grabnummer Fibelnummer Schnabel Kopf Körper Flügel Füße Schwanz
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 96 Aldi1 3 1 2 1 1 2 1
2 97 Aldi1 4 1 2 1 1 1 1
3 14 Alte1135 1 2 2 3 2 3 3
4 15 Alte1135 2 2 2 2 2 2 3
5 16 Alte1299 2 1 2 3 2 2 2
6 17 Alte1299 3 2 3 2 2 3 1
7 50 Alte130 1 2 3 2 3 3 3
8 51 Alte130 2 2 3 2 2 2 2
9 18 Alte1332 1 1 2 2 2 3 3
10 56 Alte1332 2 2 2 2 4 3 3
# ℹ 109 more rows
# ℹ 8 more variables: Kanten <dbl>, Rückseite <dbl>, Nadelrast <dbl>,
# Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
$Zikadenfibeln
# A tibble: 7 × 14
ID Grabnummer Fibelnummer Kopf Körper Flügel Kanten Rückseite Nadelrast
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3 Aldi18 3 1 1 1 1 2 1
2 4 Aldi18 4 1 1 1 1 2 1
3 1 Alte26 1 3 3 3 3 2 4
4 2 Alte26 2 3 3 3 3 2 NA
5 NA <NA> NA NA NA NA NA NA NA
6 NA <NA> NA NA NA NA NA NA NA
7 NA <NA> NA NA NA NA NA NA NA
# ℹ 5 more variables: Nadelhalter <dbl>, Nadel <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>, Gesamtabnutzung <dbl>,
# `Anzahl von Werten` <chr>
# die einzelnen Blätter sind nun unter ihrem Namen ansprechbar und auswertbar, z.B.
$Fibeln Sorg_sheets
# A tibble: 836 × 22
ID Grabkürzel Fibelnummer Fibeltyp Aufnahme `Abnutzung laut Bearbeiter`
<dbl> <chr> <dbl> <chr> <chr> <chr>
1 755 Aldi1 1 Bügelfibel Ja Nadel fehlt, sonst gut erha…
2 756 Aldi1 2 Bügelfibel Ja Nadel fehlt, sonst gut erha…
3 757 Aldi1 3 Vogelfibel Ja Nadel und Teile der Spiralk…
4 758 Aldi1 4 Vogelfibel Ja Nadel und Teile der Spiralk…
5 759 Aldi11 1 Bügelfibel Ja Nadelhalter wenig abgenutzt…
6 760 Aldi11 2 Bügelfibel Ja Nadelhalter wenig abgenutzt…
7 721 Aldi12 1 Tierfibel Ja Abnutzungsspuren
8 761 Aldi15 1 Bügelfibel Ja An Bügel und Knöpfen Abnutz…
9 762 Aldi15 2 Bügelfibel Ja An Bügel und Knöpfen Abnutz…
10 763 Aldi18 1 Bügelfibel Ja Starke Abnutzungsspuren am …
# ℹ 826 more rows
# ℹ 16 more variables: `Gesamtabnutzung, exakt` <dbl>,
# `Gesamtabnutzung, gerundet` <dbl>, `Gesamtabnutzung, ganze Zahl` <dbl>,
# `Gesamtabnutzung ohne Nadelkonstruktion` <dbl>,
# `Gesamtabnutzung, gleichmäßig verteilt` <dbl>,
# `Anzahl der untersuchten Areale` <dbl>, Gewicht <dbl>, Länge <chr>,
# Vierfibelkombination <chr>, `Lage Fibel 1` <chr>, `Lage Fibel 2` <chr>, …
# Umgehen der Länge als Textcodierung:
<- cbind(Sorg_sheets$Fibeln, Sorg_sheets$lang)
mydf head(mydf)
ID Grabkürzel Fibelnummer Fibeltyp Aufnahme
1 755 Aldi1 1 Bügelfibel Ja
2 756 Aldi1 2 Bügelfibel Ja
3 757 Aldi1 3 Vogelfibel Ja
4 758 Aldi1 4 Vogelfibel Ja
5 759 Aldi11 1 Bügelfibel Ja
6 760 Aldi11 2 Bügelfibel Ja
Abnutzung laut Bearbeiter
1 Nadel fehlt, sonst gut erhalten
2 Nadel fehlt, sonst gut erhalten
3 Nadel und Teile der Spiralkonstruktion fehlen, sonst gut erhalten
4 Nadel und Teile der Spiralkonstruktion fehlen, sonst gut erhalten
5 Nadelhalter wenig abgenutzt, Vergoldung an den Knöpfen stark abgerieben
6 Nadelhalter wenig abgenutzt, Vergoldung an den Knöpfen stark abgerieben
Gesamtabnutzung, exakt Gesamtabnutzung, gerundet Gesamtabnutzung, ganze Zahl
1 1.428571 1.428571 1.428571
2 1.357143 1.357143 1.357143
3 1.400000 1.400000 1.400000
4 1.200000 1.200000 1.200000
5 1.750000 1.750000 1.750000
6 1.875000 1.875000 1.875000
Gesamtabnutzung ohne Nadelkonstruktion Gesamtabnutzung, gleichmäßig verteilt
1 1.333333 1
2 1.250000 1
3 1.375000 1
4 1.250000 1
5 1.785714 2
6 1.857143 2
Anzahl der untersuchten Areale Gewicht Länge Vierfibelkombination
1 14 28.2 7,8 ja
2 14 29.7 7,9 ja
3 10 2.8 2,5 ja
4 10 3.1 2,5 ja
5 16 16.8 7,5 <NA>
6 16 17.1 7,5 <NA>
Lage Fibel 1 Lage Fibel 2 Lage Fibel 3
1 In Bauchmitte <NA> <NA>
2 <NA> Am linken Oberschenkel <NA>
3 <NA> <NA> Auf der linken Brust
4 <NA> <NA> <NA>
5 Auf dem rechten Becken <NA> <NA>
6 <NA> Unterhalb des rechten Beckens <NA>
Lage Fibel 4 Metallanalyse Aufbewahrungsort
1 <NA> NA WLM
2 <NA> NA WLM
3 <NA> NA WLM
4 Am rechten Knie NA WLM
5 <NA> NA WLM
6 <NA> NA WLM
Sonstiges
1 <NA>
2 Bruchlinien an der Nadelrast.
3 <NA>
4 Größerer Rest der Spirale am Nadelhalter erhalten.
5 Auf Zeichnung hufeisenförmige Delle (?) neben der Nadelrast. Kopfplattenrückseite mit Kreuzschraffur. Beschriftung: Aldingen Grab 11/2 F 83,110.
6 Auf Zeichnung 2 Kerben auf Fußrückseite. Kopfplattenrückseite mit Kreuzschraffur. Beschriftung: Aldingen Grab 11/1 F83,110.
lang
1 7.8
2 7.9
3 2.5
4 2.5
5 7.5
6 7.5
Der Datensatz “mydf” (my data file) enthält nun alle Informationen aus dem Sorgschen Blatt “Fibeln” plus als “lang” die zahlenkodierte Länge der Fibeln. Aus diesem Blatt lese ich die Bügelfibeln heraus und speichere sie als “mydf2”. Bei Sichtung der Variable “Gewicht” bemerkt man, dass eine fehlende Beobachtung “es liegt keine Gewichtsangabe vor” von Sorg als “0” = Null Gramm Gewicht abgelegt wurde. Da es nachfolgend zunächst um das Gewicht der Bügelfibeln geht, reduziere ich den Datensatz um alle Stücke, die 0 gr Gewicht aufweisen.
<- mydf[mydf$Fibeltyp == "Bügelfibel", ]
mydf2 head(mydf2)
ID Grabkürzel Fibelnummer Fibeltyp Aufnahme
1 755 Aldi1 1 Bügelfibel Ja
2 756 Aldi1 2 Bügelfibel Ja
5 759 Aldi11 1 Bügelfibel Ja
6 760 Aldi11 2 Bügelfibel Ja
8 761 Aldi15 1 Bügelfibel Ja
9 762 Aldi15 2 Bügelfibel Ja
Abnutzung laut Bearbeiter
1 Nadel fehlt, sonst gut erhalten
2 Nadel fehlt, sonst gut erhalten
5 Nadelhalter wenig abgenutzt, Vergoldung an den Knöpfen stark abgerieben
6 Nadelhalter wenig abgenutzt, Vergoldung an den Knöpfen stark abgerieben
8 An Bügel und Knöpfen Abnutzungsspuren
9 An Bügel und Knöpfen Abnutzungsspuren
Gesamtabnutzung, exakt Gesamtabnutzung, gerundet Gesamtabnutzung, ganze Zahl
1 1.428571 1.428571 1.428571
2 1.357143 1.357143 1.357143
5 1.750000 1.750000 1.750000
6 1.875000 1.875000 1.875000
8 2.428571 2.428571 2.428571
9 2.692308 2.692308 2.692308
Gesamtabnutzung ohne Nadelkonstruktion Gesamtabnutzung, gleichmäßig verteilt
1 1.333333 1
2 1.250000 1
5 1.785714 2
6 1.857143 2
8 2.416667 2
9 2.727273 3
Anzahl der untersuchten Areale Gewicht Länge Vierfibelkombination
1 14 28.2 7,8 ja
2 14 29.7 7,9 ja
5 16 16.8 7,5 <NA>
6 16 17.1 7,5 <NA>
8 14 24.3 7,1 <NA>
9 13 26.1 7,2 <NA>
Lage Fibel 1 Lage Fibel 2 Lage Fibel 3
1 In Bauchmitte <NA> <NA>
2 <NA> Am linken Oberschenkel <NA>
5 Auf dem rechten Becken <NA> <NA>
6 <NA> Unterhalb des rechten Beckens <NA>
8 Auf dem linken Becken <NA> <NA>
9 <NA> Auf dem linken Becken <NA>
Lage Fibel 4 Metallanalyse Aufbewahrungsort
1 <NA> NA WLM
2 <NA> NA WLM
5 <NA> NA WLM
6 <NA> NA WLM
8 <NA> NA WLM
9 <NA> NA WLM
Sonstiges
1 <NA>
2 Bruchlinien an der Nadelrast.
5 Auf Zeichnung hufeisenförmige Delle (?) neben der Nadelrast. Kopfplattenrückseite mit Kreuzschraffur. Beschriftung: Aldingen Grab 11/2 F 83,110.
6 Auf Zeichnung 2 Kerben auf Fußrückseite. Kopfplattenrückseite mit Kreuzschraffur. Beschriftung: Aldingen Grab 11/1 F83,110.
8 Weniger Textilreste um den Nadelhalter.
9 Viele Textilreste um den Nadelhalter. Nach Zeichnung Reihe aus Doppelpunkten entlang der Mittellinie der Fußrückseite.
lang
1 7.8
2 7.9
5 7.5
6 7.5
8 7.1
9 7.2
#
<- mydf2[mydf2$Gewicht > 0, ]
mydf3 View(mydf3)
#
<- mydf3[!is.na(mydf3$ID), ]
mydf3 View(mydf3)
#
summary(mydf3)
ID Grabkürzel Fibelnummer Fibeltyp
Min. : 1.0 Length:81 Min. :1.000 Length:81
1st Qu.:131.0 Class :character 1st Qu.:1.000 Class :character
Median :198.0 Mode :character Median :2.000 Mode :character
Mean :340.1 Mean :1.679
3rd Qu.:720.0 3rd Qu.:2.000
Max. :804.0 Max. :4.000
Aufnahme Abnutzung laut Bearbeiter Gesamtabnutzung, exakt
Length:81 Length:81 Min. :0.000
Class :character Class :character 1st Qu.:0.000
Mode :character Mode :character Median :2.111
Mean :1.646
3rd Qu.:2.667
Max. :3.462
Gesamtabnutzung, gerundet Gesamtabnutzung, ganze Zahl
Min. :0.000 Min. :0.000
1st Qu.:0.000 1st Qu.:0.000
Median :2.111 Median :2.111
Mean :1.646 Mean :1.646
3rd Qu.:2.667 3rd Qu.:2.667
Max. :3.462 Max. :3.462
Gesamtabnutzung ohne Nadelkonstruktion Gesamtabnutzung, gleichmäßig verteilt
Min. :0.000 Min. :1.0
1st Qu.:0.000 1st Qu.:2.0
Median :2.077 Median :3.0
Mean :1.628 Mean :2.5
3rd Qu.:2.727 3rd Qu.:3.0
Max. :3.364 Max. :4.0
NA's :27
Anzahl der untersuchten Areale Gewicht Länge
Min. : 0.000 Min. : 3.40 Length:81
1st Qu.: 0.000 1st Qu.: 12.25 Class :character
Median :13.000 Median : 16.30 Mode :character
Mean : 9.321 Mean : 25.64
3rd Qu.:14.000 3rd Qu.: 26.10
Max. :18.000 Max. :140.00
Vierfibelkombination Lage Fibel 1 Lage Fibel 2 Lage Fibel 3
Length:81 Length:81 Length:81 Length:81
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Lage Fibel 4 Metallanalyse Aufbewahrungsort Sonstiges
Length:81 Mode:logical Length:81 Length:81
Class :character NA's:81 Class :character Class :character
Mode :character Mode :character Mode :character
lang
Min. : 3.65
1st Qu.: 6.10
Median : 7.20
Mean : 7.72
3rd Qu.: 8.50
Max. :16.20
Gewicht der Bügelfibeln
Danach enthält der Datensatz 81 Bügelfibeln, zu denen das Gewicht bekannt ist. Als für solche Daten übliche Darstellungsweise wähle ich ein Histogramm.
library(ggplot2)
ggplot(mydf3, aes(x=Gewicht)) +
geom_histogram(colour="white", fill="blue", alpha=0.7) +
labs(title="Gewicht Bügelfibeln",
x="Gewicht (in gr)",
y="Anzahl")
Das Histogramm bestätigt die Ausführungen von Sorg (2022, 103ff. mit Anm. 655), wonach Bügelfibeln schwerer als 35 Gramm Ausreißer sind und die weitere Detailanalyse stören. Ich schließe sie daher aus dem Datensatz aus und zeichne erneut ein Histogramm:
<- mydf3[mydf3$Gewicht < 35.0, ]
mydf4 nrow(mydf4)
[1] 71
#
ggplot(mydf4, aes(x=Gewicht)) +
geom_histogram(binwidth=1, colour="white", fill="blue", alpha=0.7) +
scale_x_continuous(breaks=seq(0, 35, 1)) +
labs(title="Gewicht Bügelfibeln",
subtitle = "ohne Bügelfibeln > 35 gr",
x="Gewicht (in gr)",
y="Anzahl")
Dieses Bild möchte ich als Abbildung für den Druck verwenden, es braucht daher zusätzlich einige Anpassungen:
<- par(no.readonly=TRUE) # speichert die originalen par-Parameter
opar par(pin=c(11/2.54, 6.2/2.54)) # legt die Bildgröße auf 11 zu 6.2 cm fest
par(mai=c(0.85, 0.85, 0.85, 0.85)) # setzt die Bildränder: c(bottom, left, top, right), in inch
#
# tiff(file="Abb_1.tif", width=110, height=62, units="mm", res=300)
#
ggplot(mydf4, aes(x=Gewicht)) +
geom_histogram(binwidth=1, colour="white", fill="blue", alpha=0.6) +
scale_x_continuous(breaks=seq(0, 34, 2)) +
labs(title="",
x="Gewicht (in gr)",
y="Anzahl Fibeln") +
theme(axis.title.x = element_text(size =11)) +
theme(axis.text.x = element_text(size = 9)) +
theme(axis.title.y = element_text(size =9)) +
theme(axis.text.y = element_text(size = 7))
par(opar) # liest die ursprünglichen par-Einstellungen wieder zurück
Als Darstellungsalternative gebe ich die gleichen Daten als Dichtekurve aus:
<- par(no.readonly=TRUE) # speichert die originalen par-Parameter
opar par(pin=c(11/2.54, 6.2/2.54)) # legt die Bildgröße auf 11 zu 6.2 cm fest
par(mai=c(0.85, 0.85, 0.85, 0.85)) # setzt die Bildränder: c(bottom, left, top, right), in inch
#
# tiff(file="Abb_2.tif", width=110, height=62, units="mm", res=300)
#
ggplot(mydf4, aes(x=Gewicht)) +
geom_density(fill="blue", alpha=.4, bw=.8) +
scale_x_continuous(breaks=seq(0, 36, 2)) +
labs(title="",
x="Gewicht (in gr)",
y="EDF") +
theme(axis.title.x = element_text(size =11)) +
theme(axis.text.x = element_text(size = 9)) +
theme(axis.title.y = element_text(size =9)) +
theme(axis.text.y = element_text(size = 7))
par(opar) # liest die ursprünglichen par-Einstellungen wieder zurück
Zusammenhang Länge und Gewicht bei Bügelfibeln
Nachfolgend eine kurze Analyse des Zusammenhangs zwischen der Länge und dem Gewicht der Bügelfibeln – ein Aspekt, der in der o.g. Rezension nicht näher behandelt wird. Sorg sieht diesen Zusammenhang als nicht gegeben an.
ggplot(data=mydf4, mapping=aes(x=Gewicht, y=lang)) +
scale_x_continuous(breaks=seq(0, 36, 1)) +
scale_y_continuous(breaks=seq(0, 13, 1)) +
geom_point(alpha=0.4, col="blue", shape=19, size=2.5) +
labs(title = "Bügelfibeln bis 35 gr",
x = "Gewicht (gr)",
y = "Länge (cm)")
#
cor.test(mydf4$Gewicht, mydf4$lang, method="kendall")
Kendall's rank correlation tau
data: mydf4$Gewicht and mydf4$lang
z = 8.4502, p-value < 2.2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.6918942
#
.1 <- lm(Gewicht ~ lang, data=mydf4)
Modell.1 Modell
Call:
lm(formula = Gewicht ~ lang, data = mydf4)
Coefficients:
(Intercept) lang
-8.361 3.584
summary(Modell.1)
Call:
lm(formula = Gewicht ~ lang, data = mydf4)
Residuals:
Min 1Q Median 3Q Max
-7.1715 -3.0934 -0.7524 2.7338 9.7479
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.3606 1.9578 -4.27 6.11e-05 ***
lang 3.5839 0.2689 13.33 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.163 on 69 degrees of freedom
Multiple R-squared: 0.7202, Adjusted R-squared: 0.7162
F-statistic: 177.6 on 1 and 69 DF, p-value: < 2.2e-16
Das Streuungsdiagramm zeigt, dass der Zusammenhang (wie erwartet) gegeben und recht deutlich ist. Die Regressionsrechnung besagt, dass der Zusammenhanbg statistisch hochsignifikant ist. Mit der Formel “Länge mal 3,58 minus 8,36” kann man das Gewicht einer Bügelfibel schätzen, die Hälfte aller resultierenden Schätzungen haben einen Schätzfehler zwischen -3,1 und plus 2,7 Gramm. Die Stärke des Zusammenhangs beträgt 0,72 (“R-Squared”), was ein relativ starker / enger Zusammenhang ist.
Abnutzung von Fibeln
Nachfolgend betrachte ich alle Gräber mit abgenutzten Fibeln, gehe also (wie Sorg) über die Bügelfibeln hinaus. Für übergreifende Betrachtungen hat Sorg im Datenblatt “Gräber” aus den Abnutzungswerten der einzelnen Fibeln eines Grabes einen Mittelwert errechnet, von ihr als “Abnutzungsgrad je Grab, exakt” bezeichnet. Auch hier sind vor der Auswertung wieder diverse Datenbereinigungen und -aufbereitungen nötig: Ich fokussiere auf die klar und relativ genau definierten anthropologischen Altersklassen und entferne die anthropologisch erheblich ungenauer bestimmten “Zwischenstufen”, die de fakto zwei oder gar mehr Altersklassen umfassen. Zudem entferne ich alle alters-unbestimmten Grabinventare aus dem Datensatz, wonach noch 2.734 Fälle übrig bleiben.
<- Sorg_sheets$Gräber
mydf5 head(mydf5)
# A tibble: 6 × 25
ID Gräberfeld Grabnummer Beraubung Störung `Fibeln vorhanden`
<dbl> <chr> <chr> <chr> <chr> <chr>
1 796 Aldingen Aldi1 <NA> <NA> Ja
2 797 Aldingen Aldi11 <NA> <NA> Ja
3 771 Aldingen Aldi12 ja antik Ja
4 798 Aldingen Aldi15 <NA> <NA> Ja
5 875 Aldingen Aldi17 <NA> <NA> Nein
6 799 Aldingen Aldi18 <NA> <NA> Ja
# ℹ 19 more variables: `Anzahl Fibeln` <dbl>, Vierfibelkombination <chr>,
# `Typ Fibel 1` <chr>, `Typ Fibel 2` <chr>, `Typ Fibel 3` <chr>,
# `Typ Fibel 4` <chr>, `Typ Fibel 5` <chr>,
# `Abnutzungsgrad je Grab, exakt` <dbl>,
# `Abnutzungsgrad je Grab, gerundet` <dbl>,
# `Abnutzungsgrad je Grab, ganze Zahl` <dbl>,
# `Abnutzungsgrad je Grab, gleichmäßig verteilt` <dbl>, …
View(mydf5)
#
$Alter <- mydf5$Altersziffer
mydf5#
<- within(mydf5,{
mydf5 <- NA
Alter == 1] <- "1:infans I"
Alter[Altersziffer == 2] <- "2:infans II"
Alter[Altersziffer == 3] <- "3:juvenil"
Alter[Altersziffer == 4] <- "4:adult"
Alter[Altersziffer == 5] <- "5:matur"
Alter[Altersziffer == 6] <- "6:senil"
Alter[Altersziffer
})#
<- mydf5[!is.na(mydf5$Alter), ]
mydf5 nrow(mydf5)
[1] 2734
#
table(mydf5$Alter)
1:infans I 2:infans II 3:juvenil 4:adult 5:matur 6:senil
205 173 203 1382 555 216
barplot(table(mydf5$Alter))
Sodann benenne ich die Variable “Abnutzungsgrad je Grab, exakt” um in “Abnutzung” und entferne alle Gräber aus dem Datensatz, zu dem diese Kennzahl nicht vorliegt (bei Sorg als “0” kodiert).
names(mydf5)[14] <- "Abnutzung"
#
<- mydf5[mydf5$Abnutzung > 0.5, ]
mydf5 nrow(mydf5)
[1] 282
summary(mydf5$Abnutzung)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.032 2.466 2.461 2.855 4.000
sd(mydf5$Abnutzung)
[1] 0.5471537
Es verbleiben 282 Gräber mit einem mittleren Abnutzungsgrab pro Grab, zu dem anthropologische Altersbestimmungen hinreichender Qualität vorliegen. Der mittlere Abnutzungsgrad in der gesamten Stichprobe liegt bei 2,46, die Standardabweichung beträgt 0,55, d. h. ca. zwei Drittel aller Beobachtungen liegen im Intervall 1,9 bis 3,0. Der Median beträgt 2,47, die 50 %-Spanne beträgt 2,03 - 2,86. Die Nähe von Mittelwert und Median deuten eine weitgehend symmetrische Verteilung an. Zur Visualisierung bestelle ich ein Histogramm:
<- par(no.readonly=TRUE) # speichert die originalen par-Parameter
opar par(pin=c(11/2.54, 6.2/2.54)) # legt die Bildgröße auf 11 zu 6.2 cm fest
par(mai=c(0.85, 0.85, 0.85, 0.85)) # setzt die Bildränder: c(bottom, left, top, right), in inch
#
# tiff(file="Abb_3.tif", width=110, height=62, units="mm", res=300)
#
ggplot(mydf5, aes(x=Abnutzung)) +
geom_histogram(binwidth=.25, colour="white", fill="blue", alpha=0.7) +
scale_x_continuous(breaks=seq(1, 4, .5),
minor_breaks=seq(1, 4, .1)) +
labs(title="",
x="Mittelwert Abnutzungsgrad Grab",
y="Anzahl Fibeln") +
theme(axis.title.x = element_text(size =11)) +
theme(axis.text.x = element_text(size = 9)) +
theme(axis.title.y = element_text(size =9)) +
theme(axis.text.y = element_text(size = 7))
par(opar)
Alternativ wieder als Dichtekurve visualisiert:
ggplot(mydf5, aes(x=Abnutzung)) +
geom_density(fill="blue", alpha=.4, bw=.075) +
scale_x_continuous(breaks=seq(1, 4, .5),
minor_breaks=seq(1, 4, .1)) +
labs(title="",
x="Mittelwert Abnutzungsgrad Grab",
y="Anzahl Fibeln")
Mit Hilfe des R-Pakets “hdrcde” bestimme ich genauer, wo die “Berge” in der Dichtekurve der Abnutzung liegen. Danach fallen 50 % aller Beobachtungen auf der Skala von 1,0 bis 4,0 in die drei recht eng definierten Bereich 1,95 bis 2,06 (1. Gipfel), den Bereich 2,33 bis 2,72 (2. Gipfel) und den Bereich 2,97 bis 3,04 (3. Gipfel).
# install.packages('hdrcde', dependencies = TRUE)
library(hdrcde)
#
hdr.den(mydf5$Abnutzung, h=0.05)
$hdr
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
99% 0.9530958 1.069203 1.102738 1.180978 1.225750 3.538118 3.640325 3.7321
95% 1.3579134 1.562867 1.609704 3.456406 NA NA NA NA
50% 1.9535887 2.055734 2.331125 2.721462 2.970897 3.038299 NA NA
[,9] [,10]
99% 3.825354 3.859674
95% NA NA
50% NA NA
$mode
[1] 2.0017
$falpha
1% 5% 50%
0.05474208 0.08689683 0.65325657
Zusammenhang von Abnutzung und Alter
Zur Visulaisierung des Zusammenhangs von mittlerem Abnutzungsgrad pro Grab und Alter der Verstorbenen wird nun pro Altersklasse eine Dichtekurze gezeichnet:
<- par(no.readonly=TRUE) # speichert die originalen par-Parameter
opar par(pin=c(16/2.54, 12/2.54)) # legt die Bildgröße auf 16 x 12 cm fest
par(mai=c(0.85, 0.85, 0.85, 0.85)) # setzt die Bildränder: c(bottom, left, top, right), in inch
#
# tiff(file="Abb_4.tif", width=160, height=120, units="mm", res=300)
#
#
ggplot(mydf5, aes(x=Abnutzung, group=Alter)) +
geom_density(fill="blue", alpha=0.4, bw=.075) +
facet_wrap(~Alter , dir="v") +
geom_vline(xintercept = 2.0, color="red", lty=3, lwd=1.2) +
geom_vline(xintercept = 2.5, color="blue", lty=3, lwd=1.2) +
geom_vline(xintercept = 3.0, color="black", lty=3, lwd=1.2) +
labs(x="mittlerer Abnutzungsgrab je Grab", y="Dichte (EDF)",
title="") +
theme(axis.title.x = element_text(size =12)) +
theme(axis.text.x = element_text(size = 11)) +
theme(axis.title.y = element_text(size =11)) +
theme(axis.text.y = element_text(size = 9)) +
theme(strip.text.x = element_text(size = 12))
par(opar)
Test auf Altersabhängigkeit des Abnutzungsgrades
Zunächst gewinnen der Kennzahlen pro Altersklasse:
library(psych)
$Alter <- as.factor(mydf5$Alter)
mydf5table(mydf5$Alter)
1:infans I 2:infans II 3:juvenil 4:adult 5:matur 6:senil
16 19 17 155 48 27
#
::describeBy(mydf5$Abnutzung, group=mydf5$Alter,
psychdigits=2, mat=TRUE)
item group1 vars n mean sd median trimmed mad min max range
X11 1 1:infans I 1 16 2.32 0.53 2.34 2.31 0.50 1.50 3.29 1.79
X12 2 2:infans II 1 19 2.35 0.50 2.31 2.36 0.69 1.40 3.11 1.71
X13 3 3:juvenil 1 17 2.23 0.52 2.11 2.23 0.49 1.25 3.33 2.08
X14 4 4:adult 1 155 2.46 0.54 2.44 2.46 0.54 1.00 4.00 3.00
X15 5 5:matur 1 48 2.61 0.52 2.63 2.64 0.51 1.14 3.43 2.29
X16 6 6:senil 1 27 2.49 0.67 2.56 2.51 0.55 1.13 3.75 2.62
skew kurtosis se
X11 0.04 -1.18 0.13
X12 0.05 -1.29 0.12
X13 0.30 -0.51 0.13
X14 0.10 0.51 0.04
X15 -0.65 0.07 0.08
X16 -0.36 -0.70 0.13
Anschließend ein Kruskal-Wallis-Test auf Signifikanz der Unterschiede, zunächst für die gesamte Stichprobe, d. h. alle Altersklassen inklusive infans I und infans II:
kruskal.test(Abnutzung ~ Alter, data=mydf5)
Kruskal-Wallis rank sum test
data: Abnutzung by Alter
Kruskal-Wallis chi-squared = 10.646, df = 5, p-value = 0.05888
Im zweiten Schritt führe ich den gleichen Test aus für den um die Altersklassen “infans I” und “infans II” reduzierten Datensatz, d. h. für die vier Altersklassen juvenil, adult, matur und senil.
<- mydf5[mydf5$Alter != "1:infans I" & mydf5$Alter != "2:infans II", ]
mydf6 nrow(mydf6)
[1] 247
head(mydf6)
# A tibble: 6 × 26
ID Gräberfeld Grabnummer Beraubung Störung `Fibeln vorhanden`
<dbl> <chr> <chr> <chr> <chr> <chr>
1 797 Aldingen Aldi11 <NA> <NA> Ja
2 771 Aldingen Aldi12 ja antik Ja
3 798 Aldingen Aldi15 <NA> <NA> Ja
4 799 Aldingen Aldi18 <NA> <NA> Ja
5 769 Aldingen Aldi8 <NA> <NA> Ja
6 770 Aldingen Aldi9 <NA> <NA> Ja
# ℹ 20 more variables: `Anzahl Fibeln` <dbl>, Vierfibelkombination <chr>,
# `Typ Fibel 1` <chr>, `Typ Fibel 2` <chr>, `Typ Fibel 3` <chr>,
# `Typ Fibel 4` <chr>, `Typ Fibel 5` <chr>, Abnutzung <dbl>,
# `Abnutzungsgrad je Grab, gerundet` <dbl>,
# `Abnutzungsgrad je Grab, ganze Zahl` <dbl>,
# `Abnutzungsgrad je Grab, gleichmäßig verteilt` <dbl>,
# `Geschlechtsbestimmung, archäologisch` <chr>, …
#
kruskal.test(Abnutzung ~ Alter, data=mydf6)
Kruskal-Wallis rank sum test
data: Abnutzung by Alter
Kruskal-Wallis chi-squared = 8.2625, df = 3, p-value = 0.04089
Ergebnis: bei den Altersklassen juvenil bis senil sind die Unterschiede im Abnutzungsgrad statistisch signifikant.
Literatur
Sorg, M. (2022). Fibelausstattung und Lebensalter in der Merowingerzeit: Studien zu Abnutzung und Gebrauch frühmittelalterlicher Bügelfibeln. (RGA Erg.bd., 129). Berlin: de Gruyter. https://doi.org/10.1515/9783110754810
Siegmund, F. (2023). Rezension zu: Sorg, M. (2022). Fibelausstattung und Lebensalter in der Merowingerzeit: Studien zu Abnutzung und Gebrauch frühmittelalterlicher Bügelfibeln. (RGA Erg.bd., 129). Berlin: de Gruyter. Archäologische Informationen 46, Early View, online publiziert 5. Mai 2023. https://dguf.de/fileadmin/AI/archinf-ev_siegmund4.pdf