From 1f3c227fe8f1747e39338a5a0bd3009301b48b33 Mon Sep 17 00:00:00 2001 From: Tim Hallett <39991060+tbhallett@users.noreply.github.com> Date: Thu, 31 Aug 2023 12:22:38 +0100 Subject: [PATCH 1/7] pseudo-code --- .../copd_analyses/copd_calibrations.py | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index e883019270..b8b41ca0be 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -6,7 +6,7 @@ import pandas as pd from matplotlib import pyplot as plt -from tlo import Date, Simulation +from tlo import Date, Simulation, logging from tlo.analysis.utils import parse_log_file, unflatten_flattened_multi_index_in_logging from tlo.methods import ( copd, @@ -105,10 +105,10 @@ def copd_prevalence(self): def rate_of_death_by_lungfunction_category(self): """Make the comparison to Alupo P et al. (2021) study. This study found that the rate of COPD death was as follows: - Persons with Mild COPD Stage: 3.8 deaths per 100 person-years - Persons with Moderate COPD Stage: 5.1 deaths per 100 person-years - Persons with Severe COPD Stage: 15.3 deaths per 100 person-years - Persons with Very Severe COPD Stage: 27.8 deaths per 100 person-years + Persons with Mild COPD Stage: 3.8 all-cause deaths per 100 person-years + Persons with Moderate COPD Stage: 5.1 all-cause deaths per 100 person-years + Persons with Severe COPD Stage: 15.3 all-cause deaths per 100 person-years + Persons with Very Severe COPD Stage: 27.8 all-cause deaths per 100 person-years We will compare this with fraction of people that die each year, averaged over many years, as an estimate of the risk of persons in each stage dying. We assume that the disease stages in the model correspond to the study as: @@ -120,27 +120,35 @@ def rate_of_death_by_lungfunction_category(self): # Get the number of deaths each year in each category of lung function output = parse_log_file(self.__logfile_path) # parse output file - demog = output['tlo.methods.demography']['death'] # read deaths from demography module - - model = demog.assign( - year=lambda x: x['date'].dt.year).groupby(['year', 'sex', 'age', 'cause'])['person_id'].count() - - # extract copd deaths: - copd_deaths = pd.concat( - { - 'mild': ( - model.loc[(slice(None), slice(None), slice(None), ['COPD_cat1'])].groupby('year').sum() - + model.loc[(slice(None), slice(None), slice(None), ['COPD_cat2'])].groupby('year').sum() - ), - 'moderate': ( - model.loc[(slice(None), slice(None), slice(None), ["COPD_cat3"])].groupby("year").sum() - + model.loc[(slice(None), slice(None), slice(None), ["COPD_cat4"])].groupby("year").sum() - ), - 'severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat5'])].groupby('year').sum(), - 'very_severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat6'])].groupby('year').sum(), - }, - axis=1 - ).fillna(0).astype(float) + demog = output['tlo.methods.demography.detail']['properties_of_deceased_persons'] # read deaths from demography detail logger + + # Each death is a row. + # For each death work out the lung function category (none/mild/severe/very severe). Do this by looking at + # ... ch_lung_function. Call this "cat" + # Then reformat date into year (as already done). + # Then do a groupby on year and "cat" and summarize using .count(). + # Call that copd_deaths... everything else will work. + + # DELETE THIS --- ITS ONLY LOOKING AT COPD DEATHS AND NOT ALL DEATHS + # model = demog.assign( + # year=lambda x: x['date'].dt.year).groupby(['year', 'sex', 'age', 'cause'])['person_id'].count() + # + # # extract copd deaths: + # copd_deaths = pd.concat( + # { + # 'mild': ( + # model.loc[(slice(None), slice(None), slice(None), ['COPD_cat1'])].groupby('year').sum() + # + model.loc[(slice(None), slice(None), slice(None), ['COPD_cat2'])].groupby('year').sum() + # ), + # 'moderate': ( + # model.loc[(slice(None), slice(None), slice(None), ["COPD_cat3"])].groupby("year").sum() + # + model.loc[(slice(None), slice(None), slice(None), ["COPD_cat4"])].groupby("year").sum() + # ), + # 'severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat5'])].groupby('year').sum(), + # 'very_severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat6'])].groupby('year').sum(), + # }, + # axis=1 + # ).fillna(0).astype(float) # Get the number of person each year in each category of lung function (irrespective of sex/age/smokingstatus) # average within the year @@ -157,11 +165,15 @@ def rate_of_death_by_lungfunction_category(self): # data death_rate_per100 = (100 * copd_deaths / prev).mean() print(death_rate_per100) + # NONE.... # mild 0.000000 (vs 3.8 in Alupo et al) # moderate 0.000000 (vs 5.1 in Alupo et al) # severe 1.674310 (vs 15.3 in Alupo et al) # very_severe 4.507594 (vs 27.8 in Alupo et al) + # COMPUTE THE RELATIVE RATES TO NONE + rr_rates = death_rate_per100 / death_rate_per100.loc['none'] + start_date = Date(2010, 1, 1) end_date = Date(2030, 1, 1) @@ -181,6 +193,10 @@ def get_simulation(popsize): log_config={ 'filename': 'copd_analyses', 'directory': outputpath, + 'custom_logs': { + '*': logging.WARNING, + 'tlo.methods.demography.detail': logging.INFO, + } }, ) sim.register(demography.Demography(resourcefilepath=resourcefilepath), From aa10b312cd265927eb0669fd3f482791b540a0a9 Mon Sep 17 00:00:00 2001 From: Tim Hallett <39991060+tbhallett@users.noreply.github.com> Date: Thu, 31 Aug 2023 12:24:14 +0100 Subject: [PATCH 2/7] drop deaths --- src/scripts/copd_analyses/copd_calibrations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index b8b41ca0be..0a14baa0d1 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -125,6 +125,7 @@ def rate_of_death_by_lungfunction_category(self): # Each death is a row. # For each death work out the lung function category (none/mild/severe/very severe). Do this by looking at # ... ch_lung_function. Call this "cat" + # Drop all deaths among persons aged under 30. # Then reformat date into year (as already done). # Then do a groupby on year and "cat" and summarize using .count(). # Call that copd_deaths... everything else will work. From 6507393046fde14457c746ee929ba59ba97889d8 Mon Sep 17 00:00:00 2001 From: mnjowe Date: Fri, 1 Sep 2023 14:19:21 +0200 Subject: [PATCH 3/7] calibrating rate and relative rate of deaths --- .../copd_analyses/copd_calibrations.py | 144 +++++++++++++----- 1 file changed, 105 insertions(+), 39 deletions(-) diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index 0a14baa0d1..64382f3a0a 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -5,6 +5,7 @@ import numpy as np import pandas as pd from matplotlib import pyplot as plt +from matplotlib.font_manager import FontProperties from tlo import Date, Simulation, logging from tlo.analysis.utils import parse_log_file, unflatten_flattened_multi_index_in_logging @@ -120,42 +121,32 @@ def rate_of_death_by_lungfunction_category(self): # Get the number of deaths each year in each category of lung function output = parse_log_file(self.__logfile_path) # parse output file - demog = output['tlo.methods.demography.detail']['properties_of_deceased_persons'] # read deaths from demography detail logger - - # Each death is a row. - # For each death work out the lung function category (none/mild/severe/very severe). Do this by looking at - # ... ch_lung_function. Call this "cat" - # Drop all deaths among persons aged under 30. - # Then reformat date into year (as already done). - # Then do a groupby on year and "cat" and summarize using .count(). - # Call that copd_deaths... everything else will work. - - # DELETE THIS --- ITS ONLY LOOKING AT COPD DEATHS AND NOT ALL DEATHS - # model = demog.assign( - # year=lambda x: x['date'].dt.year).groupby(['year', 'sex', 'age', 'cause'])['person_id'].count() - # - # # extract copd deaths: - # copd_deaths = pd.concat( - # { - # 'mild': ( - # model.loc[(slice(None), slice(None), slice(None), ['COPD_cat1'])].groupby('year').sum() - # + model.loc[(slice(None), slice(None), slice(None), ['COPD_cat2'])].groupby('year').sum() - # ), - # 'moderate': ( - # model.loc[(slice(None), slice(None), slice(None), ["COPD_cat3"])].groupby("year").sum() - # + model.loc[(slice(None), slice(None), slice(None), ["COPD_cat4"])].groupby("year").sum() - # ), - # 'severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat5'])].groupby('year').sum(), - # 'very_severe': model.loc[(slice(None), slice(None), slice(None), ['COPD_cat6'])].groupby('year').sum(), - # }, - # axis=1 - # ).fillna(0).astype(float) + + # read deaths from demography detail logger + demog = output['tlo.methods.demography.detail']['properties_of_deceased_persons'] + + # only consider deaths from individuals above 30 + demog = demog.loc[demog.age_years > 30] + + # assign a function that groups deaths by year and lung function thereafter do count + all_deaths = demog.assign( + year=lambda x: x['date'].dt.year, + cat=lambda x: x['ch_lungfunction']).groupby(['year', 'cat'])['cause_of_death'].count() + + # re-construct the dataframe by transforming lung function categories into columns + all_deaths_df = all_deaths.unstack().assign( + none=lambda x: x[0], + mild=lambda x: x[1] + x[2], + moderate=lambda x: x[3] + x[4], + severe=lambda x: x[5], + very_severe=lambda x: x[6]).drop(columns=[0, 1, 2, 3, 4, 5, 6]) # Get the number of person each year in each category of lung function (irrespective of sex/age/smokingstatus) # average within the year prev = self.construct_dfs()['copd_prevalence'] prev = (prev.groupby(axis=1, by=prev.columns.droplevel([0, 1, 2])).sum() .groupby(axis=0, by=prev.index.year).mean()) + prev['none'] = prev['0'] prev['mild'] = prev['1'] + prev['2'] prev['moderate'] = prev['3'] + prev['4'] prev['severe'] = prev['5'] @@ -164,17 +155,92 @@ def rate_of_death_by_lungfunction_category(self): # Compute fraction that die each year in each category of lung function, average over many years and compare to # data - death_rate_per100 = (100 * copd_deaths / prev).mean() - print(death_rate_per100) - # NONE.... - # mild 0.000000 (vs 3.8 in Alupo et al) - # moderate 0.000000 (vs 5.1 in Alupo et al) - # severe 1.674310 (vs 15.3 in Alupo et al) - # very_severe 4.507594 (vs 27.8 in Alupo et al) + death_rate_per100 = (100 * all_deaths_df / prev).mean() + + model_and_observed_data_dict = {'model': [death_rate_per100.mild, death_rate_per100.moderate, + death_rate_per100.severe, death_rate_per100.very_severe], + 'data': [3.8, 5.1, 15.3, 27.8] + } + + # plot rate of death (per 100 per year) by COPD stage (mild, moderate, severe, very severe) + plot_rate_df = pd.DataFrame(index=['mild', 'moderate', 'severe', 'very_severe'], + data=model_and_observed_data_dict) + + fig, axes = plt.subplots(ncols=4, sharey=True) + _col_counter = 0 + for _label in plot_rate_df.index: + # do plotting + ax = plot_rate_df.iloc[_col_counter:1 + _col_counter].plot.line(ax=axes[_col_counter], + title=f"{_label} COPD", + y='model', + marker='o', + color='blue', + ) + + plot_rate_df.iloc[_col_counter:1 + _col_counter].plot.line( + y='data', + marker='^', + color='red', + ax=ax + ) + _col_counter += 1 # increment column counter + # remove all the subplot legends + for ax in axes: + ax.get_legend().remove() + + fontP = FontProperties() + fontP.set_size('small') + + # set legend + legend_keys = ['Model (Risk of death per 100 persons)', 'Data (Rate of death per 100 person-years)'] + plt.legend(legend_keys, bbox_to_anchor=(0.1, 0.74), loc='upper left', prop=fontP) + + # show plot + plt.show() # COMPUTE THE RELATIVE RATES TO NONE rr_rates = death_rate_per100 / death_rate_per100.loc['none'] + rr_model_and_observed_data_dict = {'model': [rr_rates.none, rr_rates.mild, rr_rates.moderate, + rr_rates.severe + rr_rates.very_severe], + 'data': [1.0, 2.4, 3.5, 6.6] + } + + # plot relative rate of (all cause) death according to COPD stage (none, mild, moderate, severe + v severe) + plot_rr_rate_df = pd.DataFrame(index=['none', 'mild', 'moderate', 'severe_and_very_severe'], + data=rr_model_and_observed_data_dict) + + fig, axes = plt.subplots(ncols=4, sharey=True) + _col_counter = 0 + for _label in plot_rr_rate_df.index: + # do plotting + ax = plot_rr_rate_df.iloc[_col_counter:1 + _col_counter].plot.line(ax=axes[_col_counter], + title=f"{_label} COPD", + y='model', + marker='o', + color='blue', + ) + + plot_rr_rate_df.iloc[_col_counter:1 + _col_counter].plot.line( + y='data', + marker='^', + color='red', + ax=ax + ) + _col_counter += 1 # increment column counter + # remove all the subplot legends + for ax in axes: + ax.get_legend().remove() + + fontP = FontProperties() + fontP.set_size('small') + # set legend + plt.legend(['Model', 'Data'], bbox_to_anchor=(0.1, 0.74), loc='upper left', prop=fontP) + plt.figtext(0.5, 0.01, "Relative rate of (all cause) death according to COPD stage (none, mild, moderate, " + "severe + v severe)", ha="center", bbox={"facecolor": "grey", "alpha": 0.5, "pad": 5}) + # show plot + plt.show() + start_date = Date(2010, 1, 1) end_date = Date(2030, 1, 1) @@ -219,13 +285,13 @@ def get_simulation(popsize): # run simulation and store logfile path # sim = get_simulation(50000) # path_to_logfile = sim.log_filepath -path_to_logfile = Path('/Users/tbh03/GitHub/TLOmodel/outputs/copd/copd_analyses__2023-08-24T170704.log') +path_to_logfile = Path('./outputs/copd_analyses__2023-08-24T170704.log') # initialise Copd analyses class copd_analyses = CopdCalibrations(logfile_path=path_to_logfile) # plot lung function categories per each category -copd_analyses.copd_prevalence() +# copd_analyses.copd_prevalence() # Examine rate of death by lung function copd_analyses.rate_of_death_by_lungfunction_category() From 8c8042c5aaa2f62fd8744b9b0531eeaeebda95b3 Mon Sep 17 00:00:00 2001 From: mnjowe Date: Mon, 4 Sep 2023 09:29:52 +0200 Subject: [PATCH 4/7] uncommenting some blocks of code --- src/scripts/copd_analyses/copd_calibrations.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index 64382f3a0a..146939c948 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -283,15 +283,14 @@ def get_simulation(popsize): # run simulation and store logfile path -# sim = get_simulation(50000) -# path_to_logfile = sim.log_filepath -path_to_logfile = Path('./outputs/copd_analyses__2023-08-24T170704.log') +sim = get_simulation(50000) +path_to_logfile = sim.log_filepath # initialise Copd analyses class copd_analyses = CopdCalibrations(logfile_path=path_to_logfile) # plot lung function categories per each category -# copd_analyses.copd_prevalence() +copd_analyses.copd_prevalence() # Examine rate of death by lung function copd_analyses.rate_of_death_by_lungfunction_category() From 90118dda2f3b138dd540e7e7c224707303210033 Mon Sep 17 00:00:00 2001 From: mnjowe Date: Wed, 7 Feb 2024 14:45:47 +0200 Subject: [PATCH 5/7] addressing key not found errors when running both COPD analyses and calibrations. Logging COPD logs in copd calibration --- .../analysis_copd_prevalence_and_deaths.py | 8 ++++++-- src/scripts/copd_analyses/copd_calibrations.py | 14 +++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/scripts/copd_analyses/analysis_copd_prevalence_and_deaths.py b/src/scripts/copd_analyses/analysis_copd_prevalence_and_deaths.py index 005c550b54..33ebf2e64b 100644 --- a/src/scripts/copd_analyses/analysis_copd_prevalence_and_deaths.py +++ b/src/scripts/copd_analyses/analysis_copd_prevalence_and_deaths.py @@ -267,10 +267,13 @@ def plot_lung_function_categories_by_age_group(self): def plot_copd_deaths_by_lungfunction(self): """ a function to plot COPD deaths by lung function/obstruction """ # get COPD deaths by lung function from copd logs - deaths_lung_func = self.__logs_dict['copd_deaths_lung_func'] + deaths_lung_func = \ + parse_log_file(self.__logfile_path)['tlo.methods.demography.detail']['properties_of_deceased_persons'] + _plot_deaths = deaths_lung_func.loc[(deaths_lung_func.cause_of_death == 'COPD_cat5') | + (deaths_lung_func.cause_of_death == 'COPD_cat6')] # group by date and lung function - deaths_grouped = deaths_lung_func.groupby(['date', 'lung_function']).size() + deaths_grouped = _plot_deaths.groupby(['date', 'ch_lungfunction']).size() unstack_df = deaths_grouped.unstack() plot_lung_func_deaths = unstack_df.groupby(unstack_df.index.year).sum() plot_lung_func_deaths = plot_lung_func_deaths.apply(lambda row: row / row.sum(), axis=1) @@ -297,6 +300,7 @@ def plot_modal_gbd_deaths_by_gender(self): fig, axs = plt.subplots(nrows=1, ncols=2, sharey=True, sharex=True) for _col, sex in enumerate(('M', 'F')): plot_df = death_compare.loc[(['2010-2014', '2015-2019'], sex, slice(None), 'COPD')].groupby('period').sum() + plot_df = plot_df.loc[['2010-2014', '2015-2019']] ax = plot_df['model'].plot.bar(color=self.__plot_colors[6], label='Model', ax=axs[_col], rot=0) ax.errorbar(x=plot_df['model'].index, y=plot_df.GBD_mean, yerr=[plot_df.GBD_lower, plot_df.GBD_upper], diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index 146939c948..b24c81ad60 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -101,6 +101,8 @@ def copd_prevalence(self): ) ax.legend(["modal", "observed data"]) _col_counter += 1 # increment column counter + plt.figtext(0.5, 0.01, "Prevalence of mild, moderate, severe, very severe COPD at mean age 49 (SD 17 years)*", + ha="center", bbox={"facecolor": "grey", "alpha": 0.5, "pad": 5}) plt.show() def rate_of_death_by_lungfunction_category(self): @@ -165,7 +167,6 @@ def rate_of_death_by_lungfunction_category(self): # plot rate of death (per 100 per year) by COPD stage (mild, moderate, severe, very severe) plot_rate_df = pd.DataFrame(index=['mild', 'moderate', 'severe', 'very_severe'], data=model_and_observed_data_dict) - fig, axes = plt.subplots(ncols=4, sharey=True) _col_counter = 0 for _label in plot_rate_df.index: @@ -175,6 +176,8 @@ def rate_of_death_by_lungfunction_category(self): y='model', marker='o', color='blue', + ylabel="rate of COPD death per 100 " + "person years" ) plot_rate_df.iloc[_col_counter:1 + _col_counter].plot.line( @@ -194,6 +197,8 @@ def rate_of_death_by_lungfunction_category(self): # set legend legend_keys = ['Model (Risk of death per 100 persons)', 'Data (Rate of death per 100 person-years)'] plt.legend(legend_keys, bbox_to_anchor=(0.1, 0.74), loc='upper left', prop=fontP) + plt.figtext(0.5, 0.01, "Rate of death (per 100 per year) by COPD stage (mild, moderate, severe, very severe)", + ha="center", bbox={"facecolor": "grey", "alpha": 0.5, "pad": 5}) # show plot plt.show() @@ -209,7 +214,6 @@ def rate_of_death_by_lungfunction_category(self): # plot relative rate of (all cause) death according to COPD stage (none, mild, moderate, severe + v severe) plot_rr_rate_df = pd.DataFrame(index=['none', 'mild', 'moderate', 'severe_and_very_severe'], data=rr_model_and_observed_data_dict) - fig, axes = plt.subplots(ncols=4, sharey=True) _col_counter = 0 for _label in plot_rr_rate_df.index: @@ -219,6 +223,9 @@ def rate_of_death_by_lungfunction_category(self): y='model', marker='o', color='blue', + ylabel="relative rate of COPD death per " + "100 " + "person years" ) plot_rr_rate_df.iloc[_col_counter:1 + _col_counter].plot.line( @@ -260,9 +267,10 @@ def get_simulation(popsize): log_config={ 'filename': 'copd_analyses', 'directory': outputpath, - 'custom_logs': { + 'custom_levels': { '*': logging.WARNING, 'tlo.methods.demography.detail': logging.INFO, + 'tlo.methods.copd': logging.INFO, } }, ) From 13aa43a72c27692369393fde636a76d6a169f96b Mon Sep 17 00:00:00 2001 From: mnjowe Date: Wed, 7 Feb 2024 16:39:02 +0200 Subject: [PATCH 6/7] year specific calibration --- src/scripts/copd_analyses/copd_calibrations.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/scripts/copd_analyses/copd_calibrations.py b/src/scripts/copd_analyses/copd_calibrations.py index b24c81ad60..caa16fd76a 100644 --- a/src/scripts/copd_analyses/copd_calibrations.py +++ b/src/scripts/copd_analyses/copd_calibrations.py @@ -157,7 +157,7 @@ def rate_of_death_by_lungfunction_category(self): # Compute fraction that die each year in each category of lung function, average over many years and compare to # data - death_rate_per100 = (100 * all_deaths_df / prev).mean() + death_rate_per100 = (100 * all_deaths_df.loc[[2021]] / prev.loc[[2021]]).mean() model_and_observed_data_dict = {'model': [death_rate_per100.mild, death_rate_per100.moderate, death_rate_per100.severe, death_rate_per100.very_severe], @@ -204,7 +204,8 @@ def rate_of_death_by_lungfunction_category(self): plt.show() # COMPUTE THE RELATIVE RATES TO NONE - rr_rates = death_rate_per100 / death_rate_per100.loc['none'] + rr_death_rate_per100 = (100 * all_deaths_df.loc[[2023]] / prev.loc[[2023]]).mean() + rr_rates = rr_death_rate_per100 / rr_death_rate_per100.loc['none'] rr_model_and_observed_data_dict = {'model': [rr_rates.none, rr_rates.mild, rr_rates.moderate, rr_rates.severe + rr_rates.very_severe], From 0a14fc8c8efe54c9db9069760fba2b4aeaef1b38 Mon Sep 17 00:00:00 2001 From: Tim Hallett <39991060+tbhallett@users.noreply.github.com> Date: Thu, 8 Feb 2024 12:41:21 +0000 Subject: [PATCH 7/7] add write-up --- docs/write-ups/Copd.docx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/write-ups/Copd.docx b/docs/write-ups/Copd.docx index 51667effcc..4806e12292 100644 --- a/docs/write-ups/Copd.docx +++ b/docs/write-ups/Copd.docx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0c065a2c806bfdfa5d0eaabba8f123f03a9011ce725f11e4825b30af1a13197 -size 1416900 +oid sha256:bf9ab3048642b62fc782f1d7da017fb34e515bbdf9f436c410613fcb93b90a49 +size 761798