diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.spec.ts b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.spec.ts index 258f8106788321276cbdce6aa785190d44a307fc..4713037aacbb3d41a783318c5084809bba822b27 100644 --- a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.spec.ts +++ b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.spec.ts @@ -2,17 +2,19 @@ import { TableResult } from '../../../../models/result/table-result.model'; import { Experiment } from '../../../../models/experiment/experiment.model'; import TtestOnesampleHandler from './ttest-onesample.handler'; -const data = { - n_obs: 1991, - t_value: 304.98272738655413, - p_value: 0.0, - df: 1990.0, - mean_diff: 220.17867654445, - se_diff: 0.7464781919192859, - ci_upper: 221.64263732187715, - ci_lower: 218.71471576702288, - cohens_d: 6.835017232945105, -}; +const data = [ + { + n_obs: 1991, + t_value: 304.98272738655413, + p_value: 0.0, + df: 1990.0, + mean_diff: 220.17867654445, + se_diff: 0.7464781919192859, + ci_upper: 221.64263732187715, + ci_lower: 218.71471576702288, + cohens_d: 6.835017232945105, + }, +]; const createExperiment = (): Experiment => ({ id: 'dummy-id', diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.ts b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.ts index 0cb7bb1903e8e49f68820f5fe337c5353175cc4f..be893f5444f1f1559de4f0d5c8c71603f3842cba 100644 --- a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.ts +++ b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-onesample.handler.ts @@ -31,13 +31,18 @@ const isNumberPrecision = (value: any, name: string) => { export default class TtestOnesampleHandler extends BaseHandler { public static readonly ALGO_NAME = 'ttest_onesample'; - private canHandle(algoId: string) { - return algoId.toLocaleLowerCase() === TtestOnesampleHandler.ALGO_NAME; + private canHandle(algoId: string, data: any) { + return ( + data && + data[0] && + data[0]['t_value'] && + algoId.toLowerCase() === TtestOnesampleHandler.ALGO_NAME + ); } private getTable(data: any): TableResult { const tableModel: TableResult = { - name: 'T-test', + name: 'Results', tableStyle: TableStyle.NORMAL, headers: ['name', 'value'].map((name) => ({ name, type: 'string' })), data: [ @@ -62,10 +67,12 @@ export default class TtestOnesampleHandler extends BaseHandler { } handle(experiment: Experiment, data: any, domain?: Domain): void { - if (!this.canHandle(experiment.algorithm.name)) + if (!this.canHandle(experiment.algorithm.name, data)) return super.handle(experiment, data, domain); - const tableModel = this.getTable(data); + const extData = data[0]; + + const tableModel = this.getTable(extData); if (tableModel) experiment.results.push(tableModel); } 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 index b1e0629051c6a34941173ec2d56eb04b47560045..1797524ebd33ea552b613597811ad14d672d8c6d 100644 --- 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 @@ -2,22 +2,24 @@ 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 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', + name: TTestPairedHandler.ALGO_NAME.toUpperCase(), }, datasets: ['desd-synthdata'], domain: 'dementia', 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 index f7196ee295154f399f64c888d5228424f9403f54..10ca096c455e37dcc904636c29349ce4497d6bf1 100644 --- a/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.ts +++ b/api/src/engine/connectors/exareme/handlers/algorithms/ttest-paired.handler.ts @@ -20,14 +20,21 @@ const lookupDict = { const NUMBER_PRECISION = 4; export default class TTestPairedHandler extends BaseHandler { - private canHandle(experimentId: string) { - return experimentId.toLocaleLowerCase() === 'ttest_paired'; + public static readonly ALGO_NAME = 'paired_ttest'; + + private canHandle(algoName: string, data: any) { + return ( + data && + data[0] && + data[0]['t_stat'] && + algoName.toLowerCase() === TTestPairedHandler.ALGO_NAME + ); } private getTable(data: any): TableResult { const tableModel: TableResult = { - name: 'T-test', - tableStyle: TableStyle.NORMAL, + name: 'Results', + tableStyle: TableStyle.DEFAULT, headers: ['name', 'value'].map((name) => ({ name, type: 'string' })), data: [ 't_stat', @@ -50,10 +57,12 @@ export default class TTestPairedHandler extends BaseHandler { } handle(experiment: Experiment, data: any, domain?: Domain): void { - if (!this.canHandle(experiment.algorithm.name)) + if (!this.canHandle(experiment.algorithm.name, data)) return super.handle(experiment, data, domain); - const tableModel = this.getTable(data); + const extData = data[0]; + + const tableModel = this.getTable(extData); if (tableModel) experiment.results.push(tableModel); } diff --git a/api/src/engine/connectors/exareme/handlers/index.ts b/api/src/engine/connectors/exareme/handlers/index.ts index c3041feb05df727b30a27a3589afbee533893f8f..a1018098456f7d9a6fec1016d8f3cc26e1404c17 100644 --- a/api/src/engine/connectors/exareme/handlers/index.ts +++ b/api/src/engine/connectors/exareme/handlers/index.ts @@ -8,10 +8,10 @@ import LogisticRegressionHandler from './algorithms/logistic-regression.handler' import PCAHandler from './algorithms/PCA.handler'; import PearsonHandler from './algorithms/pearson.handler'; import RawHandler from './algorithms/raw.handler'; +import TtestOnesampleHandler from './algorithms/ttest-onesample.handler'; import TTestPairedHandler from './algorithms/ttest-paired.handler'; -import ResultHandler from './result-handler.interface'; -const start = new PearsonHandler() as ResultHandler; +const start = new PearsonHandler(); start .setNext(new DescriptiveHandler()) @@ -21,6 +21,7 @@ start .setNext(new LinearRegressionCVHandler()) .setNext(new LogisticRegressionHandler()) .setNext(new TTestPairedHandler()) + .setNext(new TtestOnesampleHandler()) .setNext(new RawHandler()); // should be last handler as it works as a fallback (if other handlers could not process the results) export default (exp: Experiment, data: unknown, domain: Domain): Experiment => { diff --git a/api/src/engine/connectors/exareme/transformations/algorithms/index.ts b/api/src/engine/connectors/exareme/transformations/algorithms/index.ts index 6d71217b30c1e625be6794dac083ae23fb268fd1..e32d56fdc6239581684c2123caaf24d88cae290d 100644 --- a/api/src/engine/connectors/exareme/transformations/algorithms/index.ts +++ b/api/src/engine/connectors/exareme/transformations/algorithms/index.ts @@ -12,7 +12,7 @@ const transformToAlgorithms = jsonata(` 'LOGISTIC_REGRESSION','TTEST_INDEPENDENT','TTEST_PAIRED', 'PEARSON','ID3','KMEANS','NAIVE_BAYES', 'TTEST_ONESAMPLE','PCA','CALIBRATION_BELT','CART', - 'KAPLAN_MEIER','THREE_C', 'ONE_WAY_ANOVA', 'PEARSON_CORRELATION', 'LINEAR_REGRESSION_CV']; + 'KAPLAN_MEIER','THREE_C', 'ONE_WAY_ANOVA', 'PEARSON_CORRELATION', 'LINEAR_REGRESSION_CV', 'TTEST_ONESAMPLE', 'PAIRED_TTEST']; $linkedVars:= ['positive_class', 'positive_level', 'negative_level', 'outcome_neg', 'outcome_pos']; $linkedCoVars:= ['referencevalues', 'xlevels']; $truthy:= function($val) {(