The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

WHO::GrowthReference::Table - Lookup height/weight in the WHO growth chart (a.k.a. growth reference, growth standards)

VERSION

This document describes version 0.012 of WHO::GrowthReference::Table (from Perl distribution WHO-GrowthReference-Table), released on 2022-06-07.

SYNOPSIS

 use WHO::GrowthReference::Table qw(get_who_growth_reference);

 # get mean height & weight of a 3-year old girl

 my $res = get_who_growth_reference(gender => "F", dob => time() - 3*365.25*86400);
 # => [200, "OK", {
 #      age => "36.0 month(s)",
 #      height_mean => 95.034, # cm
 #      weight_mean => 13.9,   # kg
 #      height_P01  => ..., # height at 0.1% percentile
 #      height_P1   => ..., # height at 1% percentile
 #      height_Z-3  => ..., # height at -3 SD
 #      height_Z-2  => ..., # height at -2 SD
 #      ...
 #     }]

 # you have a 3.5-year old boy weighing at 14.8kg and with a height of 102cm,
 # calculate the percentiles

 my $res = get_who_growth_reference(gender => "M", dob => time() - 3.5*365.25*86400, weight=>14.8, height=>102);
 # => [200, "OK", {
 #      age => "42.0 month(s)",
 #      height_mean => 99.844, # cm
 #      height_percentile => 70.2, # your boy's height is above world average, about 70.2% of boys of the same age are shorter than your boy
 #      height_zscore => ...,
 #      weight_mean => 15.3,   # kg
 #      weight_percentile => 39.6, # your boy's weight is below world average, about 39.6% of boys of the same age weigh less than your boy
 #      weight_zscore => ...,
 #      height_P01 => ...,
 #      ...
 #      height_potential => ...,
 #      height_potential_Z0 => ...,
 #      weight_potential_10y => ...,
 #      weight_potential_10y_Z0 => ...,
 #     }]

DESCRIPTION

FUNCTIONS

get_who_growth_reference

Usage:

 get_who_growth_reference(%args) -> [$status_code, $reason, $payload, \%result_meta]

Lookup height/weight in the WHO growth chart (a.k.a. growth reference, growth standards).

Examples:

  • Get weight/height information for a boy that is born on May 4, 2017:

     get_who_growth_reference(gender => "M", dob => "2017-05-04");

    Result:

     [
       200,
       "OK",
       {
         age           => "61.0 month(s)",
         bmi_mean      => 15.264,
         bmi_P01       => 12.041,
         bmi_P1        => 12.72,
         bmi_P10       => 13.764,
         bmi_P15       => 14.03,
         bmi_P25       => 14.441,
         bmi_P3        => 13.148,
         bmi_P5        => 13.384,
         bmi_P50       => 15.264,
         bmi_P75       => 16.172,
         bmi_P85       => 16.7,
         bmi_P90       => 17.074,
         bmi_P95       => 17.656,
         bmi_P97       => 18.052,
         bmi_P99       => 18.845,
         bmi_P999      => 20.355,
         bmi_SD0       => 15.264,
         bmi_SD1       => 16.645,
         bmi_SD1neg    => 14.071,
         bmi_SD2       => 18.259,
         bmi_SD2neg    => 13.031,
         bmi_SD3       => 20.166,
         bmi_SD3neg    => 12.118,
         bmi_SD4       => 22.072,
         bmi_SD4neg    => 11.204,
         gender        => "M",
         height_mean   => 110.265,
         height_P01    => 96.076,
         height_P1     => 99.583,
         height_P10    => 104.381,
         height_P15    => 105.506,
         height_P25    => 107.168,
         height_P3     => 101.629,
         height_P5     => 102.712,
         height_P50    => 110.265,
         height_P75    => 113.362,
         height_P85    => 115.023,
         height_P90    => 116.149,
         height_P95    => 117.817,
         height_P97    => 118.9,
         height_P99    => 120.946,
         height_P999   => 124.453,
         height_SD0    => 110.265,
         height_SD1    => 114.856,
         height_SD1neg => 105.673,
         height_SD2    => 119.448,
         height_SD2neg => 101.082,
         height_SD3    => 124.039,
         height_SD3neg => 96.49,
         height_SD4    => 128.63,
         height_SD4neg => 91.899,
         weight_mean   => 18.506,
         weight_P01    => 12.581,
         weight_P1     => 13.802,
         weight_P10    => 15.711,
         weight_P15    => 16.204,
         weight_P25    => 16.967,
         weight_P3     => 14.58,
         weight_P5     => 15.013,
         weight_P50    => 18.506,
         weight_P75    => 20.216,
         weight_P85    => 21.212,
         weight_P90    => 21.92,
         weight_P95    => 23.023,
         weight_P97    => 23.774,
         weight_P99    => 25.276,
         weight_P999   => 28.126,
         weight_SD0    => 18.506,
         weight_SD1    => 21.109,
         weight_SD1neg => 16.279,
         weight_SD2    => 24.165,
         weight_SD2neg => 14.367,
         weight_SD3    => 27.77,
         weight_SD3neg => 12.718,
         weight_SD4    => 31.375,
         weight_SD4neg => 11.07,
       },
       {
         "func.raw_weight" => [
           61,
           -0.2026,
           18.5057,
           0.12988,
           12.581,
           13.802,
           14.58,
           15.013,
           15.711,
           16.204,
           16.967,
           18.506,
           20.216,
           21.212,
           21.92,
           23.023,
           23.774,
           25.276,
           28.126,
         ],
       },
     ]
  • Get weight/height information for a 6.5yo girl:

     get_who_growth_reference(gender => "F", age => "6.5y");

    Result:

     [
       200,
       "OK",
       {
         age           => "78.0 month(s)",
         bmi_mean      => 15.32,
         bmi_P01       => 11.645,
         bmi_P1        => 12.365,
         bmi_P10       => 13.525,
         bmi_P15       => 13.832,
         bmi_P25       => 14.315,
         bmi_P3        => 12.832,
         bmi_P5        => 13.096,
         bmi_P50       => 15.32,
         bmi_P75       => 16.492,
         bmi_P85       => 17.206,
         bmi_P90       => 17.728,
         bmi_P95       => 18.57,
         bmi_P97       => 19.165,
         bmi_P99       => 20.41,
         bmi_P999      => 23.013,
         bmi_SD0       => 15.32,
         bmi_SD1       => 17.131,
         bmi_SD1neg    => 13.879,
         bmi_SD2       => 19.482,
         bmi_SD2neg    => 12.704,
         bmi_SD3       => 22.668,
         bmi_SD3neg    => 11.725,
         bmi_SD4       => 25.855,
         bmi_SD4neg    => 10.746,
         gender        => "F",
         height_mean   => 117.977,
         height_P01    => 101.611,
         height_P1     => 105.657,
         height_P10    => 111.19,
         height_P15    => 112.488,
         height_P25    => 114.405,
         height_P3     => 108.016,
         height_P5     => 109.266,
         height_P50    => 117.977,
         height_P75    => 121.549,
         height_P85    => 123.466,
         height_P90    => 124.764,
         height_P95    => 126.688,
         height_P97    => 127.938,
         height_P99    => 130.297,
         height_P999   => 134.343,
         height_SD0    => 117.977,
         height_SD1    => 123.273,
         height_SD1neg => 112.681,
         height_SD2    => 128.569,
         height_SD2neg => 107.385,
         height_SD3    => 133.865,
         height_SD3neg => 102.089,
         height_SD4    => 139.161,
         height_SD4neg => 96.793,
         weight_mean   => 21.227,
         weight_P01    => 13.932,
         weight_P1     => 15.333,
         weight_P10    => 17.626,
         weight_P15    => 18.239,
         weight_P25    => 19.206,
         weight_P3     => 16.252,
         weight_P5     => 16.773,
         weight_P50    => 21.227,
         weight_P75    => 23.591,
         weight_P85    => 25.028,
         weight_P90    => 26.077,
         weight_P95    => 27.761,
         weight_P97    => 28.945,
         weight_P99    => 31.399,
         weight_P999   => 36.41,
         weight_SD0    => 21.227,
         weight_SD1    => 24.877,
         weight_SD1neg => 18.333,
         weight_SD2    => 29.572,
         weight_SD2neg => 15.998,
         weight_SD3    => 35.757,
         weight_SD3neg => 14.087,
         weight_SD4    => 41.942,
         weight_SD4neg => 12.175,
       },
       {
         "func.raw_weight" => [
           78,
           -0.5185,
           21.2274,
           0.1523,
           13.932,
           15.333,
           16.252,
           16.773,
           17.626,
           18.239,
           19.206,
           21.227,
           23.591,
           25.028,
           26.077,
           27.761,
           28.945,
           31.399,
           36.41,
         ],
       },
     ]
  • See percentiles/z-scores for a 6yo boy weighing 17kg and having a height of 102cm:

     get_who_growth_reference(gender => "M", age => "6y", height => 102, weight => 17);

    Result:

     [
       200,
       "OK",
       {
         age                  => "72.0 month(s)",
         bmi                  => 16.3398692810458,
         bmi_mean             => 15.306,
         bmi_P01              => 12.066,
         bmi_P1               => 12.733,
         bmi_P10              => 13.773,
         bmi_P15              => 14.042,
         bmi_P25              => 14.459,
         bmi_P3               => 13.157,
         bmi_P5               => 13.393,
         bmi_P50              => 15.306,
         bmi_P75              => 16.258,
         bmi_P85              => 16.819,
         bmi_P90              => 17.221,
         bmi_P95              => 17.854,
         bmi_P97              => 18.291,
         bmi_P99              => 19.176,
         bmi_P999             => 20.91,
         bmi_percentile       => 76.4593454731863,
         bmi_SD0              => 15.306,
         bmi_SD1              => 16.761,
         bmi_SD1neg           => 14.083,
         bmi_SD2              => 18.52,
         bmi_SD2neg           => 13.04,
         bmi_SD3              => 20.689,
         bmi_SD3neg           => 12.141,
         bmi_SD4              => 22.858,
         bmi_SD4neg           => 11.242,
         bmi_zscore           => 0.71056307975653,
         gender               => "M",
         height_mean          => 115.951,
         height_P01           => 100.726,
         height_P1            => 104.49,
         height_P10           => 109.637,
         height_P15           => 110.845,
         height_P25           => 112.628,
         height_P3            => 106.685,
         height_P5            => 107.847,
         height_P50           => 115.951,
         height_P75           => 119.274,
         height_P85           => 121.057,
         height_P90           => 122.265,
         height_P95           => 124.055,
         height_P97           => 125.217,
         height_P99           => 127.412,
         height_P999          => 131.176,
         height_percentile    => 0.404622741764081,
         height_potential     => 155.876968650372,
         height_potential_SD0 => 176.543,
         height_SD0           => 115.951,
         height_SD1           => 120.878,
         height_SD1neg        => 111.024,
         height_SD2           => 125.804,
         height_SD2neg        => 106.097,
         height_SD3           => 130.731,
         height_SD3neg        => 101.171,
         height_SD4           => 135.658,
         height_SD4neg        => 96.244,
         height_zscore        => -2.83170929760455,
         weight_mean          => 20.514,
         weight_P01           => 13.913,
         weight_P1            => 15.248,
         weight_P10           => 17.361,
         weight_P15           => 17.912,
         weight_P25           => 18.768,
         weight_P3            => 16.105,
         weight_P5            => 16.585,
         weight_P50           => 20.514,
         weight_P75           => 22.48,
         weight_P85           => 23.637,
         weight_P90           => 24.467,
         weight_P95           => 25.767,
         weight_P97           => 26.661,
         weight_P99           => 28.464,
         weight_P999          => 31.948,
         weight_percentile    => 7.67396907216494,
         weight_SD0           => 20.514,
         weight_SD1           => 23.517,
         weight_SD1neg        => 17.996,
         weight_SD2           => 27.129,
         weight_SD2neg        => 15.87,
         weight_SD3           => 31.508,
         weight_SD3neg        => 14.063,
         weight_SD4           => 35.888,
         weight_SD4neg        => 12.256,
         weight_zscore        => -1.46848541862653,
       },
       {
         "func.raw_weight" => [
           72,
           -0.318,
           20.5137,
           0.13372,
           13.913,
           15.248,
           16.105,
           16.585,
           17.361,
           17.912,
           18.768,
           20.514,
           22.48,
           23.637,
           24.467,
           25.767,
           26.661,
           28.464,
           31.948,
         ],
       },
     ]

Caveats:

Currently the z-zcore line values (e.g. height_Z1, height_Z-1, etc) are calculated using linear interpolation.

This function is not exported by default, but exportable.

Arguments ('*' denotes required arguments):

  • age => duration

  • dob => date

  • gender* => str

  • height => float

    Specify height to calculate percentile.

  • now => date

    Assume now is this date, instead of current date.

  • weight => float

    Specify weight to calculate percentile.

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/WHO-GrowthReference-Table.

SOURCE

Source repository is at https://github.com/perlancar/perl-WHO-GrowthReference-Table.

SEE ALSO

WHO::GrowthReference::GenChart uses this module to make growth charts.

For CLI frontends for this module and more, see App::WHOGrowthReferenceUtils.

Source data is from http://www.who.int/childgrowth/standards/en/. Note that CDC also publishes growth standards; I might write CDC::GrowthReference::Table too someday.

AUTHOR

perlancar <perlancar@cpan.org>

CONTRIBUTING

To contribute, you can send patches by email/via RT, or send pull requests on GitHub.

Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:

 % prove -l

If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional steps required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE

This software is copyright (c) 2022, 2021, 2018 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=WHO-GrowthReference-Table

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.