heor-agent-mcp 0.9.6 → 0.9.10
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 +8 -7
- package/dist/data/eq5dValueSets.d.ts +62 -0
- package/dist/data/eq5dValueSets.d.ts.map +1 -0
- package/dist/data/eq5dValueSets.js +171 -0
- package/dist/data/eq5dValueSets.js.map +1 -0
- package/dist/formatters/comparisonMarkdown.d.ts.map +1 -1
- package/dist/formatters/comparisonMarkdown.js +19 -3
- package/dist/formatters/comparisonMarkdown.js.map +1 -1
- package/dist/network/heterogeneity.d.ts +73 -0
- package/dist/network/heterogeneity.d.ts.map +1 -0
- package/dist/network/heterogeneity.js +185 -0
- package/dist/network/heterogeneity.js.map +1 -0
- package/dist/network/types.d.ts +12 -0
- package/dist/network/types.d.ts.map +1 -1
- package/dist/providers/direct/allOfUs.d.ts.map +1 -1
- package/dist/providers/direct/allOfUs.js +1 -0
- package/dist/providers/direct/allOfUs.js.map +1 -1
- package/dist/providers/direct/biorxiv.d.ts.map +1 -1
- package/dist/providers/direct/biorxiv.js +2 -2
- package/dist/providers/direct/biorxiv.js.map +1 -1
- package/dist/providers/direct/chembl.d.ts.map +1 -1
- package/dist/providers/direct/chembl.js +2 -2
- package/dist/providers/direct/chembl.js.map +1 -1
- package/dist/providers/direct/citeline.d.ts.map +1 -1
- package/dist/providers/direct/citeline.js +2 -1
- package/dist/providers/direct/citeline.js.map +1 -1
- package/dist/providers/direct/clinicalTrials.d.ts.map +1 -1
- package/dist/providers/direct/clinicalTrials.js +3 -2
- package/dist/providers/direct/clinicalTrials.js.map +1 -1
- package/dist/providers/direct/cmsNadac.d.ts.map +1 -1
- package/dist/providers/direct/cmsNadac.js +5 -3
- package/dist/providers/direct/cmsNadac.js.map +1 -1
- package/dist/providers/direct/cochrane.d.ts.map +1 -1
- package/dist/providers/direct/cochrane.js +2 -1
- package/dist/providers/direct/cochrane.js.map +1 -1
- package/dist/providers/direct/cortellis.d.ts.map +1 -1
- package/dist/providers/direct/cortellis.js +2 -1
- package/dist/providers/direct/cortellis.js.map +1 -1
- package/dist/providers/direct/embase.d.ts.map +1 -1
- package/dist/providers/direct/embase.js +3 -4
- package/dist/providers/direct/embase.js.map +1 -1
- package/dist/providers/direct/euroqol.d.ts +3 -0
- package/dist/providers/direct/euroqol.d.ts.map +1 -0
- package/dist/providers/direct/euroqol.js +35 -0
- package/dist/providers/direct/euroqol.js.map +1 -0
- package/dist/providers/direct/googleScholar.d.ts.map +1 -1
- package/dist/providers/direct/googleScholar.js +8 -4
- package/dist/providers/direct/googleScholar.js.map +1 -1
- package/dist/providers/direct/ihmeGbd.js +1 -0
- package/dist/providers/direct/ihmeGbd.js.map +1 -1
- package/dist/providers/direct/index.d.ts.map +1 -1
- package/dist/providers/direct/index.js +4 -0
- package/dist/providers/direct/index.js.map +1 -1
- package/dist/providers/direct/nhsCosts.d.ts.map +1 -1
- package/dist/providers/direct/nhsCosts.js +1 -1
- package/dist/providers/direct/nhsCosts.js.map +1 -1
- package/dist/providers/direct/oecd.d.ts.map +1 -1
- package/dist/providers/direct/oecd.js +2 -2
- package/dist/providers/direct/oecd.js.map +1 -1
- package/dist/providers/direct/ohe.d.ts +3 -0
- package/dist/providers/direct/ohe.d.ts.map +1 -0
- package/dist/providers/direct/ohe.js +30 -0
- package/dist/providers/direct/ohe.js.map +1 -0
- package/dist/providers/direct/orangeBook.d.ts.map +1 -1
- package/dist/providers/direct/orangeBook.js +13 -6
- package/dist/providers/direct/orangeBook.js.map +1 -1
- package/dist/providers/direct/pharmapendium.d.ts.map +1 -1
- package/dist/providers/direct/pharmapendium.js +2 -1
- package/dist/providers/direct/pharmapendium.js.map +1 -1
- package/dist/providers/direct/pubmed.d.ts.map +1 -1
- package/dist/providers/direct/pubmed.js +9 -3
- package/dist/providers/direct/pubmed.js.map +1 -1
- package/dist/providers/direct/purpleBook.d.ts.map +1 -1
- package/dist/providers/direct/purpleBook.js +11 -5
- package/dist/providers/direct/purpleBook.js.map +1 -1
- package/dist/providers/direct/scienceDirect.d.ts.map +1 -1
- package/dist/providers/direct/scienceDirect.js +4 -1
- package/dist/providers/direct/scienceDirect.js.map +1 -1
- package/dist/providers/direct/whoGho.d.ts.map +1 -1
- package/dist/providers/direct/whoGho.js +1 -0
- package/dist/providers/direct/whoGho.js.map +1 -1
- package/dist/providers/direct/wiley.d.ts.map +1 -1
- package/dist/providers/direct/wiley.js +3 -1
- package/dist/providers/direct/wiley.js.map +1 -1
- package/dist/providers/direct/worldBank.js +1 -1
- package/dist/providers/direct/worldBank.js.map +1 -1
- package/dist/providers/types.d.ts +2 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/server.js +57 -23
- package/dist/server.js.map +1 -1
- package/dist/sources/registry.d.ts.map +1 -1
- package/dist/sources/registry.js +12 -0
- package/dist/sources/registry.js.map +1 -1
- package/dist/tools/costEffectivenessModel.d.ts +5 -0
- package/dist/tools/costEffectivenessModel.d.ts.map +1 -1
- package/dist/tools/costEffectivenessModel.js +43 -1
- package/dist/tools/costEffectivenessModel.js.map +1 -1
- package/dist/tools/htaDossierPrep.d.ts.map +1 -1
- package/dist/tools/htaDossierPrep.js +17 -0
- package/dist/tools/htaDossierPrep.js.map +1 -1
- package/dist/tools/indirectComparison.d.ts.map +1 -1
- package/dist/tools/indirectComparison.js +40 -0
- package/dist/tools/indirectComparison.js.map +1 -1
- package/dist/tools/itcFeasibility.d.ts +58 -0
- package/dist/tools/itcFeasibility.d.ts.map +1 -0
- package/dist/tools/itcFeasibility.js +332 -0
- package/dist/tools/itcFeasibility.js.map +1 -0
- package/dist/tools/literatureSearch.d.ts.map +1 -1
- package/dist/tools/literatureSearch.js +10 -1
- package/dist/tools/literatureSearch.js.map +1 -1
- package/dist/tools/utilityValueSet.d.ts +43 -0
- package/dist/tools/utilityValueSet.d.ts.map +1 -0
- package/dist/tools/utilityValueSet.js +260 -0
- package/dist/tools/utilityValueSet.js.map +1 -0
- package/dist/tools/validateLinks.d.ts.map +1 -1
- package/dist/tools/validateLinks.js +37 -0
- package/dist/tools/validateLinks.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 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.
|
|
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
|
|
|
@@ -49,7 +49,7 @@ Add to your MCP configuration:
|
|
|
49
49
|
|
|
50
50
|
| Tool | Purpose |
|
|
51
51
|
|------|---------|
|
|
52
|
-
| `literature_search` | Search
|
|
52
|
+
| `literature_search` | Search 42 data sources with a full PRISMA-style audit trail |
|
|
53
53
|
| `screen_abstracts` | PICO-based relevance scoring and study design classification |
|
|
54
54
|
| `risk_of_bias` | Cochrane RoB 2 / ROBINS-I / AMSTAR-2 with GRADE RoB domain summary |
|
|
55
55
|
| `cost_effectiveness_model` | Markov / PartSA / decision-tree CEA with PSA, OWSA, CEAC, EVPI |
|
|
@@ -61,7 +61,7 @@ Add to your MCP configuration:
|
|
|
61
61
|
|
|
62
62
|
### `literature_search`
|
|
63
63
|
|
|
64
|
-
Searches across
|
|
64
|
+
Searches across 42 sources in parallel. Every call returns a **source selection table** showing which of the 42 sources were used and why — essential for HTA audit trails.
|
|
65
65
|
|
|
66
66
|
**Example call:**
|
|
67
67
|
```json
|
|
@@ -197,15 +197,16 @@ This single prompt exercises: `project_create` → `literature_search` → `scre
|
|
|
197
197
|
|
|
198
198
|
## Data Sources
|
|
199
199
|
|
|
200
|
-
**
|
|
200
|
+
**42 sources across 9 categories.** Every `literature_search` call includes a source selection table showing used/not-used status and reason for each.
|
|
201
201
|
|
|
202
202
|
<details>
|
|
203
|
-
<summary><b>Biomedical & Clinical Trials (
|
|
203
|
+
<summary><b>Biomedical & Clinical Trials (5)</b></summary>
|
|
204
204
|
|
|
205
205
|
- **PubMed** — 35M+ biomedical citations (NCBI E-utilities)
|
|
206
206
|
- **ClinicalTrials.gov** — NIH/NLM trial registry (CT.gov v2 API)
|
|
207
207
|
- **bioRxiv / medRxiv** — Life sciences and medical preprints
|
|
208
208
|
- **ChEMBL** — Drug bioactivity, mechanisms, ADMET (EMBL-EBI)
|
|
209
|
+
- **Wiley Online Library** — Pharmacoeconomics, Health Economics, Journal of Medical Economics, Value in Health (CrossRef, ~77% abstract coverage, no key required)
|
|
209
210
|
</details>
|
|
210
211
|
|
|
211
212
|
<details>
|
|
@@ -292,7 +293,7 @@ DOCX files are saved to `~/.heor-agent/projects/{project}/reports/` (when a proj
|
|
|
292
293
|
|
|
293
294
|
Every tool call returns a full audit record:
|
|
294
295
|
|
|
295
|
-
- **Source selection table** — all
|
|
296
|
+
- **Source selection table** — all 42 sources with used/not-used and reason
|
|
296
297
|
- **Sources queried** — queries sent, response counts, status, latency
|
|
297
298
|
- **Inclusions / exclusions** — counts with reasons
|
|
298
299
|
- **Methodology** — PRISMA-style for literature, ISPOR/NICE for economics
|
|
@@ -400,7 +401,7 @@ npm run dev # Run with tsx (no build step)
|
|
|
400
401
|
│ │ 7 MCP tools (Zod-validated) │ │
|
|
401
402
|
│ ├──────────────────────────────────────┤ │
|
|
402
403
|
│ │ DirectProvider (default) │ │
|
|
403
|
-
│ │ ├─
|
|
404
|
+
│ │ ├─ 42 source fetchers │ │
|
|
404
405
|
│ │ ├─ Audit builder + PRISMA trail │ │
|
|
405
406
|
│ │ ├─ Markov / PartSA economic models │ │
|
|
406
407
|
│ │ ├─ Markdown + DOCX formatters │ │
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EQ-5D Value Set Reference Data
|
|
3
|
+
*
|
|
4
|
+
* Static reference data for the four value sets currently relevant to UK HTA submissions.
|
|
5
|
+
* Sources: EuroQol Group (euroqol.org) — value-set registry; Devlin et al. 2018
|
|
6
|
+
* Health Economics (England 5L); Dolan 1997 Medical Care (UK 3L MVH);
|
|
7
|
+
* Hernández Alava et al. 2022 NICE DSU (3L→5L mapping algorithm);
|
|
8
|
+
* NICE ECD16 position statement; OHE publications (ohe.org).
|
|
9
|
+
*
|
|
10
|
+
* Impact estimates from:
|
|
11
|
+
* Biz A.N., Hernández Alava M., Wailoo A. (2026). Switching from EQ-5D-3L to EQ-5D-5L
|
|
12
|
+
* in England: the impact in NICE technology appraisals. Value in Health (forthcoming).
|
|
13
|
+
*
|
|
14
|
+
* This data is PUBLIC knowledge about value sets — not derivative of the EQ-5D instrument
|
|
15
|
+
* itself (which is EuroQol trademark).
|
|
16
|
+
*/
|
|
17
|
+
export type ValueSetId = "uk_3l" | "england_5l" | "uk_5l_new" | "dsu_mapping";
|
|
18
|
+
export interface ValueSet {
|
|
19
|
+
id: ValueSetId;
|
|
20
|
+
name: string;
|
|
21
|
+
country: string;
|
|
22
|
+
version: "3L" | "5L" | "mapped_3L";
|
|
23
|
+
valuation_year: number;
|
|
24
|
+
publication_year: number;
|
|
25
|
+
protocol: string;
|
|
26
|
+
methods: string[];
|
|
27
|
+
n_respondents: number;
|
|
28
|
+
n_states_valued: number;
|
|
29
|
+
full_health_value: number;
|
|
30
|
+
mildest_slight_state: number | null;
|
|
31
|
+
moderate_state_value: number;
|
|
32
|
+
worst_state_value: number;
|
|
33
|
+
pct_states_worse_than_dead: number;
|
|
34
|
+
dimension_weights: {
|
|
35
|
+
mobility: number;
|
|
36
|
+
self_care: number;
|
|
37
|
+
usual_activities: number;
|
|
38
|
+
pain_discomfort: number;
|
|
39
|
+
anxiety_depression: number;
|
|
40
|
+
};
|
|
41
|
+
nice_status: "current" | "superseded" | "consultation" | "interim" | "rejected";
|
|
42
|
+
reference_url: string;
|
|
43
|
+
notes: string;
|
|
44
|
+
}
|
|
45
|
+
export declare const EQ5D_VALUE_SETS: ValueSet[];
|
|
46
|
+
export type IndicationType = "cancer_life_extending" | "non_cancer_life_extending" | "non_cancer_qol_only";
|
|
47
|
+
export interface ImpactEstimate {
|
|
48
|
+
indication_type: IndicationType;
|
|
49
|
+
median_qaly_change_pct: number;
|
|
50
|
+
median_icer_change_pct: number;
|
|
51
|
+
direction: "more_cost_effective" | "less_cost_effective" | "mixed";
|
|
52
|
+
examples: string[];
|
|
53
|
+
caveat: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Anticipated impact of switching UK 3L (via DSU mapping) → new UK 5L value set.
|
|
57
|
+
* Source: Biz, Hernández Alava, Wailoo (2026) — 39 decisions across 37 NICE TAs.
|
|
58
|
+
*/
|
|
59
|
+
export declare const BIZ_2026_IMPACT: ImpactEstimate[];
|
|
60
|
+
export declare function getValueSet(id: ValueSetId): ValueSet | undefined;
|
|
61
|
+
export declare function getImpactEstimate(indication: IndicationType): ImpactEstimate | undefined;
|
|
62
|
+
//# sourceMappingURL=eq5dValueSets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eq5dValueSets.d.ts","sourceRoot":"","sources":["../../src/data/eq5dValueSets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AAE9E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0BAA0B,EAAE,MAAM,CAAC;IACnC,iBAAiB,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,WAAW,EACP,SAAS,GACT,YAAY,GACZ,cAAc,GACd,SAAS,GACT,UAAU,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,eAAe,EAAE,QAAQ,EAmHrC,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,uBAAuB,GACvB,2BAA2B,GAC3B,qBAAqB,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,cAAc,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,OAAO,CAAC;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,EAkC3C,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAEhE;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,cAAc,GACzB,cAAc,GAAG,SAAS,CAE5B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EQ-5D Value Set Reference Data
|
|
3
|
+
*
|
|
4
|
+
* Static reference data for the four value sets currently relevant to UK HTA submissions.
|
|
5
|
+
* Sources: EuroQol Group (euroqol.org) — value-set registry; Devlin et al. 2018
|
|
6
|
+
* Health Economics (England 5L); Dolan 1997 Medical Care (UK 3L MVH);
|
|
7
|
+
* Hernández Alava et al. 2022 NICE DSU (3L→5L mapping algorithm);
|
|
8
|
+
* NICE ECD16 position statement; OHE publications (ohe.org).
|
|
9
|
+
*
|
|
10
|
+
* Impact estimates from:
|
|
11
|
+
* Biz A.N., Hernández Alava M., Wailoo A. (2026). Switching from EQ-5D-3L to EQ-5D-5L
|
|
12
|
+
* in England: the impact in NICE technology appraisals. Value in Health (forthcoming).
|
|
13
|
+
*
|
|
14
|
+
* This data is PUBLIC knowledge about value sets — not derivative of the EQ-5D instrument
|
|
15
|
+
* itself (which is EuroQol trademark).
|
|
16
|
+
*/
|
|
17
|
+
export const EQ5D_VALUE_SETS = [
|
|
18
|
+
{
|
|
19
|
+
id: "uk_3l",
|
|
20
|
+
name: "UK EQ-5D-3L (MVH)",
|
|
21
|
+
country: "United Kingdom",
|
|
22
|
+
version: "3L",
|
|
23
|
+
valuation_year: 1993,
|
|
24
|
+
publication_year: 1997,
|
|
25
|
+
protocol: "Measurement and Valuation of Health (MVH)",
|
|
26
|
+
methods: ["TTO"],
|
|
27
|
+
n_respondents: 2997,
|
|
28
|
+
n_states_valued: 45,
|
|
29
|
+
full_health_value: 1.0,
|
|
30
|
+
mildest_slight_state: null, // 3L has no "slight" level
|
|
31
|
+
moderate_state_value: 0.516, // state 22222
|
|
32
|
+
worst_state_value: -0.594, // state 33333
|
|
33
|
+
pct_states_worse_than_dead: 34.6,
|
|
34
|
+
dimension_weights: {
|
|
35
|
+
mobility: 25.2,
|
|
36
|
+
self_care: 17.2,
|
|
37
|
+
usual_activities: 7.6,
|
|
38
|
+
pain_discomfort: 31.0,
|
|
39
|
+
anxiety_depression: 19.0,
|
|
40
|
+
},
|
|
41
|
+
nice_status: "current",
|
|
42
|
+
reference_url: "https://doi.org/10.1097/00005650-199711000-00002",
|
|
43
|
+
notes: "Dolan 1997. Wide range (−0.594 to 1), bimodal distribution, 34.6% of states worse than dead. Current NICE-recommended set pending 2026 5L adoption.",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "england_5l",
|
|
47
|
+
name: "England EQ-5D-5L (Devlin)",
|
|
48
|
+
country: "England",
|
|
49
|
+
version: "5L",
|
|
50
|
+
valuation_year: 2012,
|
|
51
|
+
publication_year: 2018,
|
|
52
|
+
protocol: "EQ-VT v1.0",
|
|
53
|
+
methods: ["cTTO", "DCE"],
|
|
54
|
+
n_respondents: 996,
|
|
55
|
+
n_states_valued: 86,
|
|
56
|
+
full_health_value: 1.0,
|
|
57
|
+
mildest_slight_state: 0.95, // state 11211 / 12111
|
|
58
|
+
moderate_state_value: 0.593, // state 33333
|
|
59
|
+
worst_state_value: -0.285, // state 55555
|
|
60
|
+
pct_states_worse_than_dead: 5.1,
|
|
61
|
+
dimension_weights: {
|
|
62
|
+
mobility: 21.3,
|
|
63
|
+
self_care: 15.8,
|
|
64
|
+
usual_activities: 14.3,
|
|
65
|
+
pain_discomfort: 26.1,
|
|
66
|
+
anxiety_depression: 22.5,
|
|
67
|
+
},
|
|
68
|
+
nice_status: "rejected",
|
|
69
|
+
reference_url: "https://doi.org/10.1002/hec.3564",
|
|
70
|
+
notes: "Devlin et al. 2018. Independent QA review flagged data and methods concerns; NICE did not adopt. Narrower range than UK 3L, only 5.1% of states worse than dead.",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "dsu_mapping",
|
|
74
|
+
name: "UK 3L via NICE DSU Mapping",
|
|
75
|
+
country: "United Kingdom",
|
|
76
|
+
version: "mapped_3L",
|
|
77
|
+
valuation_year: 2022,
|
|
78
|
+
publication_year: 2022,
|
|
79
|
+
protocol: "NICE DSU Mapping Algorithm (Hernández Alava 2022)",
|
|
80
|
+
methods: ["bespoke mixture copula (5L responses → 3L utilities)"],
|
|
81
|
+
n_respondents: 3551,
|
|
82
|
+
n_states_valued: 3125, // all 5L states mapped
|
|
83
|
+
full_health_value: 0.985, // reference: female aged 40
|
|
84
|
+
mildest_slight_state: 0.932,
|
|
85
|
+
moderate_state_value: 0.424, // state 33333 mapped
|
|
86
|
+
worst_state_value: -0.524, // state 55555 mapped
|
|
87
|
+
pct_states_worse_than_dead: 20.6,
|
|
88
|
+
dimension_weights: {
|
|
89
|
+
// DSU mapping is not a direct 5L value set — dimension weights are not reported
|
|
90
|
+
// at the instrument-level; use UK 3L weights as baseline.
|
|
91
|
+
mobility: 25.2,
|
|
92
|
+
self_care: 17.2,
|
|
93
|
+
usual_activities: 7.6,
|
|
94
|
+
pain_discomfort: 31.0,
|
|
95
|
+
anxiety_depression: 19.0,
|
|
96
|
+
},
|
|
97
|
+
nice_status: "interim",
|
|
98
|
+
reference_url: "https://www.sheffield.ac.uk/nice-dsu/tsds",
|
|
99
|
+
notes: "Hernández Alava et al. 2022. Interim NICE recommendation since 2022 — maps EQ-5D-5L responses to UK 3L utility space. Reference person is female aged 40. Being superseded by the new direct UK 5L value set (2026).",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "uk_5l_new",
|
|
103
|
+
name: "UK EQ-5D-5L (NEW 2026)",
|
|
104
|
+
country: "United Kingdom",
|
|
105
|
+
version: "5L",
|
|
106
|
+
valuation_year: 2023,
|
|
107
|
+
publication_year: 2026,
|
|
108
|
+
protocol: "EQ-VT v2.1",
|
|
109
|
+
methods: ["cTTO"],
|
|
110
|
+
n_respondents: 1200,
|
|
111
|
+
n_states_valued: 102,
|
|
112
|
+
full_health_value: 1.0,
|
|
113
|
+
mildest_slight_state: 0.968, // state 21111
|
|
114
|
+
moderate_state_value: 0.604, // state 33333
|
|
115
|
+
worst_state_value: -0.567, // state 55555
|
|
116
|
+
pct_states_worse_than_dead: 14.7,
|
|
117
|
+
dimension_weights: {
|
|
118
|
+
mobility: 17.8, // ↓ vs UK 3L
|
|
119
|
+
self_care: 13.1, // ↓ vs UK 3L
|
|
120
|
+
usual_activities: 13.5, // ↑ vs UK 3L
|
|
121
|
+
pain_discomfort: 30.6,
|
|
122
|
+
anxiety_depression: 25.0, // ↑ vs UK 3L
|
|
123
|
+
},
|
|
124
|
+
nice_status: "consultation",
|
|
125
|
+
reference_url: "https://www.nice.org.uk/corporate/ecd16",
|
|
126
|
+
notes: "NICE consultation 2026-04-15 to 2026-05-13. Similar range to UK 3L but symmetric distribution (not bimodal). Mild–moderate states have more compressed utilities. Usual activities and anxiety/depression relatively more important; mobility and self-care relatively less.",
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
/**
|
|
130
|
+
* Anticipated impact of switching UK 3L (via DSU mapping) → new UK 5L value set.
|
|
131
|
+
* Source: Biz, Hernández Alava, Wailoo (2026) — 39 decisions across 37 NICE TAs.
|
|
132
|
+
*/
|
|
133
|
+
export const BIZ_2026_IMPACT = [
|
|
134
|
+
{
|
|
135
|
+
indication_type: "cancer_life_extending",
|
|
136
|
+
median_qaly_change_pct: 13.7,
|
|
137
|
+
median_icer_change_pct: -12,
|
|
138
|
+
direction: "more_cost_effective",
|
|
139
|
+
examples: ["Oncology medicines with life-extending effect"],
|
|
140
|
+
caveat: "Driven by higher utility values for severe states under the new 5L set — larger QALY gains in end-of-life phases.",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
indication_type: "non_cancer_life_extending",
|
|
144
|
+
median_qaly_change_pct: 0,
|
|
145
|
+
median_icer_change_pct: -9.6,
|
|
146
|
+
direction: "mixed",
|
|
147
|
+
examples: ["Heterogeneous — 7 of 11 cases saw ICER decrease"],
|
|
148
|
+
caveat: "Results were mixed; in most cases (7 of 11) ICERs decreased, with a median reduction of 9.6% across the category.",
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
indication_type: "non_cancer_qol_only",
|
|
152
|
+
median_qaly_change_pct: -37,
|
|
153
|
+
median_icer_change_pct: 59,
|
|
154
|
+
direction: "less_cost_effective",
|
|
155
|
+
examples: [
|
|
156
|
+
"Migraine",
|
|
157
|
+
"Ulcerative colitis",
|
|
158
|
+
"Atopic dermatitis",
|
|
159
|
+
"Hidradenitis suppurativa",
|
|
160
|
+
"Plaque psoriasis",
|
|
161
|
+
],
|
|
162
|
+
caveat: "The new 5L set has compressed utility values in mild–moderate health states — the range patients typically occupy for chronic QoL-only conditions. This shrinks incremental QALY gains and raises ICERs sharply. Consider requesting NICE flexibilities (non-EQ-5D evidence where instrument is demonstrably inappropriate).",
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
export function getValueSet(id) {
|
|
166
|
+
return EQ5D_VALUE_SETS.find((v) => v.id === id);
|
|
167
|
+
}
|
|
168
|
+
export function getImpactEstimate(indication) {
|
|
169
|
+
return BIZ_2026_IMPACT.find((i) => i.indication_type === indication);
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=eq5dValueSets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eq5dValueSets.js","sourceRoot":"","sources":["../../src/data/eq5dValueSets.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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"}
|
|
@@ -39,9 +39,7 @@ export function comparisonToMarkdown(result) {
|
|
|
39
39
|
lines.push(`| Comparison | ${label} | 95% CI | p-value | Via | Method |`);
|
|
40
40
|
lines.push("|------------|---------|--------|---------|-----|--------|");
|
|
41
41
|
for (const e of estimates) {
|
|
42
|
-
const est = measure === "MD"
|
|
43
|
-
? formatNum(e.estimate)
|
|
44
|
-
: formatNum(e.estimate);
|
|
42
|
+
const est = measure === "MD" ? formatNum(e.estimate) : formatNum(e.estimate);
|
|
45
43
|
const ci = `[${formatNum(e.ci_lower)}, ${formatNum(e.ci_upper)}]`;
|
|
46
44
|
const p = formatP(e.p_value);
|
|
47
45
|
const via = e.commonComparator;
|
|
@@ -50,6 +48,24 @@ export function comparisonToMarkdown(result) {
|
|
|
50
48
|
}
|
|
51
49
|
lines.push("");
|
|
52
50
|
}
|
|
51
|
+
// Heterogeneity statistics (I², Cochran Q)
|
|
52
|
+
if (result.heterogeneity && result.heterogeneity.length > 0) {
|
|
53
|
+
lines.push("### Heterogeneity Statistics");
|
|
54
|
+
lines.push(`Per-comparison heterogeneity across trials of the same pair/outcome/measure. Interpretation bands per Cochrane Handbook Ch. 10.10.`);
|
|
55
|
+
lines.push("");
|
|
56
|
+
lines.push(`| Comparison | k | Cochran Q | df | p-value | I² (%) | τ² | Interpretation |`);
|
|
57
|
+
lines.push(`|---|---:|---:|---:|---:|---:|---:|---|`);
|
|
58
|
+
for (const h of result.heterogeneity) {
|
|
59
|
+
lines.push(`| ${h.comparison_label} | ${h.n_studies} | ${h.cochran_q.toFixed(2)} | ${h.df} | ${h.p_value.toFixed(4)} | ${h.i_squared_pct.toFixed(1)} | ${h.tau_squared.toFixed(4)} | ${h.interpretation_band} |`);
|
|
60
|
+
}
|
|
61
|
+
const anyHigh = result.heterogeneity.some((h) => h.interpretation === "substantial" ||
|
|
62
|
+
h.interpretation === "considerable");
|
|
63
|
+
if (anyHigh) {
|
|
64
|
+
lines.push("");
|
|
65
|
+
lines.push(`> ⚠️ Substantial or considerable heterogeneity detected in at least one comparison. Consider subgroup analysis, meta-regression, or random-effects pooling. Investigate effect modifiers via \`itc_feasibility\`.`);
|
|
66
|
+
}
|
|
67
|
+
lines.push("");
|
|
68
|
+
}
|
|
53
69
|
// Warnings
|
|
54
70
|
if (result.warnings.length > 0) {
|
|
55
71
|
lines.push("### Warnings");
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"comparisonMarkdown.js","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heterogeneity statistics for meta-analysis / network meta-analysis.
|
|
3
|
+
*
|
|
4
|
+
* Implements Cochran's Q, I², τ² (DerSimonian-Laird), and Cochrane-standard
|
|
5
|
+
* interpretation bands. Pure functions — no side effects.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Higgins JPT, Thompson SG. Quantifying heterogeneity in a meta-analysis.
|
|
9
|
+
* Stat Med. 2002;21:1539-1558.
|
|
10
|
+
* - Cochrane Handbook for Systematic Reviews of Interventions, Chapter 10.10.
|
|
11
|
+
*/
|
|
12
|
+
export interface StudyEffect {
|
|
13
|
+
/** Point estimate of the treatment effect (log-scale for OR/HR/RR). */
|
|
14
|
+
estimate: number;
|
|
15
|
+
/** Standard error of the estimate. */
|
|
16
|
+
se: number;
|
|
17
|
+
}
|
|
18
|
+
export interface HeterogeneityResult {
|
|
19
|
+
/** Cochran's Q test statistic. */
|
|
20
|
+
cochran_q: number;
|
|
21
|
+
/** Degrees of freedom (k - 1). */
|
|
22
|
+
df: number;
|
|
23
|
+
/** Two-sided p-value for H0: no heterogeneity. */
|
|
24
|
+
p_value: number;
|
|
25
|
+
/** I² statistic as percentage (0-100). */
|
|
26
|
+
i_squared_pct: number;
|
|
27
|
+
/** Between-study variance (DerSimonian-Laird estimator). */
|
|
28
|
+
tau_squared: number;
|
|
29
|
+
/** Cochrane interpretation: might_not_be_important / moderate / substantial / considerable. */
|
|
30
|
+
interpretation: "might_not_be_important" | "moderate" | "substantial" | "considerable";
|
|
31
|
+
/** Human-readable interpretation label with band. */
|
|
32
|
+
interpretation_band: string;
|
|
33
|
+
/** Number of studies included in the calculation. */
|
|
34
|
+
n_studies: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compute Cochran's Q statistic.
|
|
38
|
+
*
|
|
39
|
+
* Q = Σ w_i * (y_i - ȳ)², where w_i = 1 / SE_i², ȳ = Σ(w_i * y_i) / Σ w_i
|
|
40
|
+
*
|
|
41
|
+
* Under H0 (homogeneity), Q ~ χ²(k-1).
|
|
42
|
+
*/
|
|
43
|
+
export declare function cochranQ(effects: StudyEffect[]): {
|
|
44
|
+
q: number;
|
|
45
|
+
df: number;
|
|
46
|
+
weighted_mean: number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* I² statistic.
|
|
50
|
+
*
|
|
51
|
+
* I² = max(0, 100% × (Q − df) / Q)
|
|
52
|
+
*/
|
|
53
|
+
export declare function iSquared(q: number, df: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* DerSimonian-Laird between-study variance τ².
|
|
56
|
+
*
|
|
57
|
+
* τ² = max(0, (Q − df) / (Σw_i − Σw_i² / Σw_i))
|
|
58
|
+
*/
|
|
59
|
+
export declare function tauSquared(effects: StudyEffect[], q: number, df: number): number;
|
|
60
|
+
/**
|
|
61
|
+
* Upper-tail probability of χ²(df) evaluated at q.
|
|
62
|
+
*
|
|
63
|
+
* Uses a series approximation for the regularised upper incomplete gamma function.
|
|
64
|
+
* Accurate to ~1e-6 for typical meta-analysis Q values (df < 100, q < 200).
|
|
65
|
+
*/
|
|
66
|
+
export declare function chiSquaredPValue(q: number, df: number): number;
|
|
67
|
+
/**
|
|
68
|
+
* Compute the full heterogeneity summary for a set of study effect estimates.
|
|
69
|
+
*
|
|
70
|
+
* Returns zeros and "might_not_be_important" when fewer than 2 studies.
|
|
71
|
+
*/
|
|
72
|
+
export declare function computeHeterogeneity(effects: StudyEffect[]): HeterogeneityResult;
|
|
73
|
+
//# sourceMappingURL=heterogeneity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heterogeneity.d.ts","sourceRoot":"","sources":["../../src/network/heterogeneity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,cAAc,EACV,wBAAwB,GACxB,UAAU,GACV,aAAa,GACb,cAAc,CAAC;IACnB,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAChD,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;CACvB,CAcA;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQhF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAuC9D;AAkDD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,mBAAmB,CA+BhF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heterogeneity statistics for meta-analysis / network meta-analysis.
|
|
3
|
+
*
|
|
4
|
+
* Implements Cochran's Q, I², τ² (DerSimonian-Laird), and Cochrane-standard
|
|
5
|
+
* interpretation bands. Pure functions — no side effects.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Higgins JPT, Thompson SG. Quantifying heterogeneity in a meta-analysis.
|
|
9
|
+
* Stat Med. 2002;21:1539-1558.
|
|
10
|
+
* - Cochrane Handbook for Systematic Reviews of Interventions, Chapter 10.10.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Compute Cochran's Q statistic.
|
|
14
|
+
*
|
|
15
|
+
* Q = Σ w_i * (y_i - ȳ)², where w_i = 1 / SE_i², ȳ = Σ(w_i * y_i) / Σ w_i
|
|
16
|
+
*
|
|
17
|
+
* Under H0 (homogeneity), Q ~ χ²(k-1).
|
|
18
|
+
*/
|
|
19
|
+
export function cochranQ(effects) {
|
|
20
|
+
if (effects.length < 2) {
|
|
21
|
+
return { q: 0, df: 0, weighted_mean: effects[0]?.estimate ?? 0 };
|
|
22
|
+
}
|
|
23
|
+
const weights = effects.map((e) => 1 / (e.se * e.se));
|
|
24
|
+
const sumW = weights.reduce((a, b) => a + b, 0);
|
|
25
|
+
const weighted_mean = effects.reduce((acc, e, i) => acc + weights[i] * e.estimate, 0) / sumW;
|
|
26
|
+
const q = effects.reduce((acc, e, i) => acc + weights[i] * (e.estimate - weighted_mean) * (e.estimate - weighted_mean), 0);
|
|
27
|
+
return { q, df: effects.length - 1, weighted_mean };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* I² statistic.
|
|
31
|
+
*
|
|
32
|
+
* I² = max(0, 100% × (Q − df) / Q)
|
|
33
|
+
*/
|
|
34
|
+
export function iSquared(q, df) {
|
|
35
|
+
if (q <= 0 || df <= 0)
|
|
36
|
+
return 0;
|
|
37
|
+
return Math.max(0, (100 * (q - df)) / q);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* DerSimonian-Laird between-study variance τ².
|
|
41
|
+
*
|
|
42
|
+
* τ² = max(0, (Q − df) / (Σw_i − Σw_i² / Σw_i))
|
|
43
|
+
*/
|
|
44
|
+
export function tauSquared(effects, q, df) {
|
|
45
|
+
if (effects.length < 2 || q <= df)
|
|
46
|
+
return 0;
|
|
47
|
+
const weights = effects.map((e) => 1 / (e.se * e.se));
|
|
48
|
+
const sumW = weights.reduce((a, b) => a + b, 0);
|
|
49
|
+
const sumW2 = weights.reduce((a, b) => a + b * b, 0);
|
|
50
|
+
const c = sumW - sumW2 / sumW;
|
|
51
|
+
if (c <= 0)
|
|
52
|
+
return 0;
|
|
53
|
+
return Math.max(0, (q - df) / c);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Upper-tail probability of χ²(df) evaluated at q.
|
|
57
|
+
*
|
|
58
|
+
* Uses a series approximation for the regularised upper incomplete gamma function.
|
|
59
|
+
* Accurate to ~1e-6 for typical meta-analysis Q values (df < 100, q < 200).
|
|
60
|
+
*/
|
|
61
|
+
export function chiSquaredPValue(q, df) {
|
|
62
|
+
if (df <= 0 || q <= 0)
|
|
63
|
+
return 1;
|
|
64
|
+
// P(Q > q) = 1 - regularized_lower_gamma(df/2, q/2)
|
|
65
|
+
const a = df / 2;
|
|
66
|
+
const x = q / 2;
|
|
67
|
+
// Use series for x < a + 1, continued fraction otherwise (Numerical Recipes)
|
|
68
|
+
if (x < a + 1) {
|
|
69
|
+
// Series expansion of P(a, x)
|
|
70
|
+
let term = 1 / a;
|
|
71
|
+
let sum = term;
|
|
72
|
+
for (let n = 1; n < 200; n++) {
|
|
73
|
+
term *= x / (a + n);
|
|
74
|
+
sum += term;
|
|
75
|
+
if (Math.abs(term) < Math.abs(sum) * 1e-10)
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
const lowerIncomplete = sum * Math.exp(-x + a * Math.log(x) - logGamma(a));
|
|
79
|
+
return Math.max(0, Math.min(1, 1 - lowerIncomplete));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Continued fraction for Q(a, x) directly
|
|
83
|
+
const FPMIN = 1e-300;
|
|
84
|
+
let b = x + 1 - a;
|
|
85
|
+
let c = 1 / FPMIN;
|
|
86
|
+
let d = 1 / b;
|
|
87
|
+
let h = d;
|
|
88
|
+
for (let n = 1; n < 200; n++) {
|
|
89
|
+
const an = -n * (n - a);
|
|
90
|
+
b += 2;
|
|
91
|
+
d = an * d + b;
|
|
92
|
+
if (Math.abs(d) < FPMIN)
|
|
93
|
+
d = FPMIN;
|
|
94
|
+
c = b + an / c;
|
|
95
|
+
if (Math.abs(c) < FPMIN)
|
|
96
|
+
c = FPMIN;
|
|
97
|
+
d = 1 / d;
|
|
98
|
+
const delta = d * c;
|
|
99
|
+
h *= delta;
|
|
100
|
+
if (Math.abs(delta - 1) < 1e-10)
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
const upperIncomplete = h * Math.exp(-x + a * Math.log(x) - logGamma(a));
|
|
104
|
+
return Math.max(0, Math.min(1, upperIncomplete));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function logGamma(x) {
|
|
108
|
+
// Lanczos approximation
|
|
109
|
+
const g = 7;
|
|
110
|
+
const c = [
|
|
111
|
+
0.99999999999980993, 676.5203681218851, -1259.1392167224028,
|
|
112
|
+
771.32342877765313, -176.61502916214059, 12.507343278686905,
|
|
113
|
+
-0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7,
|
|
114
|
+
];
|
|
115
|
+
if (x < 0.5) {
|
|
116
|
+
return Math.log(Math.PI / Math.sin(Math.PI * x)) - logGamma(1 - x);
|
|
117
|
+
}
|
|
118
|
+
x -= 1;
|
|
119
|
+
let a = c[0];
|
|
120
|
+
const t = x + g + 0.5;
|
|
121
|
+
for (let i = 1; i < c.length; i++) {
|
|
122
|
+
a += c[i] / (x + i);
|
|
123
|
+
}
|
|
124
|
+
return 0.5 * Math.log(2 * Math.PI) + (x + 0.5) * Math.log(t) - t + Math.log(a);
|
|
125
|
+
}
|
|
126
|
+
function interpretI2(i2) {
|
|
127
|
+
if (i2 < 30) {
|
|
128
|
+
return {
|
|
129
|
+
interpretation: "might_not_be_important",
|
|
130
|
+
interpretation_band: "0–40% → might not be important",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (i2 < 50) {
|
|
134
|
+
return {
|
|
135
|
+
interpretation: "moderate",
|
|
136
|
+
interpretation_band: "30–60% → moderate heterogeneity",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (i2 < 75) {
|
|
140
|
+
return {
|
|
141
|
+
interpretation: "substantial",
|
|
142
|
+
interpretation_band: "50–90% → substantial heterogeneity",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
interpretation: "considerable",
|
|
147
|
+
interpretation_band: "75–100% → considerable heterogeneity",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Compute the full heterogeneity summary for a set of study effect estimates.
|
|
152
|
+
*
|
|
153
|
+
* Returns zeros and "might_not_be_important" when fewer than 2 studies.
|
|
154
|
+
*/
|
|
155
|
+
export function computeHeterogeneity(effects) {
|
|
156
|
+
const n = effects.length;
|
|
157
|
+
if (n < 2) {
|
|
158
|
+
return {
|
|
159
|
+
cochran_q: 0,
|
|
160
|
+
df: 0,
|
|
161
|
+
p_value: 1,
|
|
162
|
+
i_squared_pct: 0,
|
|
163
|
+
tau_squared: 0,
|
|
164
|
+
interpretation: "might_not_be_important",
|
|
165
|
+
interpretation_band: "insufficient studies (n < 2)",
|
|
166
|
+
n_studies: n,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const { q, df } = cochranQ(effects);
|
|
170
|
+
const i2 = iSquared(q, df);
|
|
171
|
+
const tau2 = tauSquared(effects, q, df);
|
|
172
|
+
const p = chiSquaredPValue(q, df);
|
|
173
|
+
const { interpretation, interpretation_band } = interpretI2(i2);
|
|
174
|
+
return {
|
|
175
|
+
cochran_q: q,
|
|
176
|
+
df,
|
|
177
|
+
p_value: p,
|
|
178
|
+
i_squared_pct: i2,
|
|
179
|
+
tau_squared: tau2,
|
|
180
|
+
interpretation,
|
|
181
|
+
interpretation_band,
|
|
182
|
+
n_studies: n,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=heterogeneity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heterogeneity.js","sourceRoot":"","sources":["../../src/network/heterogeneity.ts"],"names":[],"mappings":"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"}
|