← All posts

Propensity Score vs Prognosis Summary Score: Two Similar-Looking Tools That Answer Different Questions

Clinical Epidemiology ResearchUniqcret doctor knowledgesData Analytics or StatisticsMethodology and Research Design
Propensity Score vs Prognosis Summary Score: Two Similar-Looking Tools That Answer Different Questions
On this page

The Thai tailor-made Article is better

Abstract

Two tools in observational research look almost identical — each squeezes many variables into a single number per patient, and each can drive matching — yet they answer different questions. The propensity score asks how likely a person was to receive treatment; it is fitted on everyone with a logistic model of treatment on covariates. The prognosis summary score asks what a person's outcome would be if untreated; it is fitted on controls only, then applied to all. Using 400 fully simulated patients with confounding by indication built in — age, sex and severity all shape who is treated, but the outcome depends on age and severity while sex has no effect — we build both scores and match on each. The payoff is one number: sex. Matching on the propensity score forces sex into balance (SMD 0.12 to about −0.06); matching on the prognosis score leaves it near 0.13, because sex never touches the outcome.


Visual summary — propensity score versus prognosis summary score
Visual summary · ภาพสรุป

Two similar-looking tools that answer completely different questions

In observational research we say, almost reflexively, that we want to "make the groups comparable." But a sharper question comes first: comparable in what sense?

Are we trying to make two groups alike in terms of who would receive treatment? Or alike in terms of what their outcome should look like at baseline? Those are not the same goal, and they lead to two powerful but fundamentally different tools:

At first glance they look like twins. Both reduce many variables to a single number per person, and both can be used for matching, weighting, or adjustment. But underneath they answer completely different clinical and methodological questions. This article goes all the way from that idea to a live terminal where you can watch the two scores behave differently on the very same patients.


The core difference, in one line

That is it. Everything else — how you fit each score, who you fit it on, and what "balance" ends up meaning — follows from this one difference. To keep it concrete, we will build both scores on a single small cohort and then match on each in turn.


A cohort to think with: 400 simulated patients

Rather than argue in the abstract, let's create a world we control completely. The data below are entirely synthetic — 400 made-up patients created by a few lines of R. There are no real patients here and nothing disease-specific; everyone is simply labelled Case (treated) or Control (untreated).

We deliberately build in the exact situation this article is about — confounding by indication. In this toy world, doctors treat older and sicker patients more often, so the Cases start out sicker than the Controls. Age, sex and severity all push a person toward being a Case. But the outcome (an adverse event) is driven only by prognosis — age and severity — plus a modest treatment effect. Sex has no effect on the outcome at all. Hold on to that one design choice: it is what makes the two scores tell different stories later.

set.seed(2026)
n   <- 400
age <- rnorm(n, mean = 60, sd = 10)          # baseline age
sex <- rbinom(n, 1, 0.45)                     # 1 = male, 0 = female
sev <- pmax(0, rnorm(n, mean = 5, sd = 2))    # severity score

# Treatment (Case) assignment: older + sicker + male -> more likely a Case
lp_treat <- -4.5 + 0.04*age + 0.40*sex + 0.30*sev
treat    <- rbinom(n, 1, plogis(lp_treat))    # 1 = Case, 0 = Control

# Outcome: driven by prognosis (age, sev) + a modest treatment effect.
# NOTE: sex is deliberately NOT in the outcome model.
lp_y <- -5.5 + 0.05*age + 0.40*sev - 0.50*treat
y    <- rbinom(n, 1, plogis(lp_y))            # 1 = adverse event

df  <- data.frame(age, sex, sev, treat, y)   # the working cohort

In this particular run the cohort comes out roughly two-thirds Control and one-third Case, with the Cases carrying more adverse events — exactly the head start in sickness we asked for. Now we summarise each patient with a single number, in two different ways.


Score 1 — the propensity score: "how likely were they to be treated?"

The propensity score is the probability that a person receives treatment (or exposure), given their observed characteristics. For each individual it answers: "Given their age, sex, severity and clinical profile, how likely were they to be treated?"

You build it on all subjects — treated and untreated together — because you are trying to learn how treatment decisions were actually made in this dataset. In code that is a single logistic regression, and each patient's PS is simply their fitted probability of being a Case, a number between 0 and 1:

# Propensity Score -- Pr(Case), fit on ALL subjects
ps_model <- glm(treat ~ age + sex + sev, family = binomial(), data = df)
df$ps    <- predict(ps_model, type = "response")

Matching then pairs people with similar probabilities of receiving treatment. For example:

After matching you can say: "These two people had about the same chance of being treated, given their characteristics." Any remaining difference in outcome is then less likely to be explained by disease severity, comorbidity, or selection — which is exactly what you want when the danger is confounding by indication (sicker patients get treated) or confounding by contraindication (frail patients avoid treatment).

The propensity score balances treatment assignment, not outcome. It answers: "Are these two people equally likely to receive treatment?"

Notice what it does not do: the PS has no idea what a normal outcome should look like — it never sees your outcome variable at all. That is precisely the gap the second score fills.


Score 2 — the prognosis summary score: "how sick would they be anyway?"

Now shift the focus from treatment to outcome. The prognosis summary score answers a very intuitive clinical question: "If this person were healthy — a control — but kept the same age, sex and severity, what should their outcome be?"

Here is the critical difference in how it is built. You fit the model on controls only — the untreated, disease-free individuals — so that it learns normal physiology: the ordinary relationship between covariates and outcome in people without the disease. If you let cases into this model, the disease effect would leak in and corrupt what "normal" means. You then apply that control-trained model to everyone.

For example, in real CMR (cardiac MRI) research the outcome might be left-ventricular (LV) mass. There you would fit the model LV mass ~ age + sex + BSA + heart rate on controls only, then use it to predict a "healthy" LV mass for every patient — the concrete answer to "what should this person's LV mass be if they were disease-free?"

But in our simulated cohort here the outcome is not LV mass — it is a binary adverse event, and the identical control-only logic is coded as:

# Prognosis Summary Score -- baseline outcome risk,
# fit on CONTROLS ONLY, then predicted for EVERYONE
pss_model <- glm(y ~ age + sex + sev, family = binomial(),
                 data = df[df$treat == 0, ])
df$pss    <- predict(pss_model, newdata = df, type = "response")

Fit on controls, predicted for all — that one clause, data = df[df$treat == 0, ], is the whole idea. The result:

Each person now carries a predicted value — "this is what their outcome should be if they were healthy." That predicted value is the PSS. And crucially, you match on the expected value, not the observed one. Returning to the LV-mass illustration — grams are easier to picture than a probability — that distinction looks like this:

Person Group Observed LV mass Expected (PSS)
A Case 150 110
B Control 108 108

A and B match because their expected values are close (110 vs 108), not because their observed values are. Take a 60-year-old man with an observed LV mass of 150 g in the case group; the control-only model might predict that, were he healthy, his LV mass "should" be about 110 g. His PSS is 110, not 150 — so we look for a control whose PSS sits near 110, then ask how far disease has pushed him from where he ought to be. That is why the PSS matches on predicted healthy Y, never on the observed Y (which would risk matching disease effect to disease effect).

After matching this way you can say: "These two people should have had the same outcome if they were healthy," so any difference you then observe is more likely to reflect disease effect.

The PSS balances baseline physiology, not treatment. It answers: "Should these two people have the same outcome under normal conditions?"


Same variable, two roles: what each score does with sex

We have now built two one-number summaries on the identical 400 patients. The clearest way to see that they are two different animals is to look at what each model does with a single variable — sex (coefficients from this simulated run, set.seed(2026)):

Score How it is fit (R) Coefficient for sex
Propensity Score glm(treat ~ age + sex + sev), all subjects ≈ 0.24
Prognosis Summary Score glm(y ~ age + sex + sev), controls only ≈ 0.01

Sex carries real weight in the propensity model — it helped decide who got treated. In the prognosis model its coefficient is essentially zero, because we built the data so that sex does nothing to the outcome. Same variable, two scores, two completely different roles. Keep that in mind: it is about to explain everything the matching does.


Before we match: how far apart are the groups?

Before touching either score, how imbalanced is the raw cohort? The standard yardstick is the standardized mean difference (SMD) — the gap between Cases and Controls in pooled-SD units, where anything above about 0.1 is the usual red flag. Here is the starting position:

Covariate SMD (before matching)
age 0.475
severity 0.419
sex 0.122

All three covariates are off, because all three shaped who became a Case. Age and severity are badly imbalanced — the Cases really are older and sicker — and sex is mildly off too. This is the confounding we must remove before any outcome comparison is fair. The question is which score to remove it with.


Run it yourself

Here is the whole analysis as a live terminal, so you can watch it happen before we read off the results. It replays this exact R session one line at a time: type the highlighted line (or press Enter to autofill and run) and the Stage panel on the right shows the table, value or plot each step produces — including two overlap plots where the Case and Control curves slide together as the matching does its work. Every value was computed in R beforehand; nothing runs in your browser.

Propensity score (PS) และ prognosis summary score (PSS) ต่างก็เป็นคะแนนตัวเลขเดียวที่สรุปตัวแปรร่วมหลายตัว แต่ตอบคนละคำถาม จึงจัดสมดุลคนละอย่าง PS จำลอง ว่าใครได้รับการรักษา ส่วน PSS จำลอง ว่าผู้ป่วยจะป่วยหนักแค่ไหนหากไม่ได้รักษา เทอร์มินัลนี้รันการวิเคราะห์จริงทีละบรรทัดบนข้อมูล จำลองทั้งหมด (ไม่มีผู้ป่วยจริง) ที่อายุ เพศ และความรุนแรงล้วนผลักให้เป็น Case แต่มีเพียงอายุกับความรุนแรงที่ขับผลลัพธ์ ส่วนเพศตั้งใจไม่ให้มีผล ลองดูเส้นเรื่อง: การจับคู่ด้วย PSS จัดสมดุลตัวขับพยากรณ์โรค (อายุ ความรุนแรง) แต่ทิ้งเพศไว้เดิม ขณะที่จับคู่ด้วย PS จัดสมดุลเพศด้วย คุณเป็นคนลงมือเอง — พิมพ์ตามบรรทัดที่ไฮไลต์ (หรือกด Enter เพื่อเติมและรัน) กด Tab เพื่อรับคำที่ระบบเดาให้ แล้วแผง Stage ด้านขวาจะแสดงตาราง ค่า หรือกราฟที่แต่ละขั้นสร้างขึ้น ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณด้วย R ไว้ก่อนแล้ว

A propensity score (PS) and a prognosis summary score (PSS) are both single-number summaries of many covariates, but they answer different questions — so they balance different things. PS models who got treated; PSS models how sick a patient would be anyway. This terminal runs the real analysis one line at a time on a fully simulated cohort (no real patients) where age, sex and severity all push toward being a Case, but only age and severity drive the outcome — sex deliberately does not. Watch the arc: matching on PSS balances the prognosis drivers (age, severity) while leaving sex untouched, whereas the same match on PS balances sex too. You drive it — type the highlighted line (or press Enter to autofill and run), press Tab to accept the ghost, and the Stage on the right shows the table, value, or plot each step produces. Nothing runs in your browser; every value and plot was computed in R beforehand.


Matching each Case to its closest Control

To compare Cases and Controls fairly we match each Case to its nearest Control — the Control whose score is closest — one to one, without reusing a Control, and keeping only pairs that fall within a small caliper (here 0.2 SD on the logit scale). Taking the closest-scoring comparison is exactly what nearest-neighbour matching means; the caliper simply refuses a pair when even the closest available Control is still too far away, which quietly drops the most extreme Cases that have no honest counterpart.

logit   <- function(p) log(p / (1 - p))
lp_pss  <- logit(df$pss)                 # match on the score's linear predictor
caliper <- 0.2 * sd(lp_pss)

# Walk each Case, take the closest still-unused Control within the caliper.
for (i in cases) {
  d <- abs(lp_pss[i] - lp_pss[ctrls]); d[used] <- Inf
  j <- which.min(d)
  if (is.finite(d[j]) && d[j] <= caliper) {
    pairs[[length(pairs) + 1]] <- c(i, ctrls[j]); used[j] <- TRUE
  }
}

Did it work? Re-checking the balance

Never trust a match — check it. We recompute the SMD on the matched set and stack it under the "before" row:

Covariate SMD before SMD after PSS matching
age 0.475 0.095
severity 0.419 -0.040
sex 0.122 0.132

Matching on the prognosis score sharply balances the prognosis drivers: age and severity drop from clearly imbalanced to comfortably under the line. Sex barely moves — it sits at about 0.12 before and after. That is not a failure of the match; it is the honest consequence of what the PSS is. The prognosis score never "saw" sex (sex does not affect the outcome), so matching on it spends no effort balancing sex.


So which score should you match on?

Here is the whole "PS vs PSS" thesis in three numbers. We repeat the identical matching routine on the same 400 patients, changing only the score we match on, and line up the sex SMD:

Sex SMD Value
before matching 0.122
after PSS matching 0.132
after PS matching -0.059

Matching on the propensity score pulls sex into balance (from about 0.12 down to roughly −0.06), while matching on the prognosis score leaves it about where it started. Neither result is a mistake — they are answering different questions. The propensity score balances the treatment drivers, and sex helped decide who got treated, so the PS balances it; the prognosis score balances the outcome drivers, and sex does not affect the outcome, so the PSS leaves it alone. Same data, two notions of "comparable" — now visible in the numbers.

Laid side by side, the two scores line up like this:

Concept Propensity Score PSS
Focus Treatment Outcome
Model Probability of treatment Expected outcome
Built from All subjects Controls only
Matching goal Same treatment probability Same expected physiology
Question answered "Who is likely to be treated?" "What should normal look like?"

A simple analogy

Imagine studying exam scores. The propensity-score approach matches students who had the same chance of getting tutoring. The PSS approach matches students who should have had the same expected exam score based on ability. If your question is "does tutoring improve scores?", the propensity score fits. If your question is "how much does a disease alter expected performance?", the PSS is more aligned.

Why the PSS is powerful in physiologic studies

In fields like imaging, cardiology, or biomarker research, the real question is often "how much does disease shift someone away from normal?" — not simply "are cases different from controls?" The PSS lets you say not just "higher than control" but "higher than expected for this person," which is a far more precise and clinically meaningful statement — especially when the outcome has interpretable units (grams, ms, %, mL/m²) rather than a bare probability. And because you now hold a baseline expectation for every patient, the same PSS can also be used to adjust in a regression, or to form a residual (observed − expected) that reads directly as disease-related deviation.


Four traps to avoid

Both scores are only as good as the thinking behind them. Four common traps:

  1. Assuming the PS predicts outcome. It does not — it models treatment assignment only, the probability of being treated, not what the outcome should be.
  2. Matching the PSS on the observed Y. The PSS is a predicted healthy value, not the value the patient actually had. Match on expected Y, or you risk matching disease effect to disease effect.
  3. Building the PSS with cases included. That contaminates the "normal" model with disease effects and destroys the meaning of "if this person were healthy."
  4. Choosing a method before choosing the question. The method should follow the question. And both scores lean heavily on covariate selection: feed in a mediator, a collider, or a variable that is itself a consequence of disease or treatment, and either score can steer the analysis the wrong way.

Final takeaway

Both methods simplify complex data into one number per person. But:

So before you reach for either, ask: am I trying to control how treatment was assigned, or to understand how far someone deviates from normal? Your answer determines everything — as the same 400 patients, matched two ways, have just shown.

0
Message for International and Thai ReadersUnderstanding My Medical Context in ThailandRead more →Message for International and Thai ReadersUnderstanding My Broader Content Beyond MedicineRead more →

Comments

No comments yet. Be the first to share your thoughts.

Sign in to comment