From 81f836fe3a4e402cd208dd282bd4be524608536f Mon Sep 17 00:00:00 2001 From: TJMKuijpers Date: Wed, 12 Jun 2024 13:57:21 +0200 Subject: [PATCH] Update the table with scatter data summary Update table with log scale Define types in data table Update screenshot Remove whisker info and add full name MAD Update screenshot --- ...visualisation_element_chrome_1600x1000.png | Bin 26172 -> 47689 bytes .../ClinicalNumericalDataVisualisation.tsx | 15 ++- .../groupComparison/GroupComparisonUtils.tsx | 4 + .../SummaryStatisticsTable.tsx | 109 +++++++++++++++++- .../components/plots/BoxScatterPlot.tsx | 68 ++++++++++- 5 files changed, 191 insertions(+), 5 deletions(-) diff --git a/end-to-end-test/local/screenshots/reference/shows_table_when_selecting_table_visualisation_element_chrome_1600x1000.png b/end-to-end-test/local/screenshots/reference/shows_table_when_selecting_table_visualisation_element_chrome_1600x1000.png index ee6deea4f3b022c41fb7e2f29a7e36d70b622f7b..7e458790358e147bbcc8866604ebb43ab691bcd2 100644 GIT binary patch literal 47689 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 T`|LmXmu0^peRuY@UHX3jYLk$Q literal 26172 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 diff --git a/src/pages/groupComparison/ClinicalNumericalDataVisualisation.tsx b/src/pages/groupComparison/ClinicalNumericalDataVisualisation.tsx index 6098a1c75cd..ec3ca27005f 100644 --- a/src/pages/groupComparison/ClinicalNumericalDataVisualisation.tsx +++ b/src/pages/groupComparison/ClinicalNumericalDataVisualisation.tsx @@ -1,11 +1,14 @@ import BoxScatterPlot, { + IBaseBoxScatterPlotPoint, + IBoxScatterPlotData, IBoxScatterPlotProps, toBoxPlotData, + toDataDescriptive, } from 'shared/components/plots/BoxScatterPlot'; import { IBoxScatterPlotPoint } from 'shared/components/plots/PlotsTabUtils'; import React from 'react'; import { computed, makeObservable } from 'mobx'; -import { SummaryStatisticsTable } from './SummaryStatisticsTable'; +import { DescriptiveDataTable } from './SummaryStatisticsTable'; export enum ClinicalNumericalVisualisationType { Plot = 'Plot', @@ -43,9 +46,17 @@ export class ClinicalNumericalDataVisualisation extends React.Component< this.props.excludeLimitValuesFromBoxPlot, this.props.logScale ); + const dataDescription = toDataDescriptive( + this.props.data, + this.props.logScale + ); const groupLabels = this.props.data.map(d => d.label); return ( - + ); } diff --git a/src/pages/groupComparison/GroupComparisonUtils.tsx b/src/pages/groupComparison/GroupComparisonUtils.tsx index d881c49a46f..25c9334282c 100644 --- a/src/pages/groupComparison/GroupComparisonUtils.tsx +++ b/src/pages/groupComparison/GroupComparisonUtils.tsx @@ -47,6 +47,10 @@ import { import { GroupComparisonMutation } from 'shared/model/GroupComparisonMutation'; import { getTwoTailedPValue } from 'shared/lib/calculation/FisherExactTestCalculator'; import { calculateQValues } from 'shared/lib/calculation/BenjaminiHochbergFDRCalculator'; +import { + IBaseBoxScatterPlotPoint, + IBoxScatterPlotData, +} from 'shared/components/plots/BoxScatterPlot'; type Omit = Pick>; diff --git a/src/pages/groupComparison/SummaryStatisticsTable.tsx b/src/pages/groupComparison/SummaryStatisticsTable.tsx index e34d3c248a2..dce8268ee77 100644 --- a/src/pages/groupComparison/SummaryStatisticsTable.tsx +++ b/src/pages/groupComparison/SummaryStatisticsTable.tsx @@ -1,8 +1,31 @@ import { FunctionComponent } from 'react'; import _ from 'lodash'; import * as React from 'react'; +import { + BoxModel, + IBoxScatterPlotData, +} from 'shared/components/plots/BoxScatterPlot'; -type SummaryStatisticsTableProps = { data: any[]; labels: string[] }; +type SummaryStatisticsTableProps = { + data: BoxModel[]; + labels: string[]; +}; + +type DescriptiveDataTableProps = { + descriptiveData: DataDescriptiveValues[]; + dataBoxplot: BoxModel[]; + labels: string[]; +}; + +type DataDescriptiveValues = { + mad: number; + stdDeviation: number; + median: number; + mean: number; + count: number; + maximum: number; + minimum: number; +}; export const SummaryStatisticsTable: FunctionComponent = ( props: SummaryStatisticsTableProps @@ -53,3 +76,87 @@ export const SummaryStatisticsTable: FunctionComponent ); }; + +export const DescriptiveDataTable: FunctionComponent = ( + props: DescriptiveDataTableProps +) => { + const headers = + props.labels.length === 1 ? ( + {props.labels[0]} + ) : ( + [, props.labels.map(label => {label})] + ); + return ( +
+

Data description

+ + + {headers} + + + + + {props.descriptiveData.map((d, index) => ( + + ))} + + + + {props.descriptiveData.map((d, index) => { + return ; + })} + + + + {props.descriptiveData.map((d, index) => { + return ; + })} + + + + {props.descriptiveData.map((d, index) => { + return ; + })} + + + + {props.descriptiveData.map((d, index) => { + return ( + + ); + })} + + + + {props.descriptiveData.map((d, index) => { + return ; + })} + + + + {props.descriptiveData.map((d, index) => { + return ; + })} + + + + {props.dataBoxplot.map((d, index) => ( + + ))} + + + + {props.dataBoxplot.map((d, index) => ( + + ))} + + +
Count{d.count}
Minimum{_.round(d.minimum, 2)}
Maximum{_.round(d.maximum, 2)}
Mean{_.round(d.mean, 2)}
Standard Deviation + {_.round(d.stdDeviation, 2)} +
Median{_.round(d.median, 2)}
Mean absolute deviation{_.round(d.mad, 2)}
25% (q1){_.round(d.q1, 2)}
75% (q3){_.round(d.q3, 2)}
+
+ ); +}; diff --git a/src/shared/components/plots/BoxScatterPlot.tsx b/src/shared/components/plots/BoxScatterPlot.tsx index 0681bf22e1a..a417df682fb 100644 --- a/src/shared/components/plots/BoxScatterPlot.tsx +++ b/src/shared/components/plots/BoxScatterPlot.tsx @@ -93,7 +93,7 @@ export interface IBoxScatterPlotProps { qValue?: number | null; } -type BoxModel = { +export type BoxModel = { min: number; max: number; median: number; @@ -957,7 +957,7 @@ export function toBoxPlotData( data: IBoxScatterPlotData[], boxCalculationFilter?: (d: D) => boolean, excludeLimitValuesFromBoxPlot?: any, - logScale?: any, + logScale?: IAxisLogScaleParams, calcBoxSizes?: (box: BoxModel, i: number) => void ) { // when limit values are shown in the legend, exclude @@ -1014,3 +1014,67 @@ export function toBoxPlotData( ); }); } + +export function toDataDescriptive( + data: IBoxScatterPlotData[], + logScale?: IAxisLogScaleParams +) { + return data.map(d => { + const scatterValues = d.data.map(x => + logScale ? logScale.fLogScale(x.value, 0) : x.value + ); + const count = scatterValues.length; + // Calculate minimum and maximum + const minimum = Math.min(...scatterValues); + const maximum = Math.max(...scatterValues); + const mean = _.mean(scatterValues); + + // Calculate standard deviation + const squaredDifferences = scatterValues.map((val: number) => { + const difference = val - mean; + return difference * difference; + }); + const variance = + squaredDifferences.reduce( + (sum: number, val: number) => sum + val, + 0 + ) / scatterValues.length; + const stdDeviation = Math.sqrt(variance); + + // Calculate median + const scatterValuesSorted = scatterValues + .slice() + .sort((a: number, b: number) => a - b); + const mid = Math.floor(scatterValuesSorted.length / 2); + const median = + scatterValuesSorted.length % 2 !== 0 + ? scatterValuesSorted[mid] + : (scatterValuesSorted[mid - 1] + scatterValuesSorted[mid]) / 2; + + // Calculate median absolute deviation (MAD) + const absoluteDeviations = scatterValues.map(val => + Math.abs(val - median) + ); + const absoluteDeviationsSorted = absoluteDeviations + .slice() + .sort((a, b) => a - b); + const madMid = Math.floor(absoluteDeviationsSorted.length / 2); + const mad = + absoluteDeviationsSorted.length % 2 !== 0 + ? absoluteDeviationsSorted[madMid] + : (absoluteDeviationsSorted[madMid - 1] + + absoluteDeviationsSorted[madMid]) / + 2; + + // Return an object with the descriptive statistics + return { + count, + minimum, + maximum, + mean, + stdDeviation, + median, + mad, + }; + }); +}