我有一个数据库,列主题(值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的值。我做错了什么?
答案 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
函数之一;我认为可以直接应用的前两个(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