Claims-Based Frailty Index (Faurot / Kim)
A predicted frailty score built from administrative claims — the Faurot predicted-probability-of-dependency index and the Kim deficit-accumulation frailty index — used to adjust for frailty-related confounding that diagnosis-counting comorbidity indices (Charlson, Elixhauser) miss.
In plain language
Frailty is about how much physical reserve a person has left — whether they are robust or worn down — and it predicts bad outcomes on top of which diseases someone has. The problem is that claims data almost never record frailty directly. A claims-based frailty index gets around this by looking at the footprints frailty leaves in billing data: wheelchairs, home health visits, oxygen, hospital beds, and similar services. The Faurot version uses these to predict the chance a person is dependent on others for daily activities; the Kim version adds up the share of possible health "deficits" a person has to land them on a 0-to-1 frailty scale. Researchers use the resulting score to make treatment groups fairer to compare, because frailer patients are often steered toward or away from certain treatments. The honest caveats: it is an educated guess, not a real frailty exam; it only works where the underlying services get coded; and you must measure it before treatment starts so you do not accidentally adjust away the very effect you are studying.
A claims-based frailty index (CFI) estimates a patient's frailty from administrative data when no direct frailty assessment (gait speed, grip strength, activities-of-daily-living dependency) was ever recorded. It exists because comorbidity indices answer "how many diseases?" while frailty answers "how depleted is this person's physiologic reserve?" — distinct axes of risk that a Charlson or Elixhauser score captures poorly. Two complementary algorithms dominate. Faurot et al. (2015) fit a logistic model predicting a directly measured frailty/dependency proxy from claims indicators (durable medical equipment, home health, oxygen, wheelchair, hospital beds, mobility/ADL-related codes, demographics) and output a predicted probability of dependency that is used as a continuous confounder. Kim et al. (2018) mapped a validated deficit-accumulation frailty index (Rockwood-style, the proportion of possible deficits a patient has) onto ~93 claims variables, producing a continuous 0–1 CFI validated against the Health and Retirement Study (Kim 2019). Both are covariate-construction methods for confounding control, not study designs or outcomes; both are computed over a fixed baseline window (commonly 8–12 months) before index date.
Core conceptual distinctions
(1) Frailty vs comorbidity: frailty is a state of diminished reserve and vulnerability; comorbidity is disease count. A robust 80-year-old with controlled diabetes and hypertension can have a high Charlson score yet low frailty, while a frail elder with sparse diagnoses scores low on Charlson — so the CFI adjusts for something the comorbidity indices structurally cannot. (2) Predicted-probability vs deficit-accumulation: Faurot outputs the probability of a frailty proxy from a fitted model (the score is a model prediction, interpreted as risk of dependency); Kim outputs a deficit-accumulation index (the fraction of possible health deficits present, interpreted on the Rockwood 0–1 frailty scale). They correlate but are not interchangeable and use different coefficient sets. (3) Confounding by frailty / functional status: the CFI is the standard tool for confounding by frailty in pharmacoepidemiology — the bias where frailer patients are differentially started on, or withheld from, a treatment (a major driver of "healthy-user" and "frailty-by-indication" effects). (4) Continuous score, not a label: the CFI is meant to enter models as a continuous covariate or PS input; dichotomizing into "frail/not frail" at a cut point discards information and is discouraged for adjustment.
Pros, cons, and trade-offs
(named against the alternatives). - vs the Charlson / Elixhauser comorbidity indices: the CFI captures functional decline and care-dependency proxies (DME, home health, oxygen) those indices ignore, materially reducing residual confounding in older populations; but it is less familiar, requires a fitted coefficient set, and predicts a latent construct (frailty) rather than counting observed diagnoses. Use the CFI alongside a comorbidity index, not instead of it — they adjust for different axes and the combination outperforms either alone. - Faurot predicted-probability vs Kim deficit-accumulation: Faurot is parsimonious and directly tied to a dependency outcome; Kim is a richer ~93-variable deficit index validated against a gold-standard survey frailty index. Prefer Kim when you want a Rockwood-scaled, survey-validated continuous index; prefer Faurot for a lighter, dependency-oriented predicted probability. - vs a high-dimensional propensity score (hdPS): hdPS may empirically pick up frailty proxies on its own, but a pre-specified CFI is transparent, validated, and guaranteed to be present; hdPS is data-driven and may or may not select the relevant frailty codes. They are complementary. - vs direct frailty assessment (Fried phenotype, clinical frailty scale): direct measures are the gold standard but are absent from claims/most EHR; the CFI is the best available proxy when direct measurement was never done, at the cost of measurement error and dependence on coding of frailty-related services.
When to use
As a confounder for frailty/functional status in comparative-effectiveness and safety RWE in older or chronically ill populations; as a propensity-score input to control confounding by frailty; as an effect-modifier or subgroup variable (treatment effects often differ by frailty); and as a sensitivity-analysis adjustment to probe residual confounding beyond comorbidity. It is increasingly expected in Medicare claims-based drug and device studies where frailty plausibly drives both treatment and outcome.
When NOT to use — and when it is actively misleading or dangerous
- Adjusting for an on-pathway frailty change. If the exposure itself causes functional decline measured in the baseline window (or the window overlaps post-treatment time), the CFI becomes a mediator/collider and adjusting for it biases the effect. Ascertain the CFI strictly before treatment initiation. - Importing coefficients into a different population or coding system. The Faurot and Kim weights were fit in specific (largely US Medicare) populations and code systems; applying them to a different age band, payer, country, or ICD/HCPCS coding environment without re-validation can produce a miscalibrated score. Check calibration before trusting it. - Treating it as a frailty diagnosis for an individual. The CFI is a population-level adjustment proxy with real measurement error; it should not be read as a clinical determination that a specific patient is frail. - Dichotomizing for adjustment. Splitting the continuous score into frail/non-frail at a threshold throws away information and weakens confounding control; keep it continuous (or finely categorized) when adjusting. - Unequal or short lookback / thin service coding. The CFI depends on coded frailty-related services; an exposure group with shorter baseline enrollment or a setting that under-codes home health/DME will look artificially robust. Require an equal continuous-enrollment window and adequate service capture.
Data-source operational depth
The CFI is native to claims (especially Medicare FFS), where DME, home health, hospice, oxygen, wheelchair, and procedure/diagnosis codes that proxy dependency are reliably captured; apply the published Faurot or Kim variable list and coefficients over a fixed pre-index window with continuous enrollment. Medicare Advantage encounter data under-capture some of these services, biasing the score downward, so FFS-derived coefficients should not be applied uncritically to MA person-time. EHR can supply richer functional detail (notes, problem lists) but misses care delivered out-of-system and rarely codes ADL dependency discretely. Linked claims–EHR–survey is the validation substrate (Kim validated against the HRS survey frailty index) but inherits linkage selection. Across sources, the score is only comparable when baseline enrollment and service-coding intensity are comparable across the exposure groups.
Interpreting the output
In the worked example, a patient accumulates a linear predictor LP = 0.9 + 1.1 + 0.8 + 0.7 − 3.0 = 0.5, giving a frailty probability = 1 / (1 + e^(−0.5)) ≈ 0.62.
(1) Formal interpretation. A predicted frailty probability of 0.62 means the logistic model assigns this patient a 62% estimated probability of belonging to the frail category as defined in the validation cohort (typically the HRS or CHS frailty phenotype). The linear predictor is a weighted sum of claims-detectable frailty-associated service codes (e.g., home health visits, durable medical equipment, falls-related diagnoses), minus a model intercept. This is a proxy measure — it approximates frailty as captured by administrative service-use patterns, not a clinical frailty assessment such as the Fried phenotype or Clinical Frailty Scale. Misclassification error is inherent: patients who are clinically frail but do not generate the relevant service codes (e.g., unengaged with healthcare, Medicare Advantage encounter data gaps) will be scored lower than their true frailty warrants.
(2) Practical interpretation. A frailty probability of 0.62 is above the typical threshold for classifying a patient as frail (commonly 0.5 in logistic implementations), but the threshold and its clinical meaning depend on the specific tool (Kim, Segal, CFAI) and its validation context. Use the continuous probability as a covariate in regression or propensity-score models rather than dichotomizing, to preserve information and reduce threshold-sensitivity. Never interpret this probability as a clinical frailty diagnosis. When comparing frailty scores across treatment arms or data sources, confirm that baseline enrollment continuity and service-coding intensity are comparable — systematic differences in MA vs FFS enrollment or care-seeking patterns will bias the score distribution independently of true frailty.
Worked example
Scenario
We want a Faurot-style claims-based frailty score for one patient, expressed as a predicted probability of dependency. The model has an intercept and a coefficient for each frailty-proxy service; we add the intercept and the coefficients for the services the patient used in the baseline window to get the linear predictor, then pass it through the logistic function to get the probability the analyst uses as a continuous confounder.
Dataset
The frailty-proxy claims indicators for one patient over the baseline window, with the model coefficient each contributes to the linear predictor (intercept shown as its own row).
| predictor | present | coefficient |
|---|---|---|
| intercept | 1 | -3.0 |
| age_75_plus | 1 | 0.9 |
| wheelchair_or_dme | 1 | 1.1 |
| hospital_bed | 1 | 0.8 |
| home_oxygen | 0.5 | |
| skilled_home_health | 1 | 0.7 |
Steps
Keep the coefficient for each predictor the patient actually has (present = 1) plus the intercept; home oxygen is absent, so its 0.5 contributes nothing.
Add the contributing coefficients to form the linear predictor: 0.9 + 1.1 + 0.8 + 0.7 - 3.0 = 0.5.
Convert the linear predictor to a probability with the logistic function 1/(1 + e^(-0.5)), which gives about 0.62.
Carry that 0.62 predicted probability of dependency into the outcome model as a continuous frailty confounder (not a frail/not-frail label).
Result
Linear predictor = 0.9 + 1.1 + 0.8 + 0.7 - 3.0 = 0.5; the logistic transform 1/(1 + e^(-0.5)) gives a predicted frailty probability of about 0.62. The same coefficient set and baseline window are applied identically to every patient, and the continuous score (not a dichotomized label) enters the adjustment.
Runnable example
python implementation
Compute a Faurot-style predicted-probability claims frailty score over a fixed pre-index window. Inputs: claims : person_id, code (HCPCS/ICD string), svc_date (datetime) base : person_id, index_date (datetime), age (int) PREDICTORS maps each frailty proxy...
import numpy as np
import pandas as pd
LOOKBACK_DAYS = 365
INTERCEPT = -3.0
# predictor -> (code regex over the window, logistic coefficient). ILLUSTRATIVE; replace with published model.
PREDICTORS = {
"wheelchair_or_dme": (r"^(K000[0-9]|E114[0-9]|E124[0-9])", 1.1),
"hospital_bed": (r"^(E029[0-9]|E030[0-9])", 0.8),
"home_oxygen": (r"^(E0431|E0439|E1390)", 0.5),
"skilled_home_health": (r"^(G015[0-9]|G016[0-9]|99[0-9]{3}HH)", 0.7),
}
def frailty_score(claims: pd.DataFrame, base: pd.DataFrame) -> pd.DataFrame:
df = claims.merge(base[["person_id", "index_date"]], on="person_id", how="inner")
win = df[(df["svc_date"] < df["index_date"]) &
(df["svc_date"] >= df["index_date"] - pd.Timedelta(days=LOOKBACK_DAYS))]
present = {}
for pid, g in win.groupby("person_id"):
codes = g["code"].astype(str)
present[pid] = {p: bool(codes.str.match(rx).any()) for p, (rx, _) in PREDICTORS.items()}
rows = []
for _, r in base.iterrows():
pid = r["person_id"]
p = present.get(pid, {k: False for k in PREDICTORS})
lp = INTERCEPT + (0.9 if r["age"] >= 75 else 0.0) # age_75_plus term
lp += sum(coef for k, (_, coef) in PREDICTORS.items() if p[k])
prob = 1.0 / (1.0 + np.exp(-lp)) # logistic transform
rows.append({"person_id": pid, "frailty_lp": lp, "frailty_prob": prob})
return pd.DataFrame(rows)r implementation
R/data.table version of the Faurot-style predicted-probability frailty score. Inputs mirror Python: claims : person_id, code (character HCPCS/ICD), svc_date (Date) base : person_id, index_date (Date), age (integer) Replace the illustrative predictor regexes...
library(data.table)
LOOKBACK_DAYS <- 365L
INTERCEPT <- -3.0
predictors <- list( # name = list(regex, coefficient) -- ILLUSTRATIVE
wheelchair_or_dme = list("^(K000[0-9]|E114[0-9]|E124[0-9])", 1.1),
hospital_bed = list("^(E029[0-9]|E030[0-9])", 0.8),
home_oxygen = list("^(E0431|E0439|E1390)", 0.5),
skilled_home_health = list("^(G015[0-9]|G016[0-9])", 0.7)
)
frailty_score <- function(claims, base) {
setDT(claims); setDT(base)
df <- merge(claims, base[, .(person_id, index_date)], by = "person_id")
win <- df[svc_date < index_date & svc_date >= index_date - LOOKBACK_DAYS]
flag_one <- function(codes)
sapply(predictors, function(pc) any(grepl(pc[[1]], codes)))
fl <- win[, as.list(flag_one(as.character(code))), by = person_id]
out <- merge(base[, .(person_id, age)], fl, by = "person_id", all.x = TRUE)
for (p in names(predictors)) out[is.na(get(p)), (p) := FALSE]
out[, lp := INTERCEPT + fifelse(age >= 75L, 0.9, 0.0)]
for (p in names(predictors))
out[, lp := lp + as.integer(get(p)) * predictors[[p]][[2]]]
out[, frailty_prob := 1 / (1 + exp(-lp))]
out[, .(person_id, frailty_lp = lp, frailty_prob)]
}