heor-agent-mcp 0.2.0 → 0.3.0

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/dist/formatters/comparisonMarkdown.d.ts +3 -0
  2. package/dist/formatters/comparisonMarkdown.d.ts.map +1 -0
  3. package/dist/formatters/comparisonMarkdown.js +68 -0
  4. package/dist/formatters/comparisonMarkdown.js.map +1 -0
  5. package/dist/network/bucher.d.ts +29 -0
  6. package/dist/network/bucher.d.ts.map +1 -0
  7. package/dist/network/bucher.js +125 -0
  8. package/dist/network/bucher.js.map +1 -0
  9. package/dist/network/frequentistNma.d.ts +12 -0
  10. package/dist/network/frequentistNma.d.ts.map +1 -0
  11. package/dist/network/frequentistNma.js +230 -0
  12. package/dist/network/frequentistNma.js.map +1 -0
  13. package/dist/network/index.d.ts +4 -1
  14. package/dist/network/index.d.ts.map +1 -1
  15. package/dist/network/index.js +3 -0
  16. package/dist/network/index.js.map +1 -1
  17. package/dist/network/pathfinder.d.ts +14 -0
  18. package/dist/network/pathfinder.d.ts.map +1 -0
  19. package/dist/network/pathfinder.js +93 -0
  20. package/dist/network/pathfinder.js.map +1 -0
  21. package/dist/network/types.d.ts +45 -0
  22. package/dist/network/types.d.ts.map +1 -1
  23. package/dist/providers/direct/index.d.ts.map +1 -1
  24. package/dist/providers/direct/index.js +62 -27
  25. package/dist/providers/direct/index.js.map +1 -1
  26. package/dist/providers/types.d.ts +1 -0
  27. package/dist/providers/types.d.ts.map +1 -1
  28. package/dist/server.js +5 -0
  29. package/dist/server.js.map +1 -1
  30. package/dist/tools/indirectComparison.d.ts +73 -0
  31. package/dist/tools/indirectComparison.d.ts.map +1 -0
  32. package/dist/tools/indirectComparison.js +191 -0
  33. package/dist/tools/indirectComparison.js.map +1 -0
  34. package/dist/tools/literatureSearch.d.ts +4 -0
  35. package/dist/tools/literatureSearch.d.ts.map +1 -1
  36. package/dist/tools/literatureSearch.js +43 -1
  37. package/dist/tools/literatureSearch.js.map +1 -1
  38. package/package.json +4 -2
@@ -0,0 +1,3 @@
1
+ import type { IndirectComparisonResult } from "../network/types.js";
2
+ export declare function comparisonToMarkdown(result: IndirectComparisonResult): string;
3
+ //# sourceMappingURL=comparisonMarkdown.d.ts.map
@@ -0,0 +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,CAClC,MAAM,EAAE,wBAAwB,GAC/B,MAAM,CAgFR"}
@@ -0,0 +1,68 @@
1
+ function formatNum(n, decimals = 2) {
2
+ return n.toFixed(decimals);
3
+ }
4
+ function formatP(p) {
5
+ if (p < 0.001)
6
+ return "<0.001";
7
+ if (p < 0.01)
8
+ return formatNum(p, 3);
9
+ return formatNum(p, 3);
10
+ }
11
+ export function comparisonToMarkdown(result) {
12
+ const lines = [];
13
+ lines.push("## Indirect Treatment Comparisons");
14
+ lines.push("");
15
+ const methodLabel = result.method === "bucher"
16
+ ? "Bucher Method"
17
+ : result.method === "frequentist_nma"
18
+ ? "Frequentist Network Meta-Analysis"
19
+ : "Mixed Methods";
20
+ lines.push(`**Method:** ${methodLabel}`);
21
+ lines.push(`**Comparisons:** ${result.estimates.length}`);
22
+ lines.push("");
23
+ if (result.estimates.length === 0) {
24
+ lines.push("No indirect comparisons could be computed. Check that comparisons share a common comparator and measure the same outcome.");
25
+ return lines.join("\n");
26
+ }
27
+ // Group by outcome
28
+ const outcomes = new Map();
29
+ for (const e of result.estimates) {
30
+ if (!outcomes.has(e.outcome))
31
+ outcomes.set(e.outcome, []);
32
+ outcomes.get(e.outcome).push(e);
33
+ }
34
+ for (const [outcome, estimates] of outcomes) {
35
+ lines.push(`### ${outcome}`);
36
+ lines.push("");
37
+ const measure = estimates[0].measure;
38
+ const label = measure === "MD" ? "MD" : measure;
39
+ lines.push(`| Comparison | ${label} | 95% CI | p-value | Via | Method |`);
40
+ lines.push("|------------|---------|--------|---------|-----|--------|");
41
+ for (const e of estimates) {
42
+ const est = measure === "MD"
43
+ ? formatNum(e.estimate)
44
+ : formatNum(e.estimate);
45
+ const ci = `[${formatNum(e.ci_lower)}, ${formatNum(e.ci_upper)}]`;
46
+ const p = formatP(e.p_value);
47
+ const via = e.commonComparator;
48
+ const method = e.method === "bucher" ? "Bucher" : "Freq. NMA";
49
+ lines.push(`| ${e.intervention} vs ${e.comparator} | ${est} | ${ci} | ${p} | ${via} | ${method} |`);
50
+ }
51
+ lines.push("");
52
+ }
53
+ // Warnings
54
+ if (result.warnings.length > 0) {
55
+ lines.push("### Warnings");
56
+ for (const w of result.warnings) {
57
+ lines.push(`- ⚠️ ${w}`);
58
+ }
59
+ lines.push("");
60
+ }
61
+ // Limitations
62
+ lines.push("### Limitations");
63
+ for (const l of result.limitations) {
64
+ lines.push(`- ${l}`);
65
+ }
66
+ return lines.join("\n");
67
+ }
68
+ //# sourceMappingURL=comparisonMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparisonMarkdown.js","sourceRoot":"","sources":["../../src/formatters/comparisonMarkdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { EffectMeasure, PooledEstimate, DirectComparison, IndirectEstimate } from "./types.js";
2
+ /** Standard error from 95% CI */
3
+ export declare function seFromCI(lower: number, upper: number): number;
4
+ /** Normal CDF approximation (Abramowitz & Stegun 26.2.17) */
5
+ export declare function normalCDF(x: number): number;
6
+ /** Two-tailed p-value from z-score */
7
+ export declare function pValueFromZ(z: number): number;
8
+ /** Fixed-effect inverse-variance pooling */
9
+ export declare function poolFixedEffect(studies: Array<{
10
+ value: number;
11
+ se: number;
12
+ }>): PooledEstimate;
13
+ /** Bucher indirect comparison: A vs C = A vs B - C vs B */
14
+ export declare function bucherIndirect(ab: PooledEstimate, cb: PooledEstimate): {
15
+ value: number;
16
+ se: number;
17
+ z: number;
18
+ p_value: number;
19
+ };
20
+ /**
21
+ * Compute a single indirect comparison A vs C through common comparator B.
22
+ *
23
+ * directAB: studies comparing A (intervention) vs B (comparator)
24
+ * directCB: studies comparing C (intervention) vs B (comparator)
25
+ *
26
+ * Returns the indirect estimate of A vs C.
27
+ */
28
+ export declare function computeIndirectComparison(intervention: string, comparator: string, bridge: string, directAB: DirectComparison[], directCB: DirectComparison[], outcome: string, measure: EffectMeasure): IndirectEstimate;
29
+ //# sourceMappingURL=bucher.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,125 @@
1
+ /** Standard error from 95% CI */
2
+ export function seFromCI(lower, upper) {
3
+ return (upper - lower) / 3.92;
4
+ }
5
+ /** Normal CDF approximation (Abramowitz & Stegun 26.2.17) */
6
+ export function normalCDF(x) {
7
+ const sign = x < 0 ? -1 : 1;
8
+ const z = Math.abs(x);
9
+ const t = 1.0 / (1.0 + 0.2316419 * z);
10
+ const d = 0.3989422804014327; // 1/sqrt(2*pi)
11
+ const p = d *
12
+ Math.exp((-z * z) / 2.0) *
13
+ (t *
14
+ (0.319381530 +
15
+ t *
16
+ (-0.356563782 +
17
+ t * (1.781477937 + t * (-1.821255978 + t * 1.330274429)))));
18
+ return sign === 1 ? 1.0 - p : p;
19
+ }
20
+ /** Two-tailed p-value from z-score */
21
+ export function pValueFromZ(z) {
22
+ return 2 * (1 - normalCDF(Math.abs(z)));
23
+ }
24
+ /** Whether the measure operates on a log scale */
25
+ function isLogScale(measure) {
26
+ return measure === "OR" || measure === "RR" || measure === "HR";
27
+ }
28
+ /** Convert to working scale (log for ratio measures) */
29
+ function toWorkingScale(estimate, se, measure) {
30
+ if (isLogScale(measure)) {
31
+ return { value: Math.log(estimate), se };
32
+ }
33
+ return { value: estimate, se };
34
+ }
35
+ /** Convert SE from CI on the original scale to working scale */
36
+ function seOnWorkingScale(estimate, ci_lower, ci_upper, measure) {
37
+ if (isLogScale(measure)) {
38
+ return (Math.log(ci_upper) - Math.log(ci_lower)) / 3.92;
39
+ }
40
+ return seFromCI(ci_lower, ci_upper);
41
+ }
42
+ /** Back-transform from working scale */
43
+ function fromWorkingScale(value, lower, upper, measure) {
44
+ if (isLogScale(measure)) {
45
+ return {
46
+ estimate: Math.exp(value),
47
+ ci_lower: Math.exp(lower),
48
+ ci_upper: Math.exp(upper),
49
+ };
50
+ }
51
+ return { estimate: value, ci_lower: lower, ci_upper: upper };
52
+ }
53
+ /** Fixed-effect inverse-variance pooling */
54
+ export function poolFixedEffect(studies) {
55
+ if (studies.length === 0) {
56
+ throw new Error("No studies to pool");
57
+ }
58
+ if (studies.length === 1) {
59
+ return { value: studies[0].value, se: studies[0].se, n_studies: 1 };
60
+ }
61
+ let sumW = 0;
62
+ let sumWY = 0;
63
+ for (const s of studies) {
64
+ const w = 1 / (s.se * s.se);
65
+ sumW += w;
66
+ sumWY += w * s.value;
67
+ }
68
+ return {
69
+ value: sumWY / sumW,
70
+ se: Math.sqrt(1 / sumW),
71
+ n_studies: studies.length,
72
+ };
73
+ }
74
+ /** Bucher indirect comparison: A vs C = A vs B - C vs B */
75
+ export function bucherIndirect(ab, cb) {
76
+ const value = ab.value - cb.value;
77
+ const se = Math.sqrt(ab.se * ab.se + cb.se * cb.se);
78
+ const z = value / se;
79
+ const p_value = pValueFromZ(z);
80
+ return { value, se, z, p_value };
81
+ }
82
+ /**
83
+ * Compute a single indirect comparison A vs C through common comparator B.
84
+ *
85
+ * directAB: studies comparing A (intervention) vs B (comparator)
86
+ * directCB: studies comparing C (intervention) vs B (comparator)
87
+ *
88
+ * Returns the indirect estimate of A vs C.
89
+ */
90
+ export function computeIndirectComparison(intervention, comparator, bridge, directAB, directCB, outcome, measure) {
91
+ // Convert to working scale and pool
92
+ const abStudies = directAB.map((d) => ({
93
+ value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
94
+ se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
95
+ }));
96
+ const cbStudies = directCB.map((d) => ({
97
+ value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
98
+ se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
99
+ }));
100
+ const pooledAB = poolFixedEffect(abStudies);
101
+ const pooledCB = poolFixedEffect(cbStudies);
102
+ // Bucher indirect
103
+ const indirect = bucherIndirect(pooledAB, pooledCB);
104
+ // Back-transform
105
+ const ciLowerWorking = indirect.value - 1.96 * indirect.se;
106
+ const ciUpperWorking = indirect.value + 1.96 * indirect.se;
107
+ const result = fromWorkingScale(indirect.value, ciLowerWorking, ciUpperWorking, measure);
108
+ return {
109
+ intervention,
110
+ comparator,
111
+ commonComparator: bridge,
112
+ outcome,
113
+ measure,
114
+ method: "bucher",
115
+ estimate: result.estimate,
116
+ se: indirect.se,
117
+ ci_lower: result.ci_lower,
118
+ ci_upper: result.ci_upper,
119
+ z: indirect.z,
120
+ p_value: indirect.p_value,
121
+ pooled_ab: pooledAB,
122
+ pooled_bc: pooledCB,
123
+ };
124
+ }
125
+ //# sourceMappingURL=bucher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucher.js","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DirectComparison, EffectMeasure, IndirectEstimate } from "./types.js";
2
+ /**
3
+ * Frequentist contrast-based NMA using weighted least squares.
4
+ *
5
+ * Given a set of direct comparisons (possibly multiple per edge),
6
+ * estimates all pairwise treatment effects relative to a reference.
7
+ *
8
+ * For small networks this is equivalent to the graph-theoretical
9
+ * approach (Rücker 2012).
10
+ */
11
+ export declare function frequentistNMA(comparisons: DirectComparison[], outcome: string, measure: EffectMeasure): IndirectEstimate[];
12
+ //# sourceMappingURL=frequentistNma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frequentistNma.d.ts","sourceRoot":"","sources":["../../src/network/frequentistNma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AA0BpB;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,gBAAgB,EAAE,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GACrB,gBAAgB,EAAE,CA4LpB"}
@@ -0,0 +1,230 @@
1
+ import { seFromCI, pValueFromZ, poolFixedEffect } from "./bucher.js";
2
+ function isLogScale(measure) {
3
+ return measure === "OR" || measure === "RR" || measure === "HR";
4
+ }
5
+ function toWorkingScale(d) {
6
+ const log = isLogScale(d.measure);
7
+ const se = log
8
+ ? (Math.log(d.ci_upper) - Math.log(d.ci_lower)) / 3.92
9
+ : seFromCI(d.ci_lower, d.ci_upper);
10
+ const value = log ? Math.log(d.estimate) : d.estimate;
11
+ return { value, se };
12
+ }
13
+ /**
14
+ * Frequentist contrast-based NMA using weighted least squares.
15
+ *
16
+ * Given a set of direct comparisons (possibly multiple per edge),
17
+ * estimates all pairwise treatment effects relative to a reference.
18
+ *
19
+ * For small networks this is equivalent to the graph-theoretical
20
+ * approach (Rücker 2012).
21
+ */
22
+ export function frequentistNMA(comparisons, outcome, measure) {
23
+ // Filter to the specified outcome
24
+ const relevant = comparisons.filter((c) => c.outcome === outcome && c.measure === measure);
25
+ if (relevant.length === 0)
26
+ return [];
27
+ // Pool direct comparisons by edge (intervention-comparator pair)
28
+ const edgeKey = (a, b) => [a, b].sort().join("↔");
29
+ const edgeMap = new Map();
30
+ for (const d of relevant) {
31
+ const ws = toWorkingScale(d);
32
+ const key = edgeKey(d.intervention, d.comparator);
33
+ if (!edgeMap.has(key)) {
34
+ edgeMap.set(key, { a: d.intervention, b: d.comparator, studies: [] });
35
+ }
36
+ const edge = edgeMap.get(key);
37
+ // Ensure consistent direction: if stored as B-A but input is A-B
38
+ if (edge.a === d.comparator && edge.b === d.intervention) {
39
+ ws.value = -ws.value; // flip direction
40
+ }
41
+ edge.studies.push(ws);
42
+ }
43
+ // Pool each edge
44
+ const contrasts = [];
45
+ for (const edge of edgeMap.values()) {
46
+ const pooled = poolFixedEffect(edge.studies);
47
+ contrasts.push({
48
+ a: edge.a,
49
+ b: edge.b,
50
+ value: pooled.value,
51
+ se: pooled.se,
52
+ n_studies: pooled.n_studies,
53
+ });
54
+ }
55
+ // Collect all treatment names
56
+ const treatments = new Set();
57
+ for (const c of contrasts) {
58
+ treatments.add(c.a);
59
+ treatments.add(c.b);
60
+ }
61
+ const treatmentList = Array.from(treatments).sort();
62
+ const n = treatmentList.length;
63
+ const idx = new Map(treatmentList.map((t, i) => [t, i]));
64
+ if (n < 2)
65
+ return [];
66
+ // Reference treatment = first alphabetically
67
+ const ref = treatmentList[0];
68
+ // Build design matrix and weight matrix
69
+ // Each contrast gives one equation: effect_a - effect_b = observed_value
70
+ // Parameters: treatment effects relative to reference (n-1 params)
71
+ const m = contrasts.length; // number of equations
72
+ const p = n - 1; // number of parameters
73
+ // X: m x p design matrix
74
+ // W: m x m diagonal weight matrix (1/se^2)
75
+ // y: m x 1 observation vector
76
+ const X = Array.from({ length: m }, () => Array(p).fill(0));
77
+ const W = new Array(m);
78
+ const y = new Array(m);
79
+ for (let i = 0; i < m; i++) {
80
+ const c = contrasts[i];
81
+ const ia = idx.get(c.a);
82
+ const ib = idx.get(c.b);
83
+ // effect_a - effect_b (relative to reference, which has effect = 0)
84
+ if (ia > 0)
85
+ X[i][ia - 1] = 1; // a is not reference
86
+ if (ib > 0)
87
+ X[i][ib - 1] = -1; // b is not reference
88
+ W[i] = 1 / (c.se * c.se);
89
+ y[i] = c.value;
90
+ }
91
+ // Solve: beta = (X'WX)^-1 X'Wy
92
+ // X'WX is p x p
93
+ const XtWX = Array.from({ length: p }, () => Array(p).fill(0));
94
+ const XtWy = Array(p).fill(0);
95
+ for (let i = 0; i < m; i++) {
96
+ for (let j = 0; j < p; j++) {
97
+ XtWy[j] += X[i][j] * W[i] * y[i];
98
+ for (let k = 0; k < p; k++) {
99
+ XtWX[j][k] += X[i][j] * W[i] * X[i][k];
100
+ }
101
+ }
102
+ }
103
+ // Invert XtWX using Gaussian elimination
104
+ const invXtWX = invertMatrix(XtWX);
105
+ if (!invXtWX) {
106
+ // Singular — network is disconnected or underdetermined
107
+ return [];
108
+ }
109
+ // beta = invXtWX * XtWy
110
+ const beta = Array(p).fill(0);
111
+ for (let j = 0; j < p; j++) {
112
+ for (let k = 0; k < p; k++) {
113
+ beta[j] += invXtWX[j][k] * XtWy[k];
114
+ }
115
+ }
116
+ // SE of each beta: sqrt(diag(invXtWX))
117
+ const seBeta = Array(p).fill(0);
118
+ for (let j = 0; j < p; j++) {
119
+ seBeta[j] = Math.sqrt(invXtWX[j][j]);
120
+ }
121
+ // Generate all pairwise comparisons
122
+ const estimates = [];
123
+ for (let i = 0; i < n; i++) {
124
+ for (let j = i + 1; j < n; j++) {
125
+ const tA = treatmentList[i];
126
+ const tB = treatmentList[j];
127
+ // Effect A vs B = effect_A - effect_B (relative to ref)
128
+ let value;
129
+ let variance;
130
+ if (i === 0) {
131
+ // A is reference: effect = -beta_B
132
+ value = -beta[j - 1];
133
+ variance = invXtWX[j - 1][j - 1];
134
+ }
135
+ else if (j === 0) {
136
+ // B is reference: effect = beta_A
137
+ value = beta[i - 1];
138
+ variance = invXtWX[i - 1][i - 1];
139
+ }
140
+ else {
141
+ // Neither is reference: effect = beta_A - beta_B
142
+ value = beta[i - 1] - beta[j - 1];
143
+ variance =
144
+ invXtWX[i - 1][i - 1] +
145
+ invXtWX[j - 1][j - 1] -
146
+ 2 * invXtWX[i - 1][j - 1];
147
+ }
148
+ const se = Math.sqrt(Math.max(0, variance));
149
+ const z = se > 0 ? value / se : 0;
150
+ const p_value = pValueFromZ(z);
151
+ let estimate;
152
+ let ci_lower;
153
+ let ci_upper;
154
+ if (isLogScale(measure)) {
155
+ estimate = Math.exp(value);
156
+ ci_lower = Math.exp(value - 1.96 * se);
157
+ ci_upper = Math.exp(value + 1.96 * se);
158
+ }
159
+ else {
160
+ estimate = value;
161
+ ci_lower = value - 1.96 * se;
162
+ ci_upper = value + 1.96 * se;
163
+ }
164
+ // Check if this is a direct or indirect comparison
165
+ const directKey = edgeKey(tA, tB);
166
+ const isDirect = edgeMap.has(directKey);
167
+ estimates.push({
168
+ intervention: tA,
169
+ comparator: tB,
170
+ commonComparator: isDirect ? "(direct)" : ref,
171
+ outcome,
172
+ measure,
173
+ method: "frequentist_nma",
174
+ estimate,
175
+ se,
176
+ ci_lower,
177
+ ci_upper,
178
+ z,
179
+ p_value,
180
+ pooled_ab: { value: beta[Math.max(0, i - 1)] ?? 0, se: seBeta[Math.max(0, i - 1)] ?? 0, n_studies: 0 },
181
+ pooled_bc: { value: beta[Math.max(0, j - 1)] ?? 0, se: seBeta[Math.max(0, j - 1)] ?? 0, n_studies: 0 },
182
+ });
183
+ }
184
+ }
185
+ return estimates;
186
+ }
187
+ /** Gaussian elimination matrix inversion for small matrices */
188
+ function invertMatrix(matrix) {
189
+ const n = matrix.length;
190
+ // Augmented matrix [A | I]
191
+ const aug = matrix.map((row, i) => {
192
+ const augRow = [...row];
193
+ for (let j = 0; j < n; j++) {
194
+ augRow.push(i === j ? 1 : 0);
195
+ }
196
+ return augRow;
197
+ });
198
+ for (let col = 0; col < n; col++) {
199
+ // Find pivot
200
+ let maxRow = col;
201
+ let maxVal = Math.abs(aug[col][col]);
202
+ for (let row = col + 1; row < n; row++) {
203
+ if (Math.abs(aug[row][col]) > maxVal) {
204
+ maxVal = Math.abs(aug[row][col]);
205
+ maxRow = row;
206
+ }
207
+ }
208
+ if (maxVal < 1e-12)
209
+ return null; // Singular
210
+ // Swap rows
211
+ [aug[col], aug[maxRow]] = [aug[maxRow], aug[col]];
212
+ // Scale pivot row
213
+ const pivot = aug[col][col];
214
+ for (let j = 0; j < 2 * n; j++) {
215
+ aug[col][j] /= pivot;
216
+ }
217
+ // Eliminate column
218
+ for (let row = 0; row < n; row++) {
219
+ if (row === col)
220
+ continue;
221
+ const factor = aug[row][col];
222
+ for (let j = 0; j < 2 * n; j++) {
223
+ aug[row][j] -= factor * aug[col][j];
224
+ }
225
+ }
226
+ }
227
+ // Extract inverse
228
+ return aug.map((row) => row.slice(n));
229
+ }
230
+ //# sourceMappingURL=frequentistNma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frequentistNma.js","sourceRoot":"","sources":["../../src/network/frequentistNma.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  export { extractComparatorPairs, normalizeDrugName } from "./extractor.js";
2
2
  export { buildEvidenceNetwork } from "./builder.js";
3
- export type { EvidenceNode, EvidenceEdge, EvidenceNetwork, NMAFeasibility, NetworkGap, ComparatorPair, } from "./types.js";
3
+ export { computeIndirectComparison, poolFixedEffect } from "./bucher.js";
4
+ export { frequentistNMA } from "./frequentistNma.js";
5
+ export { findIndirectPaths } from "./pathfinder.js";
6
+ export type { EvidenceNode, EvidenceEdge, EvidenceNetwork, NMAFeasibility, NetworkGap, ComparatorPair, DirectComparison, IndirectEstimate, IndirectComparisonResult, IndirectPath, EffectMeasure, PooledEstimate, } from "./types.js";
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -1,3 +1,6 @@
1
1
  export { extractComparatorPairs, normalizeDrugName } from "./extractor.js";
2
2
  export { buildEvidenceNetwork } from "./builder.js";
3
+ export { computeIndirectComparison, poolFixedEffect } from "./bucher.js";
4
+ export { frequentistNMA } from "./frequentistNma.js";
5
+ export { findIndirectPaths } from "./pathfinder.js";
3
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DirectComparison, IndirectPath } from "./types.js";
2
+ /**
3
+ * Find all indirect comparison paths through a single common comparator.
4
+ *
5
+ * Given comparisons A-B and B-C, returns the path A→B→C allowing
6
+ * indirect estimation of A vs C.
7
+ *
8
+ * If `target` is specified, only returns paths for that specific comparison.
9
+ */
10
+ export declare function findIndirectPaths(comparisons: DirectComparison[], target?: {
11
+ intervention: string;
12
+ comparator: string;
13
+ }): IndirectPath[];
14
+ //# sourceMappingURL=pathfinder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathfinder.d.ts","sourceRoot":"","sources":["../../src/network/pathfinder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,gBAAgB,EAAE,EAC/B,MAAM,CAAC,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpD,YAAY,EAAE,CAqGhB"}