rcpch / digital-growth-charts-server

RCPCH's open source Digital Growth Chart API
https://growth.rcpch.ac.uk/
GNU Affero General Public License v3.0
16 stars 11 forks source link

Issue with BMI Chart Scaling for Specific Down’s Syndrome Patients #220

Closed princepsivannhs closed 3 months ago

princepsivannhs commented 3 months ago

Hi,

We've been successfully using the RCPCH Digital Growth Charts API and the open-source React chart component after integrating these into our internally developed web application at Royal Cornwall Hospitals NHS Trust for over a year now.

One of our paediatricians identified an issue with the BMI chart for certain patients with Down’s syndrome. The BMI scale experiences significant jumps (up to a 1000 kg/m² in this case), resulting in barely visible plot points. Specifically, these points are squeezed near the Age axis. For visual reference, please see the attached image:

image

Additionally, I've been able to reproduce the issue on the RCPCH chart demo page (https://growth.rcpch.ac.uk/).

Please find below the measurement details used:

Birth Date: 08/05/2006 Measurement Date: 01/11/2022 Height: 160.02 cm Weight: 92.98 kg BMI: 36.3 kg/m²

Thanks in advance for your time.

Best regards, Prince Software Developer | RCHT

mbarton commented 3 months ago

Thanks for the report @princepsivannhs. Just acknowledging I can reproduce too with the BMI value you provided. We will have a look and get back to you.

mbarton commented 3 months ago

I can't see any obvious culprits from a quick look at the API results from the server. Have created a Storybook story for it on a branch in the react chart repo.

 {
        "birth_data": {
            "birth_date": "2006-05-08",
            "gestation_weeks": 40,
            "gestation_days": 0,
            "estimated_date_delivery": "2006-05-08",
            "estimated_date_delivery_string": "Mon 08 May, 2006",
            "sex": "male"
        },
        "measurement_dates": {
            "observation_date": "2022-11-01",
            "chronological_decimal_age": 16.484599589322382,
            "corrected_decimal_age": 16.484599589322382,
            "chronological_calendar_age": "16 years, 5 months, 3 weeks and 3 days",
            "corrected_calendar_age": "16 years, 5 months, 3 weeks and 3 days",
            "corrected_gestational_age": {
                "corrected_gestation_weeks": null,
                "corrected_gestation_days": null
            },
            "comments": {
                "clinician_corrected_decimal_age_comment": "Born at term. No correction has been made for gestation.",
                "lay_corrected_decimal_age_comment": "Your child was born on their due date.",
                "clinician_chronological_decimal_age_comment": "Born Term. No correction has been made for gestation.",
                "lay_chronological_decimal_age_comment": "Your child was born on their due date."
            },
            "corrected_decimal_age_error": null,
            "chronological_decimal_age_error": null
        },
        "child_observation_value": {
            "measurement_method": "bmi",
            "observation_value": 36.3,
            "observation_value_error": null
        },
        "measurement_calculated_values": {
            "corrected_sds": 1.9929195642473767,
            "corrected_centile": 97.7,
            "corrected_centile_band": "This body mass index measurement is on or near the 98th centile.",
            "chronological_sds": 1.9929195642473767,
            "chronological_centile": 97.7,
            "chronological_centile_band": "This body mass index measurement is on or near the 98th centile.",
            "corrected_measurement_error": null,
            "chronological_measurement_error": null,
            "corrected_percentage_median_bmi": 163.3208998549931,
            "chronological_percentage_median_bmi": 163.3208998549931
        },
        "plottable_data": {
            "centile_data": {
                "chronological_decimal_age_data": {
                    "x": 16.484599589322382,
                    "y": 36.3,
                    "b": null,
                    "centile": 97.7,
                    "sds": 1.9929195642473767,
                    "bone_age_label": null,
                    "events_text": null,
                    "bone_age_type": null,
                    "bone_age_sds": null,
                    "bone_age_centile": null,
                    "observation_error": null,
                    "age_type": "chronological_age",
                    "calendar_age": "16 years, 5 months, 3 weeks and 3 days",
                    "lay_comment": "Your child was born on their due date.",
                    "clinician_comment": "Born Term. No correction has been made for gestation.",
                    "age_error": null,
                    "centile_band": "This body mass index measurement is on or near the 98th centile.",
                    "observation_value_error": null
                },
                "corrected_decimal_age_data": {
                    "x": 16.484599589322382,
                    "y": 36.3,
                    "b": null,
                    "centile": 97.7,
                    "sds": 1.9929195642473767,
                    "bone_age_label": null,
                    "events_text": null,
                    "bone_age_type": null,
                    "bone_age_sds": null,
                    "bone_age_centile": null,
                    "observation_error": null,
                    "age_type": "corrected_age",
                    "calendar_age": "16 years, 5 months, 3 weeks and 3 days",
                    "corrected_gestational_age": "",
                    "lay_comment": "Your child was born on their due date.",
                    "clinician_comment": "Born at term. No correction has been made for gestation.",
                    "age_error": null,
                    "centile_band": "This body mass index measurement is on or near the 98th centile.",
                    "observation_value_error": null
                }
            },
            "sds_data": {
                "chronological_decimal_age_data": {
                    "x": 16.484599589322382,
                    "y": 1.9929195642473767,
                    "b": null,
                    "centile": 97.7,
                    "sds": null,
                    "bone_age_label": null,
                    "events_text": null,
                    "bone_age_type": null,
                    "bone_age_sds": null,
                    "bone_age_centile": null,
                    "observation_error": null,
                    "age_type": "chronological_age",
                    "calendar_age": "16 years, 5 months, 3 weeks and 3 days",
                    "lay_comment": "Your child was born on their due date.",
                    "clinician_comment": "Born Term. No correction has been made for gestation.",
                    "age_error": null,
                    "centile_band": "This body mass index measurement is on or near the 98th centile.",
                    "observation_value_error": null
                },
                "corrected_decimal_age_data": {
                    "x": 16.484599589322382,
                    "y": 1.9929195642473767,
                    "b": null,
                    "centile": 97.7,
                    "sds": null,
                    "bone_age_label": null,
                    "events_text": null,
                    "bone_age_type": null,
                    "bone_age_sds": null,
                    "bone_age_centile": null,
                    "observation_error": null,
                    "age_type": "corrected_age",
                    "calendar_age": "16 years, 5 months, 3 weeks and 3 days",
                    "corrected_gestational_age": "",
                    "lay_comment": "Your child was born on their due date.",
                    "clinician_comment": "Born at term. No correction has been made for gestation.",
                    "age_error": null,
                    "centile_band": "This body mass index measurement is on or near the 98th centile.",
                    "observation_value_error": null
                }
            }
        },
        "bone_age": {
            "bone_age": null,
            "bone_age_type": null,
            "bone_age_sds": null,
            "bone_age_centile": null,
            "bone_age_text": null
        },
        "events_data": {
            "events_text": null
        }
    }
mbarton commented 3 months ago

@princepsivannhs I'm able to trace the issue back to the source data used to plot the reference lines:

https://github.com/rcpch/digital-growth-charts-react-component-library/blob/b6331d27ac116991802313028fcd8257e68affd5/src/chartdata/trisomy21_bmi_male_sds_data.ts#L7712

I will need my colleague @eatyourpeas (or maybe @pacharanero?) to comment further on how those values were generated

eatyourpeas commented 3 months ago

Issue now migrated to chart component repo and discussion continues there. Fix applied pending review (see screenshot). Closing this here therefore.

image