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):
11        self.odir = odir / "te"
12        self.init_odir()
13        self.TE_number = 0
14
15    def record(self, T, e):
16        """
17        Record deaths.
18        T .. time / duration (ages)
19        E .. event observed (0/alive or 1/dead)
20
21        ###
22
23        To fit this data using lifelines, use this script as inspiration:
24            from lifelines import KaplanMeierFitter
25            kmf = KaplanMeierFitter()
26            te = pd.read_csv("/path/to/te/1.csv")
27            kmf.fit(te["T"], te["E"])
28            kmf.survival_function_.plot()
29
30        You can compare this to observed survivorship curves:
31            analyzer.get_total_survivorship(container).plot()
32        """
33
34        assert e in ("alive", "dead")
35
36        step = variables.steps
37
38        # open new file and add header
39        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
40            data = [["T", "E"]]
41            self.write(data, "%s")
42
43        # record deaths
44        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
45            E = np.repeat(1, len(T))
46            data = np.array([T, E]).T
47            self.write(data, "%i")
48
49        # flush
50        elif (
51            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
52            or step == parametermanager.parameters.STEPS_PER_SIMULATION
53        ) and e == "alive":
54            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
55            E = np.repeat(0, len(T))
56            data = np.array([T, E]).T
57            self.write(data, "%i")
58            self.TE_number += 1
59
60    def write(self, data, fmt):
61        """
62
63        # OUTPUT SPECIFICATION
64        path: /te/{te_number}.csv
65        filetype: csv
66        category: demography
67        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).
68        trait granularity: population
69        time granularity: interval
70        frequency parameter: TE_RATE
71        structure: An int matrix.
72        """
73        path = self.odir / f"{self.TE_number}.csv"
74        with open(path, "ab") as file_:
75            np.savetxt(file_, data, delimiter=",", fmt=fmt)
class TERecorder(aegis_sim.recording.recorder.Recorder):
10class TERecorder(Recorder):
11    def __init__(self, odir):
12        self.odir = odir / "te"
13        self.init_odir()
14        self.TE_number = 0
15
16    def record(self, T, e):
17        """
18        Record deaths.
19        T .. time / duration (ages)
20        E .. event observed (0/alive or 1/dead)
21
22        ###
23
24        To fit this data using lifelines, use this script as inspiration:
25            from lifelines import KaplanMeierFitter
26            kmf = KaplanMeierFitter()
27            te = pd.read_csv("/path/to/te/1.csv")
28            kmf.fit(te["T"], te["E"])
29            kmf.survival_function_.plot()
30
31        You can compare this to observed survivorship curves:
32            analyzer.get_total_survivorship(container).plot()
33        """
34
35        assert e in ("alive", "dead")
36
37        step = variables.steps
38
39        # open new file and add header
40        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
41            data = [["T", "E"]]
42            self.write(data, "%s")
43
44        # record deaths
45        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
46            E = np.repeat(1, len(T))
47            data = np.array([T, E]).T
48            self.write(data, "%i")
49
50        # flush
51        elif (
52            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
53            or step == parametermanager.parameters.STEPS_PER_SIMULATION
54        ) and e == "alive":
55            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
56            E = np.repeat(0, len(T))
57            data = np.array([T, E]).T
58            self.write(data, "%i")
59            self.TE_number += 1
60
61    def write(self, data, fmt):
62        """
63
64        # OUTPUT SPECIFICATION
65        path: /te/{te_number}.csv
66        filetype: csv
67        category: demography
68        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).
69        trait granularity: population
70        time granularity: interval
71        frequency parameter: TE_RATE
72        structure: An int matrix.
73        """
74        path = self.odir / f"{self.TE_number}.csv"
75        with open(path, "ab") as file_:
76            np.savetxt(file_, data, delimiter=",", fmt=fmt)
TERecorder(odir)
11    def __init__(self, odir):
12        self.odir = odir / "te"
13        self.init_odir()
14        self.TE_number = 0
odir
TE_number
def record(self, T, e):
16    def record(self, T, e):
17        """
18        Record deaths.
19        T .. time / duration (ages)
20        E .. event observed (0/alive or 1/dead)
21
22        ###
23
24        To fit this data using lifelines, use this script as inspiration:
25            from lifelines import KaplanMeierFitter
26            kmf = KaplanMeierFitter()
27            te = pd.read_csv("/path/to/te/1.csv")
28            kmf.fit(te["T"], te["E"])
29            kmf.survival_function_.plot()
30
31        You can compare this to observed survivorship curves:
32            analyzer.get_total_survivorship(container).plot()
33        """
34
35        assert e in ("alive", "dead")
36
37        step = variables.steps
38
39        # open new file and add header
40        if (step % parametermanager.parameters.TE_RATE) == 0 or step == 1:
41            data = [["T", "E"]]
42            self.write(data, "%s")
43
44        # record deaths
45        elif ((step % parametermanager.parameters.TE_RATE) < parametermanager.parameters.TE_DURATION) and e == "dead":
46            E = np.repeat(1, len(T))
47            data = np.array([T, E]).T
48            self.write(data, "%i")
49
50        # flush
51        elif (
52            ((step % parametermanager.parameters.TE_RATE) == parametermanager.parameters.TE_DURATION)
53            or step == parametermanager.parameters.STEPS_PER_SIMULATION
54        ) and e == "alive":
55            logging.debug(f"Data for survival analysis (T,E) flushed at step {step}.")
56            E = np.repeat(0, len(T))
57            data = np.array([T, E]).T
58            self.write(data, "%i")
59            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):
61    def write(self, data, fmt):
62        """
63
64        # OUTPUT SPECIFICATION
65        path: /te/{te_number}.csv
66        filetype: csv
67        category: demography
68        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).
69        trait granularity: population
70        time granularity: interval
71        frequency parameter: TE_RATE
72        structure: An int matrix.
73        """
74        path = self.odir / f"{self.TE_number}.csv"
75        with open(path, "ab") as file_:
76            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.