使用方差分析结果列表中的 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)
我想要 运行 一系列 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)