Hệ thống đánh giá dựa trên chuẩn WHO Child Growth Standards 2006
WHO 2006 là tiêu chuẩn toàn cầu được phát triển từ nghiên cứu đa quốc gia với:
Hệ thống đánh giá tình trạng dinh dưỡng trẻ em sử dụng 4 chỉ số chính dựa trên chuẩn WHO Child Growth Standards 2006 với phương pháp LMS (Lambda-Mu-Sigma):
Hệ thống sử dụng 4 nhóm tuổi khác nhau trong cơ sở dữ liệu WHO LMS để đảm bảo độ chính xác tối ưu cho từng giai đoạn phát triển:
Hệ thống tìm kiếm giá trị chính xác trong tất cả các bảng theo thứ tự ưu tiên:
Nếu không tìm thấy giá trị chính xác, thực hiện nội suy tuyến tính:
0_13w để có độ chính xác cao nhấtPhương pháp LMS (Lambda-Mu-Sigma) được phát triển bởi Cole & Green (1992) để xử lý phân phối không chuẩn trong dữ liệu tăng trưởng trẻ em:
public static function calculateZScore( float $X, float $L, float $M, float $S ): ?float { // WHO LMS formula if (abs($L) < 0.0001) { return log($X / $M) / $S; } else { return (pow($X/$M, $L) - 1) / ($L * $S); } }
app/Models/WHOZScoreLMS.php:278-296
who_zscore_lms database với 938 records tham số L,M,S chính thứcHệ thống không sử dụng cố định "0-60 tháng" mà tự động chọn bộ tham số WHO phù hợp nhất cho từng trẻ:
0_13w (dữ liệu theo tuần, chính xác cho trẻ sơ sinh)0_2y (granularity cao cho giai đoạn quan trọng)0_5y (phạm vi toàn diện cho trẻ mầm non)0_5y (giới hạn WHO Standards)0_13w > 0_2y > 0_5y > 2_5y0_2y > 0_5y > 0_13w > 2_5y2_5y nếu không tìm thấy chiều cao trong bộ khác// File: app/Models/WHOZScoreLMS.php:382-400 (Core WHO LMS Formula) public static function calculateZScore(float $X, float $L, float $M, float $S): ?float { // Validate inputs (M > 0, S > 0, X > 0) if ($M <= 0 || $S <= 0 || $X <= 0) return null; // WHO LMS formula implementation if (abs($L) < 0.0001) { // When L ≈ 0: Z = ln(X/M) / S return log($X / $M) / $S; } else { // Standard: Z = [(X/M)^L - 1] / (L*S) return (pow($X/$M, $L) - 1) / ($L * $S); } }
calculateZScoreLMS('wfa', weight)
calculateZScoreLMS('hfa', height)
calculateZScoreLMS(indicator, weight)
calculateZScoreLMS('bmi', bmi)
Khi tuổi hoặc chiều cao không có sẵn trong database, hệ thống tự động nội suy tuyến tính giữa 2 điểm gần nhất:
Cho 2 điểm: P₁(x₁, y₁) và P₂(x₂, y₂)
Cần tìm: y tại điểm x (với x₁ < x < x₂)
Ratio: r = (x - x₁) / (x₂ - x₁) → y = y₁ + r × (y₂ - y₁)
// File: WHOZScoreLMS.php:267-295 // x₁ = lower->age_in_months, x₂ = upper->age_in_months // x = ageInMonths (cần nội suy) $ratio = ($ageInMonths - $lower->age_in_months) / ($upper->age_in_months - $lower->age_in_months); // Áp dụng cho từng tham số LMS: L = L_lower + ratio * (L_upper - L_lower) M = M_lower + ratio * (M_upper - M_lower) S = S_lower + ratio * (S_upper - S_lower)
// File: WHOZScoreLMS.php:297-340 // x₁ = lower->length_height_cm, x₂ = upper->length_height_cm // x = lengthHeightCm (cần nội suy) $ratio = ($lengthHeightCm - $lower->length_height_cm) / ($upper->length_height_cm - $lower->length_height_cm); // Áp dụng cho từng tham số LMS: L = L_lower + ratio * (L_upper - L_lower) M = M_lower + ratio * (M_upper - M_lower) S = S_lower + ratio * (S_upper - S_lower)
WHO_zscore_lms WHERE indicator='wfa' AND sex='{M|F}' AND age_range='{optimal}' AND age_in_months={tuổi}
// File: app/Models/History.php:736-740 public function getWeightForAgeZScoreLMS() { return $this->calculateZScoreLMS('wfa', $this->weight); } // File: app/Models/WHOZScoreLMS.php:54-58 public static function getLMSForAge(string $indicator, string $sex, float $ageInMonths) { $optimalRange = self::determineOptimalAgeRange($ageInMonths); // Try exact match first, then interpolation if needed }
| Khoảng Z-Score | Phân loại | Kết luận | Màu sắc |
|---|---|---|---|
| Z ≥ +3SD | obese |
Trẻ béo phì | 🔴 Đỏ |
| +2SD < Z < +3SD | overweight |
Trẻ thừa cân | 🟠 Cam |
| -2SD ≤ Z ≤ +2SD | normal |
Trẻ bình thường | 🟢 Xanh |
| -3SD ≤ Z < -2SD | underweight_moderate |
Trẻ suy dinh dưỡng thể nhẹ cân, mức độ vừa | 🟠 Cam |
| Z < -3SD | underweight_severe |
Trẻ suy dinh dưỡng thể nhẹ cân, mức độ nặng | 🔴 Đỏ |
WHO_zscore_lms WHERE indicator='hfa' AND sex='{M|F}' AND age_range='{optimal}' AND age_in_months={tuổi}
// File: app/Models/History.php:742-746 public function getHeightForAgeZScoreLMS() { return $this->calculateZScoreLMS('hfa', $this->height); } // Sử dụng cùng WHOZScoreLMS::getLMSForAge() như W/A // Chỉ khác về indicator='hfa' và X=height thay vì weight
| Khoảng Z-Score | Phân loại | Kết luận | Màu sắc |
|---|---|---|---|
| Z ≥ +3SD | above_3sd |
Trẻ cao bất thường | 🔵 Xanh dương |
| +2SD < Z < +3SD | above_2sd |
Trẻ cao hơn bình thường | 🟦 Xanh nhạt |
| -2SD ≤ Z ≤ +2SD | normal |
Trẻ bình thường | 🟢 Xanh |
| -3SD ≤ Z < -2SD | stunted_moderate |
Trẻ suy dinh dưỡng thể thấp còi, mức độ vừa | 🟠 Cam |
| Z < -3SD | stunted_severe |
Trẻ suy dinh dưỡng thể thấp còi, mức độ nặng | 🔴 Đỏ |
WHO_zscore_lms WHERE indicator='{wfl|wfh}' AND sex='{M|F}' AND age_range='{optimal}' AND length_height_cm={chiều_cao}
// File: app/Models/History.php:757-770 public function getWeightForHeightZScoreLMS() { // Auto-select WFL vs WFH based on age $indicator = ($this->age < 24) ? 'wfl' : 'wfh'; return $this->calculateZScoreLMS($indicator, $this->weight); } // File: app/Models/WHOZScoreLMS.php:210-235 public static function getLMSForHeight(string $indicator, string $sex, float $lengthHeightCm, float $ageInMonths) { // 1. Age Range Optimization based on age // 2. Find exact height match OR interpolate between heights // 3. Fallback to other age ranges if height not found }
| Khoảng Z-Score | Phân loại | Kết luận | Màu sắc |
|---|---|---|---|
| Z ≥ +3SD | obese |
Trẻ béo phì | 🔴 Đỏ |
| +2SD < Z < +3SD | overweight |
Trẻ thừa cân | 🟠 Cam |
| -2SD ≤ Z ≤ +2SD | normal |
Trẻ bình thường | 🟢 Xanh |
| -3SD ≤ Z < -2SD | underweight_moderate |
Trẻ suy dinh dưỡng thể gầy còm, mức độ vừa | 🟠 Cam |
| Z < -3SD | underweight_severe |
Trẻ suy dinh dưỡng thể gầy còm, mức độ nặng | 🔴 Đỏ |
WHO_zscore_lms WHERE indicator='bmi' AND sex='{M|F}' AND age_range='{optimal}' AND age_in_months={tuổi}
// File: app/Models/History.php:748-752 public function getBMIForAgeZScoreLMS() { return $this->calculateZScoreLMS('bmi', $this->bmi); } // Automatically calculates BMI = weight(kg) / [height(m)]² // Then uses same WHOZScoreLMS::getLMSForAge() logic as W/A, H/A // BMI calculated in History model accessor: getBmiAttribute()
| Khoảng Z-Score | Phân loại | Kết luận | Màu sắc |
|---|---|---|---|
| Z ≥ +3SD | obese |
Trẻ béo phì | 🔴 Đỏ |
| +2SD < Z < +3SD | overweight |
Trẻ thừa cân | 🟠 Cam |
| -2SD ≤ Z ≤ +2SD | normal |
Trẻ bình thường | 🟢 Xanh |
| -3SD ≤ Z < -2SD | wasted_moderate |
Trẻ suy dinh dưỡng thể gầy còm, mức độ vừa | 🟠 Cam |
| Z < -3SD | wasted_severe |
Trẻ suy dinh dưỡng thể gầy còm, mức độ nặng | 🔴 Đỏ |
// File: app/Models/History.php:700-730 - Universal calculateZScoreLMS() public function calculateZScoreLMS(string $indicator, float $value): ?float { $sex = $this->gender == 1 ? 'M' : 'F'; $ageInMonths = $this->age; // Route to appropriate LMS lookup method if (in_array($indicator, ['wfa', 'hfa', 'bmi'])) { $lms = WHOZScoreLMS::getLMSForAge($indicator, $sex, $ageInMonths); } else { // wfh, wfl - height-based $lms = WHOZScoreLMS::getLMSForHeight($indicator, $sex, $this->height, $ageInMonths); } return WHOZScoreLMS::calculateZScore($value, $lms['L'], $lms['M'], $lms['S']); }
$history->getWeightForAgeZScoreLMS() → W/A$history->getHeightForAgeZScoreLMS() → H/A$history->getBMIForAgeZScoreLMS() → BMI/A$history->getWeightForHeightZScoreLMS() → W/H (auto WFL/WFH)float (-5.00 to +5.00)Hệ thống sử dụng thuật toán ưu tiên để xác định tình trạng dinh dưỡng cuối cùng dựa trên kết hợp 3 chỉ số chính (W/A, H/A, W/H):
| Ưu tiên | Điều kiện | Kết luận |
|---|---|---|
| 1 | H/A < -2SD VÀ W/H < -2SD | Suy dinh dưỡng phối hợp |
| 2 | W/H < -3SD | Suy dinh dưỡng gầy còm nặng |
| 3 | H/A < -3SD | Suy dinh dưỡng thấp còi nặng |
| 4 | W/A < -3SD | Suy dinh dưỡng nhẹ cân nặng |
| 5 | W/A > +3SD HOẶC W/H > +3SD | Béo phì |
| Ưu tiên | Điều kiện | Kết luận |
|---|---|---|
| 6 | W/H: -3SD ≤ Z < -2SD | Suy dinh dưỡng gầy còm |
| 7 | H/A: -3SD ≤ Z < -2SD | Suy dinh dưỡng thấp còi |
| 8 | W/A: -3SD ≤ Z < -2SD | Suy dinh dưỡng nhẹ cân |
| 9 | W/A > +2SD HOẶC W/H > +2SD | Thừa cân |
// 1. Age Range Optimization $optimalRange = WHOZScoreLMS::determineOptimalAgeRange(21); // '0_2y' // 2. Get LMS Parameters with optimized range $lms = WHOZScoreLMS::getLMSForAge('wfa', 'F', 21, $optimalRange); // 3. Calculate Z-Score return (pow($X / $M, $L) - 1) / ($L * $S); // pow(7.9/10.9451, 0.3809) - 1) / (0.3809 * 0.13058) = -2.69
SELECT L, M, S, indicator, sex, age_range, age_in_months FROM who_zscore_lms WHERE indicator = 'wfa' AND sex = 'F' AND age_range = '0_2y' -- AUTO-SELECTED! AND age_in_months = 21 ORDER BY CASE age_range WHEN '0_2y' THEN 1 -- Highest priority for 21 months WHEN '0_5y' THEN 2 END LIMIT 1; -- Kết quả: L=0.3809, M=10.9451, S=0.13058 (from optimal '0_2y' range) -- Tổng số records: 938 | Age ranges: 0_13w(71), 0_2y(49), 0_5y(305), 2_5y(513)
| Chỉ số | Z-Score | Kết luận |
|---|---|---|
| W/A | -2.69 | SDD nhẹ cân vừa |
| H/A | -2.83 | SDD thấp còi vừa |
| W/H | -1.68 | Bình thường |
who_zscore_lms (938 records)