diff --git a/src/main/java/simpaths/data/filters/AgeGenderCSfilter.java b/src/main/java/simpaths/data/filters/AgeGenderCSfilter.java new file mode 100644 index 000000000..d4053135a --- /dev/null +++ b/src/main/java/simpaths/data/filters/AgeGenderCSfilter.java @@ -0,0 +1,33 @@ +package simpaths.data.filters; + +import microsim.statistics.ICollectionFilter; +import simpaths.model.Person; +import simpaths.model.enums.Gender; + +public class AgeGenderCSfilter implements ICollectionFilter { + + private final Gender gender; + private final int ageFrom; + private final int ageTo; + public AgeGenderCSfilter(int ageFrom, int ageTo) { + super(); + this.ageFrom = ageFrom; + this.ageTo = ageTo; + this.gender = null; + } + public AgeGenderCSfilter(int ageFrom, int ageTo, Gender gender) { + super(); + this.ageFrom = ageFrom; + this.ageTo = ageTo; + this.gender = gender; + } + + @Override + public boolean isFiltered(Object object) { + Person person = (Person) object; + if (this.gender == null) + return ( (person.getDag() >= ageFrom) && (person.getDag() <= ageTo) ); + else + return ( (person.getDag() >= ageFrom) && (person.getDag() <= ageTo) && (person.getDgn().equals(gender))); + } +} diff --git a/src/main/java/simpaths/data/statistics/HealthStatistics.java b/src/main/java/simpaths/data/statistics/HealthStatistics.java new file mode 100644 index 000000000..6d42ec693 --- /dev/null +++ b/src/main/java/simpaths/data/statistics/HealthStatistics.java @@ -0,0 +1,338 @@ +package simpaths.data.statistics; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Transient; +import microsim.data.db.PanelEntityKey; +import microsim.statistics.CrossSection; +import microsim.statistics.IDoubleSource; +import microsim.statistics.functions.MeanArrayFunction; +import microsim.statistics.functions.PercentileArrayFunction; +import microsim.statistics.functions.SumArrayFunction; +import simpaths.data.filters.AgeGenderCSfilter; +import simpaths.model.Person; +import simpaths.model.SimPathsModel; +import simpaths.model.enums.Gender; + +@Entity +public class HealthStatistics { + + @Id + private PanelEntityKey key = new PanelEntityKey(1L); + + @Column(name = "gender") + private String gender; + + // mental health numeric + @Column(name = "dhm_mean") + private double dhm_mean; + + @Column(name = "dhm_median") + private double dhm_median; + + @Column(name = "dhm_p_10") + private double dhm_p_10; + + @Column(name = "dhm_p_90") + private double dhm_p_90; + + @Column(name = "dhm_p_25") + private double dhm_p_25; + + @Column(name = "dhm_p_75") + private double dhm_p_75; + + // MCS score numeric + @Column(name = "dhe_mcs_mean") + private double dhe_mcs_mean; + + @Column(name = "dhe_mcs_median") + private double dhe_mcs_median; + + @Column(name = "dhe_mcs_p_10") + private double dhe_mcs_p_10; + + @Column(name = "dhe_mcs_p_90") + private double dhe_mcs_p_90; + + @Column(name = "dhe_mcs_p_25") + private double dhe_mcs_p_25; + + @Column(name = "dhe_mcs_p_75") + private double dhe_mcs_p_75; + + // PCS score numeric + @Column(name = "dhe_pcs_mean") + private double dhe_pcs_mean; + + @Column(name = "dhe_pcs_median") + private double dhe_pcs_median; + + @Column(name = "dhe_pcs_p_10") + private double dhe_pcs_p_10; + + @Column(name = "dhe_pcs_p_90") + private double dhe_pcs_p_90; + + @Column(name = "dhe_pcs_p_25") + private double dhe_pcs_p_25; + + @Column(name = "dhe_pcs_p_75") + private double dhe_pcs_p_75; + + // Life Satisfaction numeric + @Column(name = "dls_mean") + private double dls_mean; + + @Column(name = "dls_median") + private double dls_median; + + @Column(name = "dls_p_10") + private double dls_p_10; + + @Column(name = "dls_p_90") + private double dls_p_90; + + @Column(name = "dls_p_25") + private double dls_p_25; + + @Column(name = "dls_p_75") + private double dls_p_75; + + @Column(name = "qualys") + private double qalys; + + @Column(name = "wellbys") + private double wellbys; + + //N + @Column(name = "N") + private int N; + + @Transient + final static double WELLBEING_MEASURE_ADJUSTMENT = (double) 11 / 7; + + public void setGender(String gender) { + this.gender = gender; + } + + public void setDhm_mean(double dhm_mean) { + this.dhm_mean = dhm_mean; + } + + public void setDhm_median(double dhm_median) { + this.dhm_median = dhm_median; + } + + public void setDhm_p_10(double dhm_p_10) { + this.dhm_p_10 = dhm_p_10; + } + + public void setDhm_p_90(double dhm_p_90) { + this.dhm_p_90 = dhm_p_90; + } + + public void setDhm_p_25(double dhm_p_25) { + this.dhm_p_25 = dhm_p_25; + } + + public void setDhm_p_75(double dhm_p_75) { + this.dhm_p_75 = dhm_p_75; + } + + public void setDhe_mcs_mean(double dhe_mcs_mean) { + this.dhe_mcs_mean = dhe_mcs_mean; + } + + public void setDhe_mcs_median(double dhe_mcs_median) { + this.dhe_mcs_median = dhe_mcs_median; + } + + public void setDhe_mcs_p_10(double dhe_mcs_p_10) { + this.dhe_mcs_p_10 = dhe_mcs_p_10; + } + + public void setDhe_mcs_p_90(double dhe_mcs_p_90) { + this.dhe_mcs_p_90 = dhe_mcs_p_90; + } + + public void setDhe_mcs_p_25(double dhe_mcs_p_25) { + this.dhe_mcs_p_25 = dhe_mcs_p_25; + } + + public void setDhe_mcs_p_75(double dhe_mcs_p_75) { + this.dhe_mcs_p_75 = dhe_mcs_p_75; + } + + public void setDhe_pcs_mean(double dhe_pcs_mean) { + this.dhe_pcs_mean = dhe_pcs_mean; + } + + public void setDhe_pcs_median(double dhe_pcs_median) { + this.dhe_pcs_median = dhe_pcs_median; + } + + public void setDhe_pcs_p_10(double dhe_pcs_p_10) { + this.dhe_pcs_p_10 = dhe_pcs_p_10; + } + + public void setDhe_pcs_p_90(double dhe_pcs_p_90) { + this.dhe_pcs_p_90 = dhe_pcs_p_90; + } + + public void setDhe_pcs_p_25(double dhe_pcs_p_25) { + this.dhe_pcs_p_25 = dhe_pcs_p_25; + } + + public void setDhe_pcs_p_75(double dhe_pcs_p_75) { + this.dhe_pcs_p_75 = dhe_pcs_p_75; + } + + public void setDls_mean(double dls_mean) { + this.dls_mean = dls_mean; + } + + public void setDls_median(double dls_median) { + this.dls_median = dls_median; + } + + public void setDls_p_10(double dls_p_10) { + this.dls_p_10 = dls_p_10; + } + + public void setDls_p_90(double dls_p_90) { + this.dls_p_90 = dls_p_90; + } + + public void setDls_p_25(double dls_p_25) { + this.dls_p_25 = dls_p_25; + } + + public void setDls_p_75(double dls_p_75) { + this.dls_p_75 = dls_p_75; + } + + public void setN(int n) { + N = n; + } + + public void setQalys(double qalys) { + this.qalys = qalys; + } + + public void setWellbys(double wellbys) { + this.wellbys = wellbys; + } + + public void update(SimPathsModel model, String gender_s) { + + + AgeGenderCSfilter ageGenderCSfilter; + + if (gender_s.equals("Total")) { + ageGenderCSfilter = new AgeGenderCSfilter(18, 65); + } else { + ageGenderCSfilter = new AgeGenderCSfilter(18, 65, Gender.valueOf(gender_s)); + } + + // set gender + setGender(gender_s); + + // dhm score + CrossSection.Double personsDhm = new CrossSection.Double(model.getPersons(), Person.DoublesVariables.Dhm); // Get cross section of simulated individuals and their mental health using the IDoubleSource interface implemented by Person class. + personsDhm.setFilter(ageGenderCSfilter); + + + MeanArrayFunction dhm_mean_f = new MeanArrayFunction(personsDhm); // Create MeanArrayFunction + dhm_mean_f.applyFunction(); + setDhm_mean(dhm_mean_f.getDoubleValue(IDoubleSource.Variables.Default)); + + PercentileArrayFunction percDhm_f = new PercentileArrayFunction(personsDhm); + percDhm_f.applyFunction(); + + setDhm_p_10(percDhm_f.getDoubleValue(PercentileArrayFunction.Variables.P10)); + setDhm_p_25(percDhm_f.getDoubleValue(PercentileArrayFunction.Variables.P25)); + setDhm_median(percDhm_f.getDoubleValue(PercentileArrayFunction.Variables.P50)); + setDhm_p_75(percDhm_f.getDoubleValue(PercentileArrayFunction.Variables.P75)); + setDhm_p_90(percDhm_f.getDoubleValue(PercentileArrayFunction.Variables.P90)); + + // mcs score + CrossSection.Double personsMCS = new CrossSection.Double(model.getPersons(), Person.DoublesVariables.Dhe_mcs); + personsMCS.setFilter(ageGenderCSfilter); + + + MeanArrayFunction dhe_mcs_mean_f = new MeanArrayFunction(personsMCS); // Create MeanArrayFunction + dhe_mcs_mean_f.applyFunction(); + setDhe_mcs_mean(dhe_mcs_mean_f.getDoubleValue(IDoubleSource.Variables.Default)); + + PercentileArrayFunction perc_dhe_mcs_f = new PercentileArrayFunction(personsMCS); + perc_dhe_mcs_f.applyFunction(); + + setDhe_mcs_p_10(perc_dhe_mcs_f.getDoubleValue(PercentileArrayFunction.Variables.P10)); + setDhe_mcs_p_25(perc_dhe_mcs_f.getDoubleValue(PercentileArrayFunction.Variables.P25)); + setDhe_mcs_median(perc_dhe_mcs_f.getDoubleValue(PercentileArrayFunction.Variables.P50)); + setDhe_mcs_p_75(perc_dhe_mcs_f.getDoubleValue(PercentileArrayFunction.Variables.P75)); + setDhe_mcs_p_90(perc_dhe_mcs_f.getDoubleValue(PercentileArrayFunction.Variables.P90)); + + // pcs score + CrossSection.Double personsPCS = new CrossSection.Double(model.getPersons(), Person.DoublesVariables.Dhe_pcs); + personsPCS.setFilter(ageGenderCSfilter); + + + MeanArrayFunction dhe_pcs_mean_f = new MeanArrayFunction(personsPCS); // Create MeanArrayFunction + dhe_pcs_mean_f.applyFunction(); + setDhe_pcs_mean(dhe_pcs_mean_f.getDoubleValue(IDoubleSource.Variables.Default)); + + PercentileArrayFunction perc_dhe_pcs_f = new PercentileArrayFunction(personsPCS); + perc_dhe_pcs_f.applyFunction(); + + setDhe_pcs_p_10(perc_dhe_pcs_f.getDoubleValue(PercentileArrayFunction.Variables.P10)); + setDhe_pcs_p_25(perc_dhe_pcs_f.getDoubleValue(PercentileArrayFunction.Variables.P25)); + setDhe_pcs_median(perc_dhe_pcs_f.getDoubleValue(PercentileArrayFunction.Variables.P50)); + setDhe_pcs_p_75(perc_dhe_pcs_f.getDoubleValue(PercentileArrayFunction.Variables.P75)); + setDhe_pcs_p_90(perc_dhe_pcs_f.getDoubleValue(PercentileArrayFunction.Variables.P90)); + + // Life Satisfaction score + CrossSection.Double personsDls = new CrossSection.Double(model.getPersons(), Person.DoublesVariables.Dls); + personsDls.setFilter(ageGenderCSfilter); + + + MeanArrayFunction dls_mean_f = new MeanArrayFunction(personsDls); // Create MeanArrayFunction + dls_mean_f.applyFunction(); + setDls_mean(dls_mean_f.getDoubleValue(IDoubleSource.Variables.Default)); + + PercentileArrayFunction perc_dls_f = new PercentileArrayFunction(personsDls); + perc_dls_f.applyFunction(); + + setDls_p_10(perc_dls_f.getDoubleValue(PercentileArrayFunction.Variables.P10)); + setDls_p_25(perc_dls_f.getDoubleValue(PercentileArrayFunction.Variables.P25)); + setDls_median(perc_dls_f.getDoubleValue(PercentileArrayFunction.Variables.P50)); + setDls_p_75(perc_dls_f.getDoubleValue(PercentileArrayFunction.Variables.P75)); + setDls_p_90(perc_dls_f.getDoubleValue(PercentileArrayFunction.Variables.P90)); + + // QALYS as sum of EQ5D + CrossSection.Double personEQ5D = new CrossSection.Double(model.getPersons(), Person.DoublesVariables.He_eq5d); + personEQ5D.setFilter(ageGenderCSfilter); + + SumArrayFunction.Double qalys = new SumArrayFunction.Double(personEQ5D); + qalys.applyFunction(); + setQalys(qalys.getDoubleValue(IDoubleSource.Variables.Default)); + + // WELLBYs as sum of 'points' in 0-10-scale life satisfaction (adjusted) + + SumArrayFunction.Double wellbys = new SumArrayFunction.Double(personsDls); + wellbys.applyFunction(); + + + setWellbys(wellbys.getDoubleValue(IDoubleSource.Variables.Default) * WELLBEING_MEASURE_ADJUSTMENT); + + // count + CrossSection.Integer n_persons = new CrossSection.Integer(model.getPersons(), Person.class, "getPersonCount", true); + n_persons.setFilter(ageGenderCSfilter); + + SumArrayFunction.Integer count_f = new SumArrayFunction.Integer(n_persons); + count_f.applyFunction(); + setN(count_f.getIntValue(IDoubleSource.Variables.Default)); + } +} diff --git a/src/main/java/simpaths/experiment/SimPathsCollector.java b/src/main/java/simpaths/experiment/SimPathsCollector.java index df6636c2d..a8089c31e 100644 --- a/src/main/java/simpaths/experiment/SimPathsCollector.java +++ b/src/main/java/simpaths/experiment/SimPathsCollector.java @@ -9,6 +9,7 @@ import simpaths.data.filters.FlexibleInLabourSupplyFilter; import simpaths.data.statistics.EmploymentStatistics; +import simpaths.data.statistics.HealthStatistics; import simpaths.model.BenefitUnit; import simpaths.model.SimPathsModel; import simpaths.model.enums.Quintiles; @@ -60,6 +61,9 @@ public class SimPathsCollector extends AbstractSimulationCollectorManager implem private boolean persistEmploymentStatistics = false; + @GUIparameter(description="Report health statistics") + private boolean persistHealthStatistics = true; + @GUIparameter(description="Toggle to turn database persistence on/off") private boolean exportToDatabase = false; @@ -96,6 +100,8 @@ public class SimPathsCollector extends AbstractSimulationCollectorManager implem private EmploymentStatistics statsEmployment; + private HealthStatistics statsHealth; + private GiniPersonalGrossEarnings giniPersonalGrossEarnings; private GiniEquivalisedHouseholdDisposableIncome giniEquivalisedHouseholdDisposableIncome; @@ -122,6 +128,8 @@ public class SimPathsCollector extends AbstractSimulationCollectorManager implem private DataExport exportStatisticsEmployment; + private DataExport exportHealthStatistics; + protected MultiTraceFunction.Double fGiniPersonalGrossEarningsNational; protected Map fGiniPersonalGrossEarningsRegionalMap; @@ -157,7 +165,8 @@ public enum Processes { DumpStatistics, DumpStatistics2, DumpStatistics3, - DumpStatisticsEmployment + DumpStatisticsEmployment, + DumpHealthStatistics } @@ -233,6 +242,18 @@ public void onEvent(Enum type) { } catch (Exception e) { log.error(e.getMessage()); } + break; + case DumpHealthStatistics: + String[] genders = {"Total", "Male", "Female"}; + for (String gender_s: genders) { + statsHealth.update(model, gender_s); + try { + exportHealthStatistics.export(); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + break; } } @@ -250,6 +271,7 @@ public void buildObjects() { stats2 = new Statistics2(); stats3 = new Statistics3(); statsEmployment = new EmploymentStatistics(); + statsHealth = new HealthStatistics(); //For export to database or .csv files. if(persistPersons) @@ -266,6 +288,8 @@ public void buildObjects() { exportStatistics3 = new DataExport(stats3, exportToDatabase, exportToCSV); if (persistEmploymentStatistics) exportStatisticsEmployment = new DataExport(statsEmployment, exportToDatabase, exportToCSV); + if (persistHealthStatistics) + exportHealthStatistics = new DataExport(statsHealth, exportToDatabase, exportToCSV); if (calculateGiniCoefficients) { @@ -330,6 +354,10 @@ public void buildSchedule() { getEngine().getEventQueue().scheduleRepeat(new SingleTargetEvent(this, Processes.DumpStatisticsEmployment), model.getStartYear() + dataDumpStartTime, ordering, dataDumpTimePeriod); } + if (persistHealthStatistics){ + getEngine().getEventQueue().scheduleRepeat(new SingleTargetEvent(this, Processes.DumpHealthStatistics), model.getStartYear() + dataDumpStartTime, ordering, dataDumpTimePeriod); + } + if (persistPersons) { getEngine().getEventQueue().scheduleRepeat(new SingleTargetEvent(this, Processes.DumpPersons), model.getStartYear() + dataDumpStartTime, ordering, dataDumpTimePeriod); } diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index 0aa02e664..f16cb999c 100644 --- a/src/main/java/simpaths/model/SimPathsModel.java +++ b/src/main/java/simpaths/model/SimPathsModel.java @@ -583,13 +583,13 @@ public void buildSchedule() { yearlySchedule.addCollectionEvent(persons, Person.Processes.HealthPCS2); yearlySchedule.addCollectionEvent(persons, Person.Processes.LifeSatisfaction2); - addCollectionEventToAllYears(persons, Person.Processes.HealthEQ5D); // mortality (migration) and population alignment at year's end addCollectionEventToAllYears(persons, Person.Processes.ConsiderMortality); addEventToAllYears(Processes.PopulationAlignment); // END OF YEAR PROCESSES + addCollectionEventToAllYears(persons, Person.Processes.HealthEQ5D); addEventToAllYears(Processes.CheckForImperfectTaxDBMatches); addEventToAllYears(tests, Tests.Processes.RunTests); //Run tests addEventToAllYears(Processes.EndYear); diff --git a/src/test/java/simpaths/integrationtest/RunSimPathsIntegrationTest.java b/src/test/java/simpaths/integrationtest/RunSimPathsIntegrationTest.java index 77b88102c..dec7e4fba 100644 --- a/src/test/java/simpaths/integrationtest/RunSimPathsIntegrationTest.java +++ b/src/test/java/simpaths/integrationtest/RunSimPathsIntegrationTest.java @@ -81,6 +81,10 @@ void testVerifySimulationOutput() throws IOException { latestOutputDir.resolve("csv/Statistics31.csv"), Paths.get("src/test/java/simpaths/integrationtest/expected/Statistics31.csv") ); + compareFiles( + latestOutputDir.resolve("csv/HealthStatistics1.csv"), + Paths.get("src/test/java/simpaths/integrationtest/expected/HealthStatistics1.csv") + ); } void compareFiles(Path actualFile, Path expectedFile) throws IOException { diff --git a/src/test/java/simpaths/integrationtest/expected/HealthStatistics1.csv b/src/test/java/simpaths/integrationtest/expected/HealthStatistics1.csv new file mode 100644 index 000000000..496694e8d --- /dev/null +++ b/src/test/java/simpaths/integrationtest/expected/HealthStatistics1.csv @@ -0,0 +1,25 @@ +run,time,id_HealthStatistics1,N,dhe_mcs_mean,dhe_mcs_median,dhe_mcs_p_10,dhe_mcs_p_25,dhe_mcs_p_75,dhe_mcs_p_90,dhe_pcs_mean,dhe_pcs_median,dhe_pcs_p_10,dhe_pcs_p_25,dhe_pcs_p_75,dhe_pcs_p_90,dhm_mean,dhm_median,dhm_p_10,dhm_p_25,dhm_p_75,dhm_p_90,dls_mean,dls_median,dls_p_10,dls_p_25,dls_p_75,dls_p_90,gender,qalys,wellbys, +1,2019.0,1,11898,47.31176500252107,49.35,32.26,41.45,54.79,58.05,51.69369894099909,55.0,37.79,48.4875,57.76,60.09,11.441166582618928,10.0,6.0,8.0,13.0,19.0,5.069087241553202,6.0,3.0,4.0,6.0,6.0,Total,9896.754777553848,94776.0, +1,2019.0,1,5856,48.564294740437276,50.99,34.786,43.63,55.36,58.15,52.25200307377025,55.0,40.038,49.66,57.57,59.7,10.75495218579235,10.0,6.0,7.0,12.0,17.0,5.080430327868853,5.0,3.0,5.0,6.0,6.0,Male,4987.215562312578,46751.57142857143, +1,2019.0,1,6042,46.097793776895195,48.28,30.61,39.8175,54.37,57.56,51.1525819265141,54.8,35.59,47.38,57.76,60.45,12.106256206554121,11.0,6.0,8.0,14.0,21.0,5.058093346573982,6.0,3.0,4.0,6.0,6.0,Female,4909.53921524132,48024.42857142857, +1,2020.0,1,11937,46.74610653137708,48.107436188328016,37.73335025826344,43.36599723275415,51.38169419476088,53.614387039137014,51.738960020000924,54.260826653873494,41.17881442080187,49.36173586350582,56.73760096786725,58.17833201360447,11.899170144767847,11.59959437041686,4.935146684036721,8.051891975144592,15.351529699059892,19.19956505500547,5.0822652257686185,5.0,4.0,5.0,6.0,6.0,Total,9965.602888130781,95333.85714285714, +1,2020.0,1,5868,47.84311609065639,49.14227421711047,39.503199156323994,44.907442787009735,52.031329038500175,54.00599506246491,52.38804693548592,54.56659461975053,43.037405308074106,50.33098410674175,56.898653754239234,58.32583848812859,11.25428797652068,10.871422635603551,4.444115677582998,7.555365981442911,14.63157298617667,18.270660056568595,5.060327198364008,5.0,4.0,5.0,6.0,6.0,Male,5012.103903505961,46662.0, +1,2020.0,1,6069,45.68542897430805,46.97345190328841,36.34465366241071,41.93699178201787,50.67040049054033,53.062802579136836,51.11137029845398,53.905109429208146,39.16825596996534,48.0499021888748,56.565436422832775,58.02288656747395,12.522694376646905,12.254795706933649,5.453208251023788,8.614841441252594,16.090935180624832,19.978259714251127,5.103476684791564,5.0,4.0,5.0,6.0,6.0,Female,4953.498984624907,48671.857142857145, +1,2021.0,1,11887,46.32797768420649,47.09690880535969,40.1145981551206,43.95723142952894,49.49465596452154,51.31007619369161,51.480837702282024,53.20258895898207,43.0223770360551,49.174949319696786,55.734516723126774,57.28519792159508,12.104419448987873,12.006398273882034,4.999668855705033,8.308742971943838,15.78147362122364,19.216672685899496,5.082611255993943,5.0,4.0,5.0,5.0,6.0,Total,9865.55124572884,94941.0, +1,2021.0,1,5844,47.30304904977259,48.05845740099847,41.51739564265043,45.13657925194597,50.20440605870659,51.876331261474334,52.137366725239815,53.67151747319319,44.524631894039025,50.18523764316333,56.007985988321565,57.45756284136764,11.518974100500305,11.36211719888184,4.5993192913495236,7.830132871195697,15.062912309869464,18.557921271094003,5.039185489390828,5.0,4.0,5.0,5.0,6.0,Male,4955.5657451156185,46277.0, +1,2021.0,1,6043,45.38501606574375,46.15887577696995,38.977068222402785,42.84251233452542,48.59767041803247,50.50833040048729,50.84592861570818,52.720840936122,41.554388410503215,48.13414138704007,55.43379073842458,57.065029838210044,12.670585693661264,12.662164423161373,5.4220989218530775,8.874344797244575,16.35108432954731,19.816463330337534,5.124606983286447,5.0,4.0,5.0,5.0,6.0,Female,4909.985500613229,48664.0, +1,2022.0,1,11974,46.07296001139765,46.481080945561324,41.322434734158136,44.019945459079196,48.58628527555146,50.22190994449539,51.263873704631195,52.53308314152351,44.140867421994294,48.96811948530281,55.0104688907039,56.60038274463394,12.22029042412555,12.084121863837392,5.270006520482727,8.451601082699366,15.768275273559118,19.439089741382293,5.051444797060297,5.0,4.0,5.0,5.0,6.0,Total,9883.202900807275,95049.42857142857, +1,2022.0,1,5883,46.96486276245372,47.427279443758884,42.38071718908458,45.13407617793869,49.39558689198433,50.838872744181295,51.93997189845573,53.11162421749029,45.390285354308425,49.84057320108012,55.373674261737236,56.808270893953626,11.605820752137216,11.534032398719837,4.682674799675123,7.905566205848183,15.229607112627615,18.664902625469256,4.999150093489716,5.0,4.0,5.0,5.0,6.0,Male,4957.992525217912,46215.71428571428, +1,2022.0,1,6091,45.21151461910341,45.5873911572895,40.503101186845626,43.24187703147859,47.685204182892484,49.2708262433789,50.61086341498005,51.890624927222675,42.85248670899738,48.09320623696662,54.55945328223035,56.30225474520619,12.813776728559512,12.64362896070736,5.876549869806882,9.086410344553926,16.424193444460315,19.969046677321924,5.1019537021835495,5.0,5.0,5.0,5.0,6.0,Female,4925.210375589374,48833.71428571428, +2,2019.0,1,11897,47.32166764730563,49.35,32.26,41.455,54.79,58.05,51.69889972261977,55.0,37.79,48.49,57.76,60.05,11.432125745986383,10.0,6.0,8.0,13.0,19.0,5.071866857190888,6.0,3.0,4.0,6.0,6.0,Total,9898.248674457383,94820.0, +2,2019.0,1,5858,48.57510071696836,50.995000000000005,34.936,43.665,55.36,58.15,52.248031751450775,55.0,39.998,49.66,57.57,59.7,10.752645954250598,10.0,6.0,7.0,12.0,17.0,5.081768521679754,5.0,3.0,5.0,6.0,6.0,Male,4989.392422200287,46779.857142857145, +2,2019.0,1,6039,46.105802285146694,48.28,30.61,39.84,54.37,57.57,51.16622619638983,54.8,35.63,47.41,57.76,60.45,12.091240271568141,11.0,6.0,8.0,14.0,21.0,5.0622619639013084,6.0,3.0,4.0,6.0,6.0,Female,4908.856252257153,48040.142857142855, +2,2020.0,1,11932,46.757567924601666,48.11056724571695,37.73219659703955,43.394635524511614,51.41147665400951,53.619231282215395,51.73720521469689,54.26588515527794,41.159720920492255,49.39220396238098,56.736064025123824,58.15278833296875,11.878818500107132,11.575001037790162,4.905728549439197,8.008120256186428,15.369689902252157,19.170387398014395,5.084730137445525,5.0,4.0,5.0,6.0,6.0,Total,9962.204142616913,95340.14285714286, +2,2020.0,1,5872,47.8437844177972,49.14801700969113,39.49596752160863,44.84649734774179,52.050660985276764,54.04237678319415,52.37924138956398,54.5656155283704,42.96948325538356,50.3755717154077,56.902058638282604,58.313884933380734,11.248226330418378,10.857734325096114,4.399762654128009,7.506081052094719,14.653655309319818,18.313565089541644,5.058242506811989,5.0,4.0,5.0,6.0,6.0,Male,5014.2343054639905,46674.57142857143, +2,2020.0,1,6060,45.705049236805266,46.983765216391575,36.34470864075474,41.95985199924462,50.67741970377684,53.03833306585735,51.11508699376952,53.908361021320744,39.14638790662377,48.072344096532355,56.562642569057836,58.00932540564332,12.489847744399468,12.214625392858416,5.440387218341498,8.592163681077864,16.050728312183733,19.90062856072975,5.110396039603961,5.0,4.0,5.0,6.0,6.0,Female,4947.969837153003,48665.57142857143, +2,2021.0,1,11881,46.32622527912301,47.09497610523006,40.05947644545569,43.958063999010676,49.50334746453922,51.315015188220194,51.47067378460413,53.213255710430374,42.909462371535675,49.20114247237976,55.74351402766207,57.30674456121603,12.110902712068222,11.993271401369714,5.0527046545700935,8.294402987330578,15.758243694335311,19.254880548975102,5.085683023314536,5.0,4.0,5.0,5.0,6.0,Total,9858.581685411149,94950.42857142857, +2,2021.0,1,5836,47.29706916294303,48.043758879901276,41.430035194717604,45.164249054070254,50.23326851052582,51.89777744251232,52.12630137678541,53.65671380218599,44.49042918601003,50.18721803726345,56.03551850904965,57.47692306086028,11.525623408093264,11.35113397201646,4.583389180615049,7.821584586203622,15.023848395712912,18.65965025144318,5.039753255654558,5.0,4.0,5.0,5.0,6.0,Male,4947.337454393743,46218.857142857145, +2,2021.0,1,6045,45.38894737904459,46.14824414373982,38.95162827090601,42.83285560735115,48.60162294303578,50.501752066501986,50.83771387923257,52.70949301419916,41.47445237714434,48.12603583440368,55.39248468280116,57.07391751100191,12.675946552928039,12.59164259569165,5.565575994548882,8.878938709854292,16.357336363494568,19.834242071957682,5.130024813895782,5.0,4.0,5.0,5.0,6.0,Female,4911.244231017409,48731.57142857143, +2,2022.0,1,11987,46.06227471980685,46.465772848900365,41.25859916496268,44.01256059166152,48.59452723982879,50.218118419547075,51.25947825535327,52.530645739839095,44.18179256342942,48.96680300445372,55.026196699557644,56.602417412895136,12.243135031495632,12.138586281889701,5.263404778915223,8.472011536031214,15.791625301570704,19.476066146254972,5.048886293484609,5.0,4.0,5.0,5.0,6.0,Total,9891.874497755569,95104.42857142857, +2,2022.0,1,5900,46.95173150422378,47.41494202944854,42.34535038737586,45.11557879670025,49.37219301543008,50.841212288772425,51.93951218920456,53.109424931160596,45.409872824178606,49.83699196367226,55.40308067882124,56.81171880805857,11.61558850392787,11.560515010871995,4.578652391932894,7.828896815208619,15.205355329381788,18.763454183484495,4.992203389830508,5.0,4.0,5.0,5.0,6.0,Male,4971.3727651013,46284.857142857145, +2,2022.0,1,6087,45.20014312328022,45.552011024325395,40.51422230131691,43.232112688788135,47.66654959732524,49.25939452323317,50.60033578620308,51.87678558228551,42.84283514639184,48.093281706969194,54.56187356323672,56.32429303266544,12.851402570948437,12.695148183429831,5.92518547381245,9.160032701216783,16.442194192642404,19.919060293720886,5.103827829801216,5.0,5.0,5.0,5.0,6.0,Female,4920.501732654285,48819.57142857143, \ No newline at end of file