1

我正在尝试对包含数百到数千列的数据表进行某些统计,例如 t 检验。数据的格式是我比较的两组值在同一列中。

所以,基本上我的第一次尝试是像下面这样剪切和粘贴;

NN <-read.delim("E:/output.txt")
View(NN)
attach(NN)

#output p-values of 100 t-tests 
sink(file="E:/ttest.txt", append=TRUE, split=FALSE)
t.test(Tree1[1:13],Tree1[14:34])$p.value
t.test(Tree2[1:13],Tree2[14:34])$p.value
t.test(Tree3[1:13],Tree3[14:34])$p.value

……………………

随着数据的增长,这变得越来越不切实际。有没有办法通过每一列依次循环这些 t 检验并将输出保存到文件中?

提前致谢。

4

3 回答 3

6

lapply我想用一个匿名函数把你带到那里:

> test <- data.frame(a=1:100,b=101:200)
> lapply(test,function(x) t.test(x[1:50],x[51:100])$p.value)
$a
[1] 2.876776e-31

$b
[1] 2.876776e-31

我应该为良好的实践尽自己的一份力量,同时还要注意,一次运行 100 个 t 检验充满了潜在的 1 型错误和其他不良情况。孤立地提取 p 值也可能是一个非常糟糕的举动。

于 2013-01-11T05:39:52.583 回答
2

不确定这是否是一种明智的方法,或者它是否可以正常工作,但请尝试mapply使用索引部分,如下所示:

test <- data.frame(a=1:100,b=101:200)

testa <- test[1:50, ]
testb <- test[51:100, ]
t.test2 <- function(x, y) t.test(x, y)[["p.value"]]
mapply(t.test2, testa, testb)

编辑:我使用了 thelatemail 的数据,因此具有可比性。他的警告是正确的。

于 2013-01-11T05:29:28.737 回答
-3

感谢所有的投入。只是一些澄清; 当我一次运行数百个 t 检验时,他们每次都在比较独立的数据集。因此,例如,第 1 列 (Tree1) 中的值,第 1:50 行将仅与同一列中的第 51:100 行比较一次,并且不再使用。第 2 列(Tree2)也是如此,依此类推。类型 1 错误仍然是一个问题吗?我看到它的方式基本上是一次对单独的数据集进行 t 检验。

话虽如此,我已经想出了一种使用 for 循环执行此操作的方法,结果与单独对每一列进行 t 测试时的结果相对应。

for (i in 1:100)

  print (t.test(mydata[1:50, i],mydata[51:100, i])$p.value)

end;

唯一的问题是我的输出前面总是有一个 [1]。

于 2013-01-11T23:13:38.197 回答