aegis_sim.utilities.analysis.leslie

 1import numpy as np
 2
 3
 4def leslie_matrix(s, r):
 5    leslie = np.diag(s, k=-1)
 6    leslie[0] = r
 7    leslie[np.isnan(leslie)] = 0
 8    return leslie
 9
10
11def interval_leslie(interval_life_table, interval_birth_table, index):
12    lt = interval_life_table[index]
13    s = (1 + lt.pct_change())[1:]
14    bt = interval_birth_table[index]
15    r = (bt / lt).fillna(0)
16    return leslie_matrix(s, r)
17
18
19def intrinsic_leslie(intrinsic_mortality, intrinsic_fertility, index):
20    """
21    Hypothetical Leslie matrix that ignores extrinsic mortality.
22    """
23    m = intrinsic_mortality.iloc[index]
24    s = 1 - m
25    r = intrinsic_fertility.iloc[index]
26    return leslie_matrix(s[:-1], r)
27
28
29def leslie_breakdown(leslie):
30    eigenvalues, eigenvectors = np.linalg.eig(leslie)
31    dominant_index = np.argmax(np.abs(eigenvalues))
32    dominant_eigenvector = eigenvectors[:, dominant_index]
33    return {
34        "growth_rate": np.max(np.abs(eigenvalues)),
35        "stable_age_structure": dominant_eigenvector / dominant_eigenvector.sum(),
36    }
def leslie_matrix(s, r):
5def leslie_matrix(s, r):
6    leslie = np.diag(s, k=-1)
7    leslie[0] = r
8    leslie[np.isnan(leslie)] = 0
9    return leslie
def interval_leslie(interval_life_table, interval_birth_table, index):
12def interval_leslie(interval_life_table, interval_birth_table, index):
13    lt = interval_life_table[index]
14    s = (1 + lt.pct_change())[1:]
15    bt = interval_birth_table[index]
16    r = (bt / lt).fillna(0)
17    return leslie_matrix(s, r)
def intrinsic_leslie(intrinsic_mortality, intrinsic_fertility, index):
20def intrinsic_leslie(intrinsic_mortality, intrinsic_fertility, index):
21    """
22    Hypothetical Leslie matrix that ignores extrinsic mortality.
23    """
24    m = intrinsic_mortality.iloc[index]
25    s = 1 - m
26    r = intrinsic_fertility.iloc[index]
27    return leslie_matrix(s[:-1], r)

Hypothetical Leslie matrix that ignores extrinsic mortality.

def leslie_breakdown(leslie):
30def leslie_breakdown(leslie):
31    eigenvalues, eigenvectors = np.linalg.eig(leslie)
32    dominant_index = np.argmax(np.abs(eigenvalues))
33    dominant_eigenvector = eigenvectors[:, dominant_index]
34    return {
35        "growth_rate": np.max(np.abs(eigenvalues)),
36        "stable_age_structure": dominant_eigenvector / dominant_eigenvector.sum(),
37    }