Skip to content

Convert between measurements and z-scores/percentiles for INTERGROWTH-21st and WHO Child Growth Standards, and classify growth patterns.

License

Notifications You must be signed in to change notification settings

lshtm-gigs/gigs

Repository files navigation

gigs

R-CMD-check Project Status: Active – The project has reached a stable, usable state and is being actively developed. CRAN version pkgcheck test-coverage codecov

Overview

Produced as part of the Guidance for International Growth Standards project at the London School of Hygiene & Tropical Medicine, gigs provides a single, simple interface for working with the WHO Child Growth standards and outputs from the INTERGROWTH-21st project. You will find functions for converting from anthropometric measures (e.g. weight or length) to z-scores and centiles, and the inverse. Also included are functions for classifying newborn and infant growth according to literature-based cut-offs.

gigs is of use to anyone interested in fetal and child growth, including child health researchers, policymakers, and clinicians. This package is best suited to growth data where the gestational age (GA) of each child is known, as the use of the growth standards included in gigs is GA-dependent. We recommend you check out the available standards section to see if your anthropometric measurements can be converted to z-scores/centiles by gigs. We recommend using gigs to generate continuous or categorical measures of fetal/newborn/child growth, which can then be used in downstream analyses.

Installation

# You can install the development version from GitHub with `remotes`:
# install.packages("remotes")
remotes::install_github(repo = "lshtm-gigs/gigs")

Terminology

GIGS operates on anthropometric measurements, and can convert between these and z-scores/centiles. Z-scores and centiles represent the location of a measurement within a normal distribution of values, such that:

  • A z-score is the number of standard deviations from the mean for a given anthropometric measurement (e.g. height or weight).
  • A centile represents the proportion of measurements in some distribution which we would expect to be lower than a measurement we’ve taken. In gigs, these are represented as a value between 0 and 1. For example, 0.5 corresponds to the 50th centile (i.e. the mean), whereas 0.75 corresponds to the 75th centile.

In growth data, z-scores and centiles represent the size a fetus, newborn, or child relative to its peers. Its size is considered relative to some standardising variable, which is usually age but could also be another variable such as their length. By tracking a child’s relative size as they grow, you can see if they are achieving their growth potential or not. If not, this may indicate underlying issues such as ill health or undernutrition.

Classification functions

GIGS includes a number of functions which permit fast identification of at-risk infants through classification of suboptimal growth. The cut-offs used are sourced from research literature; you can check the function documentation to see these sources.

Growth classification in data.frame-like objects

Use the classify_growth() function to quickly compute growth indicators in data.frame-like objects. All classify_*()-style functions in GIGS use data-masking, so you provide a data.frame-like object in the .data argument and then refer to your column names directly. In classify_growth(), you can also use the .analyses argument to specify which growth indicators you want to classify.

life6mo_newborns <- gigs::life6mo[life6mo$age_days == 0, ]

# Use classify_growth() to get multiple growth indicators at once
life6mo_classified <- classify_growth(
        .data = life6mo_newborns,
        gest_days = gestage,
        age_days = age_days,
        sex = as.character(sex),
        weight_kg = wt_kg,
        lenht_cm = len_cm,
        id = as.factor(id),
        .outcomes = c("svn", "stunting")
)
#> 
#> ── `gigs::classify_growth()` ───────────────────────────────────────────────────
#> ✔ Small vulnerable newborns: Success
#> ✔ Stunting: Success

head(life6mo_classified, n = 4)
#>    id gestage sex visitweek pma age_days wt_kg   len_cm headcirc_cm  muac_cm
#> 1   1     273   M         0 273        0  2.30 42.06667    33.26667 9.433333
#> 28  4     250   F         0 250        0  1.50 42.03333    30.03333 8.066667
#> 36  5     238   F         0 238        0  2.39 43.46667    33.63333 9.166667
#> 56  8     240   F         0 240        0  1.80 41.73333    31.46667 8.033334
#>    birthweight_centile         svn       lhaz        stunting stunting_outliers
#> 1          0.010765424    Term SGA -3.5406446 stunting_severe   stunting_severe
#> 28         0.002833163 Preterm SGA -2.2854751        stunting          stunting
#> 36         0.756367868 Preterm AGA -0.6087434    not_stunting      not_stunting
#> 56         0.126440075 Preterm AGA -1.6989568    not_stunting      not_stunting

When using classify_growth(), you will be informed which of the analyses you wanted to run were successful. In the example below, because lenht_cm is not specified, stunting indicators cannot be computed.

life6mo_classified <- classify_growth(
        .data = life6mo_newborns,
        gest_days = gestage,
        age_days = age_days,
        sex = as.character(sex),
        weight_kg = wt_kg,
        id = as.factor(id),
        .outcomes = c("svn", "stunting")
)
#> 
#> ── `gigs::classify_growth()` ───────────────────────────────────────────────────
#> ✔ Small vulnerable newborns: Success
#> ! Stunting: Not computed (`lenht_cm` not supplied)

head(life6mo_classified, n = 4)
#>    id gestage sex visitweek pma age_days wt_kg   len_cm headcirc_cm  muac_cm
#> 1   1     273   M         0 273        0  2.30 42.06667    33.26667 9.433333
#> 28  4     250   F         0 250        0  1.50 42.03333    30.03333 8.066667
#> 36  5     238   F         0 238        0  2.39 43.46667    33.63333 9.166667
#> 56  8     240   F         0 240        0  1.80 41.73333    31.46667 8.033334
#>    birthweight_centile         svn
#> 1          0.010765424    Term SGA
#> 28         0.002833163 Preterm SGA
#> 36         0.756367868 Preterm AGA
#> 56         0.126440075 Preterm AGA

You can also use classify_*() functions which are specific to the growth indicator you’d like to calculate, for example classify_svn() to get small, vulnerable newborn classifications for each infant:

# Small vulnerable newborns - note no ID parameter, as it is assumed that all
# measures are taken at birth
life6mo_svn <- classify_svn(
  .data = life6mo_newborns,
  weight_kg = wt_kg,
  gest_days = gestage,
  sex = as.character(sex)
)

head(life6mo_svn, n = 4)
#>    id gestage sex visitweek pma age_days wt_kg   len_cm headcirc_cm  muac_cm
#> 1   1     273   M         0 273        0  2.30 42.06667    33.26667 9.433333
#> 28  4     250   F         0 250        0  1.50 42.03333    30.03333 8.066667
#> 36  5     238   F         0 238        0  2.39 43.46667    33.63333 9.166667
#> 56  8     240   F         0 240        0  1.80 41.73333    31.46667 8.033334
#>    birthweight_centile         svn
#> 1          0.010765424    Term SGA
#> 28         0.002833163 Preterm SGA
#> 36         0.756367868 Preterm AGA
#> 56         0.126440075 Preterm AGA

Conversion functions

Available international growth standards

GIGS facilitates the proper use of international growth standards, which are growth charts developed using international samples of healthy singleton children born to mothers that had their health needs met during pregnancy. They represent an international standard of ‘optimal’ growth. GIGS implements international growth standards from the WHO and INTERGROWTH-21st project:

  • ig_nbs - INTERGROWTH-21st Newborn Size standards (including very preterm)

    Component standards
    Acronym Description Unit x range
    wfga weight-for-GA kg 168 to 300 days
    lfga length-for-GA cm 168 to 300 days
    hcfga head circumference-for-GA cm 168 to 300 days
    wlrfga weight-to-length ratio-for-GA kg/cm 168 to 300 days
    ffmfga fat-free mass-for-GA kg 266 to 294 days
    bfpfga body fat percentage-for-GA % 266 to 294 days
    fmfga fat mass-for-GA kg 266 to 294 days
  • ig_png - INTERGROWTH-21st Postnatal Growth of Preterm Infants standards

    Component standards
    Acronym Description Unit x range
    wfa weight-for-age kg 27 to ≤64 exact weeks
    lfa length-for-age cm 27 to ≤64 exact weeks
    hcfa head circumference-for-age cm 27 to ≤64 exact weeks
    wfl weight-for-length kg 35 to 65 cm
  • ig_fet - INTERGROWTH-21st Fetal standards

    Component standards
    Acronym Description Unit x range
    hcfga head circumference-for-GA mm 98 to 280 days
    bpdfga biparietal diameter-for-GA mm 98 to 280 days
    acfga abdominal circumference-for-GA mm 98 to 280 days
    flfga femur length-for-GA mm 98 to 280 days
    ofdfga occipito-frontal diameter for-GA mm 98 to 280 days
    efwfga estimated fetal weight-for-GA g 154 to 280 days
    sfhfga symphisis-fundal height-for-GA mm 112 to 294 days
    crlfga crown-rump length-for-GA mm 58 to 105 days
    gafcrl GA-for-crown-rump length days 15 to 95 mm
    gwgfga gestational weight gain-for-GA kg 98 to 280 days
    pifga pulsatility index-for-GA 168 to 280 days
    rifga resistance index-for-GA 168 to 280 days
    sdrfga systolic/diastolic ratio-for-GA 168 to 280 days
    tcdfga transcerebellar diameter-for-GA mm 98 to 280 days
    tcdfga GA-for-transcerebellar diameter mm 98 to 280 days
    poffga parietal-occipital fissure-for-GA mm 105 to 252 days
    sffga Sylvian fissue-for-GA mm 105 to 252 days
    avfga anterior horn of the lateral ventricle-for-GA mm 105 to 252 days
    pvfga atrium of the posterior horn of the lateral ventricle-for-GA mm 105 to 252 days
    cmfga cisterna magna-for-GA mm 105 to 252 days
    hefwfga Hadlock estimated fetal weight-for-GA g 126 to 287 days
  • who_gs - WHO Child Growth Standards for term infants

    Component standards
    Acronym Description Unit x range
    wfa weight-for-age kg 0 to 1856 days
    bfa BMI-for-age kg/m2 0 to 1856 days
    lhfa length/height-for-age cm 0 to 1856 days
    hcfa head circumference-for-age cm 0 to 1856 days
    wfl weight-for-height kg 45 to 110 cm
    wfh weight-for-length kg 65 to 120 cm
    acfa arm circumference-for-age cm 91 to 1856 days
    ssfa subscapular skinfold-for-age mm 91 to 1856 days
    tsfa triceps skinfold-for-age mm 91 to 1856 days

Usage

Conversion functions are named according to the conversion they perform. Either they convert measured values to z-scores/centiles (value2zscore()/value2centile()), or they generate expected values for given z-scores/centiles (zscore2value()/centile2value()).

You tell gigs which international growth standard to use with the family and acronym parameters. The family parameter tells gigs which set of standards you want to use - e.g. "ig_nbs" for the INTERGROWTH-21st Newborn Size standards (including very preterm). The acronym parameter describes which exact growth standard you want out of all the growth standards in your ‘family’ of standards.

For example, to convert values to z-scores in the weight-for-GA standard from the INTERGROWTH-21st Newborn Size standards, you would run value2zscore(..., family = "ig_nbs", acronym = "wfga").

Similarly, the conversion of length-for-age values to centiles in term and preterm infants could be performed with the WHO Child Growth standards and INTERGROWTH-21st Postnatal Growth of Preterm Infants standards, respectively:

  • Preterm infants: value2centile(..., family = "ig_png", acronym = "lfa")
  • Term infants: value2centile(..., family = "who_gs", acronym = "lhfa")

If you don’t know which units are used for a given growth standard, the report_units() function will help you. Run it with your family and acronym combination to get help:

report_units(family = "ig_nbs", acronym = "wfga")
#> You're using "wfga" from the INTERGROWTH-21st Newborn Size Standards
#> ("ig_nbs").
#> ℹ Units for `y`: Weight (kg).
#> ℹ Units for `x`: Gestational age (days).

Values to z-scores/centiles

These functions allow easy conversion from measured values to z-scores or centiles for the standard used.

# Convert from z-scores for individual values...
value2zscore(y = 0.785, x = 182, sex = "F",
             family = "ig_nbs", acronym = "wfga") |>
  round(digits = 2)
#> [1] 0

# .. or for multiple inputs
value2centile(y = 0.785, x = seq(175, 196, by = 7), sex = "F",
              family = "ig_nbs", acronym = "wfga") |>
  round(digits = 2)
#> [1] 0.75 0.50 0.25 0.09

# You can also get centiles
value2centile(y = c(2.86, 3.12, 3.12, 3.43, 3.77, 4.10), x = 40, sex = "M",
              family = "ig_png",  acronym = "wfa") |>
  round(digits = 2)
#> [1] 0.10 0.25 0.25 0.50 0.75 0.90

Z-scores/centiles to values

These functions convert z-scores to expected anthropometric measurements. They are mostly useful for the creation of reference curves (see below).

# Convert from z-scores for individual values...
zscore2value(z = 0, x = 182, sex = "F",
             family = "ig_nbs", acronym = "wfga") |>
  round(digits = 3)
#> [1] 0.785

# .. or for multiple inputs
zscore2value(z = 0, x = seq(182, 204, by = 7), sex = "F",
             family = "ig_nbs", acronym = "wfga") |>
  round(digits = 3)
#> [1] 0.785 0.893 1.013 1.147

# You can do the same for centiles
centile2value(p = c(0.1, 0.25, 0.5, 0.75, 0.9), x = 40, sex = "M",
              family = "ig_png", acronym = "wfa") |>
  round(digits = 2)
#> [1] 2.87 3.12 3.43 3.77 4.11

Reference curves

We can use gigs to generate reference curves for the standards by getting curves for the expected weight at multiple z-scores across multiple gestational ages. We would usually recommend ggplot2 for such visualisation, but do not use it here to reduce our package’s dependencies.

z_score_range <- -2:2
gestage_range <- 168:230
ref <- mapply(z_score_range,
               FUN = function(z) {
                 gigs::zscore2value(z = z,
                                    x = gestage_range,
                                    sex = "F",
                                    family = "ig_nbs",
                                    acronym = "wfga")
               })
matplot(ref, x = gestage_range, col = 1:5, type = "l", lty = 2:6,
        xlab = "Gestational age (days)",
        ylab = "Weight (kg)")
title(main = "Weight-for-GA in very preterm newborns")
legend(x = min(gestage_range) + 1, y = ref[length(ref)], legend = 2:-2,
       title = "Z-score", col = 5:1, lty = 2:6)

A growth chart for weight against gestational age, with lines for each SD from +2 to -2.

Other packages

Other R packages can be used to analyse growth data with international standards, but have limitations which are not present in gigs. There are also software packages external to R which implement these standards. The table below describes these packages, and to what extent they have implemented functions that let users convert anthropometric measurements to z-scores/centiles in each set of standards implemented in gigs - the WHO Child Growth standards, INTERGROWTH-21st Newborn Size standards (including Very Preterm), and the INTERGROWTH-21st Postnatal Growth standards for preterm infants. A tick (✅) indicates that all possible standards are included in a package, a red cross (❌) indicates that these standards are completely missing, and a warning sign (⚠️) indicates that some of these standards are implemented but not others.

Software Platform WHO (0-5 years) IG-21st NBS IG-21st PNG IG-21st Fetal Functionality
gigs R Values ↔ z-scores/centiles
anthro R Values → z-scores
AGD R Values ↔ z-scores
childsds R Values → z-scores/centiles
ki-tools/growthstandards R ⚠️ ⚠️ Values ↔ z-scores/centiles
nutriverse/intergrowth R ⚠️ Values → z-scores/centiles
gigs (Stata) Stata Values ↔ z-scores/centiles
zanthro (Stata) Stata Values → z-scores/centiles

We have benchmarked some of these implementations against each other for conversion of values to z-scores in the WHO Child Growth Standards and different sets of INTERGROWTH-21st standards. The table below shows relative speed of each software package when processing 100,000 inputs. The code used to generate these timings can be seen online in the GIGS benchmarking article.

Software Platform WHO (0-5 years) (ms) IG-21st NBS (ms) IG-21st PNG (ms) IG-21st Fetal (ms)
gigs R 100 80 20 8
anthro R 2211
AGD R 119
childsds R 125
ki-tools/growthstandards R 88 72 43 10
nutriverse/intergrowth R 16
sitar R 46
zscorer R NA
gigs (Stata) Stata 405 471 164 93
zanthro (Stata) Stata 2046

Note: zscorer is NA because we couldn’t time it for 100,000 inputs (it takes too long).

The WHO and INTERGROWTH-21st standards are also available in standalone form, available from the WHO website and INTERGROWTH-21st website, respectively. The INTERGROWTH-21st website also includes download links for Excel-based calculators in some standards.

Authors + Citation

S. R. Parker Maternal, Adolescent, Reproductive, and Child Health Centre, London School of Hygiene & Tropical Medicine

Dr L. Vesel Ariadne Labs, Brigham and Women’s Hospital Harvard T.H. Chan School of Public Health

Professor E. O. Ohuma Maternal, Adolescent, Reproductive, and Child Health Centre, London School of Hygiene & Tropical Medicine

Citation

Parker SR, Vesel L, Ohuma EO (2023). gigs: Assess Fetal, Newborn, and Child Growth with International Standards. https://github.com/lshtm-gigs/gigs/.

Code of Conduct

Please note that the gigs project is released with a Contributor Code of Conduct. By contributing to this project you agree to abide by its terms.