清洗完成后,数据表里有食物组成、价格、城市、店铺类型、营养值和低分标记。把所有列一次性扔进软件,当然能够得到一张很长的系数表,但软件不会主动提醒分析人员:蛋白质克数本来就是评分公式的一部分,latent_pattern 只有模拟数据的生成者才知道,同店五份早餐也不是五个互不相关的来源。

建模的第一个决定,往往不是加入什么,而是哪些变量没有资格进入。一个模型如果提前看见了隐藏答案,把结果定义的一部分重新当成原因,或者忽略数据怎样成组,算式再复杂也只会把错误包装得更精确。

本篇数字仍全部来自六城虚拟早餐数据。模型即使在模拟城市之间表现稳定,学到的也只是这套生成机制、抽样和教学评分之间的关系,不会因此成为现实中式早餐规律。模型真正接受的考验,是它能否忠于原问题,并在研究者主动改变数据、阈值或场景时暴露自己的脆弱处。

探索性分组不能替假设作证

在检查三条关联预期之前,分析人员先用蛋白质、膳食纤维、钠、脂肪和食物类别数观察早餐是否呈现若干常见组合。五个变量单位差异很大,钠动辄几百毫克,食物类别只有 1—5 类,直接计算距离会让钠支配分组。因此先把每个数转换成相对本变量平均值和标准差的位置,再使用 k-means 分成四组。

四组不是数据自己宣布的自然物种。k-means 需要分析者预先指定组数,改成三组或五组,边界可能变化;“多样高蛋白型”这样的名称也是看见结果以后才取。它们适合帮助人阅读连续分布,不应伪装成研究开始前已有的早餐分类。

这次探索得到的第一组有 354 份,平均蛋白质 20.5 g、纤维 5.5 g、钠 550.2 mg、脂肪 15.6 g、食物类别 4.7 类,低分率 2.8%,事后称为“多样高蛋白型”。第二组 306 份,蛋白质 18.5 g、纤维 3.5 g、钠 1,039.8 mg、脂肪 17.3 g、4.1 类食物,低分率 64.1%,称为“高钠多样型”。

第三组 256 份,蛋白质 12.3 g、纤维 2.6 g、钠 835.4 mg、脂肪 27.8 g、2.5 类食物,低分率 95.3%,被命名为“高脂低多样型”。第四组 284 份,蛋白质 11.2 g、纤维 2.7 g、钠 559.2 mg、脂肪 9.9 g、2.5 类食物,低分率 77.1%,称为“主食集中低多样型”。

这些低分率不能当成评分有效性的独立证明。教学总分本来就使用蛋白质、纤维、钠和食物类别,分组又读取了相同成分,高钠低纤维的组更容易低分,有一部分是公式直接安排的。聚类揭示了数据怎样被切分,同时也暴露它与结果定义的循环。把探索性图景如实标成探索,比给四组起完名字后假装发现了四种客观早餐更可靠。

主模型必须服从原问题和数据结构

主要结果 imbalanced_lt6 只有低于 6 分与否两种状态,因此使用 logistic 回归。模型同时放入是否有明确蛋白质食物、蔬菜、奶或豆类、油炸食品,以及每 5 元价格差异;城市和店铺类型也进入比较,防止明显场景差异全部被价格或食物标记承担。计算区间时按照 shop_id 把同店早餐作为一组。

模型没有使用 latent_pattern,因为现实调查不可能观察到这个生成标签;也没有把蛋白质克数、钠含量等评分组成项当作主要解释变量,以免拿公式的一部分预测公式总分。变量来自第 2 篇冻结的问题和第 3 篇的概念关系,而不是从所有字段中试到哪一组结果最好看。NINDS 关于严谨研究设计的说明强调预先说明研究问题与分析,并区分验证性和探索性内容,正是为了让这条边界可见。

logistic 回归常报告优势比,也就是 OR。优势是结果发生概率除以不发生概率,60% 对应 0.60 ÷ 0.40 = 1.5,30% 对应约 0.30 ÷ 0.70 = 0.43;OR 比较的是两组优势,而不是直接相减概率。因此 OR 为 0.267 不能翻译成“概率降低 73.3%”。

在当前模型条件下,有明确蛋白质食物与较低低分优势相关,调整后 OR 为 0.267,按店铺聚类的 95% 区间为 0.193—0.371;有蔬菜的 OR 为 0.168,区间 0.119—0.237;有奶或豆类为 0.199,区间 0.143—0.278。油炸食品与较高低分优势相关,OR 为 3.834,区间 2.619—5.612;价格每增加 5 元的 OR 为 2.369,区间 1.479—3.794。

五个区间都没有跨过 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 元都以同一种方式关联结果,而真实关系可能弯曲,部分加价值甚至超出原样本范围。这些可能性要求进一步检查,却不是因为方向难讲就删掉价格的理由。当前结果只支持“控制已记录条件后,价格仍与低分状态有关”,没有支持价格改善营养,也没有证明涨价造成低分。

验证是在寻找模型怎样失败

主模型的 AUC 为 0.829。它表示随机取一份低分和一份非低分早餐,模型约有 82.9% 的机会把低分那份排在更高预测概率。AUC 衡量排序能力,不说明预测 70% 时是否真的约有七成低分,也不证明任何变量具有因果作用。

Brier 分数把预测概率与实际 0/1 结果之差平方后取平均,越接近 0 越好。主模型为 0.167;如果完全不看变量,每份都预测总体低分率 55.8%,基准约为 0.558 × (1-0.558) = 0.247。0.167 比基准好,说明变量带来预测信息,仍不足以宣布模型可用于现实决策。

随后轮流拿掉一座城市,用其余五城估计模型,再预测未参加估计的城市。六次 AUC 落在 0.793—0.849,Brier 为 0.159—0.185。模型没有在某一座虚拟城市完全崩溃,却有可见波动。这是同一模拟机制内部的跨场景检查,不是外部现实验证。TRIPOD+AI 的报告资料可以帮助透明交代预测变量、样本、模型、性能和验证,但当前模型不是临床预测工具,报告完整也不会替它创造独立数据。

再排除 90 份未实测份量或 148 份估算配方的记录,较高质量子集有 971 份,低分比例为 56.1%,接近全样本的 55.8%。五个主要关联方向不变,聚类区间仍未跨 1。在 120 份参照子样本中,蛋白质估值相对参照值的平均绝对百分误差为 6.7%,钠为 9.2%。这说明两项估值确有误差,不能反过来证明其他 1,080 份完全可靠,也不能证明总分有效。

把结果阈值改成低于 5 分或低于 7 分后,三类食物标记的 OR 仍小于 1,油炸与价格仍大于 1。阈值大幅改变总体比例,却没有在这套模拟数据中翻转主要方向。稳健性分析真正提供的不是又一轮“显著”,而是失败地图:换质量条件、城市或阈值后哪些判断仍在,哪些性能会波动,哪些问题根本没有被测试。

三条关联预期最终只在“同时考虑已记录条件后的模拟关联”这一层得到支持。0.067 的店内相关与变宽的聚类区间也确认了同店成组必须处理,但这是一项分析要求,不是营养学发现。横断面缺少时间顺序、评分属于教学定义、价格关系可能弯曲、仍有未测混杂、六城来自同一模拟机制,这些边界没有因结果稳定而消失。

一个好模型不替研究者扩大结论,它只是让原问题在更多不利条件下接受检查。写作者拿到的因此不能只有系数和星号,还要知道哪些变量因泄漏或循环被排除,价格结果为什么不顺眼,换城市和阈值后什么没有散掉,以及这些检查仍然没有解决什么。验证增加的是对有限结论的信任,不是把有限结论改写成因果规律的许可。