Refactor DeepHealth indices around disease expression

This commit is contained in:
2026-06-26 16:25:36 +08:00
parent 9ec3921bed
commit 6df0435f65
15 changed files with 4168 additions and 4280 deletions

View File

@@ -1,13 +1,12 @@
\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath, amssymb, amsfonts}
\usepackage{bm}
\usepackage{amsmath, amssymb}
\usepackage{booktabs}
\usepackage{enumitem}
\usepackage{hyperref}
\title{DeepHealth Burden Indices: Dynamic Organ and Functional Burden}
\title{DeepHealth Disease Expression, Organ Involvement, and Frailty Risk Indices}
\author{}
\date{}
@@ -16,561 +15,147 @@
\maketitle
\begin{abstract}
DeepHealth produces a query-time hidden representation \(h(t)\) and
disease-specific future risk functions \(p_d(h,\Delta)\). These disease-level
outputs are clinically granular but difficult to interpret directly as a
patient-level health state. We therefore define Burden Indices (BI) that
aggregate historical and predicted disease burden into higher-level,
interpretable dimensions. The Organ Burden Index (OBI) maps diseases to
anatomical systems, while the Functional Burden Index (FBI) maps diseases to
function- and frailty-related burden domains, anchored by CIHI-HFRM-style
diagnosis weights when available. For formed burden, we distinguish an
observed-anchored version based on actual historical diagnoses and a
model-weighted version based on DeepHealth's historical risk trajectory. The
indices are burden measures, not direct health reserve measures, because the
current model is supervised by disease events rather than direct functional
outcomes such as ADL/IADL, gait speed, grip strength, cognition, or recovery
capacity.
DeepHealth provides a query-time hidden state \(h(t)\) and disease-specific
risk functions \(p_d(h,\Delta)\). We use these outputs to define a continuous
disease expression rate \(z_d(t)\). This quantity should be interpreted as how
much disease \(d\) is model-implied to have formed or expressed by query time
\(t\), not as true physiological damage. Based on \(z_d(t)\), we define two
downstream indices: an organ involvement index, which summarizes whether an
organ-age-inspired clinical system is involved by any related disease process,
and a DeepHealth-HFRS frailty risk index, which is the original UK-HFRS weighted
sum with binary disease occurrence replaced by continuous disease expression.
\end{abstract}
\section{Motivation}
\section{Disease Expression Rate}
At query time \(t\), DeepHealth produces a hidden state \(h(t)\) and
disease-level risk predictions
For a patient queried at time \(t\), let the historical readout times be
\[
p_d(h(t), \tau), \qquad d = 1,\ldots,D,
t_0 < t_1 < \cdots < t_n \le t,\qquad t_{n+1}=t.
\]
where \(p_d(h(t),\tau)\) is the predicted probability of disease \(d\) occurring
within future horizon \(\tau\). These outputs are useful for disease-specific
risk prediction, but they do not directly answer patient-level questions such as
where disease burden is concentrated or how much functional vulnerability is
implied by the disease profile.
We introduce Burden Indices to summarize disease-level predictions into
interpretable state representations:
For each interval \([t_i,t_{i+1}]\), DeepHealth produces a hidden state
\(h_i=h(t_i)\) and an interval risk
\[
\text{disease-level risk}
\quad \longrightarrow \quad
\text{system-level burden}.
q_{d,i}(t)=p_d(h_i,t_{i+1}-t_i).
\]
The indices combine two components:
\begin{enumerate}[leftmargin=*]
\item formed burden: disease burden already accumulated by query time \(t\);
\item future expected burden: disease burden expected to newly form within
horizon \(\tau\).
\end{enumerate}
At the current stage, these quantities should be called burden indices rather
than health reserve or health state scores. The current model is trained and
validated primarily on ICD disease events. Its directly verifiable semantics are
disease occurrence and disease risk. Without direct functional labels or a
calibrated healthy reference state, quantities such as \(100-\text{burden}\)
cannot be rigorously interpreted as remaining health reserve.
\section{Two Burden Spaces}
We define two complementary burden spaces.
\subsection{Organ Burden Index}
The Organ Burden Index (OBI) maps disease burden to anatomical systems. It
answers:
The model-implied disease expression rate is defined by noisy-or accumulation:
\[
\text{Which organs or anatomical systems carry the largest pathological burden?}
\]
Typical dimensions may include heart/vascular, brain/neurological, kidney,
lung, liver/digestive, metabolic/endocrine, musculoskeletal, hematologic, and
malignancy-related systems. The mapping matrix is denoted
\[
A^{\mathrm{organ}} \in \mathbb{R}_{\ge 0}^{K_o \times D},
\]
where \(A^{\mathrm{organ}}_{k,d}\) is the contribution weight from disease
\(d\) to organ dimension \(k\).
\subsection{Functional Burden Index}
The Functional Burden Index (FBI) maps disease burden to function- and
frailty-related diagnostic burden domains. It answers:
\[
\text{How much functional vulnerability is implied by the disease burden?}
\]
Candidate dimensions include mobility burden, cognition burden, mood burden,
sensory burden, nutrition burden, infection or immune vulnerability burden,
functional dependence burden, and comorbidity burden.
When CIHI-HFRM or another validated hospital frailty risk measure code list is
available, it should be used as the primary anchor for FBI. The mapping matrix
is denoted
\[
A^{\mathrm{func}} \in \mathbb{R}_{\ge 0}^{K_f \times D},
\]
where \(A^{\mathrm{func}}_{k,d}\) is the contribution weight from disease \(d\)
to functional burden dimension \(k\).
OBI and FBI are not redundant. OBI describes where pathology is concentrated,
whereas FBI describes how disease burden may translate into functional
vulnerability. For example, stroke contributes primarily to brain/vascular
burden in OBI, but may contribute to mobility, cognition, sensory, and
functional dependence burden in FBI.
\section{Model Outputs and Disease Risk Function}
For each hidden state \(h\), DeepHealth defines a disease-specific future risk
function
\[
p_d(h,\Delta),
\]
where \(\Delta \ge 0\) is the time horizon. The risk function is produced by the
all-future model. Let
\[
\eta_d(h) = \operatorname{risk\_head}(h)_d,
\qquad
\lambda_d(h) = \operatorname{softplus}(\eta_d(h)).
\]
For the exponential all-future model,
\[
p_d(h,\Delta)
=
1-\exp[-\lambda_d(h)\Delta].
\]
For the Weibull all-future model, with
\[
\rho_d(h)=\operatorname{softplus}(\operatorname{rho\_head}(h)_d),
\]
the risk function is
\[
p_d(h,\Delta)
=
1-\exp[-\lambda_d(h)\Delta^{\rho_d(h)}].
\]
The burden formulation below only assumes access to \(p_d(h,\Delta)\); the
exponential and Weibull cases are specializations.
\section{Formed Burden}
For a patient queried at time \(t\), let the available historical readout times
be
\[
t_0 < t_1 < \cdots < t_n \le t.
\]
For notational convenience, define
\[
t_{n+1}=t.
\]
The historical trajectory is partitioned into adjacent, non-overlapping
intervals
\[
[t_i,t_{i+1}], \qquad i=0,\ldots,n.
\]
Let
\[
h_i = h(t_i), \qquad \Delta_i = t_{i+1}-t_i.
\]
The interval-level model-implied probability for disease \(d\) is
\[
q_{d,i}(t) = p_d(h_i,\Delta_i).
\]
\subsection{Model-Weighted Formed Burden}
The model-weighted formed burden uses DeepHealth's own historical risk
trajectory to quantify how strongly disease \(d\) is represented as formed
burden by time \(t\). It is defined by noisy-or accumulation over historical
intervals:
\[
z^{\mathrm{model}}_d(t)
z_d(t)
=
1-\prod_{i=0}^{n}\left[1-q_{d,i}(t)\right].
\]
Equivalently,
Informally, \(z_d(t)\) is the degree to which disease \(d\) is expressed in the
patient by time \(t\). Unlike a raw diagnosis indicator, it is continuous and
can reflect heterogeneity within the same ICD label.
\section{Organ Involvement Index}
The organ index is not a frailty score, health reserve score, or organ age. It
is an organ involvement index. Let \(\mathcal{D}_k\) be the set of diseases
assigned to organ/system \(k\). Define disease expression intensity as
\[
z^{\mathrm{model}}_d(t)
\Lambda_d(t)=-\log\left[1-z_d(t)\right].
\]
The equal-weight organ involvement index is
\[
O_k(t)
=
1-\prod_{i=0}^{n}
\left[
1-p_d\!\left(h(t_i),t_{i+1}-t_i\right)
\right],
\qquad t_{n+1}=t.
\]
This definition uses each segment of the historical trajectory exactly once and
therefore avoids repeatedly counting overlapping predictions from multiple
historical states to the same query time.
\subsection{Observed-Anchored Formed Burden}
The observed-anchored formed burden treats historical diagnoses as factual
evidence. Define the observed historical disease indicator
\[
o_d(t)
=
\mathbb{I}\left\{
\exists j:\; \mathrm{event}_j=d,\; \mathrm{time}_j\le t
\right\}.
\]
The observed-anchored version is
\[
z^{\mathrm{obs}}_d(t)=o_d(t).
\]
This version is closest to diagnosis-code burden measures such as HFRM: once a
disease code has appeared before query time \(t\), the corresponding disease
burden component is considered present. It is maximally auditable and aligned
with code-based burden definitions, but it does not distinguish severity,
recency, or residual impact among patients with the same historical diagnosis.
\subsection{Choice of Formed Burden}
The two definitions represent different semantics:
\[
z^{\mathrm{obs}}_d(t)
=
\text{observed diagnostic burden},
\]
\[
z^{\mathrm{model}}_d(t)
=
\text{model-weighted state burden}.
\]
The observed-anchored version should be used when the goal is to reproduce or
extend diagnosis-code burden measures. The model-weighted version should be used
when the goal is to let DeepHealth assign a continuous burden strength based on
the historical hidden-state trajectory. In the formulas below, \(z_d(t)\)
denotes either \(z^{\mathrm{obs}}_d(t)\) or \(z^{\mathrm{model}}_d(t)\), depending
on the selected BI variant.
\subsection{Observed-Anchored versus Model-Weighted Burden}
The observed-anchored and model-weighted definitions share the same purpose:
both quantify disease burden already formed by query time \(t\), before adding
future expected burden. They also use the same downstream BI equations; the only
difference is the definition of \(z_d(t)\).
Their key difference is the evidence treated as primary. The observed-anchored
version treats diagnosis occurrence as the primary unit of evidence:
\[
z^{\mathrm{obs}}_d(t)=1
\quad\text{once disease } d \text{ has been observed before } t.
\]
This is appropriate when the burden index is intended to remain close to
diagnosis-code measures such as HFRM. It is transparent and robust to model
miscalibration, but it treats all historical occurrences of the same disease as
equally formed burden.
The model-weighted version treats the DeepHealth risk trajectory as the primary
unit of evidence:
\[
z^{\mathrm{model}}_d(t)
=
1-\prod_i
\left[
1-p_d\!\left(h(t_i),t_{i+1}-t_i\right)
\right].
\]
This version can assign different burden strengths to the same observed disease
depending on timing, surrounding history, extra-info context, and the hidden
state trajectory. It may better reflect state-dependent burden intensity, but it
can also downweight a disease that was truly observed if the model assigns low
historical probability.
Thus the two variants answer related but non-identical questions:
\[
z^{\mathrm{obs}}_d(t):
\text{Has disease } d \text{ been recorded as part of the patient's history?}
\]
\[
z^{\mathrm{model}}_d(t):
\text{How strongly does the model-implied trajectory support burden from }
d \text{ by time } t?
\]
For this reason, both should be considered useful sensitivity variants. The
observed-anchored version is preferable for auditability and alignment with
existing code-based indices. The model-weighted version is preferable when the
goal is to use DeepHealth as a continuous state model and allow the learned
trajectory to modulate burden strength.
\subsection{Cumulative Intensity Form}
Define the interval cumulative intensity
\[
\ell_d(h_i,\Delta_i)
=
-\log\left[1-p_d(h_i,\Delta_i)\right],
\]
and the accumulated historical intensity
\[
\Lambda^{\mathrm{model}}_d(t)=\sum_{i=0}^{n}\ell_d(h_i,\Delta_i).
\]
Then
\[
z^{\mathrm{model}}_d(t)=1-\exp[-\Lambda^{\mathrm{model}}_d(t)].
\]
For the exponential model,
\[
\ell_d(h_i,\Delta_i)=\lambda_d(h_i)\Delta_i,
\]
so
\[
z^{\mathrm{model}}_d(t)
=
1-\exp\left[
-\sum_{i=0}^{n}
\lambda_d\!\left(h(t_i)\right)(t_{i+1}-t_i)
\right].
\]
For the Weibull model,
\[
\ell_d(h_i,\Delta_i)
=
\lambda_d(h_i)\Delta_i^{\rho_d(h_i)},
\]
so
\[
z^{\mathrm{model}}_d(t)
=
1-\exp\left[
-\sum_{i=0}^{n}
\lambda_d\!\left(h(t_i)\right)
(t_{i+1}-t_i)^{\rho_d(h(t_i))}
\right].
\]
\section{Future Expected Burden}
The selected formed burden \(z_d(t)\) represents disease burden already formed
by query time \(t\). It can be either the observed-anchored burden
\(z^{\mathrm{obs}}_d(t)\) or the model-weighted burden
\(z^{\mathrm{model}}_d(t)\). The current future risk from query time \(t\) to
horizon \(\tau\) is
\[
p_d(h(t),\tau).
\]
The future expected newly formed burden for disease \(d\) is defined as
\[
f_d(t,\tau)
=
\left[1-z_d(t)\right]p_d(h(t),\tau).
\]
This term counts only the portion of disease burden that has not already formed
by time \(t\). The total dynamic disease burden contribution is
\[
b_d(t,\tau)
=
z_d(t)+f_d(t,\tau).
1-\exp\left(
-\sum_{d\in\mathcal{D}_k}\Lambda_d(t)
\right).
\]
Equivalently,
\[
b_d(t,\tau)
O_k(t)
=
1-
\left[1-z_d(t)\right]
\left[1-p_d(h(t),\tau)\right].
\prod_{d\in\mathcal{D}_k}
\left[1-z_d(t)\right].
\]
Thus \(b_d(t,\tau)\) can be interpreted as the probability that disease burden
for \(d\) has formed by time \(t\) or will newly form within the future horizon
\(\tau\).
\section{Burden Index Definition}
Let \(A \in \mathbb{R}_{\ge 0}^{K \times D}\) be a disease-to-burden mapping
matrix. The historical, future, and total burden indices for dimension \(k\)
are
Thus \(O_k(t)\in[0,1]\) is the probability-like degree to which organ/system
\(k\) is involved by at least one related disease process. In the current
version all diseases assigned to the same organ are equally weighted; this is a
first-stage structural definition. Future versions can introduce
organ-specific disease weights \(\alpha_{k,d}\):
\[
\operatorname{BI}^{\mathrm{hist}}_k(t)
O_k(t)
=
\sum_{d=1}^{D} A_{k,d} z_d(t),
\]
\[
\operatorname{BI}^{\mathrm{future}}_k(t,\tau)
=
\sum_{d=1}^{D}
A_{k,d}
\left[1-z_d(t)\right]p_d(h(t),\tau),
\]
and
\[
\operatorname{BI}^{\mathrm{total}}_k(t,\tau)
=
\operatorname{BI}^{\mathrm{hist}}_k(t)
+
\operatorname{BI}^{\mathrm{future}}_k(t,\tau).
\]
Equivalently,
\[
\operatorname{BI}^{\mathrm{total}}_k(t,\tau)
=
\sum_{d=1}^{D}
A_{k,d}
\left\{
1-
\left[1-z_d(t)\right]
\left[1-p_d(h(t),\tau)\right]
\right\}.
1-\exp\left(
-\sum_{d\in\mathcal{D}_k}\alpha_{k,d}\Lambda_d(t)
\right).
\]
For OBI, \(A=A^{\mathrm{organ}}\). For FBI, \(A=A^{\mathrm{func}}\).
\section{Organ List}
\section{Constructing the Mapping Matrices}
\subsection{Organ Mapping Matrix}
The organ mapping matrix should be constructed from code taxonomy or validated
clinical grouping systems rather than manually assigned arbitrary weights. In
the current ICD-token setting, the first version can use ICD chapters or
predefined ICD ranges to construct a sparse disease-to-organ mask
\[
M^{\mathrm{organ}}_{k,d}\in\{0,1\}.
\]
Examples include:
The organ/system categories are inspired by organ-age studies, especially
organ-specific plasma proteomic aging models, and are adapted to ICD disease
labels. The current list is:
\begin{center}
\begin{tabular}{ll}
\toprule
Dimension & Example ICD groups \\
ID & Label \\
\midrule
Heart/vascular & I00--I99, optionally split into cardiac and vascular groups \\
Brain/neurological & G00--G99, F00--F09, I60--I69 \\
Kidney/urogenital & N00--N39, especially N17--N19 \\
Lung/respiratory & J00--J99 \\
Metabolic/endocrine & E00--E90 \\
Liver/digestive & K00--K93, especially K70--K77 \\
Musculoskeletal & M00--M99 \\
brain\_neurologic & Brain and neurologic system \\
heart & Heart \\
artery\_vascular & Artery and vascular system \\
immune & Immune and infection-related system \\
intestine\_digestive & Intestine and digestive system \\
kidney & Kidney and urinary system \\
liver & Liver \\
lung & Lung and respiratory system \\
muscle\_musculoskeletal & Muscle and musculoskeletal system \\
pancreas\_endocrine & Pancreas and endocrine system \\
adipose\_metabolic & Adipose and metabolic system \\
female\_reproductive & Female reproductive system \\
male\_reproductive & Male reproductive system \\
neoplasm & Neoplasm \\
\bottomrule
\end{tabular}
\end{center}
The neoplasm category is retained as a disease-system category rather than
forced into a single anatomical organ. Sex-specific reproductive diseases are
separated into female and male reproductive systems.
The simplest organ weights are
\section{DeepHealth-HFRS Frailty Risk Index}
The original UK-HFRS is a weighted sum over binary disease occurrence:
\[
A^{\mathrm{organ}}_{k,d}=M^{\mathrm{organ}}_{k,d}.
\]
If longitudinal organ endpoint labels are available, the weights can be learned
under the mask:
\[
A^{\mathrm{organ}}_{k,d}\ge 0,
\operatorname{HFRS}^{\mathrm{obs}}(t)
=
\sum_{d\in\mathcal{D}_{\mathrm{HFRS}}}
w^{\mathrm{HFRS}}_d\,o_d(t),
\qquad
A^{\mathrm{organ}}_{k,d}=0
\quad\text{if}\quad
M^{\mathrm{organ}}_{k,d}=0.
o_d(t)\in\{0,1\}.
\]
This keeps the projection clinically interpretable while allowing data-driven
calibration.
\subsection{Functional Mapping Matrix}
The functional mapping matrix should be anchored by a validated frailty-related
diagnosis code set whenever possible. CIHI-HFRM or a closely related Hospital
Frailty Risk Measure provides a suitable starting point because it defines
frailty burden from diagnosis codes and associated weights.
Let \(w^{\mathrm{HFRM}}_d\ge 0\) be the HFRM weight mapped to DeepHealth disease
token \(d\). If the HFRM code list is more granular than the DeepHealth ICD
token vocabulary, weights should be mapped by code prefix. For three-character
ICD tokens, a conservative default is
DeepHealth-HFRS keeps the published UK-HFRS weights and replaces the binary
disease state with the continuous DeepHealth disease expression rate:
\[
w^{\mathrm{HFRM}}_d
\operatorname{HFRS}^{\mathrm{DH}}(t)
=
\max_{c:\, c \text{ maps to token } d}
w^{\mathrm{HFRM}}_c.
\]
For total functional burden, the one-dimensional mapping is
\[
A^{\mathrm{func,total}}_{1,d}
=
w^{\mathrm{HFRM}}_d.
\]
For domain-specific functional burden, define a grouping mask
\[
G_{k,d}\in\{0,1\},
\]
where \(G_{k,d}=1\) means HFRM-associated disease token \(d\) belongs to
functional burden domain \(k\). Then
\[
A^{\mathrm{func}}_{k,d}
=
G_{k,d} w^{\mathrm{HFRM}}_d.
\]
Candidate functional domains include mobility, cognition, mood, sensory,
nutrition, infection or immune vulnerability, functional dependence, and
comorbidity burden. These domain labels should be treated as diagnostic-burden
proxies unless direct functional measurements are available for calibration.
\section{Normalization and Reporting}
The raw burden index is an additive weighted burden:
\[
\operatorname{BI}_k(t,\tau)
=
\sum_d A_{k,d} b_d(t,\tau).
\]
For interpretability, the system should report the decomposition
\[
\operatorname{BI}^{\mathrm{hist}}_k(t),
\sum_{d\in\mathcal{D}_{\mathrm{HFRS}}}
w^{\mathrm{HFRS}}_d\,z_d(t),
\qquad
\operatorname{BI}^{\mathrm{future}}_k(t,\tau),
\qquad
\operatorname{BI}^{\mathrm{total}}_k(t,\tau).
z_d(t)\in[0,1].
\]
This is a natural continuous extension of the original HFRS, so it can still be
called a frailty risk index. The semantic change is not the HFRS weight system;
the change is the disease state variable.
Optionally, a normalized burden can be reported as
\section{Current Implementation}
The current code computes historical current-state indices only. No future
horizon is used. For each landmark age \(t\), it outputs:
\begin{itemize}[leftmargin=*]
\item \(z_d(t)\) internally as model-implied disease expression;
\item \(O_k(t)\) as equal-weight organ involvement;
\item \(\operatorname{HFRS}^{\mathrm{DH}}(t)\) as DeepHealth-HFRS frailty
risk.
\end{itemize}
The output table uses the columns
\[
\widetilde{\operatorname{BI}}_k(t,\tau)
=
\frac{
\sum_d A_{k,d} b_d(t,\tau)
}{
\sum_d A_{k,d} + \epsilon
},
\texttt{index\_type},\quad
\texttt{index\_id},\quad
\texttt{index\_label},\quad
\texttt{index\_value}.
\]
where \(\epsilon>0\) prevents division by zero. This normalized score lies on a
dimension-comparable scale when \(b_d(t,\tau)\in[0,1]\) and \(A_{k,d}\ge 0\).
For cohort-level interpretation, an additional percentile score can be computed
within age- and sex-specific reference strata:
\[
\operatorname{PercentileBI}_k(t,\tau)
=
\operatorname{rank}_{\mathrm{age,sex}}
\left(
\operatorname{BI}^{\mathrm{total}}_k(t,\tau)
\right).
\]
This percentile is a relative burden ranking, not a health reserve percentage.
\section{Validation}
OBI and FBI should be validated against different endpoints.
For OBI, validation endpoints should be organ-system-specific future events, for
example cardiac events for heart/vascular burden, stroke or dementia for
brain/neurological burden, CKD progression for kidney burden, and respiratory
events for lung burden.
For FBI, validation should use CIHI-HFRM-style frailty burden, frailty-related
diagnosis endpoints, hospitalization, mortality, care dependence proxies, or
direct functional outcomes if available. If direct functional labels such as
ADL/IADL, gait speed, grip strength, cognitive tests, or recovery measures are
not available, FBI should be reported as a diagnosis-risk-based functional
burden proxy rather than a direct functional reserve measure.
\section{Summary}
DeepHealth Burden Indices transform disease-level risk predictions into
interpretable burden representations. Formed burden can be defined either as
observed-anchored burden \(z^{\mathrm{obs}}_d(t)\), which follows factual
diagnosis history, or as model-weighted burden \(z^{\mathrm{model}}_d(t)\),
which accumulates DeepHealth's predicted interval risks along the hidden-state
trajectory. The future expected burden is the residual future risk among disease
burden not already formed. OBI uses anatomical disease groupings to summarize
where pathological burden is concentrated. FBI uses CIHI-HFRM-style
frailty-related diagnosis weights to summarize functional vulnerability burden.
Together, they provide two complementary views of disease burden while allowing
the formed-burden semantics to be chosen explicitly.
\end{document}