使用方差分析结果列表中的 p 值作为条件

Using pvalue from list of anova results as condition

我想要 运行 一系列 kruskal.tests,然后是 dunn_test,其中 Kruskal 很重要。然后打印显着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。

我意识到这不会给我想要的结果,因为 post 和方差分析项目是两个独立的对象,这只是我最初的想法。 使用 anova[[i]]$p.value 也会导致下标越界错误。

据我所知,您的代码大部分都能正常工作。唯一的主要问题是您误用了 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-value小于0.05,并且 dunn_test 中至少有一项比较显着。

这是一种方法,它带有一个函数,可以只获得您想要的 post-hoc 结果。它的工作原理类似于循环。我看到您熟悉 as.formula,我认为这是最好的方法。我对 Kruskal-Wallis 测试和 Dunn 测试使用了相同的公式。该函数仅使用您要测试的列名并从中创建公式。如果您想 return 所有 post-hoc 测试任何一个比较是否显着,则 any 可以进行小的更改。输出 want 捕获所有 post-hoc 测试,至少有一个显着的成对比较。

除了您的代码之外,创建与 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,您可以将其子集化为调整后的 p-values比 0.05 和 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)