R 配对t检验碰撞应用循环(已编辑)

R 配对t检验碰撞应用循环(已编辑),r,hypothesis-test,R,Hypothesis Test,为了回应这些有用的评论,我编辑了原始问题(我假设for循环和apply循环给出不同的结果)。 我使用R运行大量的两组t测试,使用来自分隔表的输入。根据这里和其他地方的建议,我尝试了“for循环”和“apply”来实现这一点。对于“正常”t.test,两者都能很好地工作并给出相同的结果。但是,对于配对t检验,for外观似乎有效,而apply循环则无效。后来,我发现这两个循环都有相同的问题(见下文),但是for循环更能处理这种情况(只有一个循环返回无效结果),而apply循环完全失败 我的输入文件如

为了回应这些有用的评论,我编辑了原始问题(我假设for循环和apply循环给出不同的结果)。

我使用R运行大量的两组t测试,使用来自分隔表的输入。根据这里和其他地方的建议,我尝试了“for循环”和“apply”来实现这一点。对于“正常”t.test,两者都能很好地工作并给出相同的结果。但是,对于配对t检验,for外观似乎有效,而apply循环则无效。后来,我发现这两个循环都有相同的问题(见下文),但是for循环更能处理这种情况(只有一个循环返回无效结果),而apply循环完全失败

我的输入文件如下所示:(第一行是标题行,数据行有一个名称,组1有4个数据点,组2有4个数据点):

依此类推(总共约50000条生产线)。第一个数据行(以name19开头)就是罪魁祸首

这是for-loop版本,工作得更好(在有问题的行上失败,但正确处理所有其他行):


tableUPDATE既然您说过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 ))
你真的明白了吗,还是说:

Error in t.test: data are essentially constant

但是仍然不太清楚为什么for循环可以工作。但是请注意,在for循环中,您使用的是
as.numeric
,而在
apply
情况下,您不会这样做…

在这种情况下,我会捕获所有警告和错误,然后进行调查,如下所示:


你也可以在这里找到一些好主意:

t.test(rep(1,4),rep(0,4))
会报告相同的错误。处理1)零方差2)观察值不是≥ 1

我遇到了这个问题,使用tapply进行了大量配对t检验。我使用样本大小作为删除数据的指南,我可能无论如何都不应该在这些数据上运行t测试

你能提供一个再现错误的最小示例吗?我们可能需要更多的帮助比你给我们上面。但是,不要执行
apply()
版本中的
as.matrix()
行。如果
头文件
确实在文件中,那么您可能会在那里遇到麻烦
apply()
可以在数据帧上正常工作,因此您可以使用
pv.list添加到Gavin的优秀问题中:尝试在启用
debug
的情况下运行
apply
代码。可能会出现一些半明显的索引错误。谢谢您的评论。Gavin建议跳过as.matrix步骤,简化了脚本,但没有改变任何内容。我不熟悉“调试”,我可能稍后再尝试。接下来,我追查到了罪魁祸首,现在我(部分)理解了这个问题。我已经更改了上面的示例文件,这是导致问题的第一行。我可以理解为什么配对t检验不喜欢这些数据,但这是否足以使整个“应用”循环崩溃?对此我能做些什么吗?我应该补充一点,在理解了这个问题之后,我发现for循环也拒绝了这个特定的数据行。我没有注意到这一点,因为循环的其余部分工作正常,并且输出文件看起来不明显(只缺少一行输出),很好地完成了回溯。您是否可以编辑或删除您的问题以反映您更新的问题?我同意这种行为也是不可取的(但在数据中包含Inf比在造成我的问题的看起来无害的数据行更容易发现)。看来t.test不适合批量处理(或者必须采取更多的预防措施)。顺便说一句,for循环对于有问题的行也会失败,但至少会继续并处理所有其他数据lines@user900889-啊哈!请参阅我的更新答案以获得可能的解决方案。为什么我不简单地添加TryCatch?因为我不知道它的存在:-)。谢谢对不起,我的意思是可能是零方差导致了问题的发生,我只是举一个简单的例子来说明简单的通知。我会完整回答
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})
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 ))
> 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