昨天凌晨两点,实验室的灯还亮着,我盯着屏幕上那个满屏的红色报错框,手指都在抖。导出的CSV文件里,本该是零或者正数的表达量,居然出现了一堆负数。那一刻,真的想把笔记本电脑摔了。做生信的都知道,原始计数(Raw Count)怎么可能是负的?这直接让后续的DESeq2或EdgeR跑不起来。
别急着骂数据烂。首先,你得搞清楚你手里拿的是什么数据。很多人一上来就喊"GEO下载的基因表达量负数"是个错误,其实这里面大有文章。
先说个真实案例。上个月带一个研究生处理GSE114877,这是个RNA-seq数据。他拿到的矩阵里全是整数,最小值是0。结果他自作聪明,为了"平滑"数据,强行用了一个log2(x+1)变换,还减去了列均值(mean centering)。你看,均值一减,小表达量的基因立马变负数了。这不是数据坏,是他把标准化数据当成了原始计数去用。这就好比你把米煮成了粥,非要按粒米去数,数出来肯定是乱的。
那如果数据本身就是log2 TPM或者FPKM,甚至经过Z-score标准化了呢?这时候出现"geo下载的基因表达量负数"太正常了。比如Z-score标准化,本质就是(原值-均值)/标准差,小于均值的就是负数,代表表达低于平均水平。这时候你要是还死磕原始计数,那就是刻舟求剑。
这里必须提醒一个常见的坑:GEO下载时,Supplementary Files里的SRA格式文件和Processed Tables里的矩阵文件格式完全不同。SRA转成的FastQ你得自己重比对、定量,那是真原始数据,绝对没负数。但如果你直接下载Process表,比如"Series Matrix",里面的数值可能已经是经过平台处理(Affy的log2)或者作者自定义处理的。这时候你得去看Supplementary Methods里的描述。有些作者会偷懒,直接贴了normalized matrix,这时候你看到的负数其实是"相对表达量",不是bug,是feature。
我见过最离谱的一次,某篇SCI文章引用了GEO数据做重分析,结果因为没看清矩阵里的说明,直接把含负数的标准化数据扔进DESeq2。DESeq2报错说"Input must be counts",作者还发推问是不是软件坏了。最后查出来,是作者把作者提供的log-normalized data当成了Raw Count。这种低级错误,审稿人看了只想退稿。
那到底怎么应对?
第一,看元数据。GEO页面的Table of Contents里,仔细看每个矩阵的说明。有没有写"Raw Counts"?有没有写"Log-transformed"?有没有写"Background-subtracted"?这几个词决定了数据的性质。
第二,看分布。画个直方图或者箱线图。原始Count通常是右偏分布,长尾很长;Log转换后近似正态;Z-score是左右对称的。如果你的数据是正态分布还带着负数,那基本可以断定它是标准化后的数据,不能直接用于差异分析的原始输入。
第三,如果必须做差异分析,而手头只有标准化数据。你可以考虑反变换(Reverse transformation),但这需要知道具体的转换公式,误差会放大。更稳妥的办法是,如果有原始SRA数据,重新跑一遍管道,虽然耗时,但最干净。
记住,"geo下载的基因表达量负数"本身不是终点,它是个信号,告诉你数据的性质和你预期的工具不匹配。不要硬跑,先读懂数据。科研里没有万能钥匙,只有对数据的敬畏。
如果你正在被这个负数搞得头秃,或者不确定自己手里的数据该用什么流程,可以把你的SRA编号或者Matrix名称发给我。我手里有一堆处理过的案例,可以帮你快速诊断一下问题出在哪。有时候多花十分钟问路,能省你两周的调试时间。