例如,我有一个包含11列的数据框(附加了示例屏幕截图)。第一列列出了所有基因,接下来的十列是对照(C1-C5)和处理过的(T1-T5)样品的测量值。测量值未配对。我想执行逐行t.test并为每个基因添加一个带有p值的列作为数据帧的最后一列。但是,正如您在我的数据中看到的那样,由于进行实验的方式,我没有每个基因的所有重复(在对照和治疗条件下)的所有测量值。所以我在许多行中都有几个NA值。我如何在此数据框中执行逐行t.test而不因NA值而失败?谢谢!
据我所知,t.test无法与NA's
一起使用。所以,如果我们做类似的事情:
Input = ("GeneID C1 C2 C3 C4 C5 T1 T2 T3 T4 T5
Gene1 5 1 7 9 2 7 5 4 4 3
Gene2 3 6 5 NA NA 5 1 3 NA NA
Gene3 2 3 NA NA NA NA 1 6 NA NA
Gene4 3 4 5 6 NA 3 4 5 NA NA")
df = as.data.frame(read.table(textConnection(Input), header = T, row.names = 1))
df$pval <- apply(df,1,function(x) {t.test(x[2:6],x[7:11])$p.value})
肯定会导致诸如not enough 'x' observations
之类的错误。有两个选项,您可以忽略NA's
,因此对于Gene2
,我们将拥有C1,C2,C3 vs T1,T2,T3
,因为我们只有这些观察值。其次,我们可以执行非参数测试,该测试功能较少,但更“灵活”。 T.test很不错,但必须满足许多假设。样本数量应相当大,并且C与T相等。此外,具有正态分布的组之间至少相似,这也表示方差...否则您的测试将失真。我会推荐这样的东西:
df$pval <- apply(df,1,function(x) {wilcox.test(x[2:6],x[7:11])$p.value})
C1 C2 C3 C4 C5 T1 T2 T3 T4 T5 pval
Gene1 5 1 7 9 2 7 5 4 4 3 0.7109920
Gene2 3 6 5 NA NA 5 1 3 NA NA 0.1386406
Gene3 2 3 NA NA NA NA 1 6 NA NA 1.0000000
Gene4 3 4 5 6 NA 3 4 5 NA NA 1.0000000
查看here并检查与数据特征相符的wilcox.test()
可用参数。尽管如此,请记住,如果减少测量,则测试的准确性和功效会更差。