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.
- package/README.md +1 -1
- package/dist/formatters/comparisonMarkdown.d.ts.map +1 -1
- package/dist/formatters/comparisonMarkdown.js +16 -0
- package/dist/formatters/comparisonMarkdown.js.map +1 -1
- package/dist/grade/eq5dImpact.d.ts +43 -0
- package/dist/grade/eq5dImpact.d.ts.map +1 -0
- package/dist/grade/eq5dImpact.js +119 -0
- package/dist/grade/eq5dImpact.js.map +1 -0
- package/dist/grade/inconsistency.d.ts +29 -0
- package/dist/grade/inconsistency.d.ts.map +1 -0
- package/dist/grade/inconsistency.js +71 -0
- package/dist/grade/inconsistency.js.map +1 -0
- package/dist/grade/upgrading.d.ts +32 -0
- package/dist/grade/upgrading.d.ts.map +1 -0
- package/dist/grade/upgrading.js +54 -0
- package/dist/grade/upgrading.js.map +1 -0
- package/dist/network/bucher.d.ts +1 -1
- package/dist/network/bucher.d.ts.map +1 -1
- package/dist/network/bucher.js +25 -2
- package/dist/network/bucher.js.map +1 -1
- package/dist/network/consistency.d.ts +44 -0
- package/dist/network/consistency.d.ts.map +1 -0
- package/dist/network/consistency.js +84 -0
- package/dist/network/consistency.js.map +1 -0
- package/dist/network/types.d.ts +9 -0
- package/dist/network/types.d.ts.map +1 -1
- package/dist/providers/types.d.ts +11 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/tools/htaDossierPrep.d.ts.map +1 -1
- package/dist/tools/htaDossierPrep.js +49 -15
- package/dist/tools/htaDossierPrep.js.map +1 -1
- package/dist/tools/indirectComparison.d.ts.map +1 -1
- package/dist/tools/indirectComparison.js +15 -2
- package/dist/tools/indirectComparison.js.map +1 -1
- package/dist/tools/utilityValueSet.d.ts.map +1 -1
- package/dist/tools/utilityValueSet.js +25 -3
- package/dist/tools/utilityValueSet.js.map +1 -1
- 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
|
|
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,
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"comparisonMarkdown.js","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/network/bucher.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/network/bucher.js
CHANGED
|
@@ -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.
|
|
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":"
|
|
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"}
|