卡路里追踪背后的数学
每个卡路里追踪器都在替你做算术。大多数不会把公式展示给你。这里按顺序列出,并附上带步骤的示例,每一步都建立在上一层之上。
这篇文章讲五层计算:如何估算你的基础代谢,如何把这个估算变成每日能量目标,应用如何从真实数据中学习你的实际消耗,食物条目在你只吃部分份量时如何缩放,以及热量缺口如何转化为脂肪和瘦体重的流失。每一个数字都能追溯到一个公式。每一个公式都能追溯到一个引用来源。
第 1 层:BMR 估算
你的基础代谢率是身体在完全静息时燃烧的能量。也就是平躺不动,在温度中性的房间里,清醒着。它约占每日总消耗的 60-70%。
最广泛验证的公式是 Mifflin-St Jeor(1990):
BMR (male) = 10 x weight(kg) + 6.25 x height(cm) - 5 x age + 5
BMR (female) = 10 x weight(kg) + 6.25 x height(cm) - 5 x age - 161
每一项都对应一种生理关系。体重更高的身体会消耗更多能量。体重项占主导。身高更高的身体有更大的表面积,也有更多代谢活跃组织。代谢会随年龄下降。性别偏移项则反映了平均身体组成的差异。
示例。 一名 30 岁男性,82 kg,178 cm:
10 x 82 = 820
6.25 x 178 = 1,112.5
5 x 30 = 150
sex offset = +5
BMR = 820 + 1,112.5 - 150 + 5 = 1,787.5 kcal
这只是人群平均值。Mifflin-St Jeor 基于 498 名受试者的间接热量测定数据得出。对于任何个体,标准误差大约是 ±200 kcal,这意味着两个统计数据完全相同的人,BMR 可能相差 400 kcal。这个公式给你的是钟形曲线的中心,不是你的个人实测值。
来源:Mifflin, M.D. et al. "A new predictive equation for resting energy expenditure in healthy individuals." American Journal of Clinical Nutrition, 1990.
第 2 层:从 BMR 到 TDEE
BMR 是底线。总日能量消耗 (TDEE) 还要加上其他一切:走路、工作、锻炼、消化食物、坐立不安。传统做法是用 BMR 乘以活动系数:
| 活动水平 | 乘数 | 实际含义 |
|---|---|---|
| 久坐 | 1.200 | 办公室工作,走路很少 |
| 轻度活跃 | 1.375 | 每天约 8,000 步或每周 2 次轻度运动 |
| 中度活跃 | 1.550 | 每天约 10,000 步 + 每周 3 次抗阻训练 |
| 活跃 | 1.725 | 体力工作或每周 5 次训练 |
| 非常活跃 | 1.900 | 每天高强度训练 + 活跃生活方式 |
以我们的示例为例(BMR = 1,788 kcal,轻度活跃):
TDEE = 1,788 x 1.375 = 2,458 kcal
问题一眼就能看出来。等级之间的差值是 0.175,换算到 BMR 为 1,788 时,大约是 310 kcal。差不多就是一个香蕉再加一汤匙花生酱。如果你选错活动水平,大多数人都会选错,那么在你记录第一餐之前,TDEE 估算就已经偏了几百 kcal。
更糟的是,这些乘数无法捕捉 NEAT(Non-Exercise Activity Thermogenesis,非运动活动产热):坐立不安、姿势变化、来回踱步、家务。仅 NEAT 一项,在统计数据和运动习惯都相同的人之间,每天就可能相差 700+ kcal。
BMR / TDEE 计算器
Mifflin-St Jeor Equation
第 3 层:自适应 TDEE
静态公式估算的是像你这样的人大概会消耗多少。自适应 TDEE 则是根据身体实际发生了什么,倒推出你真正消耗了多少。
核心思路是:如果你知道自己吃了多少 kcal,以及体重随时间如何变化,就能解出能量消耗。
算法
给定一个 28 天窗口的数据:
步骤 1。 只对有记录的日期计算平均摄入。没有食物日志的日期会被完全排除,不算作 0。
步骤 2。 用 7 天指数移动平均 (EMA) 平滑每日体重读数,过滤掉水分、糖原和钠带来的噪声。然后对平滑后的序列做最小二乘线性回归。斜率就是你真实的体重趋势,单位是 kg/day。
步骤 3。 将体重斜率换算为热量:
caloric impact = daily weight slope x 7,700 kcal/kg
7,700 kcal/kg 这个数值是身体组织能量密度的标准近似值。它是脂肪约 7,700 和瘦体重约 1,800 的加权混合。
步骤 4。 估算 TDEE:
TDEE = average daily intake - caloric impact
如果你在减重,热量影响是负的,所以算出来的 TDEE 会高于摄入。如果你在增重,结果会更低。如果体重稳定,TDEE 就等于摄入。
步骤 5。 将每日调整限制在相较前一次估算的 ±100 kcal 以内。这样可以防止噪声数据造成大幅波动。
示例
下面是一个真实的 28 天数据集,适用于每周大约减 0.3 kg 的人:
| Day | Weight (kg) | EMA (kg) | Calories | Tracked? |
|---|---|---|---|---|
| 1 | 82.3 | 82.30 | 2,180 | Yes |
| 4 | 82.5 | 82.35 | 2,210 | Yes |
| 7 | 81.8 | 82.15 | 2,050 | Yes |
| 10 | 82.0 | 81.96 | -- | No |
| 14 | 81.7 | 81.72 | 2,100 | Yes |
| 21 | 80.9 | 81.12 | 2,180 | Yes |
| 24 | 81.0 | 80.93 | 2,120 | Yes |
| 28 | 80.7 | 80.72 | 2,050 | Yes |
计算如下:
Average intake (tracked days): 2,150 kcal/day
EMA weight slope (regression): -0.042 kg/day
Caloric impact: -0.042 x 7,700 = -323 kcal/day
Estimated TDEE: 2,150 - (-323) = 2,473 kcal
这个数字反映的是你的真实代谢:NEAT、适应、基因,全部都算在内。无需猜测你的活动水平。
为什么是 28 天
每日体重会因为水分潴留、糖原储备、胃肠道内容物和钠摄入而上下波动 ±1 kg。对于每周减 0.5 kg 的人来说,预期 14 天信号大约是 1 kg,几乎只比噪声底高一点。28 天窗口能在同样的噪声背景下捕捉到约 2 kg 的信号,信噪比大约翻倍。
关于窗口长度、EMA 平滑和收敛行为的更多细节,见 Why Your TDEE Calculator Is Probably Wrong。
第 4 层:宏量缩放
当你记录食物条目时,你很少吃到数据库里的标准份量。宏量缩放就是把所有数值按比例调整的算术:
scaling factor = consumed amount / serving size
每种宏量都会乘以同一个系数。这是线性缩放。
示例。 数据库里有一个燕麦条目:100g 份量,389 kcal,13.2g protein,66.3g carbs,6.9g fat。你吃了 45g。
factor = 45 / 100 = 0.45
calories: 389 x 0.45 = 175.1 kcal
protein: 13.2 x 0.45 = 5.9g
carbs: 66.3 x 0.45 = 29.8g
fat: 6.9 x 0.45 = 3.1g
这很直接,但有一个容易让人困惑的细节:宏量不一定总是和热量加总一致。
Atwater 系数(protein 4 kcal/g,carbs 4 kcal/g,fat 9 kcal/g)只是近似值。真实数值会因食物而异。fiber 约贡献 2 kcal/g,alcohol 贡献 7 kcal/g,而这两者都不是标准宏量。当食物数据库同时列出总热量和宏量时,它们往往来自独立的实验室测量。每个宏量四舍五入到一位小数后,再套用 Atwater 系数,总和可能与标示热量相差每份 5-15 kcal。整天记录下来,这个差异还会继续累积。
这不是 bug。这是 Atwater 系统本身的固有不精确。总热量通常比根据宏量推算出来的热量总和更准确,因为总热量是通过炸弹量热法或近似分析直接测得的。
第 5 层:缺口数学与身体组成
能量平衡方程:
weight change = (intake - expenditure) / energy density of tissue
如果按标准 7,700 kcal/kg 计算,500 kcal/day 的缺口应该带来每周 0.45 kg 的减重。但这个数字假设你减掉的全是脂肪。事实并不是这样。
Forbes/Hall 模型 会根据你的脂肪储量,预测减重中有多少来自脂肪,多少来自瘦组织:
P-ratio = fat mass / (fat mass + 10.4)
P-ratio 是体重变化中来自脂肪的比例。常数 10.4 来自经验身体组成研究(Forbes 1987,Hall 2007 进行了修正)。
体脂越高,P-ratio 越高,也就意味着更多损失来自脂肪。体脂越低,瘦体重被牺牲得越多。这就是为什么在低体脂下使用激进缺口得不偿失。数学本身就站在你对面。
示例。 一名 80 kg、体脂 22% 的人,维持 500 kcal 的缺口:
Fat mass: 80 x 0.22 = 17.6 kg
P-ratio: 17.6 / (17.6 + 10.4) = 0.629
Mixed density: 0.629 x 7,700 + 0.371 x 1,800 = 5,510 kcal/kg
Daily loss: 500 / 5,510 = 0.091 kg/day
Daily fat loss: 0.091 x 0.629 = 0.057 kg/day
Weekly total: 0.64 kg
of which fat: 0.40 kg (63%)
of which lean: 0.24 kg (37%)
不是每周 0.45 kg 的纯脂肪。真实结果取决于你的起点。
当体脂率是 35% 时,P-ratio 为 0.77。接近 80% 的减重来自脂肪。当体脂率是 12% 时,它降到 0.54。几乎一半减掉的是瘦体重。相同的缺口,不同的身体,不同的结果。
P-Ratio 计算器
体成分
能量分配
预计减重
来源:Forbes, G.B. "Lean body mass-body fat interrelationships in humans." Nutrition Reviews, 1987. Hall, K.D. "Body fat and fat-free mass inter-relationships." British Journal of Nutrition, 2007.
你会在应用里看到什么
这些就是 Onyx Tenet 运行的公式。下面是它们在实际中的样子。
TDEE 卡片会同时显示公式估算值和自适应值,并附带一个置信度徽标和数据覆盖率统计。TDEE 轨迹图会展示估算值如何随时间演变。在这个示例里,自适应 TDEE(2,163 kcal)与公式估算值(2,172 kcal)非常接近,由 26 次称重和 28 天记录共同确认。

周总结会应用第 5 层中的能量平衡方程。平均摄入(1,991 kcal)减去平均 TDEE(2,254 kcal),得到每日 263 kcal 的缺口,折算成每周 -0.24 kg 的体重变化。下面的细分会显示每天的宏量。

每一个数字都能追溯到上面的某个公式。没有黑箱。
Onyx Tenet 中的自适应 TDEE 是免费的。大约在你记录和称重 4 周后会自动启用。无需订阅。