@erosolaraijs/cure 1.0.0 → 1.0.2

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 (69) hide show
  1. package/README.md +46 -94
  2. package/dist/bin/cure.d.ts +2 -5
  3. package/dist/bin/cure.d.ts.map +1 -1
  4. package/dist/bin/cure.js +285 -124
  5. package/dist/bin/cure.js.map +1 -1
  6. package/dist/clinician/decisionSupport.d.ts +325 -0
  7. package/dist/clinician/decisionSupport.d.ts.map +1 -0
  8. package/dist/clinician/decisionSupport.js +604 -0
  9. package/dist/clinician/decisionSupport.js.map +1 -0
  10. package/dist/clinician/index.d.ts +5 -0
  11. package/dist/clinician/index.d.ts.map +1 -0
  12. package/dist/clinician/index.js +5 -0
  13. package/dist/clinician/index.js.map +1 -0
  14. package/dist/compliance/index.d.ts +5 -0
  15. package/dist/compliance/index.d.ts.map +1 -0
  16. package/dist/compliance/index.js +5 -0
  17. package/dist/compliance/index.js.map +1 -0
  18. package/dist/integrations/clinicalTrials/index.d.ts +5 -0
  19. package/dist/integrations/clinicalTrials/index.d.ts.map +1 -0
  20. package/dist/integrations/clinicalTrials/index.js +5 -0
  21. package/dist/integrations/clinicalTrials/index.js.map +1 -0
  22. package/dist/integrations/ehr/index.d.ts +5 -0
  23. package/dist/integrations/ehr/index.d.ts.map +1 -0
  24. package/dist/integrations/ehr/index.js +5 -0
  25. package/dist/integrations/ehr/index.js.map +1 -0
  26. package/dist/integrations/genomics/index.d.ts +5 -0
  27. package/dist/integrations/genomics/index.d.ts.map +1 -0
  28. package/dist/integrations/genomics/index.js +5 -0
  29. package/dist/integrations/genomics/index.js.map +1 -0
  30. package/dist/integrations/index.d.ts +7 -0
  31. package/dist/integrations/index.d.ts.map +1 -0
  32. package/dist/integrations/index.js +10 -0
  33. package/dist/integrations/index.js.map +1 -0
  34. package/dist/ml/index.d.ts +5 -0
  35. package/dist/ml/index.d.ts.map +1 -0
  36. package/dist/ml/index.js +5 -0
  37. package/dist/ml/index.js.map +1 -0
  38. package/dist/ml/outcomePredictor.d.ts +297 -0
  39. package/dist/ml/outcomePredictor.d.ts.map +1 -0
  40. package/dist/ml/outcomePredictor.js +823 -0
  41. package/dist/ml/outcomePredictor.js.map +1 -0
  42. package/dist/patient/index.d.ts +5 -0
  43. package/dist/patient/index.d.ts.map +1 -0
  44. package/dist/patient/index.js +5 -0
  45. package/dist/patient/index.js.map +1 -0
  46. package/dist/patient/patientPortal.d.ts +337 -0
  47. package/dist/patient/patientPortal.d.ts.map +1 -0
  48. package/dist/patient/patientPortal.js +667 -0
  49. package/dist/patient/patientPortal.js.map +1 -0
  50. package/dist/safety/drugInteractions.d.ts +230 -0
  51. package/dist/safety/drugInteractions.d.ts.map +1 -0
  52. package/dist/safety/drugInteractions.js +697 -0
  53. package/dist/safety/drugInteractions.js.map +1 -0
  54. package/dist/safety/index.d.ts +5 -0
  55. package/dist/safety/index.d.ts.map +1 -0
  56. package/dist/safety/index.js +5 -0
  57. package/dist/safety/index.js.map +1 -0
  58. package/dist/validation/index.d.ts +5 -0
  59. package/dist/validation/index.d.ts.map +1 -0
  60. package/dist/validation/index.js +5 -0
  61. package/dist/validation/index.js.map +1 -0
  62. package/dist/validation/retrospectiveValidator.d.ts +246 -0
  63. package/dist/validation/retrospectiveValidator.d.ts.map +1 -0
  64. package/dist/validation/retrospectiveValidator.js +602 -0
  65. package/dist/validation/retrospectiveValidator.js.map +1 -0
  66. package/package.json +1 -1
  67. package/src/bin/cure.ts +331 -140
  68. package/src/clinician/decisionSupport.ts +949 -0
  69. package/src/patient/patientPortal.ts +1039 -0
@@ -0,0 +1,602 @@
1
+ /**
2
+ * Retrospective Validation Framework
3
+ *
4
+ * Provides tools for validating the treatment recommendation system against
5
+ * real patient outcomes. Essential for:
6
+ * - Model performance assessment
7
+ * - Calibration checking
8
+ * - Concordance analysis with actual treatments
9
+ * - Outcome correlation studies
10
+ * - Continuous quality improvement
11
+ *
12
+ * IMPORTANT: All patient data used for validation must be properly de-identified
13
+ * or used with appropriate IRB approval and patient consent.
14
+ */
15
+ import { EventEmitter } from 'events';
16
+ import { createHash } from 'crypto';
17
+ // ═══════════════════════════════════════════════════════════════════════════════
18
+ // VALIDATION SERVICE
19
+ // ═══════════════════════════════════════════════════════════════════════════════
20
+ export class RetrospectiveValidationService extends EventEmitter {
21
+ validationCohorts = new Map();
22
+ systemRecommendations = new Map();
23
+ validationResults = new Map();
24
+ constructor() {
25
+ super();
26
+ }
27
+ /**
28
+ * Load a validation cohort
29
+ */
30
+ loadCohort(cohortId, patients) {
31
+ // De-identify and validate data
32
+ const validatedPatients = patients.map(p => this.validateAndDeidentify(p));
33
+ this.validationCohorts.set(cohortId, validatedPatients);
34
+ this.emit('cohort-loaded', { cohortId, patientCount: validatedPatients.length });
35
+ }
36
+ /**
37
+ * Load system recommendations for comparison
38
+ */
39
+ loadRecommendations(recommendations) {
40
+ for (const rec of recommendations) {
41
+ this.systemRecommendations.set(rec.patientId, rec);
42
+ }
43
+ this.emit('recommendations-loaded', { count: recommendations.length });
44
+ }
45
+ /**
46
+ * Run validation for a cohort
47
+ */
48
+ async runValidation(cohortId) {
49
+ const patients = this.validationCohorts.get(cohortId);
50
+ if (!patients) {
51
+ throw new Error(`Cohort ${cohortId} not found`);
52
+ }
53
+ const results = [];
54
+ // Validate each patient
55
+ for (const patient of patients) {
56
+ const recommendation = this.systemRecommendations.get(patient.id);
57
+ const result = this.validatePatient(patient, recommendation);
58
+ results.push(result);
59
+ this.validationResults.set(patient.id, result);
60
+ }
61
+ // Compute cohort-level metrics
62
+ const analysis = this.computeCohortAnalysis(cohortId, patients, results);
63
+ this.emit('validation-complete', { cohortId, analysis });
64
+ return analysis;
65
+ }
66
+ /**
67
+ * Validate a single patient
68
+ */
69
+ validatePatient(patient, recommendation) {
70
+ // Concordance analysis
71
+ const concordance = this.assessConcordance(patient, recommendation);
72
+ // Calculate actual outcomes
73
+ const actualPFS = this.calculatePFS(patient);
74
+ const actualOS = this.calculateOS(patient);
75
+ const actualGrade3Plus = (patient.outcomes.toxicities || []).some(t => t.grade >= 3);
76
+ // Compare predictions to outcomes
77
+ const outcomeComparison = {
78
+ predictedResponse: recommendation?.predictions.responseRate || 0,
79
+ actualResponse: patient.outcomes.bestResponse,
80
+ responseCorrect: this.assessResponseAccuracy(recommendation?.predictions.responseRate || 0, patient.outcomes.bestResponse),
81
+ predictedPFS: recommendation?.predictions.pfsMonths || 0,
82
+ actualPFS,
83
+ pfsDifference: actualPFS !== undefined ? actualPFS - (recommendation?.predictions.pfsMonths || 0) : undefined,
84
+ predictedOS: recommendation?.predictions.osMonths || 0,
85
+ actualOS,
86
+ osDifference: actualOS !== undefined ? actualOS - (recommendation?.predictions.osMonths || 0) : undefined,
87
+ predictedToxicityRisk: recommendation?.predictions.toxicityRisk || 0,
88
+ actualGrade3PlusToxicity: actualGrade3Plus
89
+ };
90
+ // Clinical benefit assessment
91
+ const clinicalBenefit = {
92
+ objectiveResponse: ['CR', 'PR'].includes(patient.outcomes.bestResponse || ''),
93
+ diseaseControl: ['CR', 'PR', 'SD'].includes(patient.outcomes.bestResponse || ''),
94
+ durableBenefit: actualPFS !== undefined && actualPFS >= 6
95
+ };
96
+ return {
97
+ patientId: patient.id,
98
+ concordance,
99
+ outcomeComparison,
100
+ clinicalBenefit
101
+ };
102
+ }
103
+ /**
104
+ * Assess concordance between recommendation and actual treatment
105
+ */
106
+ assessConcordance(patient, recommendation) {
107
+ if (!recommendation) {
108
+ return {
109
+ regimenMatch: false,
110
+ partialMatch: false,
111
+ matchedDrugs: []
112
+ };
113
+ }
114
+ const actualDrugs = patient.treatment.drugs.map(d => d.toLowerCase());
115
+ const recommendedDrugs = recommendation.recommendedDrugs.map(d => d.toLowerCase());
116
+ const matchedDrugs = recommendedDrugs.filter(rd => actualDrugs.some(ad => this.drugsMatch(ad, rd)));
117
+ const regimenMatch = matchedDrugs.length === recommendedDrugs.length &&
118
+ matchedDrugs.length === actualDrugs.length;
119
+ const partialMatch = matchedDrugs.length > 0;
120
+ return {
121
+ regimenMatch,
122
+ partialMatch,
123
+ matchedDrugs
124
+ };
125
+ }
126
+ /**
127
+ * Check if two drug names refer to the same drug
128
+ */
129
+ drugsMatch(drug1, drug2) {
130
+ // Normalize names
131
+ const normalize = (s) => s.toLowerCase().replace(/[^a-z0-9]/g, '');
132
+ if (normalize(drug1) === normalize(drug2))
133
+ return true;
134
+ // Check brand/generic equivalents
135
+ const equivalents = {
136
+ 'pembrolizumab': ['keytruda'],
137
+ 'nivolumab': ['opdivo'],
138
+ 'osimertinib': ['tagrisso'],
139
+ 'alectinib': ['alecensa'],
140
+ 'trastuzumab': ['herceptin'],
141
+ 'pertuzumab': ['perjeta'],
142
+ 'olaparib': ['lynparza'],
143
+ 'palbociclib': ['ibrance'],
144
+ 'carboplatin': ['paraplatin'],
145
+ 'paclitaxel': ['taxol'],
146
+ 'docetaxel': ['taxotere']
147
+ };
148
+ for (const [generic, brands] of Object.entries(equivalents)) {
149
+ const allNames = [generic, ...brands].map(normalize);
150
+ if (allNames.includes(normalize(drug1)) && allNames.includes(normalize(drug2))) {
151
+ return true;
152
+ }
153
+ }
154
+ return false;
155
+ }
156
+ /**
157
+ * Calculate PFS in months
158
+ */
159
+ calculatePFS(patient) {
160
+ const startDate = patient.treatment.startDate;
161
+ let endDate;
162
+ if (patient.outcomes.progressionDate) {
163
+ endDate = patient.outcomes.progressionDate;
164
+ }
165
+ else if (patient.outcomes.deathDate) {
166
+ endDate = patient.outcomes.deathDate;
167
+ }
168
+ else {
169
+ // Censored at last follow-up
170
+ endDate = patient.outcomes.lastFollowUpDate;
171
+ }
172
+ const months = (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24 * 30.44);
173
+ return Math.round(months * 10) / 10;
174
+ }
175
+ /**
176
+ * Calculate OS in months
177
+ */
178
+ calculateOS(patient) {
179
+ const startDate = patient.diagnosis.diagnosisDate;
180
+ let endDate;
181
+ if (patient.outcomes.deathDate) {
182
+ endDate = patient.outcomes.deathDate;
183
+ }
184
+ else {
185
+ // Censored at last follow-up
186
+ endDate = patient.outcomes.lastFollowUpDate;
187
+ }
188
+ const months = (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24 * 30.44);
189
+ return Math.round(months * 10) / 10;
190
+ }
191
+ /**
192
+ * Assess if response prediction was accurate
193
+ */
194
+ assessResponseAccuracy(predictedRate, actualResponse) {
195
+ if (!actualResponse || actualResponse === 'NE')
196
+ return undefined;
197
+ const predicted = predictedRate >= 0.5 ? 'responder' : 'non-responder';
198
+ const actual = ['CR', 'PR'].includes(actualResponse) ? 'responder' : 'non-responder';
199
+ return predicted === actual;
200
+ }
201
+ /**
202
+ * Compute cohort-level analysis
203
+ */
204
+ computeCohortAnalysis(cohortId, patients, results) {
205
+ // Demographics
206
+ const ages = patients.map(p => p.demographics.ageAtDiagnosis);
207
+ const maleCount = patients.filter(p => p.demographics.gender === 'male').length;
208
+ const stageDistribution = {};
209
+ for (const p of patients) {
210
+ stageDistribution[p.diagnosis.stage] = (stageDistribution[p.diagnosis.stage] || 0) + 1;
211
+ }
212
+ // Concordance metrics
213
+ const fullConcordance = results.filter(r => r.concordance.regimenMatch).length / results.length;
214
+ const partialConcordance = results.filter(r => r.concordance.partialMatch && !r.concordance.regimenMatch).length / results.length;
215
+ // Response accuracy
216
+ const responseResults = results.filter(r => r.outcomeComparison.responseCorrect !== undefined);
217
+ const responseAccuracy = responseResults.length > 0
218
+ ? responseResults.filter(r => r.outcomeComparison.responseCorrect).length / responseResults.length
219
+ : 0;
220
+ // Sensitivity (correctly predicted responders)
221
+ const actualResponders = results.filter(r => ['CR', 'PR'].includes(r.outcomeComparison.actualResponse || ''));
222
+ const responseSensitivity = actualResponders.length > 0
223
+ ? actualResponders.filter(r => r.outcomeComparison.predictedResponse >= 0.5).length / actualResponders.length
224
+ : 0;
225
+ // Specificity (correctly predicted non-responders)
226
+ const actualNonResponders = results.filter(r => ['SD', 'PD'].includes(r.outcomeComparison.actualResponse || ''));
227
+ const responseSpecificity = actualNonResponders.length > 0
228
+ ? actualNonResponders.filter(r => r.outcomeComparison.predictedResponse < 0.5).length / actualNonResponders.length
229
+ : 0;
230
+ // PFS concordance index (simplified)
231
+ const pfsCIndex = this.calculateCIndex(results.map(r => r.outcomeComparison.predictedPFS), results.map(r => r.outcomeComparison.actualPFS || 0));
232
+ // PFS calibration
233
+ const pfsCalibration = this.calculateCalibration(results.map(r => r.outcomeComparison.predictedPFS), results.map(r => r.outcomeComparison.actualPFS || 0));
234
+ // OS metrics (similar calculation)
235
+ const osCIndex = this.calculateCIndex(results.map(r => r.outcomeComparison.predictedOS), results.map(r => r.outcomeComparison.actualOS || 0));
236
+ const osCalibration = this.calculateCalibration(results.map(r => r.outcomeComparison.predictedOS), results.map(r => r.outcomeComparison.actualOS || 0));
237
+ // Toxicity accuracy
238
+ const toxicityResults = results.filter(r => r.outcomeComparison.predictedToxicityRisk > 0);
239
+ const toxicityAccuracy = toxicityResults.length > 0
240
+ ? toxicityResults.filter(r => {
241
+ const predicted = r.outcomeComparison.predictedToxicityRisk >= 0.3;
242
+ return predicted === r.outcomeComparison.actualGrade3PlusToxicity;
243
+ }).length / toxicityResults.length
244
+ : 0;
245
+ // Clinical outcomes
246
+ const objectiveResponseRate = results.filter(r => r.clinicalBenefit.objectiveResponse).length / results.length;
247
+ const diseaseControlRate = results.filter(r => r.clinicalBenefit.diseaseControl).length / results.length;
248
+ const pfsValues = results.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined);
249
+ const medianPFS = this.calculateMedian(pfsValues);
250
+ const osValues = results.map(r => r.outcomeComparison.actualOS).filter(v => v !== undefined);
251
+ const medianOS = this.calculateMedian(osValues);
252
+ // Concordant vs discordant outcomes
253
+ const concordantResults = results.filter(r => r.concordance.regimenMatch || r.concordance.partialMatch);
254
+ const discordantResults = results.filter(r => !r.concordance.regimenMatch && !r.concordance.partialMatch);
255
+ const concordantORR = concordantResults.length > 0
256
+ ? concordantResults.filter(r => r.clinicalBenefit.objectiveResponse).length / concordantResults.length
257
+ : 0;
258
+ const discordantORR = discordantResults.length > 0
259
+ ? discordantResults.filter(r => r.clinicalBenefit.objectiveResponse).length / discordantResults.length
260
+ : 0;
261
+ const concordantPFS = this.calculateMedian(concordantResults.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined));
262
+ const discordantPFS = this.calculateMedian(discordantResults.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined));
263
+ // Subgroup analyses
264
+ const subgroupAnalyses = this.performSubgroupAnalyses(patients, results);
265
+ return {
266
+ cohortId,
267
+ description: `Validation cohort with ${patients.length} patients`,
268
+ patientCount: patients.length,
269
+ dateRange: {
270
+ start: new Date(Math.min(...patients.map(p => p.diagnosis.diagnosisDate.getTime()))),
271
+ end: new Date(Math.max(...patients.map(p => p.outcomes.lastFollowUpDate.getTime())))
272
+ },
273
+ demographics: {
274
+ medianAge: this.calculateMedian(ages),
275
+ ageRange: [Math.min(...ages), Math.max(...ages)],
276
+ genderDistribution: {
277
+ male: maleCount / patients.length,
278
+ female: (patients.length - maleCount) / patients.length
279
+ },
280
+ stageDistribution
281
+ },
282
+ concordance: {
283
+ fullConcordance,
284
+ partialConcordance,
285
+ noConcordance: 1 - fullConcordance - partialConcordance,
286
+ concordanceByBiomarker: this.calculateConcordanceByBiomarker(patients, results)
287
+ },
288
+ predictionAccuracy: {
289
+ responseAccuracy,
290
+ responseSensitivity,
291
+ responseSpecificity,
292
+ pfsCIndex,
293
+ pfsCalibration,
294
+ osCIndex,
295
+ osCalibration,
296
+ toxicityAccuracy
297
+ },
298
+ clinicalImpact: {
299
+ objectiveResponseRate,
300
+ diseaseControlRate,
301
+ medianPFS,
302
+ medianOS,
303
+ concordantVsDiscordant: {
304
+ concordantORR,
305
+ discordantORR,
306
+ concordantMedianPFS: concordantPFS,
307
+ discordantMedianPFS: discordantPFS
308
+ }
309
+ },
310
+ subgroupAnalyses
311
+ };
312
+ }
313
+ /**
314
+ * Calculate concordance index (C-index)
315
+ */
316
+ calculateCIndex(predicted, actual) {
317
+ let concordant = 0;
318
+ let discordant = 0;
319
+ let tied = 0;
320
+ for (let i = 0; i < predicted.length; i++) {
321
+ for (let j = i + 1; j < predicted.length; j++) {
322
+ if (actual[i] !== actual[j]) {
323
+ if ((predicted[i] > predicted[j] && actual[i] > actual[j]) ||
324
+ (predicted[i] < predicted[j] && actual[i] < actual[j])) {
325
+ concordant++;
326
+ }
327
+ else if (predicted[i] !== predicted[j]) {
328
+ discordant++;
329
+ }
330
+ else {
331
+ tied++;
332
+ }
333
+ }
334
+ }
335
+ }
336
+ const total = concordant + discordant + tied;
337
+ return total > 0 ? (concordant + 0.5 * tied) / total : 0.5;
338
+ }
339
+ /**
340
+ * Calculate calibration score (0-1, higher is better)
341
+ */
342
+ calculateCalibration(predicted, actual) {
343
+ if (predicted.length === 0)
344
+ return 0;
345
+ // Group predictions into deciles and compare to actual
346
+ const combined = predicted.map((p, i) => ({ predicted: p, actual: actual[i] }))
347
+ .filter(c => c.actual > 0)
348
+ .sort((a, b) => a.predicted - b.predicted);
349
+ if (combined.length < 10) {
350
+ // Simple correlation for small samples
351
+ const meanPred = combined.reduce((s, c) => s + c.predicted, 0) / combined.length;
352
+ const meanActual = combined.reduce((s, c) => s + c.actual, 0) / combined.length;
353
+ const errors = combined.map(c => Math.abs(c.predicted - c.actual) / Math.max(c.actual, 1));
354
+ const meanError = errors.reduce((s, e) => s + e, 0) / errors.length;
355
+ return Math.max(0, 1 - meanError);
356
+ }
357
+ // For larger samples, use decile calibration
358
+ const decileSize = Math.ceil(combined.length / 10);
359
+ let totalError = 0;
360
+ for (let i = 0; i < 10; i++) {
361
+ const start = i * decileSize;
362
+ const end = Math.min((i + 1) * decileSize, combined.length);
363
+ const decile = combined.slice(start, end);
364
+ const avgPredicted = decile.reduce((s, c) => s + c.predicted, 0) / decile.length;
365
+ const avgActual = decile.reduce((s, c) => s + c.actual, 0) / decile.length;
366
+ const relativeError = avgActual > 0 ? Math.abs(avgPredicted - avgActual) / avgActual : 0;
367
+ totalError += relativeError;
368
+ }
369
+ return Math.max(0, 1 - totalError / 10);
370
+ }
371
+ /**
372
+ * Calculate median of an array
373
+ */
374
+ calculateMedian(values) {
375
+ if (values.length === 0)
376
+ return 0;
377
+ const sorted = [...values].sort((a, b) => a - b);
378
+ const mid = Math.floor(sorted.length / 2);
379
+ return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
380
+ }
381
+ /**
382
+ * Calculate concordance by biomarker subgroup
383
+ */
384
+ calculateConcordanceByBiomarker(patients, results) {
385
+ const biomarkerGroups = {};
386
+ for (let i = 0; i < patients.length; i++) {
387
+ const patient = patients[i];
388
+ const result = results[i];
389
+ // Check various biomarker categories
390
+ const biomarkers = [];
391
+ if (patient.diagnosis.msiStatus === 'MSI-H')
392
+ biomarkers.push('MSI-H');
393
+ if (patient.diagnosis.tmbValue && patient.diagnosis.tmbValue >= 10)
394
+ biomarkers.push('TMB-H');
395
+ if (patient.diagnosis.pdl1Score && patient.diagnosis.pdl1Score >= 50)
396
+ biomarkers.push('PD-L1≥50%');
397
+ if (patient.diagnosis.hrdStatus)
398
+ biomarkers.push('HRD+');
399
+ // Check genomic alterations
400
+ for (const alt of patient.diagnosis.genomicAlterations || []) {
401
+ biomarkers.push(`${alt.gene} ${alt.alteration}`);
402
+ }
403
+ // Record concordance for each biomarker
404
+ for (const biomarker of biomarkers) {
405
+ if (!biomarkerGroups[biomarker]) {
406
+ biomarkerGroups[biomarker] = { concordant: 0, total: 0 };
407
+ }
408
+ biomarkerGroups[biomarker].total++;
409
+ if (result.concordance.regimenMatch || result.concordance.partialMatch) {
410
+ biomarkerGroups[biomarker].concordant++;
411
+ }
412
+ }
413
+ }
414
+ // Convert to concordance rates
415
+ const concordanceByBiomarker = {};
416
+ for (const [biomarker, data] of Object.entries(biomarkerGroups)) {
417
+ if (data.total >= 5) { // Only include groups with meaningful sample size
418
+ concordanceByBiomarker[biomarker] = data.concordant / data.total;
419
+ }
420
+ }
421
+ return concordanceByBiomarker;
422
+ }
423
+ /**
424
+ * Perform subgroup analyses
425
+ */
426
+ performSubgroupAnalyses(patients, results) {
427
+ const subgroups = [];
428
+ // By cancer type
429
+ const cancerTypes = [...new Set(patients.map(p => p.diagnosis.cancerType))];
430
+ for (const cancerType of cancerTypes) {
431
+ const indices = patients.map((p, i) => p.diagnosis.cancerType === cancerType ? i : -1).filter(i => i >= 0);
432
+ if (indices.length >= 10) {
433
+ const subgroupResults = indices.map(i => results[i]);
434
+ const subgroupPatients = indices.map(i => patients[i]);
435
+ subgroups.push({
436
+ subgroup: cancerType,
437
+ patientCount: indices.length,
438
+ concordance: subgroupResults.filter(r => r.concordance.regimenMatch || r.concordance.partialMatch).length / indices.length,
439
+ responseAccuracy: this.calculateSubgroupResponseAccuracy(subgroupResults),
440
+ medianPFS: this.calculateMedian(subgroupResults.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined))
441
+ });
442
+ }
443
+ }
444
+ // By stage
445
+ const stages = ['I', 'II', 'III', 'IV'];
446
+ for (const stageGroup of stages) {
447
+ const indices = patients.map((p, i) => p.diagnosis.stage.startsWith(stageGroup) ? i : -1).filter(i => i >= 0);
448
+ if (indices.length >= 10) {
449
+ const subgroupResults = indices.map(i => results[i]);
450
+ subgroups.push({
451
+ subgroup: `Stage ${stageGroup}`,
452
+ patientCount: indices.length,
453
+ concordance: subgroupResults.filter(r => r.concordance.regimenMatch || r.concordance.partialMatch).length / indices.length,
454
+ responseAccuracy: this.calculateSubgroupResponseAccuracy(subgroupResults),
455
+ medianPFS: this.calculateMedian(subgroupResults.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined))
456
+ });
457
+ }
458
+ }
459
+ // By age group
460
+ const ageGroups = [
461
+ { name: 'Age <50', filter: (p) => p.demographics.ageAtDiagnosis < 50 },
462
+ { name: 'Age 50-65', filter: (p) => p.demographics.ageAtDiagnosis >= 50 && p.demographics.ageAtDiagnosis < 65 },
463
+ { name: 'Age 65-75', filter: (p) => p.demographics.ageAtDiagnosis >= 65 && p.demographics.ageAtDiagnosis < 75 },
464
+ { name: 'Age ≥75', filter: (p) => p.demographics.ageAtDiagnosis >= 75 }
465
+ ];
466
+ for (const ageGroup of ageGroups) {
467
+ const indices = patients.map((p, i) => ageGroup.filter(p) ? i : -1).filter(i => i >= 0);
468
+ if (indices.length >= 10) {
469
+ const subgroupResults = indices.map(i => results[i]);
470
+ subgroups.push({
471
+ subgroup: ageGroup.name,
472
+ patientCount: indices.length,
473
+ concordance: subgroupResults.filter(r => r.concordance.regimenMatch || r.concordance.partialMatch).length / indices.length,
474
+ responseAccuracy: this.calculateSubgroupResponseAccuracy(subgroupResults),
475
+ medianPFS: this.calculateMedian(subgroupResults.map(r => r.outcomeComparison.actualPFS).filter(v => v !== undefined))
476
+ });
477
+ }
478
+ }
479
+ return subgroups;
480
+ }
481
+ /**
482
+ * Calculate response accuracy for a subgroup
483
+ */
484
+ calculateSubgroupResponseAccuracy(results) {
485
+ const withResponse = results.filter(r => r.outcomeComparison.responseCorrect !== undefined);
486
+ return withResponse.length > 0
487
+ ? withResponse.filter(r => r.outcomeComparison.responseCorrect).length / withResponse.length
488
+ : 0;
489
+ }
490
+ /**
491
+ * Validate and de-identify patient data
492
+ */
493
+ validateAndDeidentify(patient) {
494
+ // Generate hashed de-identified ID
495
+ const deidentifiedId = createHash('sha256')
496
+ .update(patient.id + 'SALT_CHANGE_IN_PRODUCTION')
497
+ .digest('hex')
498
+ .substring(0, 12);
499
+ return {
500
+ ...patient,
501
+ id: deidentifiedId
502
+ };
503
+ }
504
+ /**
505
+ * Generate validation report
506
+ */
507
+ generateReport(analysis) {
508
+ const lines = [
509
+ '═'.repeat(70),
510
+ ' RETROSPECTIVE VALIDATION REPORT',
511
+ '═'.repeat(70),
512
+ '',
513
+ `Cohort: ${analysis.cohortId}`,
514
+ `Patients: ${analysis.patientCount}`,
515
+ `Date Range: ${analysis.dateRange.start.toISOString().split('T')[0]} to ${analysis.dateRange.end.toISOString().split('T')[0]}`,
516
+ '',
517
+ '─'.repeat(70),
518
+ ' CONCORDANCE METRICS',
519
+ '─'.repeat(70),
520
+ `Full Concordance: ${(analysis.concordance.fullConcordance * 100).toFixed(1)}%`,
521
+ `Partial Concordance: ${(analysis.concordance.partialConcordance * 100).toFixed(1)}%`,
522
+ `No Concordance: ${(analysis.concordance.noConcordance * 100).toFixed(1)}%`,
523
+ '',
524
+ '─'.repeat(70),
525
+ ' PREDICTION ACCURACY',
526
+ '─'.repeat(70),
527
+ `Response Accuracy: ${(analysis.predictionAccuracy.responseAccuracy * 100).toFixed(1)}%`,
528
+ `Response Sensitivity: ${(analysis.predictionAccuracy.responseSensitivity * 100).toFixed(1)}%`,
529
+ `Response Specificity: ${(analysis.predictionAccuracy.responseSpecificity * 100).toFixed(1)}%`,
530
+ `PFS C-Index: ${analysis.predictionAccuracy.pfsCIndex.toFixed(3)}`,
531
+ `PFS Calibration: ${(analysis.predictionAccuracy.pfsCalibration * 100).toFixed(1)}%`,
532
+ `OS C-Index: ${analysis.predictionAccuracy.osCIndex.toFixed(3)}`,
533
+ `Toxicity Accuracy: ${(analysis.predictionAccuracy.toxicityAccuracy * 100).toFixed(1)}%`,
534
+ '',
535
+ '─'.repeat(70),
536
+ ' CLINICAL OUTCOMES',
537
+ '─'.repeat(70),
538
+ `Objective Response Rate: ${(analysis.clinicalImpact.objectiveResponseRate * 100).toFixed(1)}%`,
539
+ `Disease Control Rate: ${(analysis.clinicalImpact.diseaseControlRate * 100).toFixed(1)}%`,
540
+ `Median PFS: ${analysis.clinicalImpact.medianPFS.toFixed(1)} months`,
541
+ `Median OS: ${analysis.clinicalImpact.medianOS.toFixed(1)} months`,
542
+ '',
543
+ ' Concordant vs Discordant Treatment:',
544
+ ` Concordant ORR: ${(analysis.clinicalImpact.concordantVsDiscordant.concordantORR * 100).toFixed(1)}%`,
545
+ ` Discordant ORR: ${(analysis.clinicalImpact.concordantVsDiscordant.discordantORR * 100).toFixed(1)}%`,
546
+ ` Concordant Median PFS: ${analysis.clinicalImpact.concordantVsDiscordant.concordantMedianPFS.toFixed(1)} months`,
547
+ ` Discordant Median PFS: ${analysis.clinicalImpact.concordantVsDiscordant.discordantMedianPFS.toFixed(1)} months`,
548
+ '',
549
+ '─'.repeat(70),
550
+ ' SUBGROUP ANALYSES',
551
+ '─'.repeat(70),
552
+ ...analysis.subgroupAnalyses.map(sg => `${sg.subgroup}: n=${sg.patientCount}, Concordance=${(sg.concordance * 100).toFixed(0)}%, ` +
553
+ `Accuracy=${(sg.responseAccuracy * 100).toFixed(0)}%, mPFS=${sg.medianPFS.toFixed(1)}mo`),
554
+ '',
555
+ '═'.repeat(70)
556
+ ];
557
+ return lines.join('\n');
558
+ }
559
+ /**
560
+ * Export validation results
561
+ */
562
+ exportResults(cohortId, format) {
563
+ const patients = this.validationCohorts.get(cohortId);
564
+ if (!patients)
565
+ return '';
566
+ const results = [];
567
+ for (const patient of patients) {
568
+ const result = this.validationResults.get(patient.id);
569
+ if (result) {
570
+ results.push({
571
+ patientId: patient.id,
572
+ cancerType: patient.diagnosis.cancerType,
573
+ stage: patient.diagnosis.stage,
574
+ actualRegimen: patient.treatment.regimen,
575
+ regimenMatch: result.concordance.regimenMatch,
576
+ partialMatch: result.concordance.partialMatch,
577
+ predictedResponse: result.outcomeComparison.predictedResponse,
578
+ actualResponse: result.outcomeComparison.actualResponse,
579
+ responseCorrect: result.outcomeComparison.responseCorrect,
580
+ predictedPFS: result.outcomeComparison.predictedPFS,
581
+ actualPFS: result.outcomeComparison.actualPFS,
582
+ predictedOS: result.outcomeComparison.predictedOS,
583
+ actualOS: result.outcomeComparison.actualOS,
584
+ objectiveResponse: result.clinicalBenefit.objectiveResponse,
585
+ diseaseControl: result.clinicalBenefit.diseaseControl
586
+ });
587
+ }
588
+ }
589
+ if (format === 'json') {
590
+ return JSON.stringify(results, null, 2);
591
+ }
592
+ // CSV format
593
+ const headers = Object.keys(results[0] || {});
594
+ const rows = [
595
+ headers.join(','),
596
+ ...results.map(r => headers.map(h => JSON.stringify(r[h] ?? '')).join(','))
597
+ ];
598
+ return rows.join('\n');
599
+ }
600
+ }
601
+ export default RetrospectiveValidationService;
602
+ //# sourceMappingURL=retrospectiveValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrospectiveValidator.js","sourceRoot":"","sources":["../../src/validation/retrospectiveValidator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@erosolaraijs/cure",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "AI-powered unified cancer treatment framework with multi-provider support for medical research and patient care",
5
5
  "main": "dist/bin/cure.js",
6
6
  "type": "module",