大模型给出的数字,有的是算出来的,有的是"看起来像那么回事"生成出来的。这两者外观上几乎没有区别,但用在报告里后果完全不同。这篇讲怎么分辨,以及怎么让分析过程变得可核查。
把一张表丢给大模型,问它"这两组有没有显著差异",它会给你一个 p 值。问题是: 这个 p 值是算出来的,还是写出来的? 这不是抬杠。语言模型的本职工作是预测下一个词。当它没有真正执行计算时,它给出的数字来自"这种情况下通常会是多少",而不是"这批数据算出来是多少"。两者外观完全一样——都是一个带小数点的数,都配着一句像模像样的解释。区别只在于,一个能重现,一个不能。 一、怎么一眼分辨 有几个特征可以快速判断你拿到的是哪一种: 它有没有给你代码。 真正执行了计算,就一定有代码。没有代码只有结论的,几乎可以确定是生成的。 数字精度是否可疑。 生成的数字常常"太整齐":p = 0.03、相关系数 0.75、提升 15%。真实计算出来的值通常是 0.0287、0.7413 这样的。当然反过来不成立——生成器也可以编出不整齐的数。 改一点数据,结果会不会变。 这是最硬的判据。把数据里几行明显改掉再问一次,如果结果纹丝不动,那它根本没在读你的数据。 它有没有提到数据的具体情况。 真读了数据,会顺带发现"第 47 行有个缺失值""这一列有两个明显异常点"。完全不提数据本身状况的分析,八成没有真读。 二、可核查的分析长什么样 一份能拿去用的分析,应该包含这四样东西: 1. 数据体检结果 :多少行、多少缺失、哪些异常值、各组样本量分别是多少 2. 方法选择的理由 :为什么用这个检验、它的前提假设是什么、你的数据满足吗 3. 可运行的代码 :不是片段,是能完整跑通的脚本 4. 原始输出 :程序打印出来的结果,而不是转述 有了这四样,你可以自己重跑一遍。 能重跑,才叫可核查。 三、最该警惕的不是算错,是悄悄跳过 明显的算错反而不可怕,因为结果通常离谱到一眼能看出来。真正危险的是这几种沉默的处理: 缺失值被默默删掉。 一千行里有两百行某个变量缺失,直接删掉这两百行,剩下八百行分析出来的结论可能完全不代表原来的人群。这一步如果没告诉你,你根本不会知道。 异常值被默默保留或默默剔除。 保留会把均值拉走,剔除会让结果好看。两种做法都可能合理,但必须说明。 多重比较没有校正。 一次比较二十组,总有一组"显著"。不说清楚做了多少次比较,那个显著就没有意义。 分组标准中途变了。 处理大批数据时,如果判断标准前后不一致,最终结果就是不可比的。 判断一个分析可不可信,与其看结论多漂亮,不如看它有没有主动告诉你这些。 一份好的分析报告里,通常会有一段专门讲"我做了哪些处理、为什么、这些处理可能带来什么影响"。 四、把要求提在前面 实际使用时,与其事后检查,不如一开始就把要求说清楚。这几句话很管用: 分析之前先给我数据体检结果:行数、缺失情况、异常值。 用代码算,把代码和运行输出一起给我。 缺失值和异常值你是怎么处理的,逐条说明,不要默认处理。 哪些结论证据充分,哪些只是趋势,分开讲。 最后一句尤其重要。 很多分析的问题不在数字,在于把一个趋势说成了结论。 五、工具应该承担什么 我们做实证数据分析时的基本原则就是上面这些:分析必须以写代码、真实执行的方式完成,代码和中间输出一并交付;数据体检在建模之前做;脚本报错或结果异常时回头修再跑,而不是把错的结果当答案交上去。 这样做不是为了显得严谨,是因为 分析结果如果不能被重新验证,它在研究和决策场景里就没有使用价值 。一个无法核对的数字,和没有这个数字,区别不大。 相关阅读 :论文复现智能体讲的是怎么把论文里的方法真正跑出来并和原文对账。