-
Notifications
You must be signed in to change notification settings - Fork 11
Notes on declaring CAUSES_OF_DEATH and CAUSES_OF_DISABILITY
Each disease module can cause two outcomes: death and disability.
But we need to:
- identify where a cause contributes to both disability and death;
- identify where several modules are generating what should be considered to be the same cause of deaths or disability;
- identify which causes of death/disability in the GBD dataset correspond to the causes that are being represented in a disease module.
By doing this, we will be able to:
- Produce internally-consistent measures of deaths and DALYS
- Produce summaries that comparable with the GBD datasets;
- Automatically adjust the 'OtherDeathPoll' (which represents deaths from causes other those represented by the disease modules included in a simulation).
Whilst we need to enforce a coherence between disease modules, it remains acceptable (desirable, in fact!) for different disease modules to represent the effects with differing degrees of granularity. We have aimed to develop a system that is sufficiently flexible allow for that and also to require a minimum of changes in each disease module. [Note: these changes have already made for all modules in master
.]
### Approach The names of causes of death and disability used in each module remain unchanged. But, now, each module must "explain" what is meant by these causes. This becomes a bit complicated because:
- Some modules are responsible for many different causes of death whilst others modules are responsible for only one.
- In some cases, two modules are responsible for the same cause of death or disability.
- Many disease/condition can cause disability and death and whilst it is natural to define these somewhat differently, a line must be drawn between certain causes of death and disability for the computation of DALYS (which derive from the sum of years lived with disability and life years lost).
- The mapping between the causes defined in the module and causes in the GBD is, in principle at least, "many-to-many": i.e. some causes of death in the model map to many different causes in the GBD dataset (e.g. 'OtherCancerDeath' --> many different specific causes of cancer in GBD); whilst in other modules many different causes of death are defined which map to a single cause in the GBD data (e.g. a lot of different outcomes in pregnancy map --> 'Maternal Outcomes' in the GBD data).
Therefore, we must define, for each cause of death or disability used in the model, ("tlo_causes"):
-
a "label": this the category to which the cause of death or disability belongs: It has two purposes:
- it attaches multiple causes of death defined in the model or multiple causes of disability defined in the model: i.e., multiple different causes (from within one module or multiple) can be aggregated under a unifying label.
- it attaches causes of death defined in the model with causes of disability defined in the model: i.e., causes of death and causes of disability with the same label both contribute to the DALYs under that label.
-
the "gbd_causes": this is the list of strings of causes (in the GBD dataset), to which the cause of death/disability corresponds. (Look at any GBD file, e.g.
ResourceFile_Deaths_And_Causes_DeathRates_GBD.csv
. We using GBD's "level 3" causes.)
-
The declared names of 'tlo_causes' of death are assumed to be UNIQUE; similarly, the declare names of 'tlo_causes' of disability are assumed to be unique.
- If more than one module declares a tlo_cause of death/disability with the same name, the definitions of each must be identical (an
AssertionError
is thrown otherwise). - When two modules declare a tlo_cause of death/disability with the same name, these are combined together.
- If more than one module declares a tlo_cause of death/disability with the same name, the definitions of each must be identical (an
-
A
gbd_cause
(a cause of death or disability defined define by the GBD) cannot be associated with more than onelabel
. (AnAssertionError
is thrown otherwise). This is because in the calibration proceduresgbd_causes
must map many-to-one tolabels
. -
Declared names for 'tlo_cause' of death can be the same as 'tlo_cause' of disability and these can be the same as the 'label' of each.
-
The gbd_causes of death defined among all the 'tlo_causes' declared in a simulation are removed as potential causes of death in the
OtherDeathPoll
inDemography
. -
Checks during the simulation are made as follows:
- A death caused by a module must have a 'tlo_cause' identified that is declared by that module.
- The
report_dalys
function of a disease module must return apd.DataFrame
with one column named for each 'cause of disability' that is declared. (Optionally, if only one 'cause of disability' is defined by a module, then it'sreport_dalys
function can return apd.Series
(for which the name need not be specified).
Each disease module (identified by m.DISEASE_MODULE
in the module's metadata
) must declare it's CAUSES_OF_DEATH
and CAUSES_OF_DISABILITY
thusly:
# Declare Causes of Death
CAUSES_OF_DEATH = {
'tlo_cause_of_death': # <-- how this death is referred in the TLO model
Cause(gbd_causes=['list_of_strings_of_gbd_causes_to_which_this_cause_corresponds'],
label='the_category_of_which_this_cause_is_a_part')
}
# Declare Causes of Disability
CAUSES_OF_DISABILITY = {
'tlo_cause_of_disability': # <-- how this disability is referred in the TLO model
Cause(gbd_causes=['list_of_strings_of_gbd_causes_to_which_this_cause_corresponds'],
label='the_category_of_which_this_cause_is_a_part')
}
Note that this is using the Cause
data structure defined in tlo.core
so you will need from tlo.core import Cause
.
The most simple example:
# Declare Causes of Death
CAUSES_OF_DEATH = {
'BladderCancer': Cause(gbd_causes='Bladder cancer', label='Cancer'),
}
# Declare Causes of Disability
CAUSES_OF_DISABILITY = {
'BladderCancer': Cause(gbd_causes='Bladder cancer', label='Cancer'),
}
A more complicated example:
# Declare Causes of Death
CAUSES_OF_DEATH = {
'diabetes': Cause(
gbd_causes='Diabetes mellitus', label='Diabetes'),
'chronic_ischemic_hd': Cause(
gbd_causes=['Ischemic heart disease', 'Hypertensive heart disease'], label='Heart Disease'),
'heart_attack': Cause(
gbd_causes=['Ischemic heart disease', 'Hypertensive heart disease'], label='Heart Disease'),
'stroke': Cause(
gbd_causes='Stroke', label='Stroke'),
'chronic_kidney_disease': Cause(
gbd_causes='Chronic kidney disease', label='Kidney Disease')
}
As before, the deaths (by the cause provided by the module) and disability (by the cause provided by the module) are found in the logged output as follows:
- Deaths:
['tlo.methods.demography']['deaths']
: each row is a death, and the column 'cause' is the 'tlo_cause' that is passed by the disease module. - Years Life Lost:
[tlo.methods.healtburden]['yll_by_causes_of_death']
: This is a table (by sex, age-group and year) of the years of live lost by the 'tlo_cause' of death that are used by the disease module. - Years Lived with Disability
[tlo.methods.healtburden]['yld_by_causes_of_disability']
: This is a table (by sex, age-group and year) of the years of lived with disability by the 'tlo_cause' of disability that are used by the disease module.
But now, also output are:
- DALYS:
[tlo.methods.healtburden]['dalys']
: these are the sum of 'Years Life Lost' and 'Years Lived With Disability' that have the samelabel
, broken down by year, sex, age-group'. - Each death recorded
['tlo.methods.demography']['deaths']
is associated with the correspondinglabel
. -
dict
s that can be used to recode deaths and disability causes in GBD data into a form that is comparable with output from the model. (Note that this recoding is specific to a simulation because the 'gbd_causes' that are associated under alabel
is defined by the disease modules, including the GBD causes of death that are combined under the 'Other' label used in theOtherDeathPoll
).['tlo.methods.demography']['mapper_from_tlo_cause_to_common_label']
['tlo.methods.demography']['mapper_from_gbd_cause_to_common_label']
In some cases, this complexity can probably be resolved by authors of disease modules (e.g. sometimes different names given to disabilities or causes of death, without a good reason or because the work is still in progress). Look at:
- Malaria
- Ncds
TLO Model Wiki