Compare & meta-analysis
Cross-study synthesis.
What it computes (all in code)
| Field | Meaning |
|---|---|
pooled | The combined estimate (mean + CI + total N) via fixed or random effects — DerSimonian-Laird τ² for the random-effects weight. |
perStudy[] | Each study's value + its inverse-variance weight (tighter studies count more). |
betweenStudy[] | Every pair tested for significance — is run A really different from run B, or just noise? |
trend[] | The metric as a time series (when groupBy: "time"). |
heterogeneity | iSquared (0–1) and tauSquared — how much the studies disagree beyond chance. |
Call it
{
"studyIds": ["run_q1","run_q2","run_q3"],
"metric": "purchase_intent",
"model": "random", // "fixed" or "random" effects
"groupBy": "time" // or "audience"
}Reading the result honestly
Always check heterogeneity.iSquared first. Below ~0.5, the pooled number is trustworthy. Above 0.5, the studies are measuring meaningfully different things — the pooled mean is an average of apples and oranges, and the tool returns a warning in its meta-insight. Report the per-study values instead of (or alongside) the pool.
Then read betweenStudy: a pair with significance.pValue \< 0.05 is a real shift, not sampling noise. This is what lets you say "intent genuinely rose from Q2 to Q3" instead of "it looks higher."
Over time vs across audiences
Over time (groupBy: "time"): track a metric across repeated runs of the same study — the trend series + drift detection (next guide) tell you the direction and whether it's significant.
Across audiences (groupBy: "audience"): run the same stimulus on different segments and compare — this is the study-level cousin of comparing audiences on a single question.
From comparison to artifact
compare_studies → synthesize_insight (write up the pooled finding) → export_deck (CI whiskers preserved)