From 12b9afda4164b4f4a2774097b05f51ad63033d34 Mon Sep 17 00:00:00 2001
From: Steve Reis <stevereis93@gmail.com>
Date: Tue, 23 Aug 2022 10:18:10 +0200
Subject: [PATCH] feat(exareme2): Ttest onesample and paired integration

---
 .../ttest-onesample.handler.spec.ts           | 24 ++++++++++---------
 .../algorithms/ttest-onesample.handler.ts     | 17 +++++++++----
 .../algorithms/ttest-paired.handler.spec.ts   | 24 ++++++++++---------
 .../algorithms/ttest-paired.handler.ts        | 21 +++++++++++-----
 .../connectors/exareme/handlers/index.ts      |  5 ++--
 .../transformations/algorithms/index.ts       |  2 +-
 6 files changed, 57 insertions(+), 36 deletions(-)

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 258f810..4713037 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 0cb7bb1..be893f5 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 b1e0629..1797524 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 f7196ee..10ca096 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 c3041fe..a101809 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 6d71217..e32d56f 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) {(
-- 
GitLab