我想运行一系列的kruskal.tests,然后是一个Kruskal非常重要的dunn_test。然后打印重要dunn_tests的结果。
library(rstatix)
library(purrr)
iris<- iris
for(i in 1:4){
a<- colnames(iris)
anova<- map(names(iris)[1:4], ~ kruskal.test(reformulate('Species', response=.x), data=iris))
post<- dunn_test(iris, as.formula(paste(a[i], a[5], sep="~")), p.adjust.method= "bonferroni")
if(any(post$p.adj < 0.05 & anova[[i]]$p.value < 0.05)){
print(a)
print(setNames(post, a))
}
}我想知道,当同一变量的kruskal测试显着性时,我如何才能只打印显着的dunntests。
我意识到这不会给我我想要的结果,因为帖子和阿诺瓦项目是两个独立的对象,这只是我最初的想法。使用anova[[i]]$p.value还会导致下标越界错误。
发布于 2022-02-02 20:24:09
这里有一个函数来获得你想要的临时结果。它的工作原理类似于循环。我看到您熟悉as.formula,我认为这是这里最好的方法。我在测试和Dunn测试中使用了相同的公式。函数只使用要测试的列名,并由此创建公式。如果您想返回所有的自定义测试(如果任何一个比较都是重要的),那么any可以进行一个小的更改。输出want通过至少一个重要的成对比较捕获所有的自定义测试。
除了代码之外,创建与R中函数同名的对象名称也不是很好,anova是R中的一个基本函数,因此您不希望结果名为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的输出是一个data.frame,那么您只需根据调整后的小于0.0 5的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)发布于 2022-02-02 20:17:20
据我所知,您的代码大部分都能工作。唯一的主要问题是您误用了any()函数。你把第二个括号放错了。修复它并稍微重新排列代码,我运行了以下命令:
library(rstatix)
library(purrr)
iris<- iris
a<- colnames(iris)
anova<- map(names(iris)[1:4], ~ kruskal.test(reformulate('Species', response=.x), data=iris))
for(i in 1:4){
post<- dunn_test(iris, as.formula(paste(a[i], a[5], sep="~")), p.adjust.method= "bonferroni")
if(any(post$p.adj < 0.05) & anova[[i]]$p.value < 0.05){
print(a[i])
print(post)
}
}这段代码一个接一个地打印出正在测试的变量的名称和dunn_test的输出,只要来自kruskal测试的相关p值小于0.05,并且dunn_test中至少有一个比较是显着的。
https://stackoverflow.com/questions/70961828
复制相似问题