Skip to content
Snippets Groups Projects
Commit 008da61a authored by Steve Reis's avatar Steve Reis
Browse files

feat(exareme): Anova two way integration

linked to Issue-67
parent 0691f547
No related branches found
No related tags found
3 merge requests!110Official release,!109Update RC branch with last fixes,!104[SPRINT-1][Issue-67] Integration two-way anova algorithm
Pipeline #803368471 passed
import { Domain } from '../../../../models/domain.model';
import handlers from '..';
import { Experiment } from '../../../../models/experiment/experiment.model';
import AnovaTwoWayHandler from './anova-two-way.handler';
const createExperiment = (): Experiment => ({
id: 'dummy-id',
name: 'Testing purpose',
algorithm: {
name: AnovaTwoWayHandler.ALGO_NAME,
},
datasets: ['desd-synthdata'],
domain: 'dementia',
variables: ['parkinsonbroadcategory'],
coVariables: ['gender'],
results: [],
});
const domain: Domain = {
id: 'dummy-id',
groups: [],
rootGroup: {
id: 'dummy-id',
},
datasets: [{ id: 'desd-synthdata', label: 'Dead Synthdata' }],
variables: [
{ id: 'parkinsonbroadcategory', label: 'Example label' },
{ id: 'gender', label: 'Example label 2' },
{ id: 'parkinsonbroadcategory:gender', label: 'Example label 3' },
],
};
const data = [
{
terms: [
'parkinsonbroadcategory',
'gender',
'parkinsonbroadcategory:gender',
'Residuals',
],
sum_sq: [
0.7427619881331298, 0.004764818481136857, 0.008175662839327025,
5.6058179597692295,
],
df: [2, 1, 2, 74],
f_stat: [4.902441313320338, 0.06289832636995628, 0.05396171035628005, null],
f_pvalue: [
0.010014025893247736,
0.8026673646098741,
0.9475056310046991,
null,
],
},
];
describe('Anova 2 way result handler', () => {
const anovaHandler = new AnovaTwoWayHandler();
it('Test anova 2 way handler', () => {
const exp = createExperiment();
const summaryTable = anovaHandler.getSummaryTable(
data[0],
domain.variables,
);
handlers(exp, data, domain);
expect(exp.results.length).toBeGreaterThanOrEqual(1);
expect(summaryTable.data[0].length).toEqual(4);
});
});
import { Domain } from '../../../../models/domain.model';
import { Experiment } from '../../../../models/experiment/experiment.model';
import {
TableResult,
TableStyle,
} from '../../../../models/result/table-result.model';
import { Variable } from '../../../../models/variable.model';
import BaseHandler from '../base.handler';
const NUMBER_PRECISION = 4;
export default class AnovaTwoWayHandler extends BaseHandler {
public static readonly ALGO_NAME = 'anova_twoway';
private canHandle(algorithm: string, data: any): boolean {
return (
algorithm === AnovaTwoWayHandler.ALGO_NAME &&
!!data &&
!!data[0] &&
!!data[0]['terms']
);
}
getSummaryTable(data: any, variables: Variable[]): TableResult | undefined {
return {
name: 'Anova two way Summary',
tableStyle: TableStyle.DEFAULT,
headers: ['', 'DF', 'Sum Sq', 'F value', 'Pr(>F)'].map((name) => ({
name,
type: 'string',
})),
data: [
data['terms'].map((term: string, index: number) => [
variables.find((variable) => variable.id == term)?.label ?? term,
data['df'][index]?.toPrecision(NUMBER_PRECISION) ?? '',
data['sum_sq'][index]?.toPrecision(NUMBER_PRECISION) ?? '',
data['f_stat'][index]?.toPrecision(NUMBER_PRECISION) ?? '',
data['f_pvalue'][index]?.toPrecision(NUMBER_PRECISION) ?? '',
]),
],
};
}
handle(exp: Experiment, data: any, domain: Domain): void {
if (!this.canHandle(exp.algorithm.name, data))
return super.handle(exp, data, domain);
const result = data[0];
const varIds = [...exp.variables, ...(exp.coVariables ?? [])];
const variables = domain.variables.filter((v) => varIds.includes(v.id));
const summaryTable = this.getSummaryTable(result, variables);
if (summaryTable) exp.results.push(summaryTable);
}
}
import { Domain } from '../../../../engine/models/domain.model';
import { Experiment } from '../../../../engine/models/experiment/experiment.model';
import AnovaOneWayHandler from './algorithms/anova-one-way.handler';
import AnovaTwoWayHandler from './algorithms/anova-two-way.handler';
import DescriptiveHandler from './algorithms/descriptive.handler';
import HistogramHandler from './algorithms/histogram.handler';
import LinearRegressionCVHandler from './algorithms/linear-regression-cv.handler';
......@@ -20,6 +21,7 @@ start
.setNext(new HistogramHandler())
.setNext(new DescriptiveHandler())
.setNext(new AnovaOneWayHandler())
.setNext(new AnovaTwoWayHandler())
.setNext(new PCAHandler())
.setNext(new LinearRegressionHandler())
.setNext(new LinearRegressionCVHandler())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment