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