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)
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)
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()
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.