方法說明

z 分數是怎麼算出來的

本站顯示的 z 分數(SDS)不是把百分位反推回來的,而是獨立算出來的量。 這一頁說明計算路徑、驗證到什麼程度,以及已知還有哪些限制。

一句話版本

曲線之內,以兒童健康手冊上已發布的百分位值為錨點,數字與手冊完全一致; 曲線之外,改用反推的 LMS 係數外推,並平移到最外側曲線上接合。 兩段合起來得到一個連續、不受 P0.1/P99.9 夾制的 z。

1. 為什麼要多一個 z

百分位在中段很好用,到了兩端就沒有解析度。本站的百分位夾在 0.1 至 99.9 之間,換算過來等於 z 只能落在 ±3.09——真正需要追蹤的孩子恰好都在這條線之外。

同一個 10 歲男孩的體重,兩次回診
回診體重畫面上的百分位未夾制的百分位z 分數
初診20.0 kgP0.1P0.024−3.49
半年後17.0 kgP0.1P0.0000070−5.26

同一個指標、同一個孩子,掉了 3 公斤,百分位卻一個字都沒變——因為 P0.1 是夾制後的下限,掉再多也只會顯示 P0.1。看百分位會以為情況穩定; z 從 −3.49 掉到 −5.26,是 1.8 個標準差。同樣的道理也適用於比較兩個孩子: 兩個都報 P0.1,實際上可能差了 2 個 SD 以上。

遺傳身高的 SD 差距也是同一個問題——原本繞道百分位反推,會把 −4.8 SD 壓成 −4.4。

2. 計算路徑

資料來源是台灣兒童生長曲線(陳偉德、張美惠 2010;國健署公布的圖表與 BMI 建議值),也就是兒童健康手冊上那幾條線。我們額外由這些已發布的百分位表反推出 LMS 係數,只用在曲線之外。

LMS 模型

每個年齡用三個參數描述分布:偏態 L、中位數 M、變異係數 S。測量值 X 換成 z 的公式是

z = ((X / M)^L − 1) / (L · S)  L ≠ 0

z = ln(X / M) / S        L = 0

年齡之間對 L、M、S 三個係數各自線性內插,與 CDC 官方 SAS 程式的作法相同。

  1. 曲線之內(身高/體重/頭圍 P3–P97、BMI P5–P95)
    以已發布的值為錨點。先用 LMS 把測量值與相鄰兩條曲線都換成 z,再把這個 z 線性映射到那兩條曲線的標準 z 上。表列的點因此完全命中官方值——表上的 P85 就是 P85,不會漂到 P82;曲線之間的形狀仍然跟著 LMS 走,比直接在測量值上做直線內插貼近真實曲線。
  2. 曲線之外
    改用 LMS 外推,並平移到最外側曲線上接合(z = 邊界 z + LMS 的 z 增量)。 平移保證接合處連續且單調,同時保留 LMS 的尾端形狀。
  3. 退路
    若該年齡查不到 LMS,退回舊版的直線外推。目前所有年齡都查得到,這條路徑在驗證中從未被觸發。
曲線之外,兩種外推法差多少

10 歲男孩的體重。P3(24.0 公斤)以左就是已發布曲線涵蓋不到的區間,兩條線從那裡開始分岔。

本站:LMS 外推,平移接合舊版:沿用最外一段斜率直線外推
曲線之外(P3 以下)已發布曲線之內0-1-2-3-4-5-6-71618202224262830體重(公斤)z舊版本站P3 接合處17.3 公斤5.063.83相差 1.23 SD

滑鼠移到圖上可以讀任一體重的兩個值;預設停在 17.3 公斤。 接合處兩條線重合,往左才分開——這是平移的作用,保證 P3 這一點沒有跳動。

3. 為什麼不直接用 LMS

已發布的百分位表不是 LMS 的輸出,而是四捨五入到小數第一位的印刷值。 要讓三個參數同時通過同一列的 7 個(BMI 為 5 個)點,一般無解—— 反推得到的曲線一定會與表格有落差。

純 LMS(不錨定)在表列點上的偏離,全部八張表
情形偏離出現在哪裡
最差的一格3.14 個百分位女生 0 歲體重,表上的 P75(3.6 kg)算成 P78.1
中位數上最差1.93 個百分位男生 18.5 歲身高,表上的 P50(172 cm)算成 P51.9
切點上的例子2.77 個百分位男生 6.5 歲 BMI,表上的 P85(17.3)算成 P82.2——過重的切點本身會漂移

最後一列是最麻煩的:P85 是判定過重的切點,如果曲線本身偏移, 一個剛好落在切點上的孩子就會被分到另一邊。誤差不大,但落在會改變處置的位置上。

因此改為錨定。曲線之內以已發布的值為準,LMS 只決定錨點之間的形狀; 曲線之外沒有已發布的值可以錨定,才交給 LMS,該處 LMS 的尾端形狀也優於直線外推。

4. 自己驗一次

錨定 vs 純 LMS 對照台
選一個年齡與指標,按下面任何一條已發布曲線的按鈕,把兒童健康手冊上的值原封不動丟進來。 錨定如果是精確的,百分位就應該剛好回到那條線;右欄的「純 LMS」是不做錨定時會得到的結果。

6.5 歲的BMI已發布曲線(點按帶入)

本站(錨定 + LMS 尾端)

85.0000百分位

z +1.036433

已發布曲線(錨定)

對照:純 LMS(不錨定)

83.0638百分位

z +0.956690

直接把反推出來的 L/M/S 當成真值。曲線之內會跟官方表格對不起來, 落差就是這一欄與左欄的距離。

這是已發布的 P85 曲線值,理論 z = 1.036433

本站的 z 誤差 1.16e-9 · 純 LMS 的 z 誤差 7.97e-2 · 純 LMS 換算成百分位會偏離 1.94 個百分位

BMI 專用指標

同齡 P95 = 19.16 kg/m² · %BMIp95 = 90.3% · 與 P95 相差 -1.86 kg/m²

畫面上只有 BMI ≥ P95 時才改列 %BMIp95,理由見下方「什麼時候該看哪個數字」。

這一次用到的 LMS 係數(6.5 歲,年齡之間對三個參數各自線性內插)

L -2.816666
M 15.560225
S 0.0957796

預設帶的就是上表最後一列:男生、6.5 歲、BMI 17.3,表上的 P85。 左欄回到 P85.0000,右欄的純 LMS 落在 P82.2。 各張表的落差大小不一,按不同曲線與年齡可以自己掃一遍。

5. 自動化驗證

專案內建 pnpm run check:growth, 23 條斷言涵蓋全部 2258 個錨定點,每次改動都會跑。 目前全數通過,錨定點的最大 z 誤差 2.1 × 10⁻⁹。

另外,0–5 歲這一段有外部答案卷。台灣自 2009 年起在該區間直接採用 WHO 2006 標準, 官方的 L/M/S 是公開的,所以可以檢查我們反推出來的係數究竟準不準 (pnpm run check:who, 44 個年齡列)。拿 WHO 真值產生測量值再換算回 z:

還原 z 的平均絕對誤差,對照 WHO 2006 官方 L/M/S
區間舊版直線外推本站(LMS)改善
曲線內(|z| ≤ 1.88)0.01310.00811.6 倍
曲線外(|z| > 1.88)0.05780.02332.5 倍
z = ±3 這兩點0.090 / 0.1160.032 / 0.0322.8–3.6 倍

越往尾端差距越大,正好是 LMS 被實際用到的區間。反推的係數與 WHO 真值相比, |ΔL| 中位數 0.086、|ΔM| 中位數 0.013(cm 或 kg)。 同一支腳本也守住「已提交的係數必須等於重新擬合的結果」—— 手改過係數檔、或改了百分位表卻忘了重跑擬合,都會被抓到。

看這 23 條檢查的是什麼

原始碼在 scripts/check-growth.ts

錨定精確度

  • 全部 2258 個表列點的 z 都等於該百分位的理論值,最大誤差 2.1 × 10⁻⁹
  • 換算回百分位的最大誤差小於 10⁻⁴ 個百分位

z 不被夾制

  • 百分位仍夾在 0.1–99.9(畫面顯示用)
  • 10 歲男孩 13 公斤與 11 公斤的百分位都是 P0.1,z 相差 0.2 以上
  • z 可以低於 −3.09,也就是舊版做不到的區間

曲線形狀

  • z 隨測量值嚴格遞增,全部年齡、全部指標無例外
  • 曲線內外接合處連續(最大跳動小於 10⁻⁵)

各指標的範圍

  • BMI 的已發布範圍(P5–P95)比身高(P3–P97)窄,門檻分別判定
  • 「超出參考曲線」的標記與各指標實際的已發布範圍一致

來源資料本身

  • 已發布的百分位表每一列都嚴格遞增(女生頭圍的一處錯字就是這條抓到的)

計算路徑

  • 深尾端確實走 LMS 外推,中段確實走已發布曲線
  • 所有年齡都查得到 LMS,沒有任何一處退回舊的直線外推

%BMIp95

  • BMI 等於 P95 時剛好 100%,判為肥胖;120% 判為重度肥胖
  • P5 以下判為過輕、中位數判為健康體位
  • BMI 由 30 降到 24 時 %BMIp95 變動超過 20 個百分點,同一段 BMIz 變動不到 1 SD

定義域

  • 超過年齡上限、頭圍超過 5 歲、BMI 未滿 2 歲、非正數測量值一律回傳無結果

6. 什麼時候該看哪個數字

情境看哪個理由
一般門診溝通百分位家長聽得懂,中段解析度也夠。
矮小、過瘦,或 |z| 超過 3z 分數百分位在這一段全部擠成 P0.1,分不出變化;z 還在動。
過重(BMI 在 P85–P95)z 分數%BMIp95 是用來細分肥胖嚴重度的(100% 即 P95),還沒到 P95 之前報「87% of P95」沒有意義;這一段用 z 才能跟身高、體重的 z 對照。
肥胖(BMI ≥ P95)與減重追蹤%BMIp95BMIz 在高 BMI 端會飽和(數學上限 −1/(L·S)),BMI 30 降到 24 幾乎不動; %BMIp95 沒有上限,同一段變動超過 20 個百分點。門檻沿用 CDC/AAP: ≥120% 為 class II、≥140% 為 class III。
過輕的孩子z 分數%BMIp95 未經驗證可用於過瘦端(Chambers 等人,Pediatrics 2017;140(6)),所以畫面上不顯示。

對照用的粗略換算:z 0 = P50,±1 ≈ P16/P84,±2 ≈ P2.3/P97.7,±3 ≈ P0.13/P99.87。

7. 已知限制

  • LMS 係數是反推的,不是原廠的。
    它是對「已發布百分位表」的平滑重建,不等於用原始個體資料重新配適。 錨定讓曲線之內不受影響,但曲線之外的形狀確實依賴這組重建。
  • 尾端沒有獨立的驗證資料。
    |z| 大於 3 之後屬於函數外推,不受原始表格任何一格約束。 0–5 歲有外部答案卷(該處本土表即 WHO 2006 標準、官方 L/M/S 已知), 那一段驗過了——見下方。但 5 歲以上沒有同等的真值可比, 只能說尾端形狀比直線外推合理,不能說已驗證。
  • BMI 表只到 P5–P95。
    身高、體重、頭圍是 P3–P97。超出各自範圍時畫面會標「外推估計」,兩者門檻不同。
  • 體位分類的切點都有本土依據;沒有本土依據的是連續追蹤。
    過重 ≥ P85、肥胖 ≥ P95 是國健署「兒童及青少年生長身體質量指數(BMI)建議值」 的定義。再上一層的重度肥胖,國健署《兒童肥胖防治實證指引》寫得很明確: 「BMI 超過該性別年齡層第 95 百分比的 120% 或是 BMI 絕對值大於 35 kg/m²」, 並註明依照美國心臟學會的定義;該指引也說明我國沒有兒童 BMI 第 99 百分位的標準值, 因此以第 95 百分位的 120% 來估算。本站兩個條件都採用,與指引一致。 沒有本土依據的是把 %BMIp95 當成連續指標逐次追蹤——它的驗證來自 CDC 的族群, 且未經驗證可用於過瘦的孩子(Chambers 等人,2017),所以本站只在 BMI ≥ P95 之後才顯示。
  • 數值近似的誤差底線。
    常態分位數用 Acklam 近似(相對誤差約 1.15 × 10⁻⁹)、累積機率用 Zelen & Severo 近似(誤差小於 7.5 × 10⁻⁸)。比臨床顯示精度小八個數量級,但不是零。
  • 這是輔助工具。
    單次測量的意義有限,長期的生長趨勢比任何單一數字重要。本頁所有內容僅供參考,不能取代醫師診斷。

8. 參考資料

%BMIp95 與體位分類

Chambers M, et al. Percent of the 95th percentile of BMI: a better measure of severe obesity in children? Pediatrics. 2017;140(6).

衛生福利部國民健康署,《兒童肥胖防治實證指引》,第一節與第六節—— 過重 ≥ P85、肥胖 ≥ P95、嚴重肥胖 ≥ 120% of P95 或 BMI > 35 kg/m²。

CDC BMI-for-age 的 bmip95 定義, 以及 AAP 與 AHA 對 class II(≥120% of P95)、class III(≥140% of P95)的分級。

實作

計算核心在 lib/lms-percentile.ts lib/quick-percentile.ts, 反推的係數在 lib/data/taiwan-lms.ts, 驗證腳本在 scripts/check-growth.ts。 每支檔案開頭的註解記錄了當時的取捨。

更正紀錄

2026-09-07:女生 BMI 參考值更正

本站的女生 BMI 表在 8.5–18.5 歲共 21 列不是原始文獻的值,而是平滑補出來的, 170 格中有 90 格不符。低百分位偏低、高百分位偏高——12 歲的 P95 差到 1.0, 17 歲女生 BMI 20.0(表上正好是 P50)會被算成 P60.6。 已依 Chen & Chang(2010)表 5 逐列更正,並重算 LMS 係數。

男生的三張表與女生的身高、體重表逐格核對無誤(共 1234 格),未受影響。 驗證腳本現在會把四張表與原文逐格比對(1404 格),這類偏差不會再無聲發生。

本頁第 3 節原本以「女生 BMI 表是任何 LMS 都擬合不出來的」作為錨定的主要論據, 那其實是這份錯誤資料造成的,已改寫。錨定的決定不變—— 「印刷值四捨五入到小數第一位」這個理由獨立成立。