查看原文
其他

GEO芯片中多个探针对应一个基因,是求平均值还是保留最大值?

果子 果子学生信 2023-06-15

昨天差一个帖子,明天补上。
在之前我写过一个帖子
R语言学习路上的忆苦思甜
里面讲的是各种分组计算的方法,最终在我的知识体系里,我觉得

group_by联合summarise是分组计算的首选

所以凡是这种需求,我都是这么做的。
先创建一个极其简单的例子。

data <- data.frame(ID=rep(LETTERS,each=3),
                   sample1=sample(seq(10,1000),78))

第一列重复的字母,三个一组,从A-Z,第二列是对应的数值。
现在的需求是,求每一个字母数值的最大值
这属于分组计算的需求,应当用group_by按照ID来分组,用summarise来计算最大值即可。

library(dplyr)
data1 <- data %>%
  group_by(ID) %>% 
  summarise_all(max)

还可以怎么弄呢,这个方法我在这里介绍过。
来完成你的生信作业,这是最有诚意的GEO数据库教程

当时我们要对多个探针对应一个基因去重,其实去重有两种思路,一个是求多个探针的平均值,一个是求多个探针的最大值,我们当时选择的是最大值方案,去重用得到是disctinct函数,这个函数会保留看到的第一个元素,其余重复的都删除。

我们为什么选择最大值方案,完全是从临床医生的角度考虑的,临床上经常出现这种情况:

第一次细针穿刺患者诊断为癌症,治疗后,或者第二次取组织发现没有癌细胞,这时候究竟该如何诊断呢?

答案毫无疑问,应该诊断为阳性。那么到了多个探针对应一个基因的情况,我选择最大值的理有也是类似的,各个探针的区别只是检测效率的差异,如果一个探针能够识别某个基因的表达量为10,那么其他几个都低于10,我们有理有相信,选最大值是靠谱的。

我们只要先把数值按从大到小排序,再去重,就是实现了保留最大值。

library(dplyr)
data2 <- data %>% 
  arrange(desc(sample1)) %>% 
  distinct(ID,.keep_all = T) %>% 
  arrange(ID)

我们发现两种方法,结果是一样的。

假如有人还是觉得取平均值靠谱呢?比如,一个基因的甲基化水平,大家喜欢用多个甲基化位点的平均值来表示。那么group_by也是可以的,只要把max改成mean就可以了。

library(dplyr)
data3 <- data %>
  group_by(ID) %>% 
  summarise_all(mean)

我们嘴上说的是summarise,为什么用的却是summarise_all, 因为summarise只能作用于一列,而summarise_all可以作用于分组的其他所有列,这个更符合实际情况。
比如:

data4 <- data.frame(ID=rep(LETTERS,each=3),
                   sample1=sample(seq(10,1000),78),
                   sample2=sample(seq(20,800),78),
                   sample3=sample(seq(50,600),78))

这个代码可同时处理所有列

library(dplyr)
data4 <- data4 %>
  group_by(ID) %>% 
  summarise_all(mean)

是不是很厉害呢?
今天的数据完全由代码产生,每个人都可以操作,但是要注意,因为产生的是随机数,所以结果不会跟我一样。

我是果子,明天见,明天有三个帖子。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存