Impairment¶
Impaired organ function is a set of parameter vectors on the physiology, never a structurally different model: three severities of the top model set factors on the quantities of the healthy individual, the liver and the binding to plasma proteins. All severities 0 give the healthy model, every factor is 1. The numbers are those of data/impairment.toml, every number with its source; a number which no publication read gives is a choice of the library (ModelChoice) with a note.
| condition | severity | classes | acts on |
|---|---|---|---|
| liver cirrhosis | CP_severity |
0 healthy, 1, 2, 3 the Child-Pugh classes A, B, C, interpolated linearly | functional liver f_functional, shunt f_shunt, hepatic artery and kidney flow, cardiac index, GFR, albumin and AGP (so fu), the enzymes and transporters of the liver; hematocrit (factor 1, see Limitations) |
| chronic kidney disease | f_renal_function |
the GFR relative to healthy; its GFR per 1.73 m2 (eGFR) gives the stage |
GFR, the binding to albumin and AGP by their CKD profiles and to an unknown protein by the binding capacity of the plasma proteins (so fu); hematocrit, kidney volume and flow, gastric emptying and small intestinal transit (factor 1, see Limitations); with the switch CKD_hepatic = 1 hepatic CYP2D6 and OATP1B |
| heart failure | HF_severity |
0 healthy, 1 to 4 the NYHA classes I to IV, interpolated linearly | the blood flows of liver and portal organs, kidney, skin, adipose and muscle; the cardiac output is their sum, the GFR follows the renal blood flow |
Each condition has its factors fcp_<key>, fckd_<key>, fhf_<key>; the factor of all conditions on a quantity is fimp_<id>, their product (fimp_GFR, fimp_Qki, fimp_HCT), which the physiology multiplies. Every organ flow is its fraction of the cardiac output without impairment (CO_base) times fimp_Q<o>, and the cardiac output is CO_base*fimp_CO, so the flows sum to it. A rate of a protein in the liver runs with f_<protein>*fimp_<protein>, the base activity of the organ (genotype, interactions of an experiment) times the impairment, so both act multiplicatively.
The severities are initial values like a covariate: set them before the simulation, in the experiment. A severity which changes during a simulation (a study which changes the renal function between periods) is named in PBPKDefinition.dynamic, so its factors are assignment rules. f_shunt and f_functional stay parameters an experiment may set directly.
f_shunt = fcp_shunt
f_functional = fcp_functional_liver
fimp_Qli = fcp_hepatic_artery_flow * fhf_liver_flow
fimp_Qki = fcp_kidney_flow * fckd_kidney_flow * fhf_kidney_flow
fimp_Qmu = fcp_rest_flow * fhf_peripheral_flow
fimp_GFR = fcp_gfr * fhf_kidney_flow
fimp_HCT = fcp_hematocrit * fckd_hematocrit
fimp_li_cyp3a4 = fcp_cyp3a4 * (1 + CKD_hepatic * (fckd_cyp3a4 - 1))
fu_<s> = 1 / (1 + fimp_albumin * fimp_albumin_ckd * (1 - fu_ref_<s>) / fu_ref_<s>)
The unbound fraction follows the binding (McNamara 2002): fu = 1/(1 + f*(1 - fu_ref)/fu_ref) with the binding factor f, the factor of the binding protein in cirrhosis (fimp_albumin, fimp_agp, 1 for an unknown protein) times the CKD factor of the binding: for albumin and AGP the CKD profile of the protein (fimp_albumin_ckd, fimp_agp_ckd, see Binding in chronic kidney disease), for an unknown protein one over the factor of the binding capacity fimp_plasma_protein. fu of an albumin-bound substance rises in CKD, fu of an AGP-bound substance falls, and fu stays below 1. A substance whose binding is measured unchanged in renal impairment (apixaban: 92-94 % bound in healthy and ESRD subjects, US label) opts out with Binding(fu, protein, ckd=False): the formula then has no CKD factor, fu = 1/(1 + fimp_albumin * (1 - fu_ref)/fu_ref), so fu follows only the binding protein (cirrhosis still acts). With an unknown protein as well no factor is left and fu = fu_ref, the reference itself; an unknown protein with the CKD factor has the CKD factor alone. The notes of fu_<s> say which case applies (unbound_fraction_notes).
Liver cirrhosis¶
CP_severity between the classes interpolates every factor linearly, so scans and fits use intermediate severities:
fcp_shunt = piecewise(0, CP_severity <= 0, 0 + 0.399489795918367 * (CP_severity - 0), CP_severity < 1, 0.399489795918367 + 0.298469387755102 * (CP_severity - 1), CP_severity < 2, 0.697959183673469 + 0.114795918367347 * (CP_severity - 2), CP_severity < 3, 0.812755102040816)
fcp_rest_flow = 1 + (fcp_cardiac_index - 1 - (fQli * (fcp_hepatic_artery_flow - 1) + fQki * (fcp_kidney_flow - 1))) / (fQhe + fQmu + fQsk + fQad + fQbo + fQgo)
The organs without a factor of their own (heart, muscle, skin, adipose, bone, gonads) close the cardiac output to the cardiac index of the class (fcp_rest_flow). The brain (autoregulation of the cerebral blood flow, a choice of the library) and the portal organs (the shunt represents the portal blood which does not reach the liver) keep their flow.
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
| factor | A | B | C | source |
|---|---|---|---|---|
functional_liver |
0.69 | 0.55 | 0.28 | ModelChoice |
shunt |
0.3995 | 0.698 | 0.8128 | ModelChoice |
hepatic_artery_flow |
1.3 | 2.3 | 3.4 | ModelChoice |
kidney_flow |
0.88 | 0.65 | 0.48 | ModelChoice |
cardiac_index |
1.11 | 1.27 | 1.36 | ModelChoice |
gfr |
1 | 0.7 | 0.36 | ModelChoice |
albumin |
0.81 | 0.68 | 0.5 | ModelChoice |
agp |
0.6 | 0.56 | 0.3 | ModelChoice |
hematocrit |
1 | 1 | 1 | ModelChoice |
Sources
ModelChoice: Choice of the pkpdsim PBPK library, not a value of the literature; the notes of the value give the reasoning.
The physiological factors are those which Alasmari 2024 (Table 3) attribute to Edginton & Willmann 2008. Edginton 2008 was not read, so they are choices of the library, not verified against the paper, and are named in the notes as such. The shunt and the portal blood flow describe the same portal blood which does not reach the sinusoids; applied together they would count it twice. The library takes the shunt: the shunt fractions are the degrees of cirrhosis of the Child-Pugh classes of pkpdsim.impairment.CIRRHOSIS (the ICG models of the König lab, a choice of the library), the splanchnic flow of the portal organs is not reduced, and the fraction f_shunt of the liver inflow bypasses the liver, so the portal blood which perfuses the liver is 0.60, 0.30 and 0.19 of healthy (Edginton 2008: 0.40, 0.36, 0.04). The shunt acts on the hepatic arterial inflow as well.
The enzymes and transporters are the median abundances of El-Khateeb 2021 (the only source with all three classes); a class the figures do not annotate is the linear interpolation between healthy and the next annotated class, a choice of the library. Johnson 2010 (the abundance factors of the Simcyp cirrhosis populations) was not accessible and is not used; Prasad 2018 agrees with El-Khateeb 2021 for class C within the variability, but for CYP2D6, CYP2C8 and CYP2C9.
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
| protein | A | B | C | source |
|---|---|---|---|---|
CYP1A2 |
0.69* | 0.38 | 0.13 | ElKhateeb2021 |
CYP2A6 |
0.725* | 0.45 | 0.28 | ElKhateeb2021 |
CYP2B6 |
1 | 1 | 1 | ElKhateeb2021 |
CYP2C8 |
0.685* | 0.37 | 0.25 | ElKhateeb2021 |
CYP2C9 |
0.73* | 0.46 | 0.23 | ElKhateeb2021 |
CYP2C18 |
0.8* | 0.6* | 0.4 | ElKhateeb2021 |
CYP2C19 |
0.51* | 0.02 | 0.05 | ElKhateeb2021 |
CYP2D6 |
0.7* | 0.4 | 0.3 | ElKhateeb2021 |
CYP2E1 |
0.695* | 0.39 | 0.14 | ElKhateeb2021 |
CYP3A4 |
0.615* | 0.23 | 0.2 | ElKhateeb2021 |
UGT1A1 |
1 | 1 | 1 | ElKhateeb2021 |
UGT1A9 |
0.74* | 0.48 | 0.28 | ElKhateeb2021 |
UGT2B7 |
0.65* | 0.3 | 0.13 | ElKhateeb2021 |
SLCO1B1 |
0.46 | 0.42 | 0.3 | ElKhateeb2021 |
SLCO1B3 |
1 | 1 | 1 | ElKhateeb2021 |
ABCC2 |
0.46 | 0.34 | 0.18 | ElKhateeb2021 |
A value marked * is a choice of the library, not a value of the source.
Sources
ElKhateeb2021: El-Khateeb E, Achour B, Al-Majdoub ZM, Barber J, Rostami-Hodjegan A. Non-uniformity of changes in drug-metabolizing enzymes and transporters in liver cirrhosis: implications for drug dosage adjustment. Mol Pharm 18(9):3563-3577, 2021. doi:10.1021/acs.molpharmaceut.1c00462
Chronic kidney disease¶
f_renal_function is the factor of the GFR, as in the hand-written models (KI__f_renal_function there, f_renal_function of the top model here): GFR = GFR_base * f_renal_function, with GFR_base the GFR at renal function 1, which carries the body surface area and the factor fimp_GFR of cirrhosis and heart failure (see Physiology). Its GFR per 1.73 m2 of the reference individual of the build (eGFR) gives the stage: normal at least 90, mild 60-89, moderate 30-59, severe 15-29, end stage below 15 ml/min/1.73 m2. The factors are piecewise linear in the eGFR through anchor points at the stage midpoints: 1 from 90, the value of mild CKD at 75, of moderate CKD at 45, of severe CKD at 22.5 and of end stage CKD at 7.5 ml/min/1.73 m2 and below, linear in between (from 1 at 90 to the mild value at 75), as the factors of the Child-Pugh classes are between the classes. A scan or fit of f_renal_function therefore sees no step at a stage limit. The anchors are a choice of the library (ModelChoice: continuous covariate for scans and fits; stage midpoints), the values of the stages and their sources are unchanged.
The renal function scales the tubular capacity of the kidney as well, continuously and not by stage: every metabolism and transport of the kidney (a tubular secretion, a reabsorption by a transporter, a renal metabolism) runs with 1 - f_tubular + f_tubular*f_renal_function of its healthy capacity (see Chemistry). The share f_tubular (a constant of the kidney, KI__f_tubular) is 1, the intact nephron hypothesis (Bricker 1960): the nephrons which remain in a diseased kidney work normally, so the tubular capacity falls with their number as the GFR does, as the secretion of a fraction of the GFR of the hand-written models did. The value is a choice of the library, the publication is not verified; the filtration fu*GFR follows the GFR itself.
eGFR = 0.114467156025102 l_per_min * f_renal_function
fimp_albumin_ckd = fckd_albumin * fckd_albumin_binding
fckd_plasma_protein = piecewise(1, eGFR >= 0.09, 1, eGFR >= 0.075, 1 + 0.45 * (0.075 - eGFR) / 0.03, eGFR >= 0.045, 1.45 + 0.75 * (0.045 - eGFR) / 0.0225, eGFR >= 0.0225, 2.2 + 0.3 * (0.0225 - eGFR) / 0.015, eGFR >= 0.0075, 2.5)
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
Stage limits of the GFR per 1.73 m2 (ml/min/1.73 m2): 90, 60, 30, 15 (Yoshida2016).
Anchors of the interpolation, the eGFR (ml/min/1.73 m2) of the values of mild, moderate, severe and end stage: 75, 45, 22.5, 7.5 (ModelChoice).
| factor | mild | moderate | severe | end stage | source |
|---|---|---|---|---|---|
plasma_protein |
1* | 1.45 | 2.2 | 2.5 | Alasmari2023 |
hematocrit |
1 | 1 | 1 | 1 | ModelChoice |
kidney_volume |
1 | 1 | 1 | 1 | ModelChoice |
kidney_flow |
1 | 1 | 1 | 1 | ModelChoice |
gastric_emptying_time |
1 | 1 | 1 | 1 | ModelChoice |
si_transit_time |
1 | 1 | 1 | 1 | ModelChoice |
A value marked * is a choice of the library, not a value of the source.
Share of the tubular capacity which follows the renal function (f_tubular, not per stage): 1 (ModelChoice).
Sources
Alasmari2023: Alasmari F, Alasmari MS, Muwainea HM, Alomar HA, Alasmari AF, Alsanea S, Alshamsan A, Rasool MF, Alqahtani F. Physiologically-based pharmacokinetic modeling for single and multiple dosing regimens of ceftriaxone in healthy and chronic kidney disease populations: a tool for model-informed precision dosing. Front Pharmacol 14:1200828, 2023. doi:10.3389/fphar.2023.1200828ModelChoice: Choice of the pkpdsim PBPK library, not a value of the literature; the notes of the value give the reasoning.Yoshida2016: Yoshida K, Sun B, Zhang L, Zhao P, Abernethy DR, Nolin TD, Rostami-Hodjegan A, Zineh I, Huang SM. Systematic and quantitative assessment of the effect of chronic kidney disease on CYP2D6 and CYP3A⅘. Clin Pharmacol Ther 100(1):75-87, 2016. doi:10.1002/cpt.337
The factor plasma_protein of the binding capacity acts on the binding to an unknown protein only (the binding to albumin and AGP has its profile, below). It is a factor on the binding capacity in the form of fu above, not a factor on fu: binding capacity is the mechanistic quantity and keeps fu below 1 (at fu_ref 0.5 the end stage gives fu 0.71). Its source is Table 3 of Alasmari 2023, the "correction factor for the effect of the CKD on the content of plasma proteins" of the PK-Sim plasma protein scale factor, taken from Malik 2020 (doi:10.1002/jcph.1713, paywalled, not read); its direction (the capacity falls by it) is a choice of the library. Malik 2020 parameterize CKD for drugs secreted by the organic cation system, which do not separate the proteins.
The hepatic proteins (switch CKD_hepatic, off by default) are the mean ratios of the unbound clearance of model drugs (Yoshida 2016, Tan 2018), taken as the activity of the pathway:
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
| protein | mild | moderate | severe | end stage | source |
|---|---|---|---|---|---|
CYP2D6 |
1* | 0.53 | 0.41 | 0.5 | Yoshida2016 |
CYP3A4 |
1 | 1 | 1 | 1 | Yoshida2016 |
SLCO1B1 |
0.68 | 0.56 | 0.54 | 0.45 | Tan2018 |
SLCO1B3 |
0.68 | 0.56 | 0.54 | 0.45 | Tan2018 |
A value marked * is a choice of the library, not a value of the source.
Sources
Tan2018: Tan ML, Yoshida K, Zhao P, Zhang L, Nolin TD, Piquette-Miller M, Galetin A, Huang SM. Effect of chronic kidney disease on nonrenal elimination pathways: a systematic assessment of CYP1A2, CYP2C8, CYP2C9, CYP2C19, and OATP. Clin Pharmacol Ther 103(5):854-867, 2018. doi:10.1002/cpt.807Yoshida2016: Yoshida K, Sun B, Zhang L, Zhao P, Abernethy DR, Nolin TD, Rostami-Hodjegan A, Zineh I, Huang SM. Systematic and quantitative assessment of the effect of chronic kidney disease on CYP2D6 and CYP3A⅘. Clin Pharmacol Ther 100(1):75-87, 2016. doi:10.1002/cpt.337
Binding in chronic kidney disease¶
The binding to albumin and to alpha-1-acid glycoprotein has a CKD profile per protein, a factor on the binding of each stage, piecewise linear in the eGFR as the other factors; the factor of a protein (fimp_albumin_ckd, fimp_agp_ckd) is the product of its rows, and it multiplies the factor of cirrhosis in the binding factor of fu. Its parameters are created only when a substance binds to the protein with the CKD factor, so a model without such a substance keeps its SBML.
- Albumin, concentration (
albumin, Huang 2017, BMJ Open, doi:10.1136/bmjopen-2016-014294, full text, Table 1): serum albumin of 20 healthy controls 43.2 g/L, of non-dialysis CKD 3, 4 and 5 (eGFR 48.9, 24.7, 10.9 ml/min/1.73 m2; n = 32, 38, 25) 41.1, 40.7 and 39.1 g/L, so 0.951, 0.942 and 0.905 of the controls. The row rests on this one small study (115 subjects, a study of the coagulation in a Chinese cohort); a larger cohort with healthy controls is the better source when one is read. The meta-analysis of Schmulenson 2018 (PAGE poster, not peer reviewed) gives 0.982, 0.953, 0.910 and 0.840 for mild CKD to end stage (with dialysis); Tan 2018 take 37.6 and 35.0 g/L of men and women in severe CKD against 44.9 and 41.8 g/L (0.84, from Rowland Yeo 2011, not read). - Albumin, binding function (
albumin_binding, Klammt 2012, Nephrol Dial Transplant, doi:10.1093/ndt/gfr616, abstract): the albumin-binding capacity of site II (ABiC: the plasma is diluted to an albumin concentration of 150 umol/l and incubated with the site II marker dansylsarcosine at 150 umol/l, and ABiC is the unbound marker of the reference, a pooled plasma, over the unbound marker of the sample, times 100, so a higher ABiC is more binding; the method as Klinkmann 2022, doi:10.3390/medicina58121780, describe it) of 104 CKD patients is 118, 111, 99 and 79 % in the stages ½, 3, 4 and 5, with the protein-bound uraemic toxin indoxyl sulphate rising from 3.9 to 56.1 umol/l. Relative to the stages ½ it is 0.941, 0.839 and 0.669: a capacity of the albumin molecule, measured at a fixed albumin concentration and so separate from the concentration; the two multiply. The ratio of the unbound marker is taken as the factor of the binding per molecule, which is the factor on fu of a strongly bound drug (approximate for a weakly bound one). The stages ½ are taken as healthy and site II for every albumin-bound drug, choices of the library. The other reference of the study, its pooled plasma (100 %), would give 1.18 for the stages ½ and 1.11, 0.99 and 0.79 for moderate CKD to end stage (a binding above healthy in early CKD), and at the end stage fu of a strongly bound albumin substance x1.40 instead of x1.65; the stages ½ are chosen as the patients of the study with the least loss of renal function, the pooled plasma is of unknown donors. - AGP, concentration (
agp, Schmulenson 2018, the poster read): the weighted mean fractional changes of a systematic literature search, 1.137, 1.328 and 2.062 for moderate, severe CKD and end stage renal disease (no data for mild CKD). The peer-reviewed measurements read support the rise but not the stages: non-dialysed uremic patients 1.27 against 0.79 g/L of volunteers (Vasson 1991, doi:10.1177/039139889101400207, abstract), 1.20 against 0.83 g/L (Vasson 1993, doi:10.1159/000187492, abstract). The end stage of Schmulenson 2018 (ESRD) includes dialysis patients, and its 2.062 lies above the peer-reviewed ratios read, 1.45 to 1.86 (Vasson 1993: uremic 1.20 and haemodialysed 1.54 against 0.83 g/L; Vasson 1991: non-dialysed 1.27 and haemodialysed 1.29 against 0.79 g/L, 1.61 and 1.63). No change of the binding function of AGP is applied: Kishino 1995 (doi:10.1097/00007691-199510000-00003, abstract) found fewer binding sites per AGP molecule in renal insufficiency, the dissociation constant unchanged, but the abstract gives no numbers.
The end stage values mix the populations: the albumin concentration is of non-dialysis CKD 5 (Huang 2017), the albumin binding function (Klammt 2012, stage 5) and AGP (Schmulenson 2018, ESRD) include dialysis patients, whose binding differs between and on the days of dialysis. The library's end stage is CKD off dialysis. Mild CKD is measured by none of the sources: its value lies on the line from 1 at the eGFR 90 to the moderate value at 45 (albumin concentration, AGP), and the binding function of the stages ½ is 1, choices of the library. At the end stage the profile raises fu of a strongly bound albumin substance by 1/(0.905*0.669) = 1.65 (the binding capacity 2.5) and lowers fu of a strongly bound AGP substance to 0.485 of healthy (2.5 before). The measured rise of fu of highly bound acidic drugs in severe CKD reaches 2.71 (bumetanide, Tan 2022, doi:10.1002/cpt.2642, full text), while the concentration of albumin alone predicts at most 1.20 (Tan 2022); Vanholder 1988 (doi:10.1038/ki.1988.99, abstract) measured a falling binding of phenytoin, theophylline and methotrexate and a rising binding of the basic drugs propranolol, cimetidine and clonidine in dialysed patients.
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
| factor | mild | moderate | severe | end stage | source |
|---|---|---|---|---|---|
albumin |
0.984* | 0.951 | 0.942 | 0.905 | Huang2017 |
albumin_binding |
1* | 0.941 | 0.839 | 0.669 | Klammt2012 |
agp |
1.046* | 1.137 | 1.328 | 2.062 | Schmulenson2018 |
A value marked * is a choice of the library, not a value of the source.
The rows: albumin the plasma albumin concentration (protein albumin); albumin_binding the binding function of an albumin molecule (protein albumin); agp the plasma alpha-1-acid glycoprotein concentration (protein agp). The factor of a protein is the product of its rows.
Sources
Huang2017: Huang MJ, Wei RB, Wang Y, Su TY, Di P, Li QP, Yang X, Li P, Chen XM. Blood coagulation system in patients with chronic kidney disease: a prospective observational study. BMJ Open 7(5):e014294, 2017. doi:10.1136/bmjopen-2016-014294Klammt2012: Klammt S, Wojak HJ, Mitzner A, Koball S, Rychly J, Reisinger EC, Mitzner S. Albumin-binding capacity (ABiC) is reduced in patients with chronic kidney disease along with an accumulation of protein-bound uraemic toxins. Nephrol Dial Transplant 27(6):2377-2383, 2012 (the abstract read). doi:10.1093/ndt/gfr616Schmulenson2018: Schmulenson E, Schlender JF, Frechen S, Jaehde U. A physiologically-based pharmacokinetic modeling approach to assess the impact of chronic kidney disease. PAGE 27 (2018), Abstr 8630, poster IV-61, https://www.page-meeting.org/?abstract=8630 (the poster read: https://www.page-meeting.org/pdf_assets/1160-Schmulenson_PAGE2018.pdf).
Heart failure¶
The flows of the organs are multiplied by the factors of the NYHA class and the cardiac output is their sum (Gu 2025, Table 1). The renal blood flow is not monotonic in the class (NYHA IV above NYHA III, as measured by Leithe 1984), and the GFR follows it.
Generated from data/impairment.toml by scripts/pbpk_tables.py; the notes of every number are in the data file.
| factor | I | II | III | IV | source |
|---|---|---|---|---|---|
liver_flow |
1* | 0.765 | 0.538 | 0.463 | Rasool2015 |
kidney_flow |
1* | 0.778 | 0.55 | 0.629 | Rasool2015 |
peripheral_flow |
1* | 0.57 | 0.44 | 0.28 | Gu2025 |
A value marked * is a choice of the library, not a value of the source.
Sources
Gu2025: Gu W, Shao Q, Jiang L. Predicting pharmacokinetics of drugs in patients with heart failure and optimizing their dosing strategies using a physiologically based pharmacokinetic model. Pharmaceutics 17(11):1394, 2025. doi:10.3390/pharmaceutics17111394Rasool2015: Rasool MF, Khalil F, Läer S. A physiologically based pharmacokinetic drug-disease model to predict carvedilol exposure in adult and paediatric heart failure patients by incorporating pathophysiological changes in hepatic and renal blood flows. Clin Pharmacokinet 54(9):943-962, 2015. doi:10.1007/s40262-015-0253-7
Classes in experiments¶
The experiments of a model built on the library map the classes of a study onto the severities with the presets of pkpdsim.impairment: CHILD_PUGH (colors CIRRHOSIS_COLORS) onto CP_severity, the RENAL_FUNCTION presets onto f_renal_function, HEART_FAILURE (colors HEART_FAILURE_COLORS) onto HF_severity. The base of their experiments is PBPKSimulationExperiment of pkpdsim.pbpk.experiment, which has these maps: renal_map the classes of RENAL_FUNCTION_GFR (colors RENAL_COLORS_END_STAGE), cirrhosis_map CHILD_PUGH and cardiac_map HEART_FAILURE. The classes of renal impairment keep their GFR in ml/min: a preset is relative to a healthy GFR of 101 ml/min, the renal function of a class is its GFR over the healthy GFR GFR_base of the model (ScaledRenalMap, evaluated on the first access, so importing the experiments loads no model). This differs from the eGFR of the CKD factors above, which is relative to the GFR per 1.73 m2 of the reference individual. healthy_gfr reads GFR_base of an individual (body weight, height, HF_severity, CP_severity) from the flat model, a quantity in ml/min, and renal_function(clearance, bw=..., height=...) gives the renal function of a measured clearance in ml/min as a dimensionless quantity, so that the simulated GFR of the individual of the study is the measured one; both are quantities, which go into the changes of a simulation as they are. The renal function is limited by the validity of the kidney outflow (see Standard organ): the filtered plasma water, the GFR, and the net filtered plasma flow of every filtered substance, fu*GFR*(1 - f_reabsorbed) (fu*GFR with a threshold reabsorption), must stay below the plasma flow of the kidney, Qki*(1 - HCT) (Qki*BP with erythrocytes in equilibrium). kidney_outflow(model_path, changes) of pkpdsim.pbpk.kidney_validity gives both flows of an individual, the water first (KidneyOutflow, in ml/min, with the formula of its net filtered plasma flow, GFR and the substance None for the water, read as healthy_gfr reads the GFR (individual_values), from a simulation of one minute on a model loaded once per process, cached per model file and individual; only the changes of the parameters the flows depend on make the individual, a dose does not; a model without a filtered substance is not simulated). renal_function raises a ValueError which names the GFR and the plasma flow for a renal function beyond it, renal_function_limits(bw=..., height=..., ...) gives the range of an individual, from 0 to the smaller of the renal functions at which the GFR and the net filtered plasma flow of a substance reach the plasma flow (the GFR, the tighter bound: 6.08 for the male and 6.20 for the female reference individual), and a model narrows it with renal_function_range (None by default, e.g. (0.05, 2.0) for a model whose urine is not defined without filtration). The initialization of every experiment checks every individual it simulates (simulated_individuals), each task on the model it runs, at the start of every simulation and every point of a scan: its preinit changes, of a presimulation as well, and the values of the dimensions without a time. It does not check a change during a simulation (Simulation.changes, also at its start, of an id the definition names dynamic), a dimension with a time (at), a scan over models and the draws of the fitted parameters of a run over them; the margin is large (about 6 times at renal function 1). It fails with a message which names the experiment, the simulation, the GFR, the plasma flow and the changes of the individual. All of this is of the build of the sex of the experiment (sex, see Builds per sex): the healthy GFR of a woman is GFR_base of the female build, so healthy_gfr, renal_function, renal_function_limits and renal_map of an experiment of women read the female build, each of them takes the sex of a simulation by its key with simulation= (sex_of, the sex of simulation_sexes: the group of women of a study of men, renal_function(60.0, simulation="po_women"), renal_map_of(simulation="po_women")) or a sex with sex=, and refuses a call with neither in an experiment of both sexes, and the kidney outflow of every task is checked on the build it runs. The names of pkpdsim.pbpk.experiment and pkpdsim.pbpk.kidney_validity are imported from pkpdsim.pbpk (from pkpdsim.pbpk import REFERENCE_GFR, PBPKSimulationExperiment, kidney_outflow), which exports them lazily. The 44 hand-written models keep their maps and ids unchanged: f_cirrhosis keeps its meaning there (shunt and tissue loss in one), and the library uses other ids.
Equilibration of a condition¶
The state of a model at its start is the steady state of the healthy reference individual. A condition of a simulation, an impairment, a covariate or the parameters of a PD component with a homeostasis (the extracellular fluid and the blood pressure of a fluid model in renal impairment), moves a slow state away from it, which a study measures as the basal state of its subjects before the first dose. PBPKSimulationExperiment.equilibrated(simulation, resets=...) returns the simulation (or the scan) which starts from the drug-free steady state of its condition:
# not executed
def simulations(self) -> dict[str, Simulation]:
simulation = Simulation(
time_unit="hr",
end=24,
preinit_changes={
"f_renal_function": self.renal_function(29),
"PODOSE_hctz": Q(25, "mg"),
},
)
# the urine of the fluid PD component grows without a steady state
resets = {"FLUID__Vurine": Q(1e-6, "l"), "FLUID__na_urine": Q(0, "mmole")}
return {"hctz25": self.equilibrated(simulation, resets=resets)}
- The equilibration is the presimulation of sbmlsim (
SteadyState): the model is initialized with the changes of the simulation before the initialization, the condition, and integrated until the rate of change of every state is within the tolerances,|dx/dt| <= 1e-12 + 1e-10*|x|per minute (EQUILIBRATION_TOLERANCES, tighter than the defaults of sbmlsim, whose relative tolerance of 1e-6 per minute stops a homeostasis of 7 days 5e-5 off its steady state); the simulation starts from that state, which is not in its output. The changes of a fit (the fitted parameters) and of a run over the draws of the fitted parameters apply during it, and every point of a scan equilibrates in its own condition. - The doses before the initialization (the dose states and infusion rates of the library,
PODOSE_<s>,IVDOSE_<s>,SOLDOSE_<s>,Ri_<s>) are given by a change at the start, after the equilibration; a dose at a later time stays. A dose before the initialization which a change at the start sets as well is refused, as is a dimension of a scan over a dose which the simulation does not give. - The sinks have no steady state, their amounts grow: the urine and the feces of every substance (
Aurine_<s>,Afeces_<s>), the readouts of the intestine which nothing drains, the amount absorbed and the oral dose applied (Aabs_<s>,Aapp_<s>, orGU__Aabs_<s>,GU__Aapp_<s>with the readoutFa_<s>alone; an endogenous substance which reaches the lumen at its baseline is absorbed again during the equilibration), and what a PD component accumulates (the urine of a fluid model,resets). Their rate falls within the relative tolerance as their amount grows (after about 1e10 minutes, within the longest equilibration of 1e14 minutes), and they are set back at the start: the library sinks and readouts to 0, the states ofresetsto their values (a species ofresetsnamed by its id is set as its quantity,[sid]for a concentration species, as the zeros below). A state which nothing drains (no rate reads it, no reaction consumes it,accumulating_states) and which grows during the equilibration is refused with its id unless it is a library sink or readout or inresets(growing_states, checked once per model file in a process, in the condition of the first equilibration); a model which reaches no steady state bymax_timefails with sbmlsim'sSteadyStateError. - The species of the drugs start at exactly 0 (
drug_free_zeros): the species of the substances without a baseline (the drugs and their metabolites, not an endogenous substance) which start at 0 and which no reaction feeds from a species with a start (a reactant which holds some, a product of a reversible reaction which does, a source which is no dose of the library; the direction is thereversibleflag of the reaction, so aCustomReactionwhose rate law can run backwards, an exchangek*(A - B), is written reversible,A <-> B, else a species it feeds backwards is taken for 0) are 0 in exact arithmetic during a drug-free equilibration, and the presimulation leaves a residue of the rounding in them (1.5e-29 mM of hctz in its plasma), which a pre-dose data point with a prediction of zero would count in the fold metrics. They are set to 0 at the start, with the sinks, each as its quantity:[sid]for a species whose id is its concentration (hasOnlySubstanceUnitsfalse), the id of an amount species, so that the start changes have a representation in PEtab, whose conditions set the concentration of such a species. A species which the condition or a dimension of a scan sets, what it feeds, and a species which a change of the simulation sets at its start keep their values; an endogenous substance (a baseline, creatinine) and what it feeds keep the equilibrated values. - The base
<id>_0of a delta observer (ids.delta_base,PBPKDefinition.deltas) is set to the value after the equilibration, so the delta is 0 at the start.
equilibrated has an overload for a simulation, one for a scan and one for the union Simulation | Scan, so a model which equilibrates a mapping of both calls it without a match. The equilibration lives in pkpdsim.pbpk.equilibration (DOSE_PREFIXES, EQUILIBRATION_TOLERANCES, accumulating_states, drug_free_zeros, growing_states; a model file is parsed once per process): equilibrated_simulation(simulation, model_path, resets=...), also of pkpdsim.pbpk (exported lazily), reads the ids of the doses, the sinks, the readouts and the deltas from the model file, and equilibrated calls it with the file of the loaded model of the experiment. Outside an experiment the groups of a sensitivity analysis use it (SensitivityGroup(prepare=Equilibration(resets=...)), see Scans and sensitivity) instead of a pre-run of days from a negative start.
The presimulation was chosen over a hidden pre-run of a duration from a negative start (tested in tests/pbpk/test_equilibration.py on a homeostasis of a time constant of 7 days with and without a sink): the presimulation reaches the steady state to 1e-6, a pre-run of 28 days leaves the homeostasis 1.8 % off it, and its time before the dose would be in the output. On the hctz model with the fluid PD at the renal function 0.1 the equilibration takes a second and the extracellular fluid does not drift over 60 days after it.
Limitations¶
- The physiological factors of the Child-Pugh classes are choices of the library from a review table (Alasmari 2024), not verified against Edginton & Willmann 2008.
- The anaemia of cirrhosis and CKD: the publications read state absolute hematocrits without the healthy value of their population, so the hematocrit factors are 1 until a source with its healthy reference is read.
- The kidney volume and blood flow and the gastric emptying and small intestinal transit of CKD are factor 1: the constants which reach a PBPK library only through the code of PK-Sim (GPL) are not shipped, and Malik 2020 was not read. A dropped effect is factor 1 with a note in the data file. The CKD physiology is thinner than that of PK-Sim until Malik 2020 is read.
- The binding factor of CKD of an unknown protein acts on the binding capacity, PK-Sim multiplies fu by it: the two differ for weakly bound drugs (at
fu_ref0.5 and the factor 1.45 of moderate CKD, fu 0.59 against 0.725). Its source (Malik 2020) was not read. - The CKD profile of the binding is the mean of a population: the binding of a drug in CKD varies with its binding site and the uraemic toxins which displace it (Tan 2022: 1.0 to 2.7 times the fu of highly bound acidic drugs in severe CKD), so a drug whose fu is measured in renal impairment validates the profile with it.
Binding(ckd=False)is only for a fraction unbound which is no binding measurement (a fitted renal factor) or whose binding is measured unchanged in renal impairment (apixaban); a drug with a measured change of fu in renal impairment keeps the CKD profile, and a measured change which differs from the profile is a finding of the model for its TODO, not a reason to switch the profile off. The profile of AGP rests on a meta-analysis published as a poster; the binding function of albumin is that of site II. - A Kp of a Kp method is a number of the build: a change of fu by an impairment does not recompute it. The interstitial to plasma coefficient of the full form does follow fu, so the interstitial share of a tissue rises with the fu of CKD while its Kp stays: where the share exceeds the Kp, the intracellular coefficient
K_cell_pls_<s>is floored atK_CELL_FLOOR(1e-6), the cells hold almost nothing and the tissue holds its interstitial share, more than its Kp. The build warns (KCellFloorWarningofpkpdsim.pbpk.distribution, naming the substance, the organ, the stages with their fu and share and the sex of the build) when this happens at the fu of a CKD stage of its binding profile (kp_floor_stages, the fu of the stages fromckd_unbound_fractionsofpkpdsim.pbpk.impairment); each build checks its own sex. It does not refuse: a model gives the Kp room for the fu of the end stage, or accepts the floor in an organ with its reason,ckd_floor={organ: reason}of the distribution (KporKpMethod). An accepted organ is not warned of, and the notes of itsK_cell_pls_<s>carry the reason and the stages at which the floor holds in the build, so the archive records the decision; the acceptance is per substance and organ, every other organ is still checked, and a reason must not be empty (validate). The metabolite M1 of torasemide in the kidney reaches the floor at the end stage (Kp 0.08 against the share 0.0746 at the reference fu 0.14 and 0.0815 at the fu 0.212):
# not executed
Kp(
1.0,
overrides={Organ.KIDNEY: 0.08},
ckd_floor={
Organ.KIDNEY: "the binding of M1 is not measured in renal impairment; "
"the end stage keeps the interstitial share of the kidney"
},
)
f_tubular 1, the intact nephron hypothesis, Bricker 1960, not verified, a choice of the library); a transporter whose activity falls less or more than the GFR in CKD needs another share or an activity factor of the experiment.