核心结论

统计模型不是一台把数据放进去就会吐出结论的机器。它只是用一组数学条件,把“比较什么、同时考虑什么、误差怎样计算”写得更明确。问题问错、变量漏掉或设计没有时间顺序,模型再复杂也不会自动补回来。

模型验证也不是反复计算同一个结果,再数它有几次越过统计门槛。我们要看更换城市、阈值和数据质量条件以后,主要关系是否仍然存在;同时检查模型区分结果和估计概率的能力。稳定只能说明结果不太依赖某几项分析决定,不能让“在同一调查阶段一起出现”的横断面关联变成因果。

本篇全部数字仍来自虚拟早餐数据。模型学到的是模拟生成机制与教学评分之间的关系,不是现实早餐规律。

先让数据自己分组,但不要把分组当成自然真相

在检查三条关联预期以前,我们先做一项探索:根据蛋白质、膳食纤维、钠、脂肪和食物类别数,把营养特征相近的早餐放在一起。

五个变量单位差别很大。钠以毫克计,数值动辄几百;食物类别只有 1 到 5。若直接计算距离,钠几乎会支配分组。因此,先把每个数与本变量平均值的差,换算成“相当于多少个常见波动幅度”。这个常见波动幅度在统计里叫标准差。换算后,五个变量才处在可比较的尺度上。

接着使用 k-means 分组。它先设定四个组中心,把每份早餐分给距离最近的中心,再反复更新中心,直到分组基本不再变化。选择四组是分析者的决定,不是数据自己宣布世界上只有四种早餐。

事后名称早餐数蛋白质纤维脂肪食物类别低于 6 分
多样高蛋白型35420.5 g5.5 g550.2 mg15.6 g4.72.8%
高钠多样型30618.5 g3.5 g1,039.8 mg17.3 g4.164.1%
高脂低多样型25612.3 g2.6 g835.4 mg27.8 g2.595.3%
主食集中低多样型28411.2 g2.7 g559.2 mg9.9 g2.577.1%

这些名称是在看到各组特征以后才取的,所以只能叫探索性标签。选择四类也是分析者的决定;改成三类或五类,边界和名称都可能改变。聚类没有发现四种客观存在、永远不变的早餐物种,只是给连续分布提供了一种便于观察的切法。

各组低分率更不能当作独立验证。教学总分本来就使用蛋白质、纤维、钠和食物类别,而聚类又使用这些变量。高钠低纤维的组更容易低分,有一部分是公式定义直接造成的。这个结果适合帮助描述结构,不适合写成“聚类证明评分有效”。

主模型只回答问题卡里已经写下的问题

主要结果是“是否低于 6 分”,数据列 imbalanced_lt6 用 0 和 1 表示这两个答案。普通直线模型可能给出小于 0 或大于 1 的概率,因此这里使用专门处理两类结果的 logistic 回归。它会同时放入是否有明确蛋白质食物、蔬菜、奶或豆类、油炸食品,以及每 5 元价格差异;城市和店铺类型也一起进入比较,避免把明显的场景差异全压在食物标记或价格上。论文把这种同时考虑其他已记录条件的结果称为调整后结果。计算区间时,再根据店铺编号 shop_id 把同店早餐作为一组处理。

没有放入 latent_pattern,因为它是生成模拟数据时的隐藏答案,现场研究不可能观察到。也没有把蛋白质克数、钠克数等评分组成项当作主要解释变量,否则会把公式的一部分拿来预测公式总分,形成部分—整体循环。

logistic 回归常报告优势比,英文缩写为 OR。这里的“优势”是“结果发生的概率 ÷ 不发生的概率”:低分概率为 60% 时,优势是 0.60 ÷ 0.40 = 1.5;概率为 30% 时,优势是 0.30 ÷ 0.70 ≈ 0.43。优势比再拿两组的优势相除,并不是直接比较概率。OR 等于 1,表示两组优势相同;小于 1 表示前一组较低,大于 1 表示前一组较高。因此 OR 为 0.27 不能直接翻译成“概率降低 73%”。

主模型结果如下,括号内是按店铺聚类的 95% 区间:

条件比较调整后 OR条件性解释
有明确蛋白质食物,相比没有0.267(0.193—0.371)在模型所列条件相近时,低分优势较低
有蔬菜,相比没有0.168(0.119—0.237)低分优势较低
有奶或豆类,相比没有0.199(0.143—0.278)低分优势较低
有油炸食品,相比没有3.834(2.619—5.612)低分优势较高
价格每增加 5 元2.369(1.479—3.794)低分优势较高

所有区间都没有包含 1。由于 OR 等于 1 代表两组优势相同,这说明在当前模拟数据和模型条件下,估计范围没有碰到“无差别”这个位置。不过,区间只反映当前模型计算到的不确定性,不包括错误操作定义、没有记录的替代解释和城市选择造成的全部不确定。

论文还常报告 p 值:先假定两者其实没有关联,再计算像当前这样或更极端的数据有多难出现。它不是“假设为真的概率”,也不能单独说明结果重要不重要。美国统计协会关于 p 值的声明强调,科学结论不应只取决于结果是否越过一个阈值。这里因此同时报告关系方向、大小、区间、模型条件和后续验证,而不是给表格加一排星号便结束。

概率更直观,但模型比较仍然不是干预效果

为了让 OR 容易理解,我们又做了平均模型预测。对每一份早餐保留城市、店铺、价格和其他标记不变,分别把目标食物标记设为 0 和 1,再对 1,200 份预测概率取平均。

没有明确蛋白质食物时,平均预测低分概率为 66.9%;设为有时为 43.4%,相差 -23.6 个百分点。蔬菜的对应结果是 64.6% 与 32.2%,相差 -32.4 个百分点;奶或豆类是 64.3% 与 34.9%,相差 -29.4 个百分点;油炸食品则从 51.3% 变为 73.8%,相差 +22.4 个百分点。

这些数字比 OR 接近日常语言,却仍是模型里的条件比较。我们没有真的让同一家店增加蔬菜、保持其他所有条件不变,再观察评分怎样变化。食物标记又通过营养组成与教学评分相连。因此不能把 -32.4 个百分点写成“加蔬菜会让现实早餐不合格风险下降 32.4%”。

价格结果尤其值得停下来。每增加 5 元的 OR 为 2.369,方向与“越贵越健康”的直觉相反。把每份观察价格在模型中整体加 5 元,平均预测低分概率从 55.8% 上升到 69.4%,增加 13.6 个百分点。

这只是模型里的价格演算,不是涨价实验。当前模型还假定,无论早餐原价是多少,每增加 5 元都按同一种方式与结果变化;可现实关系未必是一条直线。部分记录加 5 元后还会超出原数据的价格范围。可能的解释包括:更大的组合价格更高,同时能量超过评分区间;价格还承载了未记录的商圈和菜单信息。正确做法是保留方向、检查是否需要弯曲的价格关系并限制解释,而不是因为结果不好讲便删掉价格。

所以关于价格的关联预期只得到了一种很有限的支持:同时考虑模型中已有的食物标记、城市和店铺类型后,价格仍与低分状态有关;它没有支持“价格改善营养”,也没有证明涨价会造成低分。

AUC 不错,只说明模型排序有些本事

主模型的 AUC 为 0.829。可以把它理解为:随机取一份低分早餐和一份非低分早餐,模型大约有 82.9% 的机会把低分那份排在更高预测概率。它评价排序区分能力,不告诉我们 70% 的预测概率是否真的对应约七成结果,也不评价变量关系是否有因果意义。

Brier 分数是预测概率与实际 0/1 结果之差的平方再取平均,0 最好。主模型为 0.167。若完全不用变量,每一份都预测总体低分率 55.8%,基准 Brier 约为 0.558 × (1-0.558) = 0.247。0.167 比这个简单基准好,但不能只凭一个数宣布模型已经可用于现实决策。

我们进一步轮流拿掉一座城市:先用其余五城估计模型中的关系,再预测此前没有参与计算的那座城市。六次 AUC 为 0.793—0.849,Brier 为 0.159—0.185。模型没有在某一座虚拟城市完全失效,却有可见波动。这只能算同一批模拟数据内部的跨场景检查,不是拿真正独立现实数据进行的外部验证;六城仍由同一个生成办法产生,现实数据可能完全不同。

TRIPOD/TRIPOD-Cluster 的报告资料面向预测模型研究,本案例并非临床预测工具,但其中透明报告预测变量、样本、模型、性能与验证的要求值得借鉴。报告指南能让模型更容易被检查,不能代替合适的开发和验证方法。

换阈值、换质量条件,主要方向有没有散掉

把 90 份未实测份量或 148 份估算配方的记录排除后,较高质量子集有 971 份,低分比例为 56.1%,接近全样本的 55.8%。五个主要关联方向保持不变:蛋白质食物、蔬菜、奶豆的 OR 仍小于 1,油炸和价格仍大于 1,聚类区间均未跨 1。

在 120 份参照子样本中,蛋白质估值相对参照值的平均绝对百分误差为 6.7%,钠为 9.2%。这说明两项估值存在实际误差,但不能由此宣布其余 1,080 份完全可靠,也不能证明总分有效。它只告诉我们估算误差大约处在哪个量级,方便以后改变误差条件重新计算,观察结果会不会明显变化。

把结果阈值改成低于 5 分或低于 7 分后,五个主要变量的方向也保持:三类食物标记 OR 小于 1,油炸与价格 OR 大于 1。阈值改变会大幅改变总体比例,却没有在这套模拟数据中翻转主要关联方向。

综合起来,三条关联预期在“同时考虑已记录条件后的模拟关联”这一层得到支持。0.067 的店内相关和变宽的聚类区间则确认了另一件事:把同店早餐作为一组处理是必要的分析要求,但它不是一条营养学研究假设。仍然没有被解决的,是横断面缺少时间顺序、评分属于教学定义、价格关系可能弯曲、仍有替代解释没有记录,以及分成几类早餐、模型怎样写都包含分析者的选择。

模型最后交付的不是一句“结果显著”,而是一组带条件的判断:哪些关系方向稳定,大小大约如何,换场景和规则后波动多少,哪些解释仍然不允许。第 10 篇要把这些条件真正写进论文,而不是只把表格里最醒目的数字搬到摘要里。论文的可信度,往往就藏在这些没有被删掉的条件里。