为了回应有用的评论,我编辑了原始问题(我曾假设 for-loop 和 apply-loop 给出不同的结果)。
我正在使用 R 运行大量 2 组 t 检验,使用来自分隔表的输入。根据这里和其他地方的建议,我尝试了“for-loops”和“apply”来实现这一点。对于“正常”的 t.test,两者都可以很好地工作并给出相同的结果。但是,对于配对 t 检验,for-look 似乎有效,而 apply-loop 则无效。后来,我发现两个循环都遇到了同样的问题(见下文),但是 for 循环更优雅地处理了这种情况(只有一个循环循环返回无效结果),而 apply 循环完全失败。
我的输入文件如下所示:(第一行是标题行,数据行有一个名称,第 1 组有 4 个数据点,第 2 组有 4 个数据点):
header g1.1 g1.2 g1.3 g1.4 g2.1 g2.2 g2.3 g2.4
name1 0 0.5 -0.2 -0.2 -0.1 0.4 -0.3 -0.3
name2 23.2 24.4 24.5 27.2 15.5 16.5 17.7 20.0
name3 .....
依此类推(总共约 50000 行)。第一条数据线(以name19开头,原来是罪魁祸首。
这是效果更好的 for 循环版本(在有问题的行上失败,但正确处理所有其他行):
table <- read.table('ttest_in.txt',head=1,sep='\t')
for(i in 1:nrow(table)) {
g1<-as.numeric((table)[i,2:5])
g2<-as.numeric((table)[i,6:9])
pv <- t.test(g1,g2,paired=TRUE)$p.value
}
这是导致问题的“应用”版本
table <- read.table('ttest_in.txt',head=1,sep='\t')
pv.list <- apply(table[,2:9],1,function(x){t.test(x[1:4],x[5:8],paired=TRUE)$p.value})
大约 50000 条数据线中的一条是有问题的,因为所有成对比较的差异都是相同的,这在成对的 t 检验中会导致未定义的 p 值(基本上为零)。应用循环因错误“数据基本不变”而崩溃。对我(作为一个 R 新手)来说,仅仅因为 t.test 不喜欢一个数据而使整个脚本崩溃似乎不是一个好主意。在 for 循环中,该数据行也会导致错误消息,但循环继续,所有其他 t 检验给出正确的结果。
我做错了什么吗?这种行为本质上禁止使用应用循环进行这种批处理分析。或者有没有一种标准的方法来规避这个问题。为什么 t 检验不只是返回对该特定 p 值无效的东西而不是退出?