我正在使用Bioconductor套件(ALL数据集),并尝试对每个基因进行t.test。目的是查看性别之间的基因表达差异。我可以通过以下步骤来进行基本的t.test测试:
> males <- exprs[, pData(ALL)$sex == "M"]
> females<-exprs[, pData(ALL)$sex == "F"]
> t.test(males, females)
但是,当我尝试应用apply函数为每个基因提取一个p值时,该命令永无止境,只是不断循环(我认为)。
pvals=apply(exprs,1,function(x) {t.test(x[males],x[females])$p.value})
这是一个男性样本,共有12625行(即探针ID)。
> males
01005 01010 04006 04007 04008
1000_at 7.597323 7.479445 7.384684 7.905312 7.065914
1001_at 5.046194 4.932537 4.922627 4.844565 5.147762
1002_f_at 3.900466 4.208155 4.206798 3.416923 3.945869
1003_s_at 5.903856 6.169024 6.116890 5.687997 6.208061
答案 0 :(得分:1)
这里有一些可以帮助您入门的东西。 (冒着重蹈覆辙的危险;-)请注意,这更多的是统计/计算练习,而不是您真正应该做的事情;正如我的评论中所解释的,存在表征差异基因表达的复杂方法。比较而言,t检验(或ANOVA)是一种非常粗糙的方法。
我们加载所有库和数据。
library(ALL)
data(ALL)
为表征男性和女性个体的平均探针强度差异,我们执行了两样本双向t检验,并将结果存储在list
中。
lst <- apply(exprs(ALL), 1, function(x)
t.test(x[which(pData(ALL)$sex == "M")], x[which(pData(ALL)$sex == "F")]))
我们提取每个探针的t统计量,平均探针强度和p值的差,并将结果存储在data.frame
中。
df <- do.call(rbind, lapply(lst, function(x) c(
statistic = unname(x$statistic),
diff = unname(diff(x$estimate)),
pval = unname(x$p.value))))
我们使用Benjamini and Hochberg的FDR方法校正了多个假设检验的p值。
df <- transform(df, padj = p.adjust(pval, method = "BH"))
我们检查了df
的前10行(从最小到最大调整后的p值排序)。
head(df[order(df$padj), ], n = 10)
# statistic diff pval padj
#37583_at 18.935092 -1.7717178 1.710570e-36 2.159594e-32
#38355_at 20.542586 -4.9979077 6.129942e-32 3.869526e-28
#41214_at 21.494496 -4.3233221 3.937217e-31 1.656912e-27
#34477_at 14.469711 -1.1639971 2.606867e-28 8.227924e-25
#35885_at 14.417265 -1.4006757 5.806146e-28 1.466052e-24
#38446_at -14.357159 2.3848176 1.956173e-21 4.116115e-18
#38182_at 11.052181 -0.7151076 1.140089e-19 2.056232e-16
#40097_at 9.401626 -0.5798433 8.801566e-16 1.388997e-12
#36321_at 9.208492 -0.6499951 1.823511e-15 2.557981e-12
#31534_at 8.939350 -0.5113203 1.077008e-14 1.359723e-11
我们在火山图上显示结果
ggplot(df, aes(diff, -log10(padj))) +
geom_point() +
labs(x = "Difference in mean probe intensity", y = "Adjusted p-value")
答案 1 :(得分:0)
多亏了Maurits,我得以使用他的代码来回答我的问题。我还开发了以下完成任务的片段(我实际上更喜欢Maurits的解决方案,但这是完成任务的另一种方法:
> exprs<-exprs(ALL)
> pval<-numeric()
> p.dat<-pData(ALL)$sex
> r.sims<-nrow(exprs)
> for(gene in 1:r.sims) {
+ gexprs<-exprs[gene,]
+ g.data<-data.frame(gexprs,p.dat)
+ ttest<-t.test(gexprs[p.dat=="M"],gexprs[p.dat=="F"])
+ pval[gene]<-ttest$p.value
+ }
答案 2 :(得分:0)
如果允许您使用外部软件包,则:
library(matrixTests)
row_t_welch(exprs[, pData(ALL)$sex == "M"], exprs[, pData(ALL)$sex == "F"])
这是假设基因成行书写。