我对数据集的子类别执行了几次wilcoxon检验。 R执行这些测试,但为每个测试显示一个大输出。我希望有一个输出,例如以表格的形式,以整齐的方式总结所有14个wilcoxon检验(分析子集的名称,检验统计的值,p值,结果,例如替代假设:...)>
我已经尝试了很多在网上找到的技巧,但是由于我对RI不太熟悉,因此无法分析问题,因此它根本无法正常工作,并且一个朋友告诉我:“ stackoverflow是您的朋友。寻求帮助!” 。你能进一步帮助我吗?
最好, 罗马
这是我执行以获取输出的代码:
strFlaecheNames<-c(df_summary$Flaeche)
varResult<-array(vector("list",10000),1000)
for(i in 1:14){
varResult[i]<-wilcox.test(df1$y,data=df1,subset(df1$y, df1$x == strFlaecheNames[i]))
print((wilcox.test(df1$y,data=df1,subset(df1$y, df1$x == strFlaecheNames[i]))))
}
我的14个输出之一如下:
Wilcoxon rank sum test with continuity correction
data: df1$y and subset(df1$y, df1$x == strFlaecheNames[i])
W = 1170300, p-value = 4.888e-13
alternative hypothesis: true location shift is not equal to 0
这是一个代码示例,我也以reprex的形式提供它,但是我无法发布它,但是由于代码有效,我想可以发布它了吗?:
ed_exp2 <- structure(list(x = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("Area1", "Area10", "Area11",
"Area12", "Area13", "Area14", "Area2", "Area3", "Area4", "Area5",
"Area6", "Area7", "Area8", "Area9"), class = "factor"), y = c(0L,
0L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 2L, 1L,
2L, 0L, 1L, 0L, -2L, 2L, 0L, 2L, 1L, 2L, 2L, -2L, 0L, 0L)), .Names = c("x",
"y"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 169L, 170L, 171L, 172L,
173L, 174L, 175L, 176L, 177L, 178L, 179L, 180L, 181L), class = "data.frame")
#load libraries
library("stats")
library("dplyr")
library("ggpubr")
library("tidyverse")
library("reprex")
strAreaNames<-c("Area1","Area2")
##required size of memory for output unclear - therefore "10000),1000)"
varResult<-array(vector("list",10000),1000)
#run wilcox.test
for(i in 1:2){
varResult[i]<-wilcox.test(ed_exp2$y,data=ed_exp2,subset(ed_exp2$y, ed_exp2$x == strAreaNames[i]))
print((wilcox.test(ed_exp2$y,data=ed_exp2,subset(ed_exp2$y, ed_exp2$x == strAreaNames[i]))))
}
答案 0 :(得分:0)
是的,R中的大多数统计函数都返回某种嵌套列表,通常是因为它们的输出比单个数据行更复杂。
broom软件包旨在获取最常用的统计函数(lm
等)的主要输出,并将其“整理”到数据行中。
如果我正确理解,您希望使用未配对的y
测试x
内的平均值y
是否与wilcox.test
的整体平均值不同(秩和检验)以比较均值。
我不确定这是否有意义,因为您的样本显然不是独立的,但是无论如何我都会向您展示如何做到这一点。
wilcox.test
library(broom)
tidy(wilcox.test(90:100, 94:100, exact = FALSE))
# A tibble: 1 x 4
statistic p.value method alternative
<dbl> <dbl> <chr> <chr>
1 24.5 0.220 Wilcoxon rank sum test with continuity correction two.sided
tibble是一种稍微好一点的数据框,是tidyverse的一部分。
工作原理:如?wilcox.test
中所述,该函数实际上返回一个列表:
> str(wilcox.test(90:100, 94:100, exact = FALSE))
List of 7
$ statistic : Named num 24.5
..- attr(*, "names")= chr "W"
$ parameter : NULL
$ p.value : num 0.22
$ null.value : Named num 0
..- attr(*, "names")= chr "location shift"
$ alternative: chr "two.sided"
$ method : chr "Wilcoxon rank sum test with continuity correction"
$ data.name : chr "90:100 and 94:100"
- attr(*, "class")= chr "htest"
broom
包只是提取了适合数据框行的主要部分。
现在,您要对x
的每个唯一值(Area1,Area2等)执行此操作,然后将结果收集到一个数据框中,该数据框中显示每个结果用于哪个子集。
在R的基础上有很多方法可以完成。这是一个:
# Example data frame (I'm calling it "d" for brevity)
d <- data.frame(x = c("Area1", "Area1", "Area1", "Area2", "Area2"), y = c(1, 2, 3, 2, 3))
# Empty list to hold our results
L <- list()
for (i in unique(d$x)) {
# Run Wilcoxon test, "tidy" the result, and assign it to element i of L
L[[i]] <- tidy(wilcox.test(d$y, d[d$x == i, "y"], exact = FALSE))
}
L
# Combine the results
results <- do.call(rbind, L) # Same as rbind(L[[1]], L[[2]], ...)
# Add a column identifying the subsets
results$area <- names(L)
results
# A tibble: 2 x 5
statistic p.value method alternative area
* <dbl> <dbl> <chr> <chr> <chr>
1 8.5 0.875 Wilcoxon rank sum test with continuity correction two.sided Area1
2 4 0.834 Wilcoxon rank sum test with continuity correction two.sided Area2
组合拆分工作流非常普遍,但是在基本R中实现起来有些麻烦。 tidyverse / dplyr的方法更加简洁,并且通过一些实践,更易于阅读:
library("tidyverse")
library("broom")
d %>%
group_by(x) %>%
do(wilcox.test(d$y, .$y, exact = FALSE) %>% tidy)
# A tibble: 2 x 5
# Groups: x [2]
x statistic p.value method alternative
<fct> <dbl> <dbl> <chr> <chr>
1 Area1 8.5 0.875 Wilcoxon rank sum test with continuity correction two.sided
2 Area2 4 0.834 Wilcoxon rank sum test with continuity correction two.sided
注意:
%>%
是语法糖:x %>% f(a)
的意思是f(x, a)
。
这使得以可读方式编写嵌套函数调用变得更加容易。
阅读pipes上的手册,以加深了解。d$y
才能获得全部y
,而与group_by
无关,但这是一个例外。
再次,阅读手册。do()
中的点是数据帧的当前子集,因此.$y
是当前组中的y
。