这是一种使用函数来获得所需的事后结果的方法。它的工作原理类似于循环。我看你很熟悉,as.formula
我认为这是最好的方法。我对 Kruskal-Wallis 检验和 Dunn 检验使用了相同的公式。该函数只使用您要测试的列名并从中创建公式。如果您想在任何一个比较显着的情况下返回所有事后测试,则any
只需进行少量更改即可。输出want
通过至少一个重要的成对比较捕获所有事后测试。
除了您的代码之外,创建与 R 中的函数具有相同名称的对象名称不是很好的做法。它是 Ranova
中的基本函数,因此您不希望将结果也命名为 anova。您还在a
循环中一遍又一遍地创建对象。这是同一个任务,所以它应该在你的循环之外。这不是什么大问题,但是如果您开始使用更大的数据集,它可以加起来。
library(rstatix)
#>
#> Attaching package: 'rstatix'
#> The following object is masked from 'package:stats':
#>
#> filter
iris <- iris
a <- colnames(iris)
a <- a[1:4]
myfunc <- function(y, x){
form <- as.formula(paste0(y, " ~ ", x))
res <- rstatix::kruskal_test(form, data = iris)
if (res$p < 0.05){
post <- rstatix::dunn_test(data = iris, form, p.adjust.method= "bonferroni")
if(any(post$p.adj < 0.05)) return(post)
}
}
want <- lapply(a, FUN = myfunc, x = "Species")
want <- do.call(rbind, want)
如果您只想要显着的特定成对比较,因为输出dunn_test
是 a data.frame
,您可以通过小于 0.05 的调整 p 值对其进行子集化return
。
myfunc <- function(y, x){
form <- as.formula(paste0(y, " ~ ", x))
res <- rstatix::kruskal_test(form, data = iris)
if (res$p < 0.05){
post <- rstatix::dunn_test(data = iris, form, p.adjust.method= "bonferroni")
post <- post[post$p.adj < 0.05 ,]
return(post)
}
}
作为一个循环,这将是:
res <- list()
post <- list()
post_sig <- list()
for(i in 1:4){
form <- as.formula(paste0(a[i], " ~ Species"))
res[[i]] <- rstatix::kruskal_test(form, data = iris)
post[[i]] <- rstatix::dunn_test(data = iris, form, p.adjust.method= "bonferroni")
if (res[[i]]$p < 0.05 & any(post[[i]]$p.adj < 0.05)){
print(post[[i]])
## could be blanks in the list here as the number i is used
## e.g. if var 2 was not significant, post_sig[[2]] is blank
post_sig[[i]] <- post[[i]]
}
}
## if you want results as a dataframe
res <- do.call(rbind, res)
post <- do.call(rbind, post)
post_sig <- do.call(rbind, post_sig)