首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用anova结果列表中的pvalue作为条件

使用anova结果列表中的pvalue作为条件
EN

Stack Overflow用户
提问于 2022-02-02 19:39:35
回答 2查看 78关注 0票数 1

我想运行一系列的kruskal.tests,然后是一个Kruskal非常重要的dunn_test。然后打印重要dunn_tests的结果。

代码语言:javascript
复制
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还会导致下标越界错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-02 20:24:09

这里有一个函数来获得你想要的临时结果。它的工作原理类似于循环。我看到您熟悉as.formula,我认为这是这里最好的方法。我在测试和Dunn测试中使用了相同的公式。函数只使用要测试的列名,并由此创建公式。如果您想返回所有的自定义测试(如果任何一个比较都是重要的),那么any可以进行一个小的更改。输出want通过至少一个重要的成对比较捕获所有的自定义测试。

除了代码之外,创建与R中函数同名的对象名称也不是很好,anova是R中的一个基本函数,因此您不希望结果名为anova。您还在循环中一次又一次地创建对象a。这是相同的任务,所以它应该在你的循环之外。这并不是什么大问题,但如果你开始使用更大的数据集,它就会加起来。

代码语言:javascript
复制
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值来对其进行子集。

代码语言:javascript
复制
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)
  }
}

作为一个循环,这将是:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2022-02-02 20:17:20

据我所知,您的代码大部分都能工作。唯一的主要问题是您误用了any()函数。你把第二个括号放错了。修复它并稍微重新排列代码,我运行了以下命令:

代码语言:javascript
复制
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中至少有一个比较是显着的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70961828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档