pediatricsgrowthhealthalgorithmdeveloper-guide

Predicting Adult Height: Methods for Pediatric Health Applications

· 6 min read · Martin Hejda

Predicting how tall a child will grow as an adult is a question pediatricians face regularly — from parents curious about their child’s future height, to clinical decisions about growth hormone therapy, to eligibility for height-dependent activities. Several validated methods exist, each with different data requirements and accuracy profiles.

For developers building pediatric health applications, understanding these methods helps you implement them correctly and communicate their limitations honestly.


Why adult height prediction is hard

Adult height is determined by genetic potential (approximately 80% heritable) and environmental factors (nutrition, illness, socioeconomic conditions) that operate across the entire growth period. Predicting the final outcome from a single point in time requires estimating:

  • How much skeletal growth remains
  • Whether growth will proceed at a typical rate or be accelerated/delayed

Bone age — the degree of skeletal maturation as assessed from a hand/wrist X-ray — is the most predictive input. Without bone age, predictions are significantly less accurate. All methods that don’t use bone age carry substantially wider prediction intervals.


Method 1: Mid-Parental Height

The simplest method. Predicts a child’s adult height from parental heights alone, without any measurement of the child.

def mid_parental_height(
    father_height_cm: float,
    mother_height_cm: float,
    child_sex: str
) -> dict:
    """
    Mid-parental height method.
    Predicts adult height target range from parental heights.
    
    Accuracy: ±8.5cm (one standard deviation) — very wide.
    Useful for: identifying children outside expected family height range.
    Not useful for: precise individual height prediction.
    """
    if child_sex == "male":
        target_cm = (father_height_cm + mother_height_cm + 13) / 2
    else:
        target_cm = (father_height_cm + mother_height_cm - 13) / 2
    
    # 95% of children fall within ±8.5cm of mid-parental height
    # (approximately ±2 SD, where 1 SD ≈ 4.25cm for this method)
    return {
        "predicted_adult_height_cm": round(target_cm, 1),
        "range_95_low_cm": round(target_cm - 8.5, 1),
        "range_95_high_cm": round(target_cm + 8.5, 1),
        "method": "mid_parental_height",
        "inputs_required": ["father_height", "mother_height"],
        "accuracy_note": "±8.5cm at 95% confidence. Wide range — useful for family context only."
    }

Method 2: Khamis-Roche (without bone age)

Published in 1994 by Khamis and Roche, this is the most validated method that does not require bone age. It predicts adult height from current height, current weight, and mid-parental height, using age-specific regression coefficients.

The Khamis-Roche tables contain regression coefficients indexed by age (in years, from 4 to 17.5) and sex. The published coefficients produce estimates with approximately ±2.1cm standard error (a 95% prediction interval of roughly ±4.2cm).

# Khamis-Roche coefficients: {age_years: (b0, b_height, b_weight, b_mp_height)}
# These are approximate values — use the published paper tables for production
# Khamis & Roche (1994), Pediatrics, 94(4):504-507
KHAMIS_ROCHE_MALE = {
    8:  (-53.9, 1.27, 0.248, 0.473),
    9:  (-27.3, 1.12, 0.262, 0.481),
    10: (-13.8, 1.01, 0.268, 0.490),
    11: ( -1.4, 0.93, 0.265, 0.498),
    12: ( 23.1, 0.78, 0.258, 0.489),
    13: ( 33.9, 0.73, 0.238, 0.498),
    14: ( 52.8, 0.66, 0.213, 0.478),
    15: ( 73.0, 0.59, 0.188, 0.441),
    16: ( 95.1, 0.51, 0.162, 0.376),
    17: (115.8, 0.45, 0.131, 0.288),
}

KHAMIS_ROCHE_FEMALE = {
    8:  ( 5.1, 0.96, 0.199, 0.439),
    9:  (13.5, 0.89, 0.196, 0.456),
    10: (23.9, 0.80, 0.195, 0.471),
    11: (35.0, 0.69, 0.197, 0.474),
    12: (47.0, 0.57, 0.204, 0.470),
    13: (61.5, 0.44, 0.206, 0.449),
    14: (75.5, 0.33, 0.202, 0.410),
    15: (87.4, 0.26, 0.190, 0.374),
    16: (96.4, 0.22, 0.170, 0.339),
    17: (103.0, 0.20, 0.140, 0.312),
}

def khamis_roche_prediction(
    current_height_cm: float,
    current_weight_kg: float,
    father_height_cm: float,
    mother_height_cm: float,
    age_years: float,
    child_sex: str
) -> dict:
    """
    Khamis-Roche adult height prediction.
    
    Note: Uses coefficient tables that must be obtained from the original publication.
    The coefficients in this example are approximations for illustration only.
    """
    coefficients = KHAMIS_ROCHE_MALE if child_sex == "male" else KHAMIS_ROCHE_FEMALE
    
    # Find nearest age entry
    age_int = min(coefficients.keys(), key=lambda k: abs(k - age_years))
    b0, b_h, b_w, b_mp = coefficients[age_int]
    
    mp_height = (father_height_cm + mother_height_cm) / 2
    
    predicted_cm = b0 + b_h * current_height_cm + b_w * current_weight_kg + b_mp * mp_height
    
    # Standard error of estimate is approximately 2.1cm
    see = 2.1
    
    return {
        "predicted_adult_height_cm": round(predicted_cm, 1),
        "range_95_low_cm": round(predicted_cm - 1.96 * see, 1),
        "range_95_high_cm": round(predicted_cm + 1.96 * see, 1),
        "method": "khamis_roche",
        "age_years_used": age_int,
        "accuracy_note": f{1.96 * see:.1f}cm at 95% confidence (no bone age). More accurate than mid-parental method."
    }

Method 3: Bayley-Pinneau (with bone age)

The Bayley-Pinneau method uses the ratio of current height to the percentage of adult height that children at a given bone age have typically achieved. It requires a bone age assessment (typically Greulich-Pyle atlas reading from a hand X-ray).

This method is more accurate than Khamis-Roche because bone age predicts remaining growth potential better than chronological age.

# Percentage of adult height achieved at each bone age
# Source: Bayley & Pinneau (1952) tables, reproduced in clinical references
# These are approximate values for illustration
BAYLEY_PINNEAU_MALE = {
    # bone_age_years: percent_of_adult_height
    8: 72.0, 9: 75.5, 10: 78.2, 11: 81.2,
    12: 85.2, 13: 89.3, 14: 93.6, 15: 97.0,
    16: 99.0, 17: 99.8
}

BAYLEY_PINNEAU_FEMALE = {
    8: 77.5, 9: 81.0, 10: 84.5, 11: 88.5,
    12: 93.0, 13: 96.5, 14: 98.5, 15: 99.5,
    16: 99.8, 17: 100.0
}

def bayley_pinneau_prediction(
    current_height_cm: float,
    bone_age_years: float,
    child_sex: str
) -> dict:
    """
    Bayley-Pinneau adult height prediction using bone age.
    Requires a radiological bone age assessment.
    """
    tables = BAYLEY_PINNEAU_MALE if child_sex == "male" else BAYLEY_PINNEAU_FEMALE
    
    # Interpolate between nearest bone age entries
    bone_age_int = round(bone_age_years)
    bone_age_clamped = max(min(bone_age_int, 17), 8)
    pct = tables.get(bone_age_clamped, 99.0)
    
    predicted_cm = current_height_cm / (pct / 100)
    
    # SEE with bone age is approximately 2.5cm (reflects remaining variability)
    see = 2.5
    
    return {
        "predicted_adult_height_cm": round(predicted_cm, 1),
        "range_95_low_cm": round(predicted_cm - 1.96 * see, 1),
        "range_95_high_cm": round(predicted_cm + 1.96 * see, 1),
        "method": "bayley_pinneau",
        "bone_age_used": bone_age_years,
        "percent_adult_height_at_bone_age": pct,
        "accuracy_note": f{1.96 * see:.1f}cm at 95% confidence (with bone age)."
    }

Method comparison

MethodData RequiredTypical 95% CIBest Use
Mid-parental heightParent heights±8.5cmFamily height context, no child measurement
Khamis-RocheChild height, weight, age, parent heights±4.1cmClinical screening, no X-ray
Bayley-PinneauChild height, bone age (X-ray)±4.9cmGrowth disorder assessment, bone age available

Bayley-Pinneau has a wider published interval than Khamis-Roche despite using more data — this reflects the variability in growth after radiological assessment, not a failure of the method.


Connecting to current dimensional prediction

For applications that also track a child’s body dimensions over time (clothes sizing for growing children, ergonomics for student furniture), combining adult height prediction with current-age dimensional prediction gives a forward-looking view:

import requests

def child_profile_with_prediction(
    gender: str,
    age_years: float,
    current_height_cm: float,
    current_weight_kg: float,
    region: str = "GLOBAL"
) -> dict:
    """
    Get current body dimensions AND predicted adult height for a child.
    """
    # Current body dimensions (for sizing today)
    response = requests.post(
        "https://dimensionspot-bodysize-engine.p.rapidapi.com/v1/predict",
        json={
            "input_data": {
                "input_unit_system": "metric",
                "subject": {
                    "gender": gender,
                    "input_origin_region": region,
                    "age_category": "AUTO"
                },
                "anchors": {
                    "body_height": int(current_height_cm * 10),
                    "body_mass": current_weight_kg
                }
            },
            "output_settings": {
                "calculation": {"calculation_model": "AUTO", "target_region": region},
                "requested_dimensions": {"bundle": "TORSO"},
                "output_format": {"include_range_95": True}
            }
        },
        headers={
            "X-RapidAPI-Key": "YOUR_API_KEY",
            "X-RapidAPI-Host": "dimensionspot-bodysize-engine.p.rapidapi.com"
        }
    )
    current_dims = response.json()
    
    return {
        "current_dimensions": current_dims,
        "adult_height_note": "Use Khamis-Roche or Bayley-Pinneau method for adult height prediction."
    }

Communicating uncertainty to parents and clinicians

The 95% confidence interval for height prediction is typically ±4–9cm. For a child predicted to reach 180cm, the actual adult height might fall anywhere from 171cm to 189cm. This is not a failure of the prediction — it’s the inherent uncertainty in forecasting a biological process that spans a decade.

For pediatric health applications:

  • Always display the confidence interval, not just the point estimate
  • Avoid language like “your child will be X cm tall” — use “predicted range” framing
  • Clarify that the prediction assumes typical growth — illness, significant nutritional changes, or medical intervention can shift outcomes outside the predicted range
  • Recommend clinical consultation for children whose current growth trajectory is outside normal ranges (z-score <-2 or >+2)

Adult height prediction is one of the few anthropometric forecasting problems that is genuinely interesting to implement — it requires understanding growth physiology, not just statistics. The methods described here are established in clinical practice; the implementation details (coefficient interpolation, uncertainty quantification, appropriate display) are where application developers add value.

Try DimensionsPot

Free tier — 100 requests/month, no credit card required.

Get API on RapidAPI