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

问题描述 投票:0回答:1

我有一个数据库,其列主题(值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的值。我究竟做错了什么?

r for-loop
1个回答
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 
© www.soinside.com 2019 - 2024. All rights reserved.