aegis_sim.recording.terecorder

 1import logging
 2import numpy as np
 3from .recorder import Recorder
 4from aegis_sim import variables
 5
 6from aegis_sim.parameterization import parametermanager
 7# BUG Header duplication; a copy ends up as first row
 8
 9class TERecorder(Recorder):
10    def __init__(self, odir, resuming=False):
11        self.odir = odir / "te"
12        self.init_odir()
13        if resuming:
14            # Restore TE_number by counting existing TE files
15            existing = list(self.odir.glob("*.csv"))
16            self.TE_number = len(existing)
17        else:
18            self.TE_number = 0
19
20    def record(self, T, e):
21        """
22        Record deaths.
23        T .. time / duration (ages)
24        E .. event observed (0/alive or 1/dead)
25
26        ###
27
28        To fit this data using lifelines, use this script as inspiration:
29            from lifelines import KaplanMeierFitter
30            kmf = KaplanMeierFitter()
31            te = pd.read_csv("/path/to/te/1.csv")
32            kmf.fit(te["T"], te["E"])
33            kmf.survival_function_.plot()
34
35        You can compare this to observed survivorship curves:
36            analyzer.get_total_survivorship(container).plot()
37        """
38
39        assert e in ("alive", "dead")
40
41        step = variables.steps
42
43        # open new file and add header
44        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
45            data = [["T", "E"]]
46            self.write(data, "%s")
47
48        # record deaths
49        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
50            E = np.repeat(1, len(T))
51            data = np.array([T, E]).T
52            self.write(data, "%i")
53
54        # flush
55        elif (
56            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
57            or step == parametermanager.parameters.STEPS_PER_SIMULATION
58        ) and e == "alive":
59            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
60            E = np.repeat(0, len(T))
61            data = np.array([T, E]).T
62            self.write(data, "%i")
63            self.TE_number += 1
64
65    def write(self, data, fmt):
66        """
67
68        # OUTPUT SPECIFICATION
69        path: /te/{te_number}.csv
70        filetype: csv
71        category: demography
72        description: Data for survival analysis; time until event (age at death or current viable age) and the event type (1 if death, 0 if still alive).
73        trait granularity: population
74        time granularity: interval
75        frequency parameter: TE_RATE
76        structure: An int matrix.
77        """
78        path = self.odir / f"{self.TE_number}.csv"
79        with open(path, "ab") as file_:
80            np.savetxt(file_, data, delimiter=",", fmt=fmt)
class TERecorder(aegis_sim.recording.recorder.Recorder):
10class TERecorder(Recorder):
11    def __init__(self, odir, resuming=False):
12        self.odir = odir / "te"
13        self.init_odir()
14        if resuming:
15            # Restore TE_number by counting existing TE files
16            existing = list(self.odir.glob("*.csv"))
17            self.TE_number = len(existing)
18        else:
19            self.TE_number = 0
20
21    def record(self, T, e):
22        """
23        Record deaths.
24        T .. time / duration (ages)
25        E .. event observed (0/alive or 1/dead)
26
27        ###
28
29        To fit this data using lifelines, use this script as inspiration:
30            from lifelines import KaplanMeierFitter
31            kmf = KaplanMeierFitter()
32            te = pd.read_csv("/path/to/te/1.csv")
33            kmf.fit(te["T"], te["E"])
34            kmf.survival_function_.plot()
35
36        You can compare this to observed survivorship curves:
37            analyzer.get_total_survivorship(container).plot()
38        """
39
40        assert e in ("alive", "dead")
41
42        step = variables.steps
43
44        # open new file and add header
45        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
46            data = [["T", "E"]]
47            self.write(data, "%s")
48
49        # record deaths
50        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
51            E = np.repeat(1, len(T))
52            data = np.array([T, E]).T
53            self.write(data, "%i")
54
55        # flush
56        elif (
57            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
58            or step == parametermanager.parameters.STEPS_PER_SIMULATION
59        ) and e == "alive":
60            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
61            E = np.repeat(0, len(T))
62            data = np.array([T, E]).T
63            self.write(data, "%i")
64            self.TE_number += 1
65
66    def write(self, data, fmt):
67        """
68
69        # OUTPUT SPECIFICATION
70        path: /te/{te_number}.csv
71        filetype: csv
72        category: demography
73        description: Data for survival analysis; time until event (age at death or current viable age) and the event type (1 if death, 0 if still alive).
74        trait granularity: population
75        time granularity: interval
76        frequency parameter: TE_RATE
77        structure: An int matrix.
78        """
79        path = self.odir / f"{self.TE_number}.csv"
80        with open(path, "ab") as file_:
81            np.savetxt(file_, data, delimiter=",", fmt=fmt)
TERecorder(odir, resuming=False)
11    def __init__(self, odir, resuming=False):
12        self.odir = odir / "te"
13        self.init_odir()
14        if resuming:
15            # Restore TE_number by counting existing TE files
16            existing = list(self.odir.glob("*.csv"))
17            self.TE_number = len(existing)
18        else:
19            self.TE_number = 0
odir
def record(self, T, e):
21    def record(self, T, e):
22        """
23        Record deaths.
24        T .. time / duration (ages)
25        E .. event observed (0/alive or 1/dead)
26
27        ###
28
29        To fit this data using lifelines, use this script as inspiration:
30            from lifelines import KaplanMeierFitter
31            kmf = KaplanMeierFitter()
32            te = pd.read_csv("/path/to/te/1.csv")
33            kmf.fit(te["T"], te["E"])
34            kmf.survival_function_.plot()
35
36        You can compare this to observed survivorship curves:
37            analyzer.get_total_survivorship(container).plot()
38        """
39
40        assert e in ("alive", "dead")
41
42        step = variables.steps
43
44        # open new file and add header
45        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
46            data = [["T", "E"]]
47            self.write(data, "%s")
48
49        # record deaths
50        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
51            E = np.repeat(1, len(T))
52            data = np.array([T, E]).T
53            self.write(data, "%i")
54
55        # flush
56        elif (
57            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
58            or step == parametermanager.parameters.STEPS_PER_SIMULATION
59        ) and e == "alive":
60            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
61            E = np.repeat(0, len(T))
62            data = np.array([T, E]).T
63            self.write(data, "%i")
64            self.TE_number += 1

Record deaths. T .. time / duration (ages) E .. event observed (0/alive or 1/dead)

#

To fit this data using lifelines, use this script as inspiration: from lifelines import KaplanMeierFitter kmf = KaplanMeierFitter() te = pd.read_csv("/path/to/te/1.csv") kmf.fit(te["T"], te["E"]) kmf.survival_function_.plot()

You can compare this to observed survivorship curves: analyzer.get_total_survivorship(container).plot()

def write(self, data, fmt):
66    def write(self, data, fmt):
67        """
68
69        # OUTPUT SPECIFICATION
70        path: /te/{te_number}.csv
71        filetype: csv
72        category: demography
73        description: Data for survival analysis; time until event (age at death or current viable age) and the event type (1 if death, 0 if still alive).
74        trait granularity: population
75        time granularity: interval
76        frequency parameter: TE_RATE
77        structure: An int matrix.
78        """
79        path = self.odir / f"{self.TE_number}.csv"
80        with open(path, "ab") as file_:
81            np.savetxt(file_, data, delimiter=",", fmt=fmt)

OUTPUT SPECIFICATION

path: /te/{te_number}.csv filetype: csv category: demography description: Data for survival analysis; time until event (age at death or current viable age) and the event type (1 if death, 0 if still alive). trait granularity: population time granularity: interval frequency parameter: TE_RATE structure: An int matrix.