Post-在 R 中使用 Welch 校正的单向方差分析的临时测试
Post-hoc tests for one-way ANOVA with Welch's correction in R
我有 运行 单向方差分析检验,使用 R 中的 oneway.test()
进行韦尔奇校正,因为我有违反等方差假设的数据(转换没有解决问题)。
一个简单的数据示例:
> dput(df)
structure(list(Count = c(13, 14, 14, 12, 11, 13, 14, 15, 13,
12, 20, 15, 9, 5, 13, 14, 7, 17, 18, 14, 12, 12, 13, 14, 11,
10, 15, 14, 14, 13), Group = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", "b", "c"
), class = "factor")), .Names = c("Count", "Group"), row.names = c(NA,
-30L), class = "data.frame")
library(car)
grp = as.factor(c(rep(1, 10), rep(2, 10),rep(3, 10)))
leveneTest(df$Count,grp) #unequal variances
#one-way ANOVA with welch's correction
oneway.test(Count ~ Group, data=df, na.action=na.omit, var.equal=FALSE)
我有多个组,所以我现在想 运行 成对 post-hoc 测试。无论如何,是否可以使用 oneway.test() 函数中的对象来执行此操作?如果不是,如何对具有不等方差的组进行 运行 宁对测试?我无法在网上找到这个问题的答案。如有任何建议,我们将不胜感激。
这里有两种方法:
数据
library(car)
df <- structure(list(Count = c(13, 14, 14, 12, 11, 13, 14, 15, 13, 12, 20, 15, 9, 5, 13, 14, 7, 17, 18, 14, 12, 12, 13, 14, 11, 10, 15, 14, 14, 13),
Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", "b", "c" ), class = "factor")),
.Names = c("Count", "Group"),
row.names = c(NA, -30L), class = "data.frame")
基础 R
首先,Group
因子的唯一对集合:
allPairs <- expand.grid(levels(df$Group), levels(df$Group))
##
allPairs <- unique(t(apply(allPairs, 1, sort)))
allPairs <- allPairs[ allPairs[,1] != allPairs[,2], ]
allPairs
## [,1] [,2]
## [1,] "a" "b"
## [2,] "a" "c"
## [3,] "b" "c"
现在分析:
allResults <- apply(allPairs, 1, function(p) {
dat <- df[ df$Group %in% p, ]
ret <- oneway.test(Count ~ Group, data = dat, na.action = na.omit, var.equal = FALSE)
ret$groups <- p
ret
})
length(allResults)
## [1] 3
allResults[[1]]
## One-way analysis of means (not assuming equal variances)
## data: Count and Group
## F = 0.004, num df = 1.000, denom df = 10.093, p-value = 0.9508
如果你想要这是一个矩阵,也许是这样:
mm <- diag(length(levels(df$Group)))
dimnames(mm) <- list(levels(df$Group), levels(df$Group))
pMatrix <- lapply(allResults, function(res) {
## not fond of out-of-scope assignment ...
mm[res$groups[1], res$groups[2]] <<- mm[res$groups[2], res$groups[1]] <<- res$p.value
})
mm
## a b c
## a 1.0000000 0.9507513 0.6342116
## b 0.9507513 1.0000000 0.8084057
## c 0.6342116 0.8084057 1.0000000
(这对于 F 统计量来说同样容易完成。)
使用dplyr
首先,Group
因子的唯一对集合:
library(dplyr)
##
allPairs <- expand.grid(levels(df$Group), levels(df$Group), stringsAsFactors = FALSE) %>%
filter(Var1 != Var2) %>%
mutate(key = paste0(pmin(Var1, Var2), pmax(Var1, Var2), sep='')) %>%
distinct(key) %>%
select(-key)
allPairs
## Var1 Var2
## 1 b a
## 2 c a
## 3 c b
如果顺序真的很重要,您可以尽早将 dplyr::arrange(Var1, Var2)
添加到此管道中,也许在调用 expand.grid
.
之后
现在分析:
ret <- allPairs %>%
rowwise() %>%
do({
data.frame(.,
oneway.test(Count ~ Group, filter(df, Group %in% c(.$Var1, .$Var2)),
na.action = na.omit, var.equal = FALSE)[c('statistic', 'p.value')],
stringsAsFactors = FALSE)
})
ret
## Source: local data frame [3 x 4]
## Groups: <by row>
## Var1 Var2 statistic p.value
## 1 b a 0.004008909 0.9507513
## 2 c a 0.234782609 0.6342116
## 3 c b 0.061749571 0.8084057
(我对其中任何一个的性能都不做任何声明;通常一个会像这个例子那样用很少的数据闪耀,但另一个会在更大的集合中领先。它们看起来表现相同具有相同结果的统计配对比较。交给你了!)
只是补充一点,尽管时机不佳,而且我自己一直在寻找类似的东西,但也可以选择执行 Games-Howell 测试。
正如 stackexchange_post 中介绍的那样,它甚至已被纳入 'userfriendlyscience' R 包中的 'posthoc.tgh' 函数。它代表了不等方差的 Tukey-Kramer 检验的扩展。
posthocTGH {userfriendlyscience}
原始出版物(甚至在我出生之前):
Paul A. Games 和 John F. Howell。
具有不等 N and/or 方差的成对多重比较程序:Monte Carlo 研究。
Journal of Educational & Behavioral Statistics,第 1 卷,第 2 期,1976 年,第 113-125 页。 doi: 10.3102/10769986001002113
我有 运行 单向方差分析检验,使用 R 中的 oneway.test()
进行韦尔奇校正,因为我有违反等方差假设的数据(转换没有解决问题)。
一个简单的数据示例:
> dput(df)
structure(list(Count = c(13, 14, 14, 12, 11, 13, 14, 15, 13,
12, 20, 15, 9, 5, 13, 14, 7, 17, 18, 14, 12, 12, 13, 14, 11,
10, 15, 14, 14, 13), Group = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", "b", "c"
), class = "factor")), .Names = c("Count", "Group"), row.names = c(NA,
-30L), class = "data.frame")
library(car)
grp = as.factor(c(rep(1, 10), rep(2, 10),rep(3, 10)))
leveneTest(df$Count,grp) #unequal variances
#one-way ANOVA with welch's correction
oneway.test(Count ~ Group, data=df, na.action=na.omit, var.equal=FALSE)
我有多个组,所以我现在想 运行 成对 post-hoc 测试。无论如何,是否可以使用 oneway.test() 函数中的对象来执行此操作?如果不是,如何对具有不等方差的组进行 运行 宁对测试?我无法在网上找到这个问题的答案。如有任何建议,我们将不胜感激。
这里有两种方法:
数据
library(car)
df <- structure(list(Count = c(13, 14, 14, 12, 11, 13, 14, 15, 13, 12, 20, 15, 9, 5, 13, 14, 7, 17, 18, 14, 12, 12, 13, 14, 11, 10, 15, 14, 14, 13),
Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", "b", "c" ), class = "factor")),
.Names = c("Count", "Group"),
row.names = c(NA, -30L), class = "data.frame")
基础 R
首先,Group
因子的唯一对集合:
allPairs <- expand.grid(levels(df$Group), levels(df$Group))
##
allPairs <- unique(t(apply(allPairs, 1, sort)))
allPairs <- allPairs[ allPairs[,1] != allPairs[,2], ]
allPairs
## [,1] [,2]
## [1,] "a" "b"
## [2,] "a" "c"
## [3,] "b" "c"
现在分析:
allResults <- apply(allPairs, 1, function(p) {
dat <- df[ df$Group %in% p, ]
ret <- oneway.test(Count ~ Group, data = dat, na.action = na.omit, var.equal = FALSE)
ret$groups <- p
ret
})
length(allResults)
## [1] 3
allResults[[1]]
## One-way analysis of means (not assuming equal variances)
## data: Count and Group
## F = 0.004, num df = 1.000, denom df = 10.093, p-value = 0.9508
如果你想要这是一个矩阵,也许是这样:
mm <- diag(length(levels(df$Group)))
dimnames(mm) <- list(levels(df$Group), levels(df$Group))
pMatrix <- lapply(allResults, function(res) {
## not fond of out-of-scope assignment ...
mm[res$groups[1], res$groups[2]] <<- mm[res$groups[2], res$groups[1]] <<- res$p.value
})
mm
## a b c
## a 1.0000000 0.9507513 0.6342116
## b 0.9507513 1.0000000 0.8084057
## c 0.6342116 0.8084057 1.0000000
(这对于 F 统计量来说同样容易完成。)
使用dplyr
首先,Group
因子的唯一对集合:
library(dplyr)
##
allPairs <- expand.grid(levels(df$Group), levels(df$Group), stringsAsFactors = FALSE) %>%
filter(Var1 != Var2) %>%
mutate(key = paste0(pmin(Var1, Var2), pmax(Var1, Var2), sep='')) %>%
distinct(key) %>%
select(-key)
allPairs
## Var1 Var2
## 1 b a
## 2 c a
## 3 c b
如果顺序真的很重要,您可以尽早将 dplyr::arrange(Var1, Var2)
添加到此管道中,也许在调用 expand.grid
.
现在分析:
ret <- allPairs %>%
rowwise() %>%
do({
data.frame(.,
oneway.test(Count ~ Group, filter(df, Group %in% c(.$Var1, .$Var2)),
na.action = na.omit, var.equal = FALSE)[c('statistic', 'p.value')],
stringsAsFactors = FALSE)
})
ret
## Source: local data frame [3 x 4]
## Groups: <by row>
## Var1 Var2 statistic p.value
## 1 b a 0.004008909 0.9507513
## 2 c a 0.234782609 0.6342116
## 3 c b 0.061749571 0.8084057
(我对其中任何一个的性能都不做任何声明;通常一个会像这个例子那样用很少的数据闪耀,但另一个会在更大的集合中领先。它们看起来表现相同具有相同结果的统计配对比较。交给你了!)
只是补充一点,尽管时机不佳,而且我自己一直在寻找类似的东西,但也可以选择执行 Games-Howell 测试。 正如 stackexchange_post 中介绍的那样,它甚至已被纳入 'userfriendlyscience' R 包中的 'posthoc.tgh' 函数。它代表了不等方差的 Tukey-Kramer 检验的扩展。 posthocTGH {userfriendlyscience}
原始出版物(甚至在我出生之前): Paul A. Games 和 John F. Howell。 具有不等 N and/or 方差的成对多重比较程序:Monte Carlo 研究。 Journal of Educational & Behavioral Statistics,第 1 卷,第 2 期,1976 年,第 113-125 页。 doi: 10.3102/10769986001002113