repare 0.0.2__tar.gz → 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of repare might be problematic. Click here for more details.
- repare-0.1.1/.gitattributes +2 -0
- {repare-0.0.2 → repare-0.1.1}/.gitignore +9 -4
- {repare-0.0.2 → repare-0.1.1}/.pre-commit-config.yaml +1 -1
- repare-0.1.1/PKG-INFO +121 -0
- repare-0.1.1/README.md +100 -0
- repare-0.1.1/benchmarks/published/compare_gurgy_pedigrees.py +81 -0
- repare-0.1.1/benchmarks/published/compare_nepluyevsky_pedigrees.py +52 -0
- repare-0.1.1/benchmarks/published/data/gurgy/citation.md +3 -0
- repare-0.1.1/benchmarks/published/data/gurgy/published_exact_relations.csv +266 -0
- repare-0.1.1/benchmarks/published/data/hazleton_north/citation.md +1 -0
- repare-0.1.1/benchmarks/published/data/hazleton_north/published_exact_relations.csv +71 -0
- repare-0.1.1/benchmarks/published/data/nepluyevsky/citation.md +1 -0
- repare-0.1.1/benchmarks/published/data/nepluyevsky/published_exact_relations.csv +83 -0
- repare-0.1.1/benchmarks/published/evaluator/comparison_utils.py +66 -0
- repare-0.0.2/benchmarks/published/comparator/relation_comparison.py → repare-0.1.1/benchmarks/published/evaluator/pedigree_evaluator.py +105 -54
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree.svg +7076 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree_repositioned_cropped.pdf +0 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree_repositioned_cropped.svg +15522 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree.svg +6957 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree_cropped.pdf +0 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree_cropped.svg +35690 -0
- repare-0.1.1/benchmarks/published/results/gurgy_comparison/relation_differences.csv +49 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree.svg +2482 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree_cropped.pdf +0 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree_cropped.svg +5120 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree.svg +2568 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree_cropped.pdf +0 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree_cropped.svg +10782 -0
- repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/relation_differences.csv +9 -0
- repare-0.1.1/benchmarks/published/results/results.csv +6 -0
- repare-0.1.1/benchmarks/published/run_evaluations.py +47 -0
- repare-0.1.1/benchmarks/simulations/plot_parameter_data.py +133 -0
- repare-0.1.1/benchmarks/simulations/plot_sampling_data.py +84 -0
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.0_error_rate_scale=0.0.csv +22 -22
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.0_error_rate_scale=0.5.csv +30 -30
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.0_error_rate_scale=1.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.0_error_rate_scale=2.0.csv +101 -0
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.2_error_rate_scale=0.0.csv +21 -21
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.2_error_rate_scale=0.5.csv +38 -38
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.2_error_rate_scale=1.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.2_error_rate_scale=2.0.csv +101 -0
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.4_error_rate_scale=0.0.csv +45 -45
- {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.4_error_rate_scale=0.5.csv +47 -47
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.4_error_rate_scale=1.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.4_error_rate_scale=2.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=0.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=0.5.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=1.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=2.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/degree_f1_heatmap.pdf +0 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/pedigree_summary_statistics.pdf +0 -0
- repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/relation_f1_heatmap.pdf +0 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.2.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.4.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.2.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.4.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.0.csv +101 -0
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.4_error_rate_scale=1.0.csv → repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.2.csv +101 -101
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.4.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.0.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.2.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.4.csv +101 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/plots/degree_f1_heatmap.pdf +0 -0
- repare-0.1.1/benchmarks/simulations/results/sampling_experiment/plots/relation_f1_heatmap.pdf +0 -0
- repare-0.0.2/benchmarks/simulations/run_simulations.py → repare-0.1.1/benchmarks/simulations/run_parameter_experiment.py +24 -12
- repare-0.1.1/benchmarks/simulations/run_sampling_experiment.py +88 -0
- {repare-0.0.2 → repare-0.1.1}/benchmarks/simulations/simulator/simulated_pedigree.py +64 -42
- repare-0.1.1/examples/algorithm_diagram.svg +2181 -0
- repare-0.1.1/examples/nodes.csv +7 -0
- repare-0.1.1/examples/outputs/corrected_input_relations.csv +21 -0
- repare-0.1.1/examples/outputs/reconstructed_exact_relations.csv +12 -0
- repare-0.1.1/examples/outputs/reconstructed_pedigree.pdf +0 -0
- repare-0.1.1/examples/relations.csv +12 -0
- repare-0.1.1/examples/repare.sh +3 -0
- repare-0.1.1/pixi.lock +7321 -0
- repare-0.1.1/pyproject.toml +76 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare/main.py +9 -3
- {repare-0.0.2 → repare-0.1.1}/src/repare/pedigree.py +491 -242
- {repare-0.0.2 → repare-0.1.1}/src/repare/pedigree_reconstructor.py +213 -43
- repare-0.1.1/src/repare.egg-info/PKG-INFO +121 -0
- repare-0.1.1/src/repare.egg-info/SOURCES.txt +98 -0
- repare-0.0.2/PKG-INFO +0 -35
- repare-0.0.2/README.md +0 -15
- repare-0.0.2/benchmarks/published/data/blocher/citation.bib +0 -16
- repare-0.0.2/benchmarks/published/data/blocher/published_exact_relations.csv +0 -83
- repare-0.0.2/benchmarks/published/data/fowler/citation.bib +0 -15
- repare-0.0.2/benchmarks/published/data/fowler/published_exact_relations.csv +0 -71
- repare-0.0.2/benchmarks/published/data/rivollat/citation.bib +0 -34
- repare-0.0.2/benchmarks/published/data/rivollat/published_exact_relations.csv +0 -266
- repare-0.0.2/benchmarks/published/run_comparisons.py +0 -26
- repare-0.0.2/benchmarks/simulations/plot_data.py +0 -99
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.0_error_rate_scale=1.0.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.0_error_rate_scale=2.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.2_error_rate_scale=1.0.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.2_error_rate_scale=2.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.4_error_rate_scale=2.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=0.0.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=0.5.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=1.0.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=2.csv +0 -101
- repare-0.0.2/benchmarks/simulations/results/plots/degree_f1_heatmap.png +0 -0
- repare-0.0.2/benchmarks/simulations/results/plots/pedigree_summary_statistics.png +0 -0
- repare-0.0.2/benchmarks/simulations/results/plots/relation_f1_heatmap.png +0 -0
- repare-0.0.2/pyproject.toml +0 -50
- repare-0.0.2/src/repare.egg-info/PKG-INFO +0 -35
- repare-0.0.2/src/repare.egg-info/SOURCES.txt +0 -55
- {repare-0.0.2 → repare-0.1.1}/LICENSE +0 -0
- {repare-0.0.2/benchmarks/published/data/rivollat → repare-0.1.1/benchmarks/published/data/gurgy}/inferred_relations_READv2.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/rivollat → repare-0.1.1/benchmarks/published/data/gurgy}/nodes.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/inferred_relations_coeffs.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/inferred_relations_custom.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/nodes.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/inferred_relations_KIN.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/inferred_relations_custom.csv +0 -0
- {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/nodes.csv +0 -0
- {repare-0.0.2/benchmarks/published/comparator → repare-0.1.1/benchmarks/published/evaluator}/__init__.py +0 -0
- {repare-0.0.2 → repare-0.1.1}/benchmarks/simulations/simulator/__init__.py +0 -0
- {repare-0.0.2 → repare-0.1.1}/setup.cfg +0 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare/__init__.py +0 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/dependency_links.txt +0 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/entry_points.txt +0 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/requires.txt +0 -0
- {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
# Data directories
|
|
2
|
-
*raw_data
|
|
3
|
-
*sandbox_data
|
|
1
|
+
# Data / sandbox directories
|
|
2
|
+
*raw_data/
|
|
3
|
+
*sandbox_data/
|
|
4
|
+
*sandbox/
|
|
4
5
|
|
|
5
6
|
# .DS_Store files
|
|
6
7
|
.DS_Store
|
|
@@ -178,4 +179,8 @@ cython_debug/
|
|
|
178
179
|
#.idea/
|
|
179
180
|
|
|
180
181
|
# PyPI configuration file
|
|
181
|
-
.pypirc
|
|
182
|
+
.pypirc
|
|
183
|
+
|
|
184
|
+
# pixi environments
|
|
185
|
+
.pixi/*
|
|
186
|
+
!.pixi/config.toml
|
repare-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: repare
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Reconstruct (ancient) pedigrees from pairwise kinship relations.
|
|
5
|
+
Author-email: Edward Huang <edwardhuangc@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Source, https://github.com/ehuangc/repare
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: matplotlib
|
|
12
|
+
Requires-Dist: networkx
|
|
13
|
+
Requires-Dist: pandas
|
|
14
|
+
Requires-Dist: tqdm
|
|
15
|
+
Provides-Extra: benchmark
|
|
16
|
+
Requires-Dist: scikit-learn; extra == "benchmark"
|
|
17
|
+
Requires-Dist: seaborn; extra == "benchmark"
|
|
18
|
+
Provides-Extra: plot
|
|
19
|
+
Requires-Dist: pygraphviz; extra == "plot"
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
🌲 **repare** is a Python package for (ancient) pedigree reconstruction.
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
### Recommended
|
|
27
|
+
```
|
|
28
|
+
conda create -n "repare" -c conda-forge python=3.13 pygraphviz matplotlib networkx pandas tqdm
|
|
29
|
+
conda activate repare
|
|
30
|
+
pip install repare
|
|
31
|
+
```
|
|
32
|
+
repare uses PyGraphviz to plot reconstructed pedigrees. Since PyGraphviz relies on Graphviz which cannot be installed using `pip`, we recommend installing repare and its dependencies in a fresh conda environment, as shown above.
|
|
33
|
+
|
|
34
|
+
If you don't need to plot reconstructed pedigrees, you can install repare directly with `pip install repare`. If you need to plot reconstructed pedigrees and have your own Graphviz installation, you can install repare and Pygraphviz with `pip install repare[plot]`.
|
|
35
|
+
|
|
36
|
+
To install conda, see [this page](https://www.anaconda.com/docs/getting-started/miniconda/install). To install PyGraphviz and Graphviz (yourself), see [this page](https://pygraphviz.github.io/documentation/stable/install.html).
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
We recommend running repare through its command-line interface.
|
|
42
|
+
```
|
|
43
|
+
repare -n NODES -r RELATIONS [-o OUTPUT] [-m MAX_CANDIDATE_PEDIGREES] [-e EPSILON] [-s SEED] [-d] [-w] [-v]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> [!NOTE]
|
|
47
|
+
> Minimal command:
|
|
48
|
+
> ```
|
|
49
|
+
> repare -n nodes.csv -r relations.csv
|
|
50
|
+
> ```
|
|
51
|
+
> For example data inputs, see [examples/nodes.csv](examples/nodes.csv) and [examples/relations.csv](examples/relations.csv).
|
|
52
|
+
|
|
53
|
+
### Inputs
|
|
54
|
+
**Nodes** (-n) (*required*): Path to a CSV file that contains information about the individuals to be analyzed by repare.
|
|
55
|
+
|
|
56
|
+
<dl>
|
|
57
|
+
<dd>
|
|
58
|
+
<details open>
|
|
59
|
+
<summary><ins>Nodes CSV file columns</ins></summary>
|
|
60
|
+
|
|
61
|
+
- **id** *(required)*: ID of individual. Cannot be fully numeric, as numeric IDs are reserved for placeholder nodes.
|
|
62
|
+
- **sex** *(required)*: Genetic sex of individual. Value must be "M" or "F".
|
|
63
|
+
- **y_haplogroup** *(required)*: Y chromosome haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
|
|
64
|
+
- **mt_haplogroup** *(required)*: Mitochondrial haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
|
|
65
|
+
- **can_have_children** *(optional)*: Whether the individual *can* have offspring (e.g., as indicated by age of death). If provided, value must be "True" or "False". Defaults to "True".
|
|
66
|
+
- **can_be_inbred** *(optional)*: Whether the individual *can* have parents related at the 3rd-degree or closer (e.g., as indicated by ROH). If provided, value must be "True" or "False". Defaults to "True".
|
|
67
|
+
- **years_before_present** *(optional)*: (Approximate) date of birth of individual, in years before present. If provided, will be used to prune temporally invalid pedigrees. *This column should only be used when backed by strong dating evidence.*
|
|
68
|
+
</details>
|
|
69
|
+
</dd>
|
|
70
|
+
</dl>
|
|
71
|
+
|
|
72
|
+
**Relations** (-r) (*required*): Path to a CSV file that contains information about inferred pairwise kinship relations. Methods to infer these kinship relations include [KIN](https://doi.org/10.1186/s13059-023-02847-7) and [READv2](https://doi.org/10.1186/s13059-024-03350-3). All individuals included in this file must be specified in the nodes CSV.
|
|
73
|
+
|
|
74
|
+
<dl>
|
|
75
|
+
<dd>
|
|
76
|
+
<details open>
|
|
77
|
+
<summary><ins>Relations CSV file columns</ins></summary>
|
|
78
|
+
|
|
79
|
+
- **id1** *(required)*: ID of individual 1.
|
|
80
|
+
- **id2** *(required)*: ID of individual 2.
|
|
81
|
+
- **degree** *(required)*: Degree of (inferred) kinship relation between individual 1 and individual 2. Value must be "1", "2", or "3". Higher-degree relatives are considered unrelated.
|
|
82
|
+
- **constraints** *(optional)*: Semicolon-delimited list of possible configurations of kinship relation. For example, a parental 1st-degree relation can be constrained with "parent-child;child-parent". Many kinship inference methods will classify 1st-degree relation types, which can be used as relation constraints. Valid constraints: "parent-child", "child-parent", "siblings", "maternal aunt/uncle-nephew/niece", "maternal nephew/niece-aunt/uncle", "paternal aunt/uncle-nephew/niece", "paternal nephew/niece-aunt/uncle", "maternal grandparent-grandchild", "maternal grandchild-grandparent", "paternal grandparent-grandchild", "paternal grandchild-grandparent" "maternal half-siblings", "paternal half-siblings".
|
|
83
|
+
- **force_constraints** *(optional)*: Whether the corresponding constraint should be forced. If provided, value must be "True" or "False". If "True", the constraint must be followed. If "False", breaking the constraint counts as one inconsistency. Defaults to "False".
|
|
84
|
+
</details>
|
|
85
|
+
</dd>
|
|
86
|
+
</dl>
|
|
87
|
+
|
|
88
|
+
**Output** (-o) (*optional*): Path to directory for saving repare outputs. Defaults to the current working directory.
|
|
89
|
+
|
|
90
|
+
**Max Candidate Pedigrees** (-m) (*optional*): Maximum number of candidate pedigrees to keep after each algorithm iteration. Defaults to 1000.
|
|
91
|
+
|
|
92
|
+
**Epsilon** (-e) (*optional*): Parameter for adapted epsilon-greedy sampling at the end of each algorithm iteration. Defaults to 0.2.
|
|
93
|
+
|
|
94
|
+
**Seed** (-s) (*optional*): Random seed for reproducibility. Defaults to 42.
|
|
95
|
+
|
|
96
|
+
**Do Not Plot** (-d) (*flag*): If set, do not plot reconstructed pedigree(s).
|
|
97
|
+
|
|
98
|
+
**Write Alternate Pedigrees** (-w) (*flag*): If set, write outputs for alternate reconstructed pedigrees to disk.
|
|
99
|
+
|
|
100
|
+
**Verbose** (-v) (*flag*): If set, enable verbose output (INFO-level logging).
|
|
101
|
+
|
|
102
|
+
<p align="center">
|
|
103
|
+
<img src="https://raw.githubusercontent.com/ehuangc/repare/main/examples/algorithm_diagram.svg" alt="Reconstruction Process Diagram" />
|
|
104
|
+
<br>
|
|
105
|
+
<em>Diagram of repare's pedigree reconstruction process</em>
|
|
106
|
+
</p>
|
|
107
|
+
|
|
108
|
+
## Reproducibility
|
|
109
|
+
We recommend using [pixi](https://pixi.sh/) to reproduce the results in this repo.
|
|
110
|
+
```
|
|
111
|
+
git clone https://github.com/ehuangc/repare.git
|
|
112
|
+
cd repare
|
|
113
|
+
pixi shell
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Once in the pixi shell, you can run the script(s) corresponding to the results you'd like to reproduce. For example:
|
|
117
|
+
```
|
|
118
|
+
python benchmarks/published/run_parameter_experiment.py
|
|
119
|
+
exit
|
|
120
|
+
```
|
|
121
|
+
To install pixi, see [this page](https://pixi.sh/latest/installation/).
|
repare-0.1.1/README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
🌲 **repare** is a Python package for (ancient) pedigree reconstruction.
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
### Recommended
|
|
6
|
+
```
|
|
7
|
+
conda create -n "repare" -c conda-forge python=3.13 pygraphviz matplotlib networkx pandas tqdm
|
|
8
|
+
conda activate repare
|
|
9
|
+
pip install repare
|
|
10
|
+
```
|
|
11
|
+
repare uses PyGraphviz to plot reconstructed pedigrees. Since PyGraphviz relies on Graphviz which cannot be installed using `pip`, we recommend installing repare and its dependencies in a fresh conda environment, as shown above.
|
|
12
|
+
|
|
13
|
+
If you don't need to plot reconstructed pedigrees, you can install repare directly with `pip install repare`. If you need to plot reconstructed pedigrees and have your own Graphviz installation, you can install repare and Pygraphviz with `pip install repare[plot]`.
|
|
14
|
+
|
|
15
|
+
To install conda, see [this page](https://www.anaconda.com/docs/getting-started/miniconda/install). To install PyGraphviz and Graphviz (yourself), see [this page](https://pygraphviz.github.io/documentation/stable/install.html).
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
We recommend running repare through its command-line interface.
|
|
21
|
+
```
|
|
22
|
+
repare -n NODES -r RELATIONS [-o OUTPUT] [-m MAX_CANDIDATE_PEDIGREES] [-e EPSILON] [-s SEED] [-d] [-w] [-v]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
> [!NOTE]
|
|
26
|
+
> Minimal command:
|
|
27
|
+
> ```
|
|
28
|
+
> repare -n nodes.csv -r relations.csv
|
|
29
|
+
> ```
|
|
30
|
+
> For example data inputs, see [examples/nodes.csv](examples/nodes.csv) and [examples/relations.csv](examples/relations.csv).
|
|
31
|
+
|
|
32
|
+
### Inputs
|
|
33
|
+
**Nodes** (-n) (*required*): Path to a CSV file that contains information about the individuals to be analyzed by repare.
|
|
34
|
+
|
|
35
|
+
<dl>
|
|
36
|
+
<dd>
|
|
37
|
+
<details open>
|
|
38
|
+
<summary><ins>Nodes CSV file columns</ins></summary>
|
|
39
|
+
|
|
40
|
+
- **id** *(required)*: ID of individual. Cannot be fully numeric, as numeric IDs are reserved for placeholder nodes.
|
|
41
|
+
- **sex** *(required)*: Genetic sex of individual. Value must be "M" or "F".
|
|
42
|
+
- **y_haplogroup** *(required)*: Y chromosome haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
|
|
43
|
+
- **mt_haplogroup** *(required)*: Mitochondrial haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
|
|
44
|
+
- **can_have_children** *(optional)*: Whether the individual *can* have offspring (e.g., as indicated by age of death). If provided, value must be "True" or "False". Defaults to "True".
|
|
45
|
+
- **can_be_inbred** *(optional)*: Whether the individual *can* have parents related at the 3rd-degree or closer (e.g., as indicated by ROH). If provided, value must be "True" or "False". Defaults to "True".
|
|
46
|
+
- **years_before_present** *(optional)*: (Approximate) date of birth of individual, in years before present. If provided, will be used to prune temporally invalid pedigrees. *This column should only be used when backed by strong dating evidence.*
|
|
47
|
+
</details>
|
|
48
|
+
</dd>
|
|
49
|
+
</dl>
|
|
50
|
+
|
|
51
|
+
**Relations** (-r) (*required*): Path to a CSV file that contains information about inferred pairwise kinship relations. Methods to infer these kinship relations include [KIN](https://doi.org/10.1186/s13059-023-02847-7) and [READv2](https://doi.org/10.1186/s13059-024-03350-3). All individuals included in this file must be specified in the nodes CSV.
|
|
52
|
+
|
|
53
|
+
<dl>
|
|
54
|
+
<dd>
|
|
55
|
+
<details open>
|
|
56
|
+
<summary><ins>Relations CSV file columns</ins></summary>
|
|
57
|
+
|
|
58
|
+
- **id1** *(required)*: ID of individual 1.
|
|
59
|
+
- **id2** *(required)*: ID of individual 2.
|
|
60
|
+
- **degree** *(required)*: Degree of (inferred) kinship relation between individual 1 and individual 2. Value must be "1", "2", or "3". Higher-degree relatives are considered unrelated.
|
|
61
|
+
- **constraints** *(optional)*: Semicolon-delimited list of possible configurations of kinship relation. For example, a parental 1st-degree relation can be constrained with "parent-child;child-parent". Many kinship inference methods will classify 1st-degree relation types, which can be used as relation constraints. Valid constraints: "parent-child", "child-parent", "siblings", "maternal aunt/uncle-nephew/niece", "maternal nephew/niece-aunt/uncle", "paternal aunt/uncle-nephew/niece", "paternal nephew/niece-aunt/uncle", "maternal grandparent-grandchild", "maternal grandchild-grandparent", "paternal grandparent-grandchild", "paternal grandchild-grandparent" "maternal half-siblings", "paternal half-siblings".
|
|
62
|
+
- **force_constraints** *(optional)*: Whether the corresponding constraint should be forced. If provided, value must be "True" or "False". If "True", the constraint must be followed. If "False", breaking the constraint counts as one inconsistency. Defaults to "False".
|
|
63
|
+
</details>
|
|
64
|
+
</dd>
|
|
65
|
+
</dl>
|
|
66
|
+
|
|
67
|
+
**Output** (-o) (*optional*): Path to directory for saving repare outputs. Defaults to the current working directory.
|
|
68
|
+
|
|
69
|
+
**Max Candidate Pedigrees** (-m) (*optional*): Maximum number of candidate pedigrees to keep after each algorithm iteration. Defaults to 1000.
|
|
70
|
+
|
|
71
|
+
**Epsilon** (-e) (*optional*): Parameter for adapted epsilon-greedy sampling at the end of each algorithm iteration. Defaults to 0.2.
|
|
72
|
+
|
|
73
|
+
**Seed** (-s) (*optional*): Random seed for reproducibility. Defaults to 42.
|
|
74
|
+
|
|
75
|
+
**Do Not Plot** (-d) (*flag*): If set, do not plot reconstructed pedigree(s).
|
|
76
|
+
|
|
77
|
+
**Write Alternate Pedigrees** (-w) (*flag*): If set, write outputs for alternate reconstructed pedigrees to disk.
|
|
78
|
+
|
|
79
|
+
**Verbose** (-v) (*flag*): If set, enable verbose output (INFO-level logging).
|
|
80
|
+
|
|
81
|
+
<p align="center">
|
|
82
|
+
<img src="https://raw.githubusercontent.com/ehuangc/repare/main/examples/algorithm_diagram.svg" alt="Reconstruction Process Diagram" />
|
|
83
|
+
<br>
|
|
84
|
+
<em>Diagram of repare's pedigree reconstruction process</em>
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
## Reproducibility
|
|
88
|
+
We recommend using [pixi](https://pixi.sh/) to reproduce the results in this repo.
|
|
89
|
+
```
|
|
90
|
+
git clone https://github.com/ehuangc/repare.git
|
|
91
|
+
cd repare
|
|
92
|
+
pixi shell
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Once in the pixi shell, you can run the script(s) corresponding to the results you'd like to reproduce. For example:
|
|
96
|
+
```
|
|
97
|
+
python benchmarks/published/run_parameter_experiment.py
|
|
98
|
+
exit
|
|
99
|
+
```
|
|
100
|
+
To install pixi, see [this page](https://pixi.sh/latest/installation/).
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from evaluator.comparison_utils import (
|
|
4
|
+
get_mt_colormap,
|
|
5
|
+
get_published_pedigree,
|
|
6
|
+
plot_inferred_pedigree,
|
|
7
|
+
plot_published_pedigree,
|
|
8
|
+
write_relation_differences,
|
|
9
|
+
)
|
|
10
|
+
from evaluator.pedigree_evaluator import PedigreeEvaluator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def main():
|
|
14
|
+
"""
|
|
15
|
+
Compare the Gurgy inferred and published pedigrees by plotting and writing relation differences.
|
|
16
|
+
"""
|
|
17
|
+
data_dir = os.path.join(os.path.dirname(__file__), "data", "gurgy")
|
|
18
|
+
results_dir = os.path.join(os.path.dirname(__file__), "results", "gurgy_comparison")
|
|
19
|
+
os.makedirs(results_dir, exist_ok=True)
|
|
20
|
+
|
|
21
|
+
evaluator = PedigreeEvaluator(
|
|
22
|
+
published_relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
|
|
23
|
+
algorithm_nodes_path=os.path.join(data_dir, "nodes.csv"),
|
|
24
|
+
algorithm_relations_path=os.path.join(data_dir, "inferred_relations_READv2.csv"),
|
|
25
|
+
)
|
|
26
|
+
inferred_pedigree = evaluator.algorithm_pedigree
|
|
27
|
+
published_pedigree = get_published_pedigree(
|
|
28
|
+
nodes_path=os.path.join(data_dir, "nodes.csv"),
|
|
29
|
+
relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
mt_haplogroup_to_color = get_mt_colormap(inferred_pedigree, published_pedigree)
|
|
33
|
+
plot_inferred_pedigree(
|
|
34
|
+
inferred_pedigree,
|
|
35
|
+
# Plot as SVG because we will need to crop and shift nodes
|
|
36
|
+
plot_path=os.path.join(results_dir, "inferred_pedigree.svg"),
|
|
37
|
+
mt_haplogroup_to_color=mt_haplogroup_to_color,
|
|
38
|
+
)
|
|
39
|
+
# Define dotted edges to add to the published pedigree plot
|
|
40
|
+
nodes_to_remove = [
|
|
41
|
+
"127", # Placeholder mother of 27 (disconnect GLN276 and GLN215A/GLN215B)
|
|
42
|
+
"26", # Placeholder father of GLN215A and GLN215B (disconnect GLN276 and GLN215A/GLN215B)
|
|
43
|
+
"27", # Placeholder mother of GLN215A and GLN215B (disconnect GLN276 and GLN215A/GLN215B)
|
|
44
|
+
"173", # Placeholder father of 170 (disconnect GLN319 and GLN232C)
|
|
45
|
+
"170", # Placeholder father of GLN232C (disconnect GLN319 and GLN232C)
|
|
46
|
+
"171", # Placeholder mother of GLN232C (disconnect GLN319 and GLN232C)
|
|
47
|
+
"189", # Placeholder mother of 187 (disconnect GLN291 and GLN288)
|
|
48
|
+
"186", # Placeholder father of GLN288 (disconnect GLN291 and GLN288)
|
|
49
|
+
"187", # Placeholder mother of GLN288 (disconnect GLN291 and GLN288)
|
|
50
|
+
]
|
|
51
|
+
edges_to_remove = [
|
|
52
|
+
("124", "122"), # Disconnect GLN320 from GLN231A and GLN270B
|
|
53
|
+
("125", "122"), # Disconnect GLN320 from GLN231A and GLN270B
|
|
54
|
+
("GLN319", "170"), # Disconnect GLN319 from GLN232C
|
|
55
|
+
("GLN291", "187"), # Disconnect GLN291 from GLN288
|
|
56
|
+
]
|
|
57
|
+
dotted_edges_to_add = [
|
|
58
|
+
("GLN320", "GLN231A"),
|
|
59
|
+
("GLN320", "GLN270B"),
|
|
60
|
+
("GLN276", "GLN215A"),
|
|
61
|
+
("GLN276", "GLN215B"),
|
|
62
|
+
("GLN319", "GLN232C"),
|
|
63
|
+
("GLN291", "GLN288"),
|
|
64
|
+
]
|
|
65
|
+
plot_published_pedigree(
|
|
66
|
+
published_pedigree=published_pedigree,
|
|
67
|
+
# Plot as SVG because we will need to crop and shift nodes
|
|
68
|
+
plot_path=os.path.join(results_dir, "published_pedigree.svg"),
|
|
69
|
+
mt_haplogroup_to_color=mt_haplogroup_to_color,
|
|
70
|
+
nodes_to_remove=nodes_to_remove,
|
|
71
|
+
edges_to_remove=edges_to_remove,
|
|
72
|
+
dotted_edges_to_add=dotted_edges_to_add,
|
|
73
|
+
)
|
|
74
|
+
write_relation_differences(
|
|
75
|
+
evaluator=evaluator,
|
|
76
|
+
path=os.path.join(results_dir, "relation_differences.csv"),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if __name__ == "__main__":
|
|
81
|
+
main()
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from evaluator.comparison_utils import (
|
|
4
|
+
get_mt_colormap,
|
|
5
|
+
get_published_pedigree,
|
|
6
|
+
plot_inferred_pedigree,
|
|
7
|
+
plot_published_pedigree,
|
|
8
|
+
write_relation_differences,
|
|
9
|
+
)
|
|
10
|
+
from evaluator.pedigree_evaluator import PedigreeEvaluator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def main():
|
|
14
|
+
"""
|
|
15
|
+
Compare the Nepluyevsky inferred and published pedigrees by plotting and writing relation differences.
|
|
16
|
+
"""
|
|
17
|
+
data_dir = os.path.join(os.path.dirname(__file__), "data", "nepluyevsky")
|
|
18
|
+
results_dir = os.path.join(os.path.dirname(__file__), "results", "nepluyevsky_comparison")
|
|
19
|
+
os.makedirs(results_dir, exist_ok=True)
|
|
20
|
+
|
|
21
|
+
evaluator = PedigreeEvaluator(
|
|
22
|
+
published_relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
|
|
23
|
+
algorithm_nodes_path=os.path.join(data_dir, "nodes.csv"),
|
|
24
|
+
algorithm_relations_path=os.path.join(data_dir, "inferred_relations_KIN.csv"),
|
|
25
|
+
)
|
|
26
|
+
inferred_pedigree = evaluator.algorithm_pedigree
|
|
27
|
+
published_pedigree = get_published_pedigree(
|
|
28
|
+
nodes_path=os.path.join(data_dir, "nodes.csv"),
|
|
29
|
+
relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
mt_haplogroup_to_color = get_mt_colormap(inferred_pedigree, published_pedigree)
|
|
33
|
+
plot_inferred_pedigree(
|
|
34
|
+
inferred_pedigree,
|
|
35
|
+
# Plot as SVG because we will need to crop and shift nodes
|
|
36
|
+
plot_path=os.path.join(results_dir, "inferred_pedigree.svg"),
|
|
37
|
+
mt_haplogroup_to_color=mt_haplogroup_to_color,
|
|
38
|
+
)
|
|
39
|
+
plot_published_pedigree(
|
|
40
|
+
published_pedigree=published_pedigree,
|
|
41
|
+
# Plot as SVG because we will need to crop and shift nodes
|
|
42
|
+
plot_path=os.path.join(results_dir, "published_pedigree.svg"),
|
|
43
|
+
mt_haplogroup_to_color=mt_haplogroup_to_color,
|
|
44
|
+
)
|
|
45
|
+
write_relation_differences(
|
|
46
|
+
evaluator=evaluator,
|
|
47
|
+
path=os.path.join(results_dir, "relation_differences.csv"),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if __name__ == "__main__":
|
|
52
|
+
main()
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Alaçamlı, E., Naidoo, T., Güler, M. N., Sağlıcan, E., Aktürk, Ş., Mapelli, I., Vural, K. B., Somel, M., Malmström, H., & Günther, T. (2024). READv2: Advanced and user-friendly detection of biological relatedness in archaeogenomics. *Genome Biology*, *25*(1), 216. [https://doi.org/10.1186/s13059-024-03350-3](https://doi.org/10.1186/s13059-024-03350-3)
|
|
2
|
+
|
|
3
|
+
Rivollat, M., Rohrlach, A. B., Ringbauer, H., Childebayeva, A., Mendisco, F., Barquera, R., Szolek, A., Le Roy, M., Colleran, H., Tuke, J., Aron, F., Pemonge, M.-H., Späth, E., Télouk, P., Rey, L., Goude, G., Balter, V., Krause, J., Rottier, S., … Haak, W. (2023). Extensive pedigrees reveal the social organization of a Neolithic community. *Nature*, *620*(7974), 600–606. [https://doi.org/10.1038/s41586-023-06350-8](https://doi.org/10.1038/s41586-023-06350-8)
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Data from Rivollat et al., 2023 Fig. 1
|
|
2
|
+
id1,id2,degree,constraints,force_constraints
|
|
3
|
+
GLN320,GLN231A,2,,
|
|
4
|
+
GLN320,GLN270B,2,,
|
|
5
|
+
GLN231A,GLN270B,1,siblings,True
|
|
6
|
+
GLN231A,GLN322,1,parent-child,True
|
|
7
|
+
GLN270B,GLN322,2,paternal aunt/uncle-nephew/niece,True
|
|
8
|
+
GLN270B,GLN237A,1,parent-child,True
|
|
9
|
+
GLN231A,GLN237A,2,paternal aunt/uncle-nephew/niece,True
|
|
10
|
+
GLN237A,GLN325,1,parent-child,True
|
|
11
|
+
GLN237A,GLN265,1,parent-child,True
|
|
12
|
+
GLN237A,GLN221B,1,parent-child,True
|
|
13
|
+
GLN237A,GLN266,1,parent-child,True
|
|
14
|
+
GLN270B,GLN325,2,paternal grandparent-grandchild,True
|
|
15
|
+
GLN270B,GLN265,2,paternal grandparent-grandchild,True
|
|
16
|
+
GLN270B,GLN221B,2,paternal grandparent-grandchild,True
|
|
17
|
+
GLN270B,GLN266,2,paternal grandparent-grandchild,True
|
|
18
|
+
GLN325,GLN265,1,siblings,True
|
|
19
|
+
GLN325,GLN221B,1,siblings,True
|
|
20
|
+
GLN325,GLN266,1,siblings,True
|
|
21
|
+
GLN265,GLN221B,1,siblings,True
|
|
22
|
+
GLN265,GLN266,1,siblings,True
|
|
23
|
+
GLN221B,GLN266,1,siblings,True
|
|
24
|
+
GLN253,GLN275,1,siblings,True
|
|
25
|
+
|
|
26
|
+
GLN275,GLN216,1,parent-child,True
|
|
27
|
+
GLN325,GLN216,1,parent-child,True
|
|
28
|
+
GLN275,GLN276,1,parent-child,True
|
|
29
|
+
GLN325,GLN276,1,parent-child,True
|
|
30
|
+
GLN237A,GLN276,2,maternal grandparent-grandchild,True
|
|
31
|
+
GLN237A,GLN216,2,maternal grandparent-grandchild,True
|
|
32
|
+
GLN276,GLN216,1,siblings,True
|
|
33
|
+
GLN265,GLN216,2,maternal aunt/uncle-nephew/niece,True
|
|
34
|
+
GLN265,GLN276,2,maternal aunt/uncle-nephew/niece,True
|
|
35
|
+
GLN221B,GLN216,2,maternal aunt/uncle-nephew/niece,True
|
|
36
|
+
GLN221B,GLN276,2,maternal aunt/uncle-nephew/niece,True
|
|
37
|
+
GLN266,GLN216,2,maternal aunt/uncle-nephew/niece,True
|
|
38
|
+
GLN266,GLN276,2,maternal aunt/uncle-nephew/niece,True
|
|
39
|
+
GLN253,GLN216,2,paternal aunt/uncle-nephew/niece,True
|
|
40
|
+
GLN253,GLN276,2,paternal aunt/uncle-nephew/niece,True
|
|
41
|
+
GLN276,GLN215A,2,,
|
|
42
|
+
GLN276,GLN215B,2,,
|
|
43
|
+
GLN215A,GLN215B,1,siblings,True
|
|
44
|
+
GLN265,GLN235,1,parent-child,True
|
|
45
|
+
GLN325,GLN235,2,paternal aunt/uncle-nephew/niece,True
|
|
46
|
+
GLN221B,GLN235,2,paternal aunt/uncle-nephew/niece,True
|
|
47
|
+
GLN266,GLN235,2,paternal aunt/uncle-nephew/niece,True
|
|
48
|
+
GLN237A,GLN235,2,paternal grandparent-grandchild,True
|
|
49
|
+
|
|
50
|
+
GLN266,GLN268B,1,parent-child,True
|
|
51
|
+
GLN325,GLN268B,2,paternal aunt/uncle-nephew/niece,True
|
|
52
|
+
GLN265,GLN268B,2,paternal aunt/uncle-nephew/niece,True
|
|
53
|
+
GLN221B,GLN268B,2,paternal aunt/uncle-nephew/niece,True
|
|
54
|
+
GLN237A,GLN268B,2,paternal grandparent-grandchild,True
|
|
55
|
+
GLN266,GLN243A,1,parent-child,True
|
|
56
|
+
GLN325,GLN243A,2,paternal aunt/uncle-nephew/niece,True
|
|
57
|
+
GLN265,GLN243A,2,paternal aunt/uncle-nephew/niece,True
|
|
58
|
+
GLN221B,GLN243A,2,paternal aunt/uncle-nephew/niece,True
|
|
59
|
+
GLN237A,GLN243A,2,paternal grandparent-grandchild,True
|
|
60
|
+
|
|
61
|
+
GLN268B,GLN243A,1,siblings,True
|
|
62
|
+
GLN269,GLN227,1,parent-child,True
|
|
63
|
+
GLN268B,GLN227,2,paternal aunt/uncle-nephew/niece,True
|
|
64
|
+
GLN243A,GLN227,2,paternal aunt/uncle-nephew/niece,True
|
|
65
|
+
GLN266,GLN227,2,paternal grandparent-grandchild,True
|
|
66
|
+
GLN269,GLN267,1,parent-child,True
|
|
67
|
+
GLN268B,GLN267,2,paternal aunt/uncle-nephew/niece,True
|
|
68
|
+
GLN243A,GLN267,2,paternal aunt/uncle-nephew/niece,True
|
|
69
|
+
GLN266,GLN267,2,paternal grandparent-grandchild,True
|
|
70
|
+
GLN269,GLN268A,1,parent-child,True
|
|
71
|
+
GLN268B,GLN268A,2,paternal aunt/uncle-nephew/niece,True
|
|
72
|
+
GLN243A,GLN268A,2,paternal aunt/uncle-nephew/niece,True
|
|
73
|
+
GLN266,GLN268A,2,paternal grandparent-grandchild,True
|
|
74
|
+
GLN227,GLN267,1,siblings,True
|
|
75
|
+
GLN227,GLN268A,1,siblings,True
|
|
76
|
+
GLN267,GLN268A,1,siblings,True
|
|
77
|
+
|
|
78
|
+
GLN243A,GLN262,1,parent-child,True
|
|
79
|
+
GLN236A,GLN262,1,parent-child,True
|
|
80
|
+
GLN268B,GLN262,2,paternal aunt/uncle-nephew/niece,True
|
|
81
|
+
GLN266,GLN262,2,paternal grandparent-grandchild,True
|
|
82
|
+
GLN243A,GLN236B,2,paternal grandparent-grandchild,True
|
|
83
|
+
GLN236A,GLN236B,2,paternal grandparent-grandchild,True
|
|
84
|
+
GLN262,GLN236B,2,paternal aunt/uncle-nephew/niece,True
|
|
85
|
+
GLN243A,GLN214,2,paternal grandparent-grandchild,True
|
|
86
|
+
GLN236A,GLN214,2,paternal grandparent-grandchild,True
|
|
87
|
+
GLN262,GLN214,2,paternal aunt/uncle-nephew/niece,True
|
|
88
|
+
|
|
89
|
+
GLN237A,GLN255,2,paternal grandparent-grandchild,True
|
|
90
|
+
GLN237A,GLN224,2,paternal grandparent-grandchild,True
|
|
91
|
+
GLN237A,GLN212,2,paternal grandparent-grandchild,True
|
|
92
|
+
GLN237A,GLN317,2,paternal grandparent-grandchild,True
|
|
93
|
+
GLN237A,GLN213,2,paternal grandparent-grandchild,True
|
|
94
|
+
|
|
95
|
+
GLN255,GLN224,1,siblings,True
|
|
96
|
+
GLN255,GLN212,1,siblings,True
|
|
97
|
+
GLN255,GLN317,1,siblings,True
|
|
98
|
+
GLN255,GLN213,1,siblings,True
|
|
99
|
+
GLN224,GLN212,1,siblings,True
|
|
100
|
+
GLN224,GLN317,1,siblings,True
|
|
101
|
+
GLN224,GLN213,1,siblings,True
|
|
102
|
+
GLN212,GLN317,1,siblings,True
|
|
103
|
+
GLN212,GLN213,1,siblings,True
|
|
104
|
+
GLN317,GLN213,1,siblings,True
|
|
105
|
+
|
|
106
|
+
GLN325,GLN255,2,paternal aunt/uncle-nephew/niece,True
|
|
107
|
+
GLN325,GLN224,2,paternal aunt/uncle-nephew/niece,True
|
|
108
|
+
GLN325,GLN212,2,paternal aunt/uncle-nephew/niece,True
|
|
109
|
+
GLN325,GLN317,2,paternal aunt/uncle-nephew/niece,True
|
|
110
|
+
GLN325,GLN213,2,paternal aunt/uncle-nephew/niece,True
|
|
111
|
+
GLN265,GLN255,2,paternal aunt/uncle-nephew/niece,True
|
|
112
|
+
GLN265,GLN224,2,paternal aunt/uncle-nephew/niece,True
|
|
113
|
+
GLN265,GLN212,2,paternal aunt/uncle-nephew/niece,True
|
|
114
|
+
GLN265,GLN317,2,paternal aunt/uncle-nephew/niece,True
|
|
115
|
+
GLN265,GLN213,2,paternal aunt/uncle-nephew/niece,True
|
|
116
|
+
GLN221B,GLN255,2,paternal aunt/uncle-nephew/niece,True
|
|
117
|
+
GLN221B,GLN224,2,paternal aunt/uncle-nephew/niece,True
|
|
118
|
+
GLN221B,GLN212,2,paternal aunt/uncle-nephew/niece,True
|
|
119
|
+
GLN221B,GLN317,2,paternal aunt/uncle-nephew/niece,True
|
|
120
|
+
GLN221B,GLN213,2,paternal aunt/uncle-nephew/niece,True
|
|
121
|
+
GLN266,GLN255,2,paternal aunt/uncle-nephew/niece,True
|
|
122
|
+
GLN266,GLN224,2,paternal aunt/uncle-nephew/niece,True
|
|
123
|
+
GLN266,GLN212,2,paternal aunt/uncle-nephew/niece,True
|
|
124
|
+
GLN266,GLN317,2,paternal aunt/uncle-nephew/niece,True
|
|
125
|
+
GLN266,GLN213,2,paternal aunt/uncle-nephew/niece,True
|
|
126
|
+
|
|
127
|
+
GLN317,GLN202,1,parent-child,True
|
|
128
|
+
GLN315,GLN202,1,parent-child,True
|
|
129
|
+
GLN255,GLN202,2,paternal aunt/uncle-nephew/niece,True
|
|
130
|
+
GLN224,GLN202,2,paternal aunt/uncle-nephew/niece,True
|
|
131
|
+
GLN212,GLN202,2,paternal aunt/uncle-nephew/niece,True
|
|
132
|
+
GLN213,GLN202,2,paternal aunt/uncle-nephew/niece,True
|
|
133
|
+
GLN202,GLN201,1,parent-child,True
|
|
134
|
+
GLN317,GLN201,2,paternal grandparent-grandchild,True
|
|
135
|
+
GLN315,GLN201,2,paternal grandparent-grandchild,True
|
|
136
|
+
GLN317,GLN223,2,paternal grandparent-grandchild,True
|
|
137
|
+
GLN315,GLN223,2,paternal grandparent-grandchild,True
|
|
138
|
+
GLN202,GLN223,2,paternal aunt/uncle-nephew/niece,True
|
|
139
|
+
GLN255,GLN210,2,paternal aunt/uncle-nephew/niece,True
|
|
140
|
+
GLN224,GLN210,2,paternal aunt/uncle-nephew/niece,True
|
|
141
|
+
GLN212,GLN210,2,paternal aunt/uncle-nephew/niece,True
|
|
142
|
+
GLN317,GLN210,2,paternal aunt/uncle-nephew/niece,True
|
|
143
|
+
GLN213,GLN210,2,paternal aunt/uncle-nephew/niece,True
|
|
144
|
+
|
|
145
|
+
GLN237A,GLN321,2,paternal grandparent-grandchild,True
|
|
146
|
+
GLN237A,GLN263,2,paternal grandparent-grandchild,True
|
|
147
|
+
GLN325,GLN321,2,paternal aunt/uncle-nephew/niece,True
|
|
148
|
+
GLN325,GLN263,2,paternal aunt/uncle-nephew/niece,True
|
|
149
|
+
GLN265,GLN321,2,paternal aunt/uncle-nephew/niece,True
|
|
150
|
+
GLN265,GLN263,2,paternal aunt/uncle-nephew/niece,True
|
|
151
|
+
GLN221B,GLN321,2,paternal aunt/uncle-nephew/niece,True
|
|
152
|
+
GLN221B,GLN263,2,paternal aunt/uncle-nephew/niece,True
|
|
153
|
+
GLN266,GLN321,2,paternal aunt/uncle-nephew/niece,True
|
|
154
|
+
GLN266,GLN263,2,paternal aunt/uncle-nephew/niece,True
|
|
155
|
+
|
|
156
|
+
GLN321,GLN263,1,siblings,True
|
|
157
|
+
GLN321,GLN279,2,paternal aunt/uncle-nephew/niece,True
|
|
158
|
+
GLN321,GLN207A,2,paternal aunt/uncle-nephew/niece,True
|
|
159
|
+
GLN321,GLN209,2,paternal aunt/uncle-nephew/niece,True
|
|
160
|
+
GLN321,GLN257,2,paternal aunt/uncle-nephew/niece,True
|
|
161
|
+
GLN263,GLN279,2,paternal aunt/uncle-nephew/niece,True
|
|
162
|
+
GLN263,GLN207A,2,paternal aunt/uncle-nephew/niece,True
|
|
163
|
+
GLN263,GLN209,2,paternal aunt/uncle-nephew/niece,True
|
|
164
|
+
GLN263,GLN257,2,paternal aunt/uncle-nephew/niece,True
|
|
165
|
+
GLN279,GLN207A,1,siblings,True
|
|
166
|
+
GLN207A,GLN282,1,parent-child,True
|
|
167
|
+
GLN279,GLN282,2,paternal aunt/uncle-nephew/niece,True
|
|
168
|
+
GLN207A,GLN204,2,paternal grandparent-grandchild,True
|
|
169
|
+
GLN207A,GLN208,2,paternal grandparent-grandchild,True
|
|
170
|
+
GLN207A,GLN206,2,paternal grandparent-grandchild,True
|
|
171
|
+
GLN282,GLN204,2,paternal aunt/uncle-nephew/niece,True
|
|
172
|
+
GLN282,GLN208,2,paternal aunt/uncle-nephew/niece,True
|
|
173
|
+
GLN282,GLN206,2,paternal aunt/uncle-nephew/niece,True
|
|
174
|
+
GLN208,GLN206,1,siblings,True
|
|
175
|
+
|
|
176
|
+
GLN270B,GLN260,2,paternal grandparent-grandchild,True
|
|
177
|
+
GLN270B,GLN220,2,paternal grandparent-grandchild,True
|
|
178
|
+
GLN270B,GLN241,2,paternal grandparent-grandchild,True
|
|
179
|
+
GLN270B,GLN319,2,paternal grandparent-grandchild,True
|
|
180
|
+
GLN270B,GLN256,2,paternal grandparent-grandchild,True
|
|
181
|
+
GLN270B,GLN261,2,paternal grandparent-grandchild,True
|
|
182
|
+
GLN237A,GLN260,2,paternal aunt/uncle-nephew/niece,True
|
|
183
|
+
GLN237A,GLN220,2,paternal aunt/uncle-nephew/niece,True
|
|
184
|
+
GLN237A,GLN241,2,paternal aunt/uncle-nephew/niece,True
|
|
185
|
+
GLN237A,GLN319,2,paternal aunt/uncle-nephew/niece,True
|
|
186
|
+
GLN237A,GLN256,2,paternal aunt/uncle-nephew/niece,True
|
|
187
|
+
GLN237A,GLN261,2,paternal aunt/uncle-nephew/niece,True
|
|
188
|
+
|
|
189
|
+
GLN260,GLN220,1,siblings,True
|
|
190
|
+
GLN260,GLN241,1,siblings,True
|
|
191
|
+
GLN260,GLN319,1,siblings,True
|
|
192
|
+
GLN220,GLN241,1,siblings,True
|
|
193
|
+
GLN220,GLN319,1,siblings,True
|
|
194
|
+
GLN241,GLN319,1,siblings,True
|
|
195
|
+
|
|
196
|
+
GLN319,GLN232C,2,,
|
|
197
|
+
GLN225,GLN226,1,parent-child,True
|
|
198
|
+
GLN260,GLN226,2,paternal aunt/uncle-nephew/niece,True
|
|
199
|
+
GLN220,GLN226,2,paternal aunt/uncle-nephew/niece,True
|
|
200
|
+
GLN241,GLN226,2,paternal aunt/uncle-nephew/niece,True
|
|
201
|
+
GLN319,GLN226,2,paternal aunt/uncle-nephew/niece,True
|
|
202
|
+
|
|
203
|
+
GLN256,GLN261,1,siblings,True
|
|
204
|
+
GLN256,GLN250,1,parent-child,True
|
|
205
|
+
GLN261,GLN250,2,paternal aunt/uncle-nephew/niece,True
|
|
206
|
+
GLN261,GLN245B,1,parent-child,True
|
|
207
|
+
GLN256,GLN245B,2,paternal aunt/uncle-nephew/niece,True
|
|
208
|
+
GLN245B,GLN245A,1,parent-child,True
|
|
209
|
+
GLN249,GLN245A,1,parent-child,True
|
|
210
|
+
GLN245B,GLN258,1,parent-child,True
|
|
211
|
+
GLN249,GLN258,1,parent-child,True
|
|
212
|
+
GLN245B,GLN244,1,parent-child,True
|
|
213
|
+
GLN249,GLN244,1,parent-child,True
|
|
214
|
+
GLN245A,GLN258,1,siblings,True
|
|
215
|
+
GLN245A,GLN244,1,siblings,True
|
|
216
|
+
GLN258,GLN244,1,siblings,True
|
|
217
|
+
GLN261,GLN245A,2,paternal grandparent-grandchild,True
|
|
218
|
+
GLN261,GLN258,2,paternal grandparent-grandchild,True
|
|
219
|
+
GLN261,GLN244,2,paternal grandparent-grandchild,True
|
|
220
|
+
|
|
221
|
+
GLN261,GLN285A,2,paternal grandparent-grandchild,True
|
|
222
|
+
GLN245B,GLN285A,2,paternal aunt/uncle-nephew/niece,True
|
|
223
|
+
GLN285A,GLN285B,1,parent-child,True
|
|
224
|
+
GLN248,GLN285B,1,parent-child,True
|
|
225
|
+
|
|
226
|
+
GLN305,GLN280,1,parent-child,True
|
|
227
|
+
GLN298,GLN280,1,parent-child,True
|
|
228
|
+
GLN305,GLN300,1,parent-child,True
|
|
229
|
+
GLN298,GLN300,1,parent-child,True
|
|
230
|
+
GLN305,GLN291,1,parent-child,True
|
|
231
|
+
GLN298,GLN291,1,parent-child,True
|
|
232
|
+
GLN280,GLN300,1,siblings,True
|
|
233
|
+
GLN280,GLN291,1,siblings,True
|
|
234
|
+
GLN300,GLN291,1,siblings,True
|
|
235
|
+
|
|
236
|
+
GLN300,GLN307,1,parent-child,True
|
|
237
|
+
GLN300,GLN277,1,parent-child,True
|
|
238
|
+
GLN307,GLN277,1,siblings,True
|
|
239
|
+
GLN280,GLN307,2,paternal aunt/uncle-nephew/niece,True
|
|
240
|
+
GLN280,GLN277,2,paternal aunt/uncle-nephew/niece,True
|
|
241
|
+
GLN291,GLN307,2,paternal aunt/uncle-nephew/niece,True
|
|
242
|
+
GLN291,GLN277,2,paternal aunt/uncle-nephew/niece,True
|
|
243
|
+
GLN305,GLN307,2,paternal grandparent-grandchild,True
|
|
244
|
+
GLN305,GLN277,2,paternal grandparent-grandchild,True
|
|
245
|
+
GLN298,GLN307,2,paternal grandparent-grandchild,True
|
|
246
|
+
GLN298,GLN277,2,paternal grandparent-grandchild,True
|
|
247
|
+
|
|
248
|
+
GLN305,GLN306,2,paternal grandparent-grandchild,True
|
|
249
|
+
GLN298,GLN306,2,paternal grandparent-grandchild,True
|
|
250
|
+
GLN305,GLN301,2,paternal grandparent-grandchild,True
|
|
251
|
+
GLN298,GLN301,2,paternal grandparent-grandchild,True
|
|
252
|
+
GLN280,GLN306,2,paternal aunt/uncle-nephew/niece,True
|
|
253
|
+
GLN280,GLN301,2,paternal aunt/uncle-nephew/niece,True
|
|
254
|
+
GLN300,GLN306,2,paternal aunt/uncle-nephew/niece,True
|
|
255
|
+
GLN300,GLN301,2,paternal aunt/uncle-nephew/niece,True
|
|
256
|
+
GLN291,GLN306,2,paternal aunt/uncle-nephew/niece,True
|
|
257
|
+
GLN291,GLN301,2,paternal aunt/uncle-nephew/niece,True
|
|
258
|
+
GLN306,GLN301,1,siblings,True
|
|
259
|
+
GLN306,GLN309,2,paternal aunt/uncle-nephew/niece,True
|
|
260
|
+
GLN301,GLN309,2,paternal aunt/uncle-nephew/niece,True
|
|
261
|
+
GLN291,GLN288,2,,
|
|
262
|
+
GLN288,GLN289B,1,parent-child,True
|
|
263
|
+
|
|
264
|
+
GLN302,GLN299,1,,
|
|
265
|
+
GLN287,GLN310B,1,siblings,True
|
|
266
|
+
GLN211A,GLN211B,1,siblings,True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Fowler, C., Olalde, I., Cummings, V., Armit, I., Büster, L., Cuthbert, S., Rohland, N., Cheronet, O., Pinhasi, R., & Reich, D. (2022). A high-resolution picture of kinship practices in an Early Neolithic tomb. *Nature*, *601*(7894), 584–587. [https://doi.org/10.1038/s41586-021-04241-4](https://doi.org/10.1038/s41586-021-04241-4)
|