如何在for循环中执行相同的t检验?

时间:2017-12-21 22:19:41

标签: r for-loop

我有一个数据库,列主题(值0或1),级别(值1到9)和 startTime (双值) )。对于每个级别,我想对startTime值执行t检验。这是我的代码:

database <- read.csv("database.csv")
themeData <- database[database$theme == 1, ]
noThemeData <- database[database$theme == 0, ]

for (i in 1:9) {
  x <- themeData[themeData$level == i, ]
  y <- noThemeData[noThemeData$level == i, ]
  t.test(x$startTime,y$startTime,
         alternative = "less")
}

不幸的是,没有执行t测试。最后,x和y只得到i = 9的值。我做错了什么?

1 个答案:

答案 0 :(得分:4)

您的代码正在忙于工作:它正在进行t.test的计算,但因为for循环总是丢弃其隐含结果,您没有存储它任何地方。您将不得不使用向量或列表(预分配总是更好),如下所示:

res <- replicate(9, NULL)
for (i in 1:9) {
  x <- themeData[themeData$level == i, ]
  y <- noThemeData[noThemeData$level == i, ]
  res[[i]] <- t.test(x$startTime,y$startTime,
                     alternative = "less")
}
res[[2]]

这可以“足够好”,因为它将list中的所有测试“结果对象”保存起来以供以后处理/使用。稍微好一点的方法是使用*apply函数之一;我认为可以直接应用的前两个(lapplysapply(..., simplify=FALSE))有各种小优点,坦白说你可以选择。

res <- lapply(c(4, 6, 8), function(thiscyl) {
  am0 <- subset(mtcars, am == 0 & cyl == thiscyl)
  am1 <- subset(mtcars, am == 1 & cyl == thiscyl)
  t.test(am0$mpg, am1$mpg)
})

如果(与此处不同)测试需要很长时间,这是特别有用的:您执行测试并保留模型,因此您可以在不必重新运行结果的情况下获得大量结果试验。例如,如果您只想要p值:

sapply(res, `[`, "p.value")
# $p.value
# [1] 0.01801712
# $p.value
# [1] 0.187123
# $p.value
# [1] 0.7038727

或更简洁:

sapply(res, `[[`, "p.value")
# [1] 0.01801712 0.18712303 0.70387268

另一个例子,置信区间,矩阵:

t(sapply(res, `[[`, "conf.int"))
#           [,1]      [,2]
# [1,] -9.232108 -1.117892
# [2,] -3.916068  1.032735
# [3,] -2.339549  1.639549

您可以随时查看单个模型,例如res[[2]],但如果您需要查看所有模型,则可以只使用res并查看整个色域。

res[[2]]
#   Welch Two Sample t-test
# data:  am0$mpg and am1$mpg
# t = -1.5606, df = 4.4055, p-value = 0.1871
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
#  -3.916068  1.032735
# sample estimates:
# mean of x mean of y 
#  19.12500  20.56667