Business

Combining Two Signals Without Double-Counting: A Lift Test

Antonio Evans8 min read

A whiteboard 2x2 grid labeled Signal A present or absent against Signal B present or absent, each cell holding a lift number, with an arrow to a decision box asking keep both, drop one, or add an interaction term.
Key points

Key points

  1. 1A lift interaction test compares the combined lift of two routing signals against the product of their individual lifts, so you can tell additive from redundant.
  2. 2The test only needs a 2x2 table of signal presence and outcome, which means you can run it on logged traffic without retraining a model.
  3. 3When combined lift falls below the product, the signals overlap: keep the stronger one or add an explicit interaction feature and drop the redundant one.
  4. 4Confidence intervals on each cell decide whether a gap is real interaction or sampling noise, so the test needs enough volume per cell.

Build the 2x2 table before you build the router

Any router that fires on two candidate signals is making an implicit claim: that each signal adds information beyond the other. That claim is testable. The cleanest way to check it is to reduce each signal to a yes or no at the moment of routing, then cross the two answers against whether the route actually produced a correct or accepted outcome.

The 2x2 table is the right container because it separates four populations: neither signal present, only the first, only the second, and both. Standard treatments of the 2x2 table note that the row and column margins carry the base rates while the interior cells carry the joint behavior, and that the odds ratio is the usual index of association between two binary quantities (the tutorial on 2x2 tables). You are using the same structure, but the outcome column is "did the chosen route succeed" rather than "did the disease occur."

Two definitions matter before you count anything, because sloppy definitions produce fake interactions:

  • Signal presence. Fix the threshold in advance. If a signal is a score, pick the cut from a prior calibration run and freeze it. Moving the cut after you see the table is how people manufacture interactions.
  • Outcome. Use a label you would accept in an A/B test: resolved without escalation, judged correct by a rubric, or a human accept/retry decision. Ticket escalation prediction work at IBM trained on over 2.5 million tickets and 10,000 escalations to reach 87.36% recall, which shows the label is tractable at scale but also that escalation is rare (the IBM field study). Rare outcomes shrink your cells fast.

The reason this matters for routing specifically: a router is a pre-generation decision about where to send work, and the AI Engineer taxonomy separates model selection (a decision made before generation) from quality escalation (a decision made after inspecting an answer) (the routing overview). Your two signals may be one of each. The interaction test does not care, but the interpretation does.

Worked example: two signals, 10,000 requests

Suppose you run a support assistant and you have two candidate signals for "this request needs the stronger model":

  • Signal A: length. The prompt exceeds a token cutoff.
  • Signal B: sentiment. The ticket text scores below a negativity threshold.

You have 10,000 logged requests with a known outcome (resolved first pass or not). Here is the table, with success rates:

A absentA presentTotal
B absent4,000 requests, 2,400 success (60.0%)1,000 requests, 300 success (30.0%)5,000, 2,700 (54.0%)
B present3,000 requests, 1,500 success (50.0%)2,000 requests, 200 success (10.0%)5,000, 1,700 (34.0%)
Total7,000, 3,900 (55.7%)3,000, 500 (16.7%)10,000, 4,400 (44.0%)

The base success rate is 44.0%. Now compute lift for each signal as the ratio of success rate in the present group to the base rate, and the same for the absent group, so you can see both directions:

  • Lift of A present: 16.7% / 44.0% = 0.38. Lift of A absent: 55.7% / 44.0% = 1.27.
  • Lift of B present: 34.0% / 44.0% = 0.77. Lift of B absent: 54.0% / 44.0% = 1.23.

Both signals point the same way: presence is bad for first-pass success, which is exactly what you want from a routing signal. Now the interaction test. Multiply the two "present" lifts:

0.38 x 0.77 = 0.293

The observed lift in the both-present cell is 10.0% / 44.0% = 0.227. The observed lift is lower than the product, which means the signals overlap: each one is partly telling you the same thing, and stacking them double-counts. This is multiplicative interaction on the risk scale, the same quantity the epidemiology literature calls interaction on a multiplicative scale, which is distinct from additive interaction and can disagree with it (the interaction tutorial).

What the overlap costs you

If you kept both signals and scored them as two independent votes, you would predict a much lower success rate for the both-present group than the 10.0% you actually saw. You would route some of those requests to the expensive model unnecessarily, or you would over-weight the pair in a learned scorer. The practical size of the error is the gap between 0.227 and 0.293, about 22% relative overcounting of the pair's effect.

Here is a compact way to run the whole calculation:

base = 0.440
lift_a = 0.167 / base
lift_b = 0.340 / base
lift_ab = 0.100 / base
product = lift_a * lift_b
print(f"lift A={lift_a:.3f} lift B={lift_b:.3f} product={product:.3f} observed={lift_ab:.3f}")
print(f"ratio observed/product = {lift_ab / product:.3f}")
# ratio near 1.0: additive in the multiplicative sense, keep both
# ratio below 1.0: overlap, drop the weaker signal or add an interaction term

A ratio near 1.0 says the signals are close to additive on this scale. A ratio meaningfully below 1.0 says overlap. A ratio above 1.0 says synergy, and that is the one case where an explicit interaction feature earns its keep.

The decision rule, and why it is not just "keep the best"

The short answer to whether to keep one signal or both is: compare the combined lift to the product, not to the sum. Multiplication is the right operation because each lift is a ratio to the same base rate, and ratios compound when independent signals are applied together.

Three outcomes, three actions:

Ratio (observed / product)ReadingAction
Near 1.0Additive on the multiplicative scaleKeep both, weight them independently
Below 1.0Overlap, shared informationKeep the stronger single signal, or add a product term and drop the weaker raw signal
Above 1.0SynergyKeep both and add an explicit interaction feature (A and B together)

The trap is treating a below-1.0 ratio as a reason to keep both anyway "because both have lift." A signal can have lift and still be redundant with another. Redundancy is not free: every extra feature in a router is a chance to overfit the training slice, and the overfitting shows up as a deeper cascade that costs more without improving quality. Work on cascades found that two-model cascades improved mean test-set accuracy over single-model selection by 2.1 to 8.2 percentage points, but adding more than two models failed to improve mean test-set accuracy in 118 of 135 comparisons and added at most 0.43 points (the cascade paper). Extra depth is a real cost with a thin payoff.

That finding has a direct reading for signal selection: the second and third signals behave like extra cascade depth. The work also found that a lightweight pre-generation router beat the best cascade policy on four of five datasets, suggesting cascade performance is limited more by paying the cheap model before escalation than by a shortage of intermediate stages (the ICML abstract). A router that decides before generation avoids that overhead. Your two signals are the router's inputs, so keeping the minimal set that carries the information is the whole game.

Where the multiplicative test can mislead you

The multiplicative test is the right default, but it has two known failure modes.

Scale dependence. Interaction on the multiplicative scale and interaction on the additive scale are different questions, and one can be present while the other is absent. The standard tutorial is explicit that the two scales must be evaluated separately and that a claim of "no interaction" is only true for the scale you tested (the interaction tutorial). If your router adds the two signal scores into a linear score, you are on the additive scale and should check the difference of differences instead of the ratio of ratios.

The interaction term is often a bad default. A review of including interactions in linear regression found that interaction terms are easy to add, inflate variance and raise the risk of overfitting, and are therefore best reserved for cases with a clear hypothesis and enough data (the pros and cons review). That is why the decision rule above puts the interaction feature last. You add it only when the combined lift is actually higher than the product, not as a reflex whenever the ratio is off.

There is a third, quieter failure: measurement noise in the signal. The 2x2 table tutorial notes that measurement error distorts the observed relationship between the two binary quantities, and that sample size drives how wide the interval on each cell gets (the tutorial on 2x2 tables). A tiny both-present cell can produce a ratio far from 1.0 by chance alone.

Checking whether the gap is real

Before you act on a ratio, put bounds around the both-present cell. Treat the success count as a binomial proportion and use the simple normal approximation: standard error equals sqrt(p times (1 minus p) divided by n), and a 95% interval runs about 1.96 standard errors either side when the cell has enough observations (the interaction tutorial covers power and sample size for additive and multiplicative interaction, which is the same arithmetic).

For our worked example, the both-present cell has 200 successes out of 2,000, so p = 0.10 and the standard error is sqrt(0.10 x 0.90 / 2,000) = 0.0067. A 95% interval runs from 0.087 to 0.113. Translate that to lift: 0.087/0.44 = 0.20 up to 0.113/0.44 = 0.26. The product was 0.293, which sits above the top of the interval, so the overlap here is not noise.

When it is noise, the intervals overlap and the honest conclusion is "no detectable interaction, fall back to the simplest model." Report the two lifts and the ratio with intervals, not a single ratio, so the next person can see how firm the call was.

One more guard: if the outcome is rare, the normal approximation gets shaky and you need more data per cell. The escalation literature is a useful warning here, because escalations are a minority of tickets and models are tuned for recall rather than precision on that small slice (AI escalation prediction). A 5% positive rate inside a both-present cell of a few hundred rows will not settle an interaction question.

From test result to a minimal, honest router

The output of the test is a decision about feature set, and the decision has to survive contact with production. Three habits make that happen.

First, keep the test offline and the policy frozen until the test is done. Moving thresholds or reweighting between the test and the deployment means the interaction result no longer describes the router you shipped. The routing overview is explicit that release should not restore old authority, so a bad threshold change should not be able to sneak back in behind a clean interaction result (the routing overview).

Second, evaluate the complete policy, not the individual signals. The same overview distinguishes mediation (a gateway choosing a destination) from quality decisions and from failure fallback, and it insists on evaluating the whole policy rather than isolated components (the routing overview). Your lift test is a feature-selection step inside that larger evaluation.

Third, watch the cost side, not just accuracy. Token pricing varies enormously across providers and within a provider across model tiers, and the same workload can differ by more than an order of magnitude in spend depending on which model handles it (the cost per token guide, the pricing comparison). A router that keeps a redundant signal and over-escalates pays that gap on every affected request. The lift interaction test is, in the end, a way of not paying twice for the same information.

For teams that want to run routing experiments across many models without wiring each provider separately, Quanta Inference gives text, image, video, audio and embedding models through one OpenAI-compatible API key with prepaid pricing in US dollars (https://quantaintelligence.ai/inference).

FAQ

FAQ

What exactly am I multiplying in a lift interaction test?

You multiply the lift of signal A when present by the lift of signal B when present, where each lift is the success rate with the signal divided by the base success rate. Compare that product to the observed lift in the both-present cell. A ratio near 1.0 means additive, below 1.0 means overlap, above 1.0 means synergy.

Why compare to the product and not the sum?

Because each lift is a ratio to the same base rate, and ratios compound when independent signals combine. Adding them compares different things. If your router actually adds raw scores into a linear model, switch to the additive scale and check the difference of differences instead.

How much data do I need in each cell?

Enough that the interval on each cell proportion is narrower than the effect you care about. A common working floor is at least 30 observations per cell for a normal approximation, but rare outcomes like escalations need far more, because the both-present cell shrinks fastest.

If the signals overlap, should I always drop the weaker one?

Usually, yes, unless the weaker signal is cheap to compute and carries a targeted correction the stronger one misses. The default action is to keep the stronger signal and add an explicit interaction feature only if you later find the combination genuinely beats the product.

Does a passing interaction test mean I can ship both signals?

No. It means the two signals are not double-counting each other. You still need to evaluate the complete routing policy end to end and check the cost per request, because a non-redundant signal can still be too expensive to justify.

Sources

Sources

  1. Interpreting Results in 2 × 2 Tables - PMC - NIH
  2. Customer support ticket escalation prediction using feature ...
  3. Model routing & gateways - AI Engineer
  4. A Tutorial on Interaction
  5. Is Escalation Worth It? On the Depth of LLM Cascades
  6. Is Escalation Worth It? A Decision-Theoretic ...
  7. To interact or not to interact: The pros and cons of including ...
  8. How AI Predicts Ticket Escalations
  9. Understanding LLM Cost Per Token: A 2026 Practical Guide
  10. LLM API Pricing Comparison & Calculator (October 2026)
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles