Step two · before any modelling
Can this data answer the question at all?
A fit takes minutes and hands back confident-looking numbers whether or not the design could ever have identified them. So we ask whether it could first, and it costs a second. Nothing here has been modelled — this is arithmetic on your file.
The verdict
No-go
The model will still run — it never refuses — but this data cannot tell your channels apart. Read the total, not the split, and fix the columns named below before you quote any single channel.
The problem is with the shape of the data itself, not with one channel.Two channels are near-duplicatesIll-conditioned design matrixNothing you do to a single column fixes that.
How this verdict is decided
There is no score to improve and no percentage to argue with. A caution about one channel never demotes the whole dataset, because it has somewhere better to live: that channel’s own row, and its trust grade after the fit.
Takes about two minutes, and it is the step that catches impossible assumptions before they become results.
Five questions we ask of every dataset
2.74 · line at 4.00
across the whole dataset
3 channels flagged
Two channels are near-duplicates, TV — Cable and Ill-conditioned design matrix
3 channels flagged
TV — Broadcast, TV — Cable and Out of Home
Present
a demand control is mapped
No extreme weeks
nothing the outlier check flagged
Seven things to know, each with what to do about it
TV — Broadcast and TV — Cable correlate at r=1.00 after transformation. No model can attribute between them; combine them or run an experiment.
What to do: These two were bought as one thing, so model them as one thing: combine the columns. If you need them split, the only way to get there is an experiment that moves one without the other.
TV — Cable has VIF 5170.9 after transformation; it is nearly a linear combination of the other regressors.
What to do: Usually the same cause as near-duplicate channels: this one is reconstructable from the others. Combine it with whichever channel it shadows, or drop a control that is standing in for it. A channel that launched partway through the window hits this too, because the baseline absorbs the period it was dark.
Condition number 216 means the design is close to singular.
What to do: The design as a whole is near-singular, so no single column is to blame. Simplify: fewer channels, fewer controls, or a longer window.
104 observations against 38 parameters is 2.7x, under the 4x rule of thumb. Expect wide intervals.
What to do: Merging two closely related channels would buy back headroom. Otherwise expect wide intervals and treat them as the honest answer rather than a defect.
It runs in 39% of weeks, in bursts rather than at the start or end of the window. The effect is identified from the handful of on/off transitions rather than from the whole period, so its interval comes back wide even when the fit itself is sound.
What to do: Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.
TV — Cable is off air most weeks0.567 measured · 0.50 thresholdOpen
It runs in 39% of weeks, in bursts rather than at the start or end of the window. The effect is identified from the handful of on/off transitions rather than from the whole period, so its interval comes back wide even when the fit itself is sound.
What to do: Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.
Out of Home is off air most weeks0.596 measured · 0.50 thresholdOpen
It runs in 40% of weeks, in bursts rather than at the start or end of the window. The effect is identified from the handful of on/off transitions rather than from the whole period, so its interval comes back wide even when the fit itself is sound.
What to do: Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.
What we will do about it
Findings change the model, not your numbers. We never impute, winsorise or drop a row — every entry here alters how the fit is estimated, and states what that costs you.
Some channels held at their current budget
Will applytriggered by vifTV — CableThese channels' spend does not vary enough, did not run for enough of the window, or moves too closely with the rest of the model for the data to say what they returned. Their numbers come mostly from the starting assumption. They stay in the model, so they do not distort the others, but the budget planner will not move them.
What it costs you
You will get no recommendation for these channels — deliberately. A plan that reallocated budget on the strength of an assumption would look exactly like one built on evidence.
How much each channel's spend moves about
Ups and downs are what let the model see what a channel does. Spend the same amount every week and there is nothing to learn from — the return comes back as whatever we assumed going in, however large the budget.
| Channel | Spend share | Variation | Overlap cost | Weeks with nothing spent |
|---|---|---|---|---|
| TV — Broadcast | 22.6% | 1.34 | 5169.3 | 61% of weeks had no spend |
| TV — Cable | 12.3% | 1.34 | 5170.9 | 61% of weeks had no spend |
| Social — Meta | 15.5% | 0.25 | 311.4 | spent every week |
| Social — TikTok | 8.2% | 0.25 | 310.4 | spent every week |
| Search — Brand | 7.4% | 0.45 | 505.1 | spent every week |
| Search — Non-brand | 11.1% | 0.42 | 486.9 | spent every week |
| Programmatic Display | 7.9% | 0.19 | 15.6 | spent every week |
| Video — CTV | 9.4% | 0.60 | 9.1 | spent every week |
| Out of Home | 5.6% | 1.23 | 1.2 | 60% of weeks had no spend |
How closely your channels move together
Read a cell as: when this channel went up, did that one go up too? 1.00 means always, 0.00 means never. Anything above 0.80 and your data cannot tell the two apart. Measured after allowing for advertising that keeps working once it stops running and for the tenth million doing less than the first — checking raw spend instead is the usual reason a tool declares your data fine and then fails to separate anything.
| TV — Broadcast | 1.00 | 1.00 | 0.18 | 0.19 | 0.21 | 0.20 | 0.14 | -0.02 | 0.08 |
|---|---|---|---|---|---|---|---|---|---|
| TV — Cable | 1.00 | 1.00 | 0.18 | 0.18 | 0.21 | 0.20 | 0.14 | -0.02 | 0.08 |
| Social — Meta | 0.18 | 0.18 | 1.00 | 1.00 | 0.96 | 0.96 | 0.96 | 0.24 | 0.05 |
| Social — TikTok | 0.19 | 0.18 | 1.00 | 1.00 | 0.96 | 0.96 | 0.95 | 0.24 | 0.07 |
| Search — Brand | 0.21 | 0.21 | 0.96 | 0.96 | 1.00 | 1.00 | 0.93 | 0.23 | 0.07 |
| Search — Non-brand | 0.20 | 0.20 | 0.96 | 0.96 | 1.00 | 1.00 | 0.93 | 0.23 | 0.08 |
| Programmatic Display | 0.14 | 0.14 | 0.96 | 0.95 | 0.93 | 0.93 | 1.00 | 0.19 | 0.02 |
| Video — CTV | -0.02 | -0.02 | 0.24 | 0.24 | 0.23 | 0.23 | 0.19 | 1.00 | -0.04 |
| Out of Home | 0.08 | 0.08 | 0.05 | 0.07 | 0.07 | 0.08 | 0.02 | -0.04 | 1.00 |
| TV — Broadcast | TV — Cable | Social — Meta | Social — TikTok | Search — Brand | Search — Non-brand | Programmatic Display | Video — CTV | Out of Home |