Skip to main content
Version: Canary - 2.3 🚧

Scores

SchemaMethodology

Table of Contents​

Hospital/ASC/Imaging Accuracy Scores​

Each rate is assigned a 1-5 canonical_rate_score.

Canonical Rate ScoreInterpretation
5Validated
4Raw - Payer/Hospital Posted Dollar; Not Outlier
3Transform/Impute - Medicare Benchmark Validated
2Transform/Impute - Not Medicare Validated but not an outlier
1Outlier
0Rate Does Not Exist
Validation + Medicare Bounds

Validated: Within ±20% of counterparty rates (±10% if rate ≥ $15k) AND meets Medicare bounds.

Medicare Bounds:

  • IP: between .9x and 10x
  • OP/PRO: between .5x and 30x

Flow Chart​

accuracy_score_flow

Code
from graphviz import Digraph

# Initialize directed graph
dot = Digraph(comment="Accuracy Score Flow (Gross Charge 0.9x–30x Medicare)", format="png")
dot.attr(rankdir="TB", size="10")

# Start
dot.node("A", "Start", shape="circle")

# ±20% check first
dot.node("D", "Within ±20% of\ncounterparty rates?", shape="diamond")
dot.edge("A", "D")

# Global Medicare bound <30x
dot.node("D2", "Rate < 30× Medicare?", shape="diamond")
dot.edge("D", "D2", label="Yes")

# Medicare bound checks after ±20%
dot.node("D3", "If Inpatient:\nRate between 0.9× and 30× Medicare", shape="diamond")
dot.edge("D2", "D3", label="Yes")

# Score 5 validated if holds
dot.node("S5v", "Score = 5 (Validated)", shape="box")
dot.edge("D3", "S5v", label="Yes")

# Fallthroughs if checks fail
dot.edge("D", "F", label="No")
dot.edge("D2", "F", label="No", style="dashed")
dot.edge("D3", "F", label="No", style="dashed")

# Raw/post imputation
dot.node("F", "Raw or Posted Imputation Rate?\n(And not an outlier)", shape="diamond")
dot.node("S4r", "Score = 4", shape="box")
dot.edge("F", "S4r", label="Yes")

# Gross charge transform (edited to 0.9x–30x Medicare)
dot.node("G", "Hospital Gross Charge Transform?\n(Between 0.9× and 30× Medicare,\nnot drug code)", shape="diamond")
dot.edge("F", "G", label="No")

dot.node("S3t", "Score = 3", shape="box")
dot.edge("G", "S3t", label="Yes")

# Medicare benchmark
dot.node("H", "Non-outlier AND\nwithin 0.95×–10× Medicare?", shape="diamond")
dot.edge("G", "H", label="No")

dot.node("S3b", "Score = 3", shape="box")
dot.edge("H", "S3b", label="Yes")

# Non-outlier generic
dot.node("I", "Non-outlier?", shape="diamond")
dot.edge("H", "I", label="No")

dot.node("S2n", "Score = 2", shape="box")
dot.edge("I", "S2n", label="Yes")

# Outlier case
dot.node("J", "Rate exists?", shape="diamond")
dot.edge("I", "J", label="No")

dot.node("S1o", "Score = 1 (Outlier)", shape="box")
dot.edge("J", "S1o", label="Yes")

# Score 0 (null)
dot.node("S0", "Score = 0 (Null)", shape="box")
dot.edge("J", "S0", label="No")

# Render PNG
output_path = "/mnt/data/accuracy_score_flow_grosscharge_0.9x_30x"
dot.render(output_path, format="png", cleanup=False)

output_path + ".png"

Drug Accuracy Scores​

Drug rates use a specialized scoring methodology that differs from medical codes. Each rate is assigned a 1-5 canonical_rate_score.

Canonical Rate ScoreInterpretation
5Validated
4Ratio to Medicare/ASP between 1.25 and 3.5 (10th–90th percentiles)
3Ratio to Medicare/ASP between 0.9 and 4
2Ratio to Medicare/ASP < 0.9 or > 4
1Outlier - Hospital MRF: < 0.8 or > 4; Payer MRF: < 0.8 or > 10
0Rate Does Not Exist

Drug Validation Criteria​

MethodCriteria
ASP ValidatedWithin ±20% of counterparty rates (±10% if rate ≥ $15k) AND between 1.2x-4x Medicare/ASP
ASP Bounds - HospitalBetween 0.8x and 4x Medicare ASP rate
ASP Bounds - PayerBetween 0.8x and 10x Medicare ASP rate

Lab Accuracy Scores​

Lab rates use a consistency-based scoring methodology. "Consistent" is defined at the lab/payer-network level and indicates that the lab reports rates at a consistent percentage of Medicare rates. Specifically, we define consistency as having at least 30 reported rates AND having the difference between the 5th and 95th percentiles of % of Medicare rates be less than 0.25.

Each rate is assigned a 1-5 canonical_rate_score.

Canonical Rate ScoreInterpretation
5Validated - Consistent rate within 0.4x-1.3x Medicare
4Consistent rate within 0.3x-3x Medicare
3Within 0.4x-1.3x Medicare (not marked as consistent)
2Not validated but within bounds (0.2x-4.5x Medicare)
1Outlier
0Rate Does Not Exist

Physician Group Accuracy Scores​

Physician Group rates use a consistency-based scoring methodology. "Consistent" is defined at the PG/payer-network level and indicates that the PG reports rates at a consistent percentage of Medicare rates. Specifically, we define consistency as having at least 30 reported rates AND having the difference between the 5th and 95th percentiles of % of Medicare rates be less than 0.25.

Each rate is assigned a 1-5 canonical_rate_score.

Canonical Rate ScoreInterpretation
5Consistent rate with ratio to Medicare between 0.9 and 3.5 (10th–90th percentiles)
4Consistent rate with ratio to Medicare between 0.5 and 5.5 (1st–99th percentiles)
3Ratio to Medicare between 0.9 and 3.5 (not marked as consistent)
2Ratio to Medicare between 0.5 and 5.5 (not an outlier, captures ~98% of posted PG rates)
1Outlier
0Rate Does Not Exist

Anesthesia Outlier Bounds​

Anesthesia Outlier Bounds

Anesthesia codes have their own outlier bounds:

  • lower bound: 1x Medicare
  • upper bound: $200

How Ties are Broken​

Sometimes we have both payer and hospital rates and they both have a canonical rate score of 4. Which one do we pick? Ties are broken by selecting the higher-likelihood rate. The "likelihood" is a statistic computed using our expectations for that code based on validated rates (payer/hospital reported similar rates).

Likelihood

Where can I see this likelihood score? It's in the validation score's decimals.

As an example, if the validation score is 6.85, the likelihood of randomly drawing the rate from the expected distribution is 85%.

Math

We estimate the likelihood as the integral of the probability distribution function of a Normal(μ,σ)Normal(\mu, \sigma) between [r−ϵ,r+ϵ][r - \epsilon, r + \epsilon]. (i.e. difference of CDF at these two points)

μ\mu and σ\sigma come from the observed distribution of validated rates for that billing code and provider type. We log transform the validated rates to reduce skew. In general this observed distribution is normal-ish enough. But we do exclude distributions that are too skewed even after a log transform. We also exclude distributions that are clearly multi-modal.

For more details, see accuracy scores v2