做单细胞或者bulk转录组,最头疼的不是画图,而是数据清洗。
很多人拿到GEO数据,第一件事就是下载,然后直接跑分析。
结果出来,聚类一团糟,差异基因全是线粒体基因或者核糖体蛋白。
这时候才想起来,低表达基因没去掉。
今天不扯那些复杂的数学公式,就聊聊怎么实操,怎么避坑。
先说个真事。
我有个学生,之前做bulk RNA-seq,为了省事,直接用了默认的过滤参数。
最后发现,他所谓的“差异表达基因”,有30%都是低丰度的背景噪音。
这导致后续的GO富集分析,出来的结果根本解释不通生物学意义。
浪费了一周时间,还得重做。
所以,geo数据集如何去除低表达基因,这个问题必须重视。
第一步,别急着看代码,先看数据分布。
用R语言加载数据后,先画个箱线图或者密度图。
看看表达量的分布情况。
如果大部分基因的表达量都在0附近,或者呈现极长的右偏分布。
那说明低表达基因确实是个大问题。
第二步,确定过滤阈值。
这是最关键的,也是最容易扯皮的地方。
有的老师建议,保留至少5个样本中表达量大于1的基因。
有的建议,保留在至少30%样本中CPM大于1的基因。
我的经验是,别死守一个数字。
要看你的样本量。
如果样本量小,比如只有6个,那阈值设高点,比如至少2个样本表达量大于1。
如果样本量大,比如几十个,那可以放宽一点。
对于geo数据集如何去除低表达基因,其实没有标准答案,只有适合你数据的方案。
我一般喜欢用edgeR包里的filterByExpr函数。
这个函数很智能,它会根据样本大小自动调整阈值。
比手动写if-else要靠谱得多。
代码很简单,几行搞定。
但要注意,过滤之前,一定要检查数据格式。
很多GEO数据下载下来,行名是基因ID,列名是样本。
如果行名有重复,或者格式不对,过滤的时候会报错。
这时候,先做个去重处理,取平均或者最大值。
别偷懒,这一步错了,后面全完蛋。
第三步,过滤后的检查。
很多人过滤完,直接继续分析。
大错特错。
一定要再画个图看看。
看看过滤前后,基因数量的变化。
如果一下子少了一半以上,那可能阈值设太高了,把真信号也过滤掉了。
如果只少了百分之几,那可能还是太低,没滤干净。
我有个案例,之前处理一个癌症数据集。
初始基因数2万多个。
过滤后剩1万5。
看起来正常。
但仔细看,线粒体基因还是很多。
这时候,得单独把线粒体基因挑出来,看看它们是不是低表达。
如果是,那就一起过滤掉。
不然,聚类的时候,细胞会按照线粒体基因的表达量聚在一起,而不是按照细胞类型。
这就叫“假阳性聚类”。
最后,关于geo数据集如何去除低表达基因,我想说,这不仅仅是技术操作,更是生物学思考。
低表达基因,可能是技术噪音,也可能是真实的稀有细胞类型信号。
如果你做的是bulk数据,大概率是噪音,大胆过滤。
如果你做的是单细胞数据,尤其是想发现稀有细胞群,那就要谨慎。
有时候,那些低表达的基因,恰恰是标记基因。
所以,别盲目套用别人的代码。
要看你的数据,看你的研究目的。
记住,数据清洗占整个分析流程的时间,至少一半。
别嫌麻烦,这一步做好了,后面的分析才能信得过。
不然,你画出来的图再漂亮,也是空中楼阁。
希望这些经验能帮你少走弯路。
毕竟,在这个行业摸爬滚打15年,见过太多因为基础不牢而翻车的案例。
与其事后补救,不如事前严谨。
加油吧,科研人。