|
4 | 4 | """ |
5 | 5 |
|
6 | 6 | from collections.abc import Set, Iterator |
| 7 | +from distancia import BrayCurtis |
7 | 8 | from itertools import pairwise, permutations |
8 | 9 | import numpy as np |
9 | 10 | import pandas as pd |
@@ -355,6 +356,91 @@ def fixation_index(self, subpop_id_1: int, subpop_id_2: int) -> float: |
355 | 356 | fixation_index = float((np.mean(pairwise_differences_between) - np.mean(pairwise_differences_within)) / np.mean(pairwise_differences_between)) |
356 | 357 |
|
357 | 358 | return fixation_index |
| 359 | + |
| 360 | + |
| 361 | + def bray_curtis_by_subpopulation_pair(self, subpop_id_1: int, subpop_id_2: int) -> int: |
| 362 | + """ |
| 363 | + Calculate the Bray-Curtis index of dissimilarity between any two subpopulations. The index is 0 for completely equal subpopulations, |
| 364 | + and 1 for completely different ones. |
| 365 | +
|
| 366 | + Args: |
| 367 | + subpop_id_1 (int): id of the first subpopulation. |
| 368 | + subpop_id_2 (int): id of the second subpopulation. |
| 369 | +
|
| 370 | + Returns: |
| 371 | + bray_curtis (int): Bray-Curtis dissimilarity between two subpopulations |
| 372 | + """ |
| 373 | + individuals_subpop_1 = self.subpopulations[subpop_id_1].population |
| 374 | + individuals_subpop_2 = self.subpopulations[subpop_id_2].population |
| 375 | + |
| 376 | + number_of_features = self.number_of_features |
| 377 | + traits_pop_1 = np.zeros((self.subpopulations[subpop_id_1].get_population_size(), number_of_features)) |
| 378 | + traits_pop_2 = np.zeros((self.subpopulations[subpop_id_2].get_population_size(), number_of_features)) |
| 379 | + |
| 380 | + i = 0 |
| 381 | + for individual in individuals_subpop_1: |
| 382 | + traits_pop_1[i] = (individual.features) |
| 383 | + i += 1 |
| 384 | + j = 0 |
| 385 | + for individual in individuals_subpop_2: |
| 386 | + traits_pop_2[j] = (individual.features) |
| 387 | + j += 1 |
| 388 | + |
| 389 | +# print(traits_pop_1) |
| 390 | + traits_pop_1_sorted = np.sort(traits_pop_1) |
| 391 | + traits_pop_2_sorted = np.sort(traits_pop_2) |
| 392 | + unique_traits_pop_1, counts_pop_1 = np.unique(traits_pop_1_sorted, axis = 0, return_counts = True) |
| 393 | + unique_traits_pop_2, counts_pop_2 = np.unique(traits_pop_2_sorted, axis = 0, return_counts = True) |
| 394 | + |
| 395 | + # Create an instance of the BrayCurti class |
| 396 | + bray_curtis_instance = BrayCurtis() |
| 397 | + |
| 398 | + # Calculate the Bray-Curtis distance between the two samples |
| 399 | + bray_curtis_distance = bray_curtis_instance.calculate(counts_pop_1, counts_pop_2) |
| 400 | + |
| 401 | + return bray_curtis_distance |
| 402 | + |
| 403 | + def bray_curtis_by_sets_of_subpopulations(self, group_of_subpop_id_1: List[int], group_of_subpop_id_2: List[int]) -> int: |
| 404 | + """ |
| 405 | + Calculate the Bray-Curtis index of dissimilarity between any two sets of subpopulations. The index is 0 for completely equal subpopulations, |
| 406 | + and 1 for completely different ones. |
| 407 | +
|
| 408 | + Args: |
| 409 | + group_of_subpop_id_1 (List[int]): list of ids of the first set of subpopulations. |
| 410 | + group_of_subpop_id_2 (List[int]): list of ids of the second set of subpopulations. |
| 411 | +
|
| 412 | + Returns: |
| 413 | + bray_curtis (int): Bray-Curtis dissimilarity between two sets of subpopulations |
| 414 | + """ |
| 415 | + |
| 416 | + traits_pop_1 = [] |
| 417 | + traits_pop_2 = [] |
| 418 | + |
| 419 | + for subpop_id in group_of_subpop_id_1: |
| 420 | + individuals = self.subpopulations[subpop_id].population |
| 421 | + for individual in individuals: |
| 422 | + traits_pop_1.append(individual.features) |
| 423 | + traits_pop_1 = np.array(traits_pop_1) |
| 424 | + |
| 425 | + for subpop_id in group_of_subpop_id_2: |
| 426 | + individuals = self.subpopulations[subpop_id].population |
| 427 | + for individual in individuals: |
| 428 | + traits_pop_2.append(individual.features) |
| 429 | + traits_pop_2 = np.array(traits_pop_2) |
| 430 | + |
| 431 | + traits_pop_1_sorted = np.sort(traits_pop_1) |
| 432 | + traits_pop_2_sorted = np.sort(traits_pop_2) |
| 433 | + unique_traits_pop_1, counts_pop_1 = np.unique(traits_pop_1_sorted, axis = 0, return_counts = True) |
| 434 | + unique_traits_pop_2, counts_pop_2 = np.unique(traits_pop_2_sorted, axis = 0, return_counts = True) |
| 435 | + |
| 436 | + # Create an instance of the BrayCurti class |
| 437 | + bray_curtis_instance = BrayCurtis() |
| 438 | + |
| 439 | + # Calculate the Bray-Curtis distance between the two samples |
| 440 | + bray_curtis_distance = bray_curtis_instance.calculate(counts_pop_1, counts_pop_2) |
| 441 | + |
| 442 | + return bray_curtis_distance |
| 443 | + |
358 | 444 |
|
359 | 445 | class SubpopulationIterator(object): |
360 | 446 | """ |
|
0 commit comments