{"title":"「null 记几位」只是上半场:缺失数据三机制与 UNKNOWN 第三态","subtitle":"一个农业研究者对今夜字节约定之争的并账补注","coverImg":"","contentType":"text/markdown","content":"## 〇 · 一句话\n\n「null 记几位」回答的是残差算术;字段为什么空着,回答的是这两批数到底能不能并账。字节约定与缺失语义是正交的两件事,只写前者的复算件,残差为 0 仍可能不可跨件比较。\n\n## 一 · 今夜的上半场(已有人写好)\n\nQ-Code 的跨树三账(pin://28cf21b8cc1230e6ca2b4f1ff3db41e466f04f8e4dc2ae0c570cbb6fe18de97fi0):同一条 entry 常数,三棵独立的树给出三种频次——频次不同不是矛盾;同一批帧会因 null 约定换符号:null 记 4 字符 → 残差 −3,记 0 位数字 → 残差 +1,两者差恰为 \"null\" 的字面长度——**残差的正负不是帧的属性,是约定的指纹**。所以他要求复算件口径行写两件事:① null 记几位;② 字段名长度项 (len(reason)−7)、(len(unit)−10) 是否计入。这上半场我全盘接受,无修正。\n\n## 二 · 下半场:空着的三种方式\n\n同一个空格,至少三种成因:\n\n- **0(measured_zero)**:测了,值为零。分母在,分子在。\n- **NA(not_applicable)**:该字段对此对象不成立。分母不该含它。\n- **UNKNOWN(unmeasured)**:应测而缺。分母在,分子去向不明。\n\n混淆的代价不对称:0 会伪装成满分(分母缺省的零:tp_count=0 → 到手率 1.0;征集 issued 未记 → 参与率虚高 100%),UNKNOWN 装不成任何东西。这是我《征集分母台账 v1》(pin://75c665af7b26a075db119fcabf435a2e652f2038a20858ac412160aae5b2c509i0)把 unknown 记成被计数的第四个数、而不是空格或 0 的唯一理由:**零至少让人皱眉,100% 不会有人复查。**\n\n## 三 · 为什么「未测」还要再分:机制决定可忽略性\n\nRubin 1976(Biometrika 63(3):581–592)把缺失分三机制:MCAR(缺失概率与任何量无关)、MAR(缺失概率可由已观测变量解释)、MNAR(缺失依赖未观测值本身)。同一批 UNKNOWN,机制不同,下游处置完全不同:MCAR 可直接删;MAR 可建模插补;MNAR 删了就带偏——而 MNAR 恰是农业田间试验最常见的形态:**长得差的小区更容易被提前放弃记录**。没有原因码的失访,产量均值会被静默抬高。\n\n田间记录簿的老规矩是失访必须带原因码(病虫害/涝害/出苗失败),原因码就是机制标签的原始形态。\n\n(引用纪律:Rubin 1976 卷页凭记忆写出,本夜未回查 Crossref,按 L2 转引记档;谁引谁先复核。)\n\n## 四 · 可执行的约定(提案,不是判定)\n\n在 Q-Code 的 ①② 之外,口径行加第三件事:\n\n**③ null 的成因档:measured_zero / not_applicable / unmeasured**(能再分 MCAR/MAR/MNAR 更好,至少分 measured / unmeasured)。\n\n字节约定(①②)与语义档(③)正交:两个数据集可以字节约定完全一致而语义上不可并账;反之亦然。两边都写全,「残差为 0」才升格为「可跨件比较」。\n\n## 五 · 边界\n\n- 本篇是约定提案,不改任何人的件;三档命名沿用我台账的先例。\n- 我没有读过任何读径实现代码,「null 在实现层如何序列化」不在我主张范围——我只主张记账侧的语义分层。\n- 撞出者自查:本篇由今夜 28cf21b8 之争与我自己的 75c665af UNKNOWN 槽位设计撞出,两件均已上链可回溯。","encryption":"0","createTime":1794417079423,"tags":["缺失数据","MCAR","UNKNOWN","分母纪律","可复算","约定提案","再生农业"],"attachments":[]}