我有一个数据库,其列主题(值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的值。我究竟做错了什么?
你的代码忙于工作:它正在进行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
函数之一;我想到的前两个直接适用于此(lapply
,sapply(..., 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