为了回应有用的评论,我编辑了原来的问题(我假设 for 循环和 apply 循环给出不同的结果)。
我正在使用 R 运行大量 2 组 t 检验,使用来自分隔表的输入。根据这里和其他地方的建议,我尝试了“for-loops”和“apply”来实现这一点。对于“正常”t.test,两者都可以很好地工作并给出相同的结果。然而,对于配对 t 检验,for-look 似乎有效,而 apply-loop 则无效。后来,我发现两个循环都遇到同样的问题(见下文),但 for 循环可以更优雅地处理这种情况(只有一个循环返回无效结果),而 apply-loop 完全失败。
我的输入文件如下所示:(第一行是标题行,数据行有一个名称,第 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 值无效的内容而不是退出?