Skip to content

Commit 8e21792

Browse files
committed
Added gini and simpson to Simulation output
1 parent 199d83d commit 8e21792

File tree

5 files changed

+105
-148
lines changed

5 files changed

+105
-148
lines changed

docs/source/overview.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,5 @@ The Simpson index is bound between 0 and 1, and represents the probability that
5353
The Gini-Simpson index is simply the complement of the Simpson index, that is it measures the probability that two random indeividuals in the same reference population do not share a set of traits. This is calculated as
5454

5555
```{math}
56-
G = 1 - \sum_{i = 1}^{K} p^2_i = 1 - S
56+
G = 1 - \sum_{i = 1}^{K} p^2_i = 1 - S.
5757
```

exploration.ipynb

+43-142
Large diffs are not rendered by default.

metapypulation/metapopulation.py

+30-2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,34 @@ def shannon_diversity_per_subpopulation(self) -> List[float]:
147147
subpopulation_shannons.append(subpopulation.shannon_diversity())
148148

149149
return subpopulation_shannons
150+
151+
152+
def simpson_diversity_per_subpopulation(self) -> List[float]:
153+
"""
154+
Calculates Simpson diversity index in each subpopulation.
155+
156+
Returns:
157+
List[float]: list with the Simpson diversity index per subpopulation.
158+
"""
159+
subpopulation_simpsons = []
160+
for subpopulation in self.subpopulations:
161+
subpopulation_simpsons.append(subpopulation.simpson_diversity())
162+
163+
return subpopulation_simpsons
164+
165+
166+
def gini_diversity_per_subpopulation(self) -> List[float]:
167+
"""
168+
Calculates Gini diversity index in each subpopulation.
169+
170+
Returns:
171+
List[float]: list with the Gini diversity index per subpopulation.
172+
"""
173+
subpopulation_ginis = []
174+
for subpopulation in self.subpopulations:
175+
subpopulation_ginis.append(subpopulation.gini_diversity())
176+
177+
return subpopulation_ginis
150178

151179

152180
def traits_sets_per_subpopulation(self) -> List[int]:
@@ -205,7 +233,7 @@ def metapopulation_test_sets(self) -> int:
205233
return len(uniques)
206234

207235

208-
def metapopulation_simpson(self) -> float:
236+
def metapopulation_simpson_diversity(self) -> float:
209237
"""
210238
Calculates Simpson diversity index over the whole metapopulation.
211239
@@ -228,7 +256,7 @@ def metapopulation_simpson(self) -> float:
228256
return simpson_diversity_index
229257

230258

231-
def metapopulation_gini(self) -> float:
259+
def metapopulation_gini_diversity(self) -> float:
232260
"""
233261
Calculates Gini-Simpson diversity index over the whole metapopulation.
234262

metapypulation/simulation.py

+31-3
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ class Simulation():
3131
mutation_rate (float): Probability of a mutation to occur during copying.
3232
subpop_set_counts (pd.DataFrame): Collects the number of unique set counts per subpopulation averaged over subpopulations.
3333
subpop_shannon (pd.DataFrame): Collects the Shannon diversity index per subpopulation averaged over subpopulations.
34+
subpop_simpson (pd.DataFrame): Collects the Simpson diversity index per subpopulation averaged over subpopulations.
35+
subpop_gini (pd.DataFrame): Collects the Gini diversity index per subpopulation averaged over subpopulations.
3436
metapop_set_counts (pd.DataFrame): Collects the number of unique set counts over the whole metapopulation.
3537
metapop_shannon (pd.DataFrame): Collects the Shannon diversity index over the whole metapopulation.
38+
metapop_simpson (pd.DataFrame): Collects the Simpson diversity index over the whole metapopulation.
39+
metapop_gini (pd.DataFrame): Collects the Gini diversity index over the whole metapopulation.
3640
"""
3741
def __init__(self,
3842
generations: int,
@@ -90,15 +94,23 @@ def __init__(self,
9094

9195
self.subpop_set_counts = pd.DataFrame()
9296
self.subpop_shannon = pd.DataFrame()
97+
self.subpop_simpson = pd.DataFrame()
98+
self.subpop_gini = pd.DataFrame()
9399
self.metapop_set_counts = pd.DataFrame()
94100
self.metapop_shannon = pd.DataFrame()
101+
self.metapop_simpson = pd.DataFrame()
102+
self.metapop_gini = pd.DataFrame()
95103

96104

97105
def empty_lists(self):
98106
self.subpop_set_counts = pd.DataFrame()
99107
self.subpop_shannon = pd.DataFrame()
108+
self.subpop_simpson = pd.DataFrame()
109+
self.subpop_gini = pd.DataFrame()
100110
self.metapop_set_counts = pd.DataFrame()
101111
self.metapop_shannon = pd.DataFrame()
112+
self.metapop_simpson = pd.DataFrame()
113+
self.metapop_gini = pd.DataFrame()
102114

103115

104116
def run_single_replicate(self, replicate_id: int) -> None:
@@ -114,8 +126,12 @@ def run_single_replicate(self, replicate_id: int) -> None:
114126

115127
set_counts = []
116128
shannon = []
129+
simpson = []
130+
gini = []
117131
metapop_counts = []
118132
metapop_shannon = []
133+
metapop_simpson = []
134+
metapop_gini = []
119135

120136
start_time = time.time()
121137
for t in range(self.generations + 1):
@@ -127,8 +143,12 @@ def run_single_replicate(self, replicate_id: int) -> None:
127143
if t%self.measure_timing == 0:
128144
set_counts.append(np.mean(metapopulation.traits_sets_per_subpopulation()))
129145
shannon.append(np.mean(metapopulation.shannon_diversity_per_subpopulation()))
146+
simpson.append(np.mean(metapopulation.simpson_diversity_per_subpopulation()))
147+
gini.append(np.mean(metapopulation.gini_diversity_per_subpopulation()))
130148
metapop_counts.append(metapopulation.metapopulation_test_sets())
131149
metapop_shannon.append(metapopulation.metapopulation_shannon_diversity())
150+
metapop_simpson.append(metapopulation.metapopulation_simpson_diversity())
151+
metapop_gini.append(metapopulation.metapopulation_gini_diversity())
132152

133153

134154
if t > self.burn_in:
@@ -138,8 +158,12 @@ def run_single_replicate(self, replicate_id: int) -> None:
138158

139159
self.subpop_set_counts = pd.concat([self.subpop_set_counts, pd.Series(set_counts, name=replicate_id)], axis=1)
140160
self.subpop_shannon = pd.concat([self.subpop_shannon, pd.Series(shannon, name=replicate_id)], axis=1)
161+
self.subpop_simpson = pd.concat([self.subpop_simpson, pd.Series(simpson, name=replicate_id)], axis=1)
162+
self.subpop_gini = pd.concat([self.subpop_gini, pd.Series(gini, name=replicate_id)], axis=1)
141163
self.metapop_set_counts = pd.concat([self.metapop_set_counts, pd.Series(metapop_counts, name=replicate_id)], axis=1)
142-
self.metapop_shannoneturn = pd.concat([self.metapop_shannon, pd.Series(metapop_shannon, name=replicate_id)], axis=1)
164+
self.metapop_shannon = pd.concat([self.metapop_shannon, pd.Series(metapop_shannon, name=replicate_id)], axis=1)
165+
self.metapop_simpson = pd.concat([self.metapop_simpson, pd.Series(metapop_simpson, name=replicate_id)], axis=1)
166+
self.metapop_gini = pd.concat([self.metapop_gini, pd.Series(metapop_gini, name=replicate_id)], axis=1)
143167

144168
if self.verbose:
145169
end_time = time.time()
@@ -187,9 +211,13 @@ def save_output(self) -> None:
187211
Save output to input folder.
188212
"""
189213
self.subpop_set_counts.to_csv(f"{self.output_path}_subpop_set_counts.csv", sep=",")
190-
#self.subpop_shannon.to_csv(f"{self.output_path}_subpop_shannon.csv", sep=",")
214+
self.subpop_shannon.to_csv(f"{self.output_path}_subpop_shannon.csv", sep=",")
215+
self.subpop_simpson.to_csv(f"{self.output_path}_subpop_simpson.csv", sep=",")
216+
self.subpop_gini.to_csv(f"{self.output_path}_subpop_gini.csv", sep=",")
191217
self.metapop_set_counts.to_csv(f"{self.output_path}_metapop_set_counts.csv", sep=",")
192-
#self.metapop_shannon.to_csv(f"{self.output_path}_metapop_shannon.csv", sep=",")
218+
self.metapop_shannon.to_csv(f"{self.output_path}_metapop_shannon.csv", sep=",")
219+
self.metapop_simpson.to_csv(f"{self.output_path}_metapop_simpson.csv", sep=",")
220+
self.metapop_gini.to_csv(f"{self.output_path}_metapop_gini.csv", sep=",")
193221

194222

195223
def create_migration_table(self, type_of_model, migration_rate: float) -> None:

simpson_neutral_test.png

-87.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)