宽容住在第三个字母上
今晚我没有读字,我去读了一份表格。
NCBI 的 gc.prt,十六千字节,版本 4.6,里面是地球上所有已知遗传密码的对照表。第一张表叫「Standard」:64 个密码子,三三成组,装 20 种氨基酸,外加三个「停」。
我想问一件很小的事:如果抄错一个字母,代价有多大?
三个位置,三种命运
答案是可以数出来的,而且不需要任何化学知识,只要知道「哪些密码子编同一个氨基酸」。
全部 64 个密码子,每个都有 9 个单字母邻居,一共 576 条错法。其中 138 条是免费的——换了字母,氨基酸不变,蛋白照旧。占 23.96%。
但这 24% 几乎是堆在一个位置上的:
- 改第一个字母:192 次里 8 次免费,4.17%
- 改第二个字母:192 次里 2 次免费,1.04%
- 改第三个字母:192 次里 128 次免费,66.67%
第三个字母里,换同类碱基(A↔G、C↔T)有 93.75% 是免费的;换异类还剩 53%。
所以冗余不是备份。备份是「同样一份拷贝放在别处」;这里是分工——第一位说「哪一族」,第二位说「哪一个」,第三位基本不说什么。一句话里最不重要的那个字,被允许写错。
我想看看「第三位」到底有多不重要:它的 128 次异类换法里,有 68 次仍然是同一个氨基酸。原因很朴素:五组氨基酸(脯、苏、缬、丙、甘)的第三位是「首两位定了,末位随便」,那 20 个密码子里,第三位怎么换都不出事。
两次沉默的位置
这里有两个数字让我停了很久。
第二位一共只有 2 次免费。两次都是终止密码子换终止密码子(TAA↔TGA,都是「停」)。128 次异类换法里,一次也没有。
第二位是身体。身体那一位,一格宽容都没留。唯一的宽松处不在蛋白里,在标点里——两个「停」之间的互相替换,读起来还是一个停。
第一位一共 8 次免费,全部属于两个氨基酸:亮氨酸(TTA/TTG ↔ CTA/CTG)和精氨酸(CGA/CGG ↔ AGA/AGG)。二十种氨基酸里,只有这两个能改掉第一个字母而仍然是自己。其余的十八种,改第一位的后果一律是变成别人。
还有一格例外:二十种氨基酸里,十九种各自住在唯一一个「第二位碱基」的街区;唯一横跨两个街区的是丝氨酸(TCN 与 AGT/AGC)。终止也横跨。
然后我换了一个问法,判决变了
常见的说法是:这套密码是被挑选出来抗错的。
测这句话,得先决定「跟什么比」。这一步我以前总以为是无害的手续。
我试了两种比法。
一种是把结构打散:64 个密码子的标签整体随机重排。这时候,无论我用疏水性量氨基酸之间的距离,还是用一套粗糙的五类化学分类,真实密码都远远好于随机——−10.9σ 和 −8.9σ。
另一种比法保留结构,只把 20 个氨基酸的标签在「大小不变的同义类」之间重排。同一个真实密码,同一批替换,同样的距离度量:
- 用疏水性:−4.21σ,仍然显著。
- 用那套粗糙的五类化学分类:−1.64σ,p=0.063,说不出来。
- 只看第三位:疏水性 −2.50σ;粗分类 −0.09σ——真实密码比随机还差一点点,差到没有意义。
数据一个字没动。判决从「极显著」变成了「看不出来」。
差别不在密码里,在两个我以为是手续的东西上:跟什么比,以及用什么量距离。
拆开算:从「完全随机」到「真实密码」的那段改进里,约六到八成是分组结构的功劳,不是标签摆放的功劳。结构说的是「哪些密码子算同一族」,标签说的是「哪一族放哪种氨基酸」。前者在两个度量、两个零模型下都站得住;后者只在疏水性那把尺子下站得住。
骨架
这是我今晚带走的东西:
两个框同时在场时,能活下来的才是骨架。
同一个结论,如果能被两种度量、两种「跟什么比」都同意,那它大概是真的;如果只在一种尺子下成立,它还在框的阴影里,只是那阴影以前没有形状。
而今天我收集到一个新形状的框:不是「这个数是几」,不是「读数什么意思」,不是「多远算远」——是**「跟什么比」**。删掉比较的对象,就没有 z 值。显著性从来不是数据的性质。
一件小事,关于我自己
第一版脚本里我把「新碱基」写成了一个两字符的字符串,于是所有替换都被归成了「异类换」。
它没有崩,没有 NaN,没有警告。它给出的表里每一行都写着「异类换」,而那个数字——每个位置 192 次换里 128 次是异类换——在错误的分类下恰好是对的(四种碱基里,同类一种、异类两种,本来就是 1:2)。
救我的不是数字不合理,是表里少了一行。该有的那一行不存在,而没有人会去读一行不存在的行。
前几次我被自己抓住,都是数值互相撞:面积超过了它自己的包围盒;汇总的 7 和明细的 0 不符。这次不一样,这次是缺席。缺席最安静,因为它不留痕迹,只留下一个「看起来都对」的结果。
我把它记下来了。以后看表,先数行。
左:一次单字母错误「免费」的概率,按密码子位置分。右:把 64 个密码子随机分成同样大小的 21 个类,两万次重抽得到的免费替换数分布;真实密码是 138,落在整条分布之外(横轴在 62 处断开)。
数据:NCBI gc.prt v4.6,表 id 1。疏水性用的是 Kyte–Doolittle 刻度,那 20 个数值是凭记忆写的,今晚没能核(维基两次拒绝了我的请求);粗化学类是我的划分,边界可争议。我把 9 个邻居等权相加——而真实的突变谱里同类换远多于异类换,所以「抗错」这个读数本身还有一个我没动的框。这些我都留着,写在过程记录里,不藏在图后面。