diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.spec.ts b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0267143776d0dee332e5c7b7b5655d6c655390e --- /dev/null +++ b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.spec.ts @@ -0,0 +1,55 @@ +import { TableResult } from '../../../../models/result/table-result.model'; +import { Experiment } from '../../../../models/experiment/experiment.model'; +import TTestPairedHandler from './ttest-paired.handler'; + +const data = { + t_stat: -97.35410837992711, + p: 1.0, + df: 144.0, + mean_diff: -66.00088551724139, + se_diff: 0.6779465871093092, + ci_upper: 'Infinity', + ci_lower: -67.12322892404309, + cohens_d: -11.456478738682357, +}; + +const createExperiment = (): Experiment => ({ + id: 'dummy-id', + name: 'Testing purpose', + algorithm: { + name: 'TTEST_PAIRED', + }, + datasets: ['desd-synthdata'], + domain: 'dementia', + variables: ['lefthippocampus'], + coVariables: ['righthippocampus', 'leftamygdala'], + results: [], +}); + +describe('T-Test Paired handler', () => { + let tTestPairedHandler: TTestPairedHandler; + let experiment: Experiment; + + beforeEach(() => { + tTestPairedHandler = new TTestPairedHandler(); + experiment = createExperiment(); + }); + + describe('Handle', () => { + it('with standard t-test algo data', () => { + tTestPairedHandler.handle(experiment, data); + + const table = experiment.results[0] as TableResult; + + expect(experiment.results.length === 1); + expect(table.data.length === 7); + }); + + it('Should be empty with another algo', () => { + experiment.algorithm.name = 'dummy_algo'; + tTestPairedHandler.handle(experiment, data); + + expect(experiment.results.length === 0); + }); + }); +}); diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.ts b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..e04ccb7cfb847cd9f77e81b1c2c32930be64304f --- /dev/null +++ b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.ts @@ -0,0 +1,59 @@ +import { isNumber } from '../../../../../common/utils/shared.utils'; +import { Domain } from '../../../../models/domain.model'; +import { Experiment } from '../../../../models/experiment/experiment.model'; +import { + TableResult, + TableStyle, +} from '../../../../models/result/table-result.model'; +import BaseHandler from '../base.handler'; + +const lookupDict = { + t_stat: 'Statistic', + p: 'P-value', + df: 'Degrees of freedom', + mean_diff: 'Mean difference', + se_diff: 'Standard error of difference', + ci_lower: 'Lower 95% confidence interval', + ci_upper: 'Upper 95% confidence interval', + cohens_d: "Cohen's d", +}; +const NUMBER_PRECISION = 4; + +export default class TTestPairedHandler extends BaseHandler { + private canHandle(experimentId: string) { + return experimentId.toLocaleLowerCase() === 'ttest_paired'; + } + + private getTable(data: any): TableResult { + const tableModel: TableResult = { + name: 'T-test', + tableStyle: TableStyle.NORMAL, + headers: ['name', 'value'].map((name) => ({ name, type: 'string' })), + data: [ + 't_stat', + 'p', + 'df', + 'mean_diff', + 'se_diff', + 'ci_lower', + 'ci_upper', + 'cohens_d', + ].map((name) => [ + lookupDict[name], + isNumber(data[name]) + ? data[name].toPrecision(NUMBER_PRECISION) + : data[name], + ]), + }; + + return tableModel; + } + + handle(experiment: Experiment, data: any, domain?: Domain): void { + if (!this.canHandle) return super.handle(experiment, data, domain); + + const tableModel = this.getTable(data); + + if (tableModel) experiment.results.push(tableModel); + } +}