为了回应有用的评论,我编辑了原始问题(我假设for循环和应用循环给出的结果不同)。
我使用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行)。第一条数据线(从名字19开始证明是罪魁祸首。
这是一个效果更好的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
}
这是导致问题的'apply'版本
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检验都会给出正确的结果。
我做了一些根本错误的事吗?这种行为基本上禁止使用apply-loops进行这种批处理分析。或者有一种规避这个问题的标准方法。为什么t检验不会为那个特定的p值返回无效的东西而不是拯救?
答案 0 :(得分:5)
更新由于您说for循环ALSO会出错并且您希望apply
版本更强大,为什么不简单地添加tryCatch
?< / p>
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 ))
如果无法计算p.value,则应返回NA
。您可以通过编辑错误处理函数来更改为其他值(例如NULL
,0
或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
案例中没有这样做...
答案 1 :(得分:1)
在这种情况下,我会捕获所有警告和错误并在之后进行调查,如下所示:How do I save warnings and errors as output from a function?
您也可以在这里找到一些好主意:How to tell lapply to ignore an error and process the next thing in the list?
答案 2 :(得分:0)
t.test(rep(1,4),rep(0,4))
会报告相同的错误。并且https://stat.ethz.ch/pipermail/r-help/2008-February/154167.html是处理1)零方差2)观察数不≥1的答案
答案 3 :(得分:0)
我确实遇到了这个问题,使用tapply来运行大量成对的t检验。我使用样本量作为指导来删除我可能不应该运行t检验的数据。