2

为了回应有用的评论,我编辑了原始问题(我曾假设 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 值无效的东西而不是退出?

4

4 回答 4

5

更新既然你说for循环也给出错误并且你希望apply版本更健壮,为什么不简单地添加一个tryCatch

pv.list <- apply(table[,2:9],1, function(x) tryCatch( 
  t.test(x[1:4],x[5:8],paired=TRUE)$p.value, error=function(x) NA ))

NA如果 p.value 无法计算,这应该返回。您可以通过编辑错误处理函数更改为另一个值(例如NULL0或)。Inf

旧帖子

我注意到t.test当某些值是Inf(这似乎是一个错误)时,(有点)给出了您发现的错误:

> t.test(1:10, c(rep(1,9), Inf), paired=TRUE)
Error in if (stderr < 10 * .Machine$double.eps * abs(mx)) stop("data are essentially constant") : 
missing value where TRUE/FALSE needed

所以你真的得到这个还是它真的说:

Error in t.test: data are essentially constant

仍然不太清楚为什么 for 循环有效。但请注意,在你的 for 循环中你做as.numeric了,在这种情况下你不做apply......

于 2012-02-28T17:14:30.100 回答
1

在这种情况下,我会捕获所有警告和错误并在之后进行调查,如下所示:如何将警告和错误保存为函数的输出?

您还可以在这里找到一些好主意:如何告诉 lapply 忽略错误并处理列表中的下一个内容?

于 2012-02-29T02:06:55.683 回答
0

t.test(rep(1,4),rep(0,4))会报同样的错误。而https://stat.ethz.ch/pipermail/r-help/2008-February/154167.html是处理 1)零方差 2)观察数不≥1的答案

于 2013-07-04T02:39:27.380 回答
0

我已经遇到了这个问题,使用 tapply 运行大量配对 t 检验。我使用样本量作为指导来删除我可能不应该在任何情况下运行 t-tests 的数据。

于 2018-08-31T18:18:52.573 回答