heor-agent-mcp 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +1 -1
  2. package/dist/formatters/comparisonMarkdown.d.ts.map +1 -1
  3. package/dist/formatters/comparisonMarkdown.js +16 -0
  4. package/dist/formatters/comparisonMarkdown.js.map +1 -1
  5. package/dist/grade/eq5dImpact.d.ts +43 -0
  6. package/dist/grade/eq5dImpact.d.ts.map +1 -0
  7. package/dist/grade/eq5dImpact.js +119 -0
  8. package/dist/grade/eq5dImpact.js.map +1 -0
  9. package/dist/grade/inconsistency.d.ts +29 -0
  10. package/dist/grade/inconsistency.d.ts.map +1 -0
  11. package/dist/grade/inconsistency.js +71 -0
  12. package/dist/grade/inconsistency.js.map +1 -0
  13. package/dist/grade/upgrading.d.ts +32 -0
  14. package/dist/grade/upgrading.d.ts.map +1 -0
  15. package/dist/grade/upgrading.js +54 -0
  16. package/dist/grade/upgrading.js.map +1 -0
  17. package/dist/network/bucher.d.ts +1 -1
  18. package/dist/network/bucher.d.ts.map +1 -1
  19. package/dist/network/bucher.js +25 -2
  20. package/dist/network/bucher.js.map +1 -1
  21. package/dist/network/consistency.d.ts +44 -0
  22. package/dist/network/consistency.d.ts.map +1 -0
  23. package/dist/network/consistency.js +84 -0
  24. package/dist/network/consistency.js.map +1 -0
  25. package/dist/network/types.d.ts +9 -0
  26. package/dist/network/types.d.ts.map +1 -1
  27. package/dist/providers/types.d.ts +11 -0
  28. package/dist/providers/types.d.ts.map +1 -1
  29. package/dist/tools/htaDossierPrep.d.ts.map +1 -1
  30. package/dist/tools/htaDossierPrep.js +49 -15
  31. package/dist/tools/htaDossierPrep.js.map +1 -1
  32. package/dist/tools/indirectComparison.d.ts.map +1 -1
  33. package/dist/tools/indirectComparison.js +15 -2
  34. package/dist/tools/indirectComparison.js.map +1 -1
  35. package/dist/tools/utilityValueSet.d.ts.map +1 -1
  36. package/dist/tools/utilityValueSet.js +25 -3
  37. package/dist/tools/utilityValueSet.js.map +1 -1
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **AI-powered Health Economics and Outcomes Research (HEOR) agent as a Model Context Protocol server.**
8
8
 
9
- Automates literature review across 42 data sources, risk of bias assessment (RoB 2 / ROBINS-I / AMSTAR-2), state-of-the-art cost-effectiveness modelling, HTA dossier preparation for NICE / EMA / FDA / IQWiG / HAS / EU JCA, and a persistent project knowledge base — all callable as MCP tools from Claude.ai, Claude Code, and any MCP-compatible host.
9
+ Automates literature review across 44 data sources, risk of bias assessment (RoB 2 / ROBINS-I / AMSTAR-2), EQ-5D value set impact estimation, state-of-the-art cost-effectiveness modelling, HTA dossier preparation for NICE / EMA / FDA / IQWiG / HAS / EU JCA, and a persistent project knowledge base — all callable as MCP tools from Claude.ai, Claude Code, and any MCP-compatible host.
10
10
 
11
11
  Built for pharmaceutical, biotech, CRO, and medical affairs teams who need rigorous, auditable HEOR workflows without building infrastructure from scratch.
12
12
 
@@ -1 +1 @@
1
- {"version":3,"file":"comparisonMarkdown.d.ts","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAYpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAqG7E"}
1
+ {"version":3,"file":"comparisonMarkdown.d.ts","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAYpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CA2H7E"}
@@ -47,6 +47,22 @@ export function comparisonToMarkdown(result) {
47
47
  lines.push(`| ${e.intervention} vs ${e.comparator} | ${est} | ${ci} | ${p} | ${via} | ${method} |`);
48
48
  }
49
49
  lines.push("");
50
+ // Bucher consistency check (when direct h2h evidence available)
51
+ const conflicts = estimates.filter((e) => e.consistency_check && e.consistency_check.severity !== "none");
52
+ if (conflicts.length > 0) {
53
+ lines.push("**Bucher consistency check (direct vs indirect):**");
54
+ lines.push("");
55
+ for (const e of conflicts) {
56
+ const c = e.consistency_check;
57
+ const icon = c.severity === "substantial"
58
+ ? "🚨"
59
+ : c.severity === "moderate"
60
+ ? "⚠️"
61
+ : "ℹ️";
62
+ lines.push(`${icon} **${e.intervention} vs ${e.comparator}** (severity: ${c.severity}): ${c.rationale}`);
63
+ }
64
+ lines.push("");
65
+ }
50
66
  }
51
67
  // Heterogeneity statistics (I², Cochran Q)
52
68
  if (result.heterogeneity && result.heterogeneity.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"comparisonMarkdown.js","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comparisonMarkdown.js","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,CAAS,EAAE,WAAmB,CAAC;IAChD,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAgC;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,QAAQ;QACxB,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,iBAAiB;YACnC,CAAC,CAAC,mCAAmC;YACrC,CAAC,CAAC,eAAe,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CACR,2HAA2H,CAC5H,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1D,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAEhD,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,sCAAsC,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEzE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,GAAG,GACP,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAClE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;YAE9D,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC,UAAU,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,MAAM,IAAI,CACxF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,gEAAgE;QAChE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,iBAAiB,CAAC,QAAQ,KAAK,MAAM,CACtE,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAkB,CAAC;gBAC/B,MAAM,IAAI,GACR,CAAC,CAAC,QAAQ,KAAK,aAAa;oBAC1B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU;wBACzB,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,CAAC;gBACb,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,MAAM,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC,UAAU,iBAAiB,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,SAAS,EAAE,CAC7F,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CACR,oIAAoI,CACrI,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,8EAA8E,CAC/E,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,mBAAmB,IAAI,CACtM,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,cAAc,KAAK,aAAa;YAClC,CAAC,CAAC,cAAc,KAAK,cAAc,CACtC,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACR,mNAAmN,CACpN,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,WAAW;IACX,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Baseline-utility-aware EQ-5D 3L→5L impact estimator.
3
+ *
4
+ * Biz, Hernández Alava, Wailoo (2026) report category-level medians for the
5
+ * UK 3L→5L value-set transition. The new 5L value set has compressed utilities
6
+ * in mild–moderate health states relative to 3L (DSU mapping), which means
7
+ * the ICER impact of the transition depends strongly on the patient cohort's
8
+ * baseline utility:
9
+ *
10
+ * - non_cancer_qol_only: utility loss is concentrated in the 0.6–0.9 zone.
11
+ * Drugs treating MILD chronic conditions (baseline ~0.85, e.g., mild
12
+ * plaque psoriasis) see the biggest ICER increase. SEVERE versions of
13
+ * these conditions (baseline ~0.45, e.g., severe HS Hurley III) see
14
+ * less impact because patients spend more time in low-utility states
15
+ * where 5L compression is less severe.
16
+ *
17
+ * - cancer_life_extending: improvement is concentrated in severe states
18
+ * (5L assigns higher utility to the worst states than DSU mapping does),
19
+ * so a drug treating advanced/metastatic disease (baseline ~0.4) sees
20
+ * a bigger ICER decrease than one treating early-stage disease.
21
+ *
22
+ * - non_cancer_life_extending: Biz report mixed direction (7/11 decreased,
23
+ * 4/11 increased). Modulation is not defensible without the underlying
24
+ * state-by-state utility differences, so we return median + warning.
25
+ *
26
+ * The modulation factor is deliberately conservative — labelled as an
27
+ * extrapolation, not a finding from the paper. Users are advised to re-run
28
+ * their economic model with both value sets for an exact estimate.
29
+ */
30
+ import type { IndicationType } from "../data/eq5dValueSets.js";
31
+ export interface BaselineAdjustedImpact {
32
+ indication_type: IndicationType;
33
+ icer_change_pct: {
34
+ point: number;
35
+ lower: number;
36
+ upper: number;
37
+ };
38
+ is_baseline_adjusted: boolean;
39
+ baseline_utility?: number;
40
+ rationale: string;
41
+ }
42
+ export declare function estimateBaselineAdjustedImpact(indication: IndicationType, baseline_utility: number | undefined): BaselineAdjustedImpact;
43
+ //# sourceMappingURL=eq5dImpact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eq5dImpact.d.ts","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,cAAc,CAAC;IAChC,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,cAAc,EAC1B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,sBAAsB,CAuExB"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Baseline-utility-aware EQ-5D 3L→5L impact estimator.
3
+ *
4
+ * Biz, Hernández Alava, Wailoo (2026) report category-level medians for the
5
+ * UK 3L→5L value-set transition. The new 5L value set has compressed utilities
6
+ * in mild–moderate health states relative to 3L (DSU mapping), which means
7
+ * the ICER impact of the transition depends strongly on the patient cohort's
8
+ * baseline utility:
9
+ *
10
+ * - non_cancer_qol_only: utility loss is concentrated in the 0.6–0.9 zone.
11
+ * Drugs treating MILD chronic conditions (baseline ~0.85, e.g., mild
12
+ * plaque psoriasis) see the biggest ICER increase. SEVERE versions of
13
+ * these conditions (baseline ~0.45, e.g., severe HS Hurley III) see
14
+ * less impact because patients spend more time in low-utility states
15
+ * where 5L compression is less severe.
16
+ *
17
+ * - cancer_life_extending: improvement is concentrated in severe states
18
+ * (5L assigns higher utility to the worst states than DSU mapping does),
19
+ * so a drug treating advanced/metastatic disease (baseline ~0.4) sees
20
+ * a bigger ICER decrease than one treating early-stage disease.
21
+ *
22
+ * - non_cancer_life_extending: Biz report mixed direction (7/11 decreased,
23
+ * 4/11 increased). Modulation is not defensible without the underlying
24
+ * state-by-state utility differences, so we return median + warning.
25
+ *
26
+ * The modulation factor is deliberately conservative — labelled as an
27
+ * extrapolation, not a finding from the paper. Users are advised to re-run
28
+ * their economic model with both value sets for an exact estimate.
29
+ */
30
+ import { getImpactEstimate } from "../data/eq5dValueSets.js";
31
+ /**
32
+ * Modulate the published median by baseline utility.
33
+ *
34
+ * Reference baselines (calibrated so multiplier=1.0 ≈ published median):
35
+ * - non_cancer_qol_only: ref_baseline = 0.65 (typical of NICE TA dataset)
36
+ * - cancer_life_extending: ref_baseline = 0.55
37
+ *
38
+ * Linear scaling within plausible bounds (×0.4 to ×1.7) — wider than the
39
+ * IQR of the published distribution to acknowledge extrapolation uncertainty.
40
+ */
41
+ function multiplierForQolOnly(baseline) {
42
+ const ref = 0.65;
43
+ const slope = 1.5; // each +0.1 baseline → +15% multiplier
44
+ const raw = 1 + slope * (baseline - ref);
45
+ return Math.min(1.7, Math.max(0.4, raw));
46
+ }
47
+ function multiplierForCancer(baseline) {
48
+ // For cancer life-extending, a LOWER baseline means BIGGER impact (more negative %).
49
+ // ref=0.55 → multiplier=1.0
50
+ const ref = 0.55;
51
+ const slope = -2.0; // each +0.1 baseline → -20% multiplier (less impact)
52
+ const raw = 1 + slope * (baseline - ref);
53
+ return Math.min(1.7, Math.max(0.4, raw));
54
+ }
55
+ export function estimateBaselineAdjustedImpact(indication, baseline_utility) {
56
+ if (baseline_utility !== undefined) {
57
+ if (baseline_utility < 0 || baseline_utility > 1) {
58
+ throw new Error(`baseline_utility must be in [0, 1]; got ${baseline_utility}`);
59
+ }
60
+ }
61
+ const published = getImpactEstimate(indication);
62
+ const median = published?.median_icer_change_pct ?? 0;
63
+ // Range for unmodulated estimate (±25% of median to reflect inter-study spread)
64
+ const baseRange = {
65
+ point: median,
66
+ lower: median - Math.abs(median) * 0.25,
67
+ upper: median + Math.abs(median) * 0.25,
68
+ };
69
+ if (baseline_utility === undefined) {
70
+ return {
71
+ indication_type: indication,
72
+ icer_change_pct: baseRange,
73
+ is_baseline_adjusted: false,
74
+ rationale: `Published median for ${indication} (Biz et al. 2026, n=${published?.examples?.length ?? 0} indication examples).`,
75
+ };
76
+ }
77
+ if (indication === "non_cancer_life_extending") {
78
+ return {
79
+ indication_type: indication,
80
+ icer_change_pct: baseRange,
81
+ is_baseline_adjusted: false,
82
+ baseline_utility,
83
+ rationale: "Mixed/heterogeneous direction in Biz 2026 (7/11 decreased, 4/11 increased) — cannot reliably modulate by baseline utility. Re-run the model with both value sets for an exact estimate.",
84
+ };
85
+ }
86
+ let multiplier;
87
+ let directionalNote;
88
+ if (indication === "non_cancer_qol_only") {
89
+ multiplier = multiplierForQolOnly(baseline_utility);
90
+ directionalNote =
91
+ baseline_utility > 0.75
92
+ ? `MILD baseline utility (${baseline_utility.toFixed(2)}) → 5L compression in mild-moderate states hits this cohort harder; expect larger ICER increase than category median.`
93
+ : baseline_utility < 0.55
94
+ ? `SEVERE baseline utility (${baseline_utility.toFixed(2)}) → patients spend more time in low-utility states where 5L compression is less severe; expect smaller ICER increase than category median.`
95
+ : `Baseline utility (${baseline_utility.toFixed(2)}) near typical NICE TA dataset average — expect impact close to published median.`;
96
+ }
97
+ else {
98
+ multiplier = multiplierForCancer(baseline_utility);
99
+ directionalNote =
100
+ baseline_utility < 0.45
101
+ ? `Advanced/metastatic disease (baseline=${baseline_utility.toFixed(2)}) — 5L assigns higher utility to severe states than DSU mapping; expect larger ICER decrease than median.`
102
+ : baseline_utility > 0.65
103
+ ? `Earlier-stage disease (baseline=${baseline_utility.toFixed(2)}) — patients spend less time in severe states; expect smaller ICER decrease than median.`
104
+ : `Baseline utility (${baseline_utility.toFixed(2)}) near typical advanced-cancer dataset average — expect impact close to published median.`;
105
+ }
106
+ const adjustedPoint = median * multiplier;
107
+ return {
108
+ indication_type: indication,
109
+ icer_change_pct: {
110
+ point: adjustedPoint,
111
+ lower: adjustedPoint - Math.abs(adjustedPoint) * 0.30,
112
+ upper: adjustedPoint + Math.abs(adjustedPoint) * 0.30,
113
+ },
114
+ is_baseline_adjusted: true,
115
+ baseline_utility,
116
+ rationale: `${directionalNote} This is an EXTRAPOLATION beyond Biz 2026 (which reports only category-level medians) — not a direct finding. Approximation: multiplier ${multiplier.toFixed(2)}× applied to published median ${median}%. Validate by re-running your model under both value sets.`,
117
+ };
118
+ }
119
+ //# sourceMappingURL=eq5dImpact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eq5dImpact.js","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * GRADE Inconsistency assessment.
3
+ *
4
+ * Per Cochrane Handbook Ch. 10.10 / GRADE Handbook 5.1, inconsistency reflects
5
+ * heterogeneity of effect estimates across studies — NOT the number of studies.
6
+ *
7
+ * Single-study comparisons cannot be assessed for inconsistency; they are
8
+ * downgraded for imprecision instead. This function returns "not_assessable"
9
+ * for k=1, mapping I² bands to GRADE inconsistency levels otherwise.
10
+ *
11
+ * I² interpretation bands (Cochrane):
12
+ * 0–40% might not be important
13
+ * 30–60% moderate heterogeneity
14
+ * 50–90% substantial heterogeneity
15
+ * 75–100% considerable heterogeneity
16
+ *
17
+ * GRADE downgrade mapping:
18
+ * <50% Low (no downgrade)
19
+ * 50–75% Moderate (consider 1-step downgrade — "Serious")
20
+ * >75% Serious (1-step downgrade — "Very Serious" if ≥90%)
21
+ */
22
+ export type GradeInconsistency = "not_assessable" | "Low" | "Moderate" | "Serious" | "Very Serious";
23
+ export interface InconsistencyAssessment {
24
+ level: GradeInconsistency;
25
+ downgrade_steps: 0 | 1 | 2;
26
+ rationale: string;
27
+ }
28
+ export declare function assessInconsistency(n_studies: number, i_squared_pct: number | null): InconsistencyAssessment;
29
+ //# sourceMappingURL=inconsistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inconsistency.d.ts","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,kBAAkB,GAC1B,gBAAgB,GAChB,KAAK,GACL,UAAU,GACV,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAkDzB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * GRADE Inconsistency assessment.
3
+ *
4
+ * Per Cochrane Handbook Ch. 10.10 / GRADE Handbook 5.1, inconsistency reflects
5
+ * heterogeneity of effect estimates across studies — NOT the number of studies.
6
+ *
7
+ * Single-study comparisons cannot be assessed for inconsistency; they are
8
+ * downgraded for imprecision instead. This function returns "not_assessable"
9
+ * for k=1, mapping I² bands to GRADE inconsistency levels otherwise.
10
+ *
11
+ * I² interpretation bands (Cochrane):
12
+ * 0–40% might not be important
13
+ * 30–60% moderate heterogeneity
14
+ * 50–90% substantial heterogeneity
15
+ * 75–100% considerable heterogeneity
16
+ *
17
+ * GRADE downgrade mapping:
18
+ * <50% Low (no downgrade)
19
+ * 50–75% Moderate (consider 1-step downgrade — "Serious")
20
+ * >75% Serious (1-step downgrade — "Very Serious" if ≥90%)
21
+ */
22
+ export function assessInconsistency(n_studies, i_squared_pct) {
23
+ if (n_studies <= 0) {
24
+ return {
25
+ level: "not_assessable",
26
+ downgrade_steps: 0,
27
+ rationale: "No studies — domain not assessable",
28
+ };
29
+ }
30
+ if (n_studies === 1) {
31
+ return {
32
+ level: "not_assessable",
33
+ downgrade_steps: 0,
34
+ rationale: "Single study — inconsistency not assessable (consider imprecision instead)",
35
+ };
36
+ }
37
+ if (i_squared_pct == null) {
38
+ return {
39
+ level: "Moderate",
40
+ downgrade_steps: 0,
41
+ rationale: "Multiple studies but I² not computed — manual heterogeneity review recommended",
42
+ };
43
+ }
44
+ if (i_squared_pct >= 90) {
45
+ return {
46
+ level: "Very Serious",
47
+ downgrade_steps: 2,
48
+ rationale: `I²=${i_squared_pct.toFixed(0)}% (considerable heterogeneity, ≥90%)`,
49
+ };
50
+ }
51
+ if (i_squared_pct >= 75) {
52
+ return {
53
+ level: "Serious",
54
+ downgrade_steps: 1,
55
+ rationale: `I²=${i_squared_pct.toFixed(0)}% (considerable heterogeneity, 75–89%)`,
56
+ };
57
+ }
58
+ if (i_squared_pct >= 50) {
59
+ return {
60
+ level: "Moderate",
61
+ downgrade_steps: 1,
62
+ rationale: `I²=${i_squared_pct.toFixed(0)}% (substantial heterogeneity, 50–74%)`,
63
+ };
64
+ }
65
+ return {
66
+ level: "Low",
67
+ downgrade_steps: 0,
68
+ rationale: `I²=${i_squared_pct.toFixed(0)}% (low heterogeneity, <50%)`,
69
+ };
70
+ }
71
+ //# sourceMappingURL=inconsistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inconsistency.js","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,aAA4B;IAE5B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,oCAAoC;SAChD,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,4EAA4E;SAC/E,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,gFAAgF;SACnF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;SAChF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;SAClF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;SACjF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;KACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GRADE Upgrading assessment for observational evidence (Guyatt 2011).
3
+ *
4
+ * GRADE allows upgrading observational studies that start at "Low" certainty
5
+ * for three specific reasons:
6
+ * 1. Large magnitude of effect (RR < 0.5 or > 2.0 → +1; RR < 0.2 or > 5.0 → +2)
7
+ * 2. Dose-response gradient
8
+ * 3. Plausible confounding/bias would reduce the observed effect (i.e.,
9
+ * bias is biasing toward null, so the true effect is likely larger)
10
+ *
11
+ * Total upgrade is capped at +2 steps. Upgrading does NOT apply when the
12
+ * starting certainty is High (RCTs) — RCTs cannot be upgraded above High.
13
+ *
14
+ * Reference: Guyatt GH et al. GRADE guidelines: 9. Rating up the quality
15
+ * of evidence. J Clin Epidemiol. 2011;64(12):1311-1316.
16
+ */
17
+ export interface UpgradingInput {
18
+ /** Starting certainty before downgrades — "High" for RCTs, "Low" for observational. */
19
+ start_certainty: "High" | "Low";
20
+ /** Magnitude of effect (effect size relative to control). */
21
+ large_effect?: "none" | "large" | "very_large";
22
+ /** Documented dose-response gradient. */
23
+ dose_response?: boolean;
24
+ /** Plausible residual confounding would bias the effect toward null. */
25
+ plausible_confounding_toward_null?: boolean;
26
+ }
27
+ export interface UpgradingAssessment {
28
+ upgrade_steps: 0 | 1 | 2;
29
+ rationale: string;
30
+ }
31
+ export declare function assessUpgrading(input: UpgradingInput): UpgradingAssessment;
32
+ //# sourceMappingURL=upgrading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrading.d.ts","sourceRoot":"","sources":["../../src/grade/upgrading.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,cAAc;IAC7B,uFAAuF;IACvF,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;IAC/C,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,iCAAiC,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,CA2C1E"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * GRADE Upgrading assessment for observational evidence (Guyatt 2011).
3
+ *
4
+ * GRADE allows upgrading observational studies that start at "Low" certainty
5
+ * for three specific reasons:
6
+ * 1. Large magnitude of effect (RR < 0.5 or > 2.0 → +1; RR < 0.2 or > 5.0 → +2)
7
+ * 2. Dose-response gradient
8
+ * 3. Plausible confounding/bias would reduce the observed effect (i.e.,
9
+ * bias is biasing toward null, so the true effect is likely larger)
10
+ *
11
+ * Total upgrade is capped at +2 steps. Upgrading does NOT apply when the
12
+ * starting certainty is High (RCTs) — RCTs cannot be upgraded above High.
13
+ *
14
+ * Reference: Guyatt GH et al. GRADE guidelines: 9. Rating up the quality
15
+ * of evidence. J Clin Epidemiol. 2011;64(12):1311-1316.
16
+ */
17
+ export function assessUpgrading(input) {
18
+ if (input.start_certainty === "High") {
19
+ return {
20
+ upgrade_steps: 0,
21
+ rationale: "Upgrading not applicable — RCT evidence already starts High",
22
+ };
23
+ }
24
+ const reasons = [];
25
+ let raw = 0;
26
+ if (input.large_effect === "very_large") {
27
+ raw += 2;
28
+ reasons.push("very large effect (RR < 0.2 or > 5.0)");
29
+ }
30
+ else if (input.large_effect === "large") {
31
+ raw += 1;
32
+ reasons.push("large effect (RR < 0.5 or > 2.0)");
33
+ }
34
+ if (input.dose_response) {
35
+ raw += 1;
36
+ reasons.push("dose-response gradient");
37
+ }
38
+ if (input.plausible_confounding_toward_null) {
39
+ raw += 1;
40
+ reasons.push("plausible confounding biases toward null");
41
+ }
42
+ const capped = Math.min(raw, 2);
43
+ if (raw === 0) {
44
+ return {
45
+ upgrade_steps: 0,
46
+ rationale: "No upgrading criteria met (Guyatt 2011)",
47
+ };
48
+ }
49
+ return {
50
+ upgrade_steps: capped,
51
+ rationale: reasons.join("; ") + (raw > capped ? " (capped at +2 per GRADE)" : ""),
52
+ };
53
+ }
54
+ //# sourceMappingURL=upgrading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrading.js","sourceRoot":"","sources":["../../src/grade/upgrading.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkBH,MAAM,UAAU,eAAe,CAAC,KAAqB;IACnD,IAAI,KAAK,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,6DAA6D;SACzE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;QACxC,GAAG,IAAI,CAAC,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QAC1C,GAAG,IAAI,CAAC,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,GAAG,IAAI,CAAC,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,CAAC,iCAAiC,EAAE,CAAC;QAC5C,GAAG,IAAI,CAAC,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAc,CAAC;IAE7C,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,yCAAyC;SACrD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,aAAa,EAAE,MAAM;QACrB,SAAS,EACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC"}
@@ -25,5 +25,5 @@ export declare function bucherIndirect(ab: PooledEstimate, cb: PooledEstimate):
25
25
  *
26
26
  * Returns the indirect estimate of A vs C.
27
27
  */
28
- export declare function computeIndirectComparison(intervention: string, comparator: string, bridge: string, directAB: DirectComparison[], directCB: DirectComparison[], outcome: string, measure: EffectMeasure): IndirectEstimate;
28
+ export declare function computeIndirectComparison(intervention: string, comparator: string, bridge: string, directAB: DirectComparison[], directCB: DirectComparison[], outcome: string, measure: EffectMeasure, directAC?: DirectComparison[]): IndirectEstimate;
29
29
  //# sourceMappingURL=bucher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bucher.d.ts","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3C;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAiDD,4CAA4C;AAC5C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,cAAc,CAqBhB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,cAAc,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GACrB,gBAAgB,CAoDlB"}
1
+ {"version":3,"file":"bucher.d.ts","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3C;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAiDD,4CAA4C;AAC5C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,cAAc,CAqBhB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,cAAc,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,gBAAgB,CA+ElB"}
@@ -1,3 +1,4 @@
1
+ import { assessConsistencyConflict } from "./consistency.js";
1
2
  /** Standard error from 95% CI */
2
3
  export function seFromCI(lower, upper) {
3
4
  return (upper - lower) / 3.92;
@@ -11,7 +12,7 @@ export function normalCDF(x) {
11
12
  const p = d *
12
13
  Math.exp((-z * z) / 2.0) *
13
14
  (t *
14
- (0.319381530 +
15
+ (0.31938153 +
15
16
  t *
16
17
  (-0.356563782 +
17
18
  t * (1.781477937 + t * (-1.821255978 + t * 1.330274429)))));
@@ -87,7 +88,7 @@ export function bucherIndirect(ab, cb) {
87
88
  *
88
89
  * Returns the indirect estimate of A vs C.
89
90
  */
90
- export function computeIndirectComparison(intervention, comparator, bridge, directAB, directCB, outcome, measure) {
91
+ export function computeIndirectComparison(intervention, comparator, bridge, directAB, directCB, outcome, measure, directAC) {
91
92
  // Convert to working scale and pool
92
93
  const abStudies = directAB.map((d) => ({
93
94
  value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
@@ -105,6 +106,27 @@ export function computeIndirectComparison(intervention, comparator, bridge, dire
105
106
  const ciLowerWorking = indirect.value - 1.96 * indirect.se;
106
107
  const ciUpperWorking = indirect.value + 1.96 * indirect.se;
107
108
  const result = fromWorkingScale(indirect.value, ciLowerWorking, ciUpperWorking, measure);
109
+ // Optional Bucher consistency check vs direct h2h evidence
110
+ let consistency_check;
111
+ if (directAC && directAC.length > 0) {
112
+ const acStudies = directAC.map((d) => ({
113
+ value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
114
+ se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
115
+ }));
116
+ const pooledAC = poolFixedEffect(acStudies);
117
+ const assessment = assessConsistencyConflict({
118
+ indirect: { value: indirect.value, se: indirect.se },
119
+ direct: { value: pooledAC.value, se: pooledAC.se },
120
+ });
121
+ consistency_check = {
122
+ has_conflict: assessment.has_conflict,
123
+ severity: assessment.severity,
124
+ direct_estimate: pooledAC.value,
125
+ direct_n_studies: pooledAC.n_studies,
126
+ z_difference: assessment.z_difference,
127
+ rationale: assessment.rationale,
128
+ };
129
+ }
108
130
  return {
109
131
  intervention,
110
132
  comparator,
@@ -120,6 +142,7 @@ export function computeIndirectComparison(intervention, comparator, bridge, dire
120
142
  p_value: indirect.p_value,
121
143
  pooled_ab: pooledAB,
122
144
  pooled_bc: pooledCB,
145
+ consistency_check,
123
146
  };
124
147
  }
125
148
  //# sourceMappingURL=bucher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bucher.js","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bucher.js","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Bucher consistency assumption check.
3
+ *
4
+ * Bucher's 1997 indirect comparison method requires that the bridge-comparator
5
+ * effect is the same in trials of A-vs-B and C-vs-B. When direct head-to-head
6
+ * (A-vs-C) evidence ALSO exists, we can test this assumption empirically by
7
+ * comparing the direct and indirect estimates — if they disagree, the
8
+ * consistency assumption is suspect and the indirect estimate may be biased.
9
+ *
10
+ * Test statistic: z = (direct - indirect) / sqrt(SE_direct² + SE_indirect²)
11
+ *
12
+ * Severity bands (Cochrane Handbook Ch. 11.4.3 / NICE DSU TSD 18):
13
+ * |z| < 1.5 → no conflict
14
+ * 1.5–1.96 → moderate inconsistency (warrants discussion)
15
+ * ≥1.96 → substantial inconsistency (consistency assumption violated)
16
+ * any opposite-direction with both estimates significant → substantial
17
+ *
18
+ * Note: the working scale matters. For OR/HR/RR, both estimates must be on the
19
+ * log scale before differencing. This function assumes the caller has already
20
+ * converted to the working scale.
21
+ */
22
+ export interface ConsistencyInput {
23
+ /** Indirect (Bucher) estimate on the working scale (log for ratio measures). */
24
+ indirect: {
25
+ value: number;
26
+ se: number;
27
+ };
28
+ /** Direct (head-to-head) estimate on the working scale, or null if no h2h. */
29
+ direct: {
30
+ value: number;
31
+ se: number;
32
+ } | null;
33
+ }
34
+ export type ConsistencySeverity = "untestable" | "none" | "moderate" | "substantial";
35
+ export interface ConsistencyAssessment {
36
+ has_conflict: boolean;
37
+ severity: ConsistencySeverity;
38
+ difference: number;
39
+ se_difference: number;
40
+ z_difference: number;
41
+ rationale: string;
42
+ }
43
+ export declare function assessConsistencyConflict(input: ConsistencyInput): ConsistencyAssessment;
44
+ //# sourceMappingURL=consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/network/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,8EAA8E;IAC9E,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ,MAAM,GACN,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,gBAAgB,GACtB,qBAAqB,CAuEvB"}