тест Данна для перебора столбцов фрейма данных

Я пытаюсь выполнить тест Данна для данных Ирис. Я хочу перебрать 4 столбца и выполнить тест Данна для каждого столбца на разных видах. Однако, когда я пытаюсь получить имя столбца, это не работает. Кто-нибудь может сказать мне, почему?

library(rstatix)
data<-iris
for (i in seq(1:4)) {
  a<-colnames(data)
  colname1 <-as.character(a[5])
  colname2 <-as.character(a[i])
  dtest<-data %>% 
   dunn_test( get(colname2) ~ get(colname1), p.adjust.method = "BH") 
  print(dtest)
  print(i)
}

2 ответа

Решение

dunn_testхочет формулу, и вы пытались предоставить данные или их комбинацию. Вы можете исправить свойfor цикл вроде этого:

library("rstatix")
data <- iris
for (i in seq(1:4)) {
  a <- colnames(data)
  dtest <- dunn_test(data, as.formula(paste(a[i], a[5], sep="~")), 
                     p.adjust.method="BH")
  print(dtest)
  print(i)
}
# # A tibble: 3 x 9
#   .y.    group1  group2    n1    n2 statistic        p    p.adj p.adj.signif
# * <chr>  <chr>   <chr>  <int> <int>     <dbl>    <dbl>    <dbl> <chr>       
# 1 Sepal~ setosa  versi~    50    50      6.11 1.02e- 9 1.53e- 9 ****        
# 2 Sepal~ setosa  virgi~    50    50      9.74 2.00e-22 6.00e-22 ****        
# 3 Sepal~ versic~ virgi~    50    50      3.64 2.77e- 4 2.77e- 4 ***         
# [1] 1
# [...]

Другой способ - использовать reformulate а также Vectorize это, а также dunn_test функция.

dunn_testv <- Vectorize(dunn_test, vectorize.args="formula", SIMPLIFY=F)
reformulatev <- Vectorize(reformulate, vectorize.args="response")

res <- dunn_testv(iris, reformulatev("Species", names(iris)[1:4]), p.adjust.method="BH")
res
# $Sepal.Length
# # A tibble: 3 x 9
#   .y.    group1  group2    n1    n2 statistic        p    p.adj p.adj.signif
# * <chr>  <chr>   <chr>  <int> <int>     <dbl>    <dbl>    <dbl> <chr>       
# 1 Sepal~ setosa  versi~    50    50      6.11 1.02e- 9 1.53e- 9 ****        
# 2 Sepal~ setosa  virgi~    50    50      9.74 2.00e-22 6.00e-22 ****        
# 3 Sepal~ versic~ virgi~    50    50      3.64 2.77e- 4 2.77e- 4 ***
# [...]

Вы можете использовать lapply для перебора имен столбцов и с reformulateсоздать объект формулы. С помощьюiris набор данных, который вы можете сделать:

colname1 <- names(iris)[5]
colname2 <- names(iris)[1:4]

data <- lapply(colname2, function(x) {
           rstatix::dunn_test(iris, reformulate(colname1, x),  
                              p.adjust.method = "BH")
         })
data
#[[1]]
# A tibble: 3 x 9
#  .y.          group1     group2        n1    n2 statistic        p    p.adj p.adj.signif
#* <chr>        <chr>      <chr>      <int> <int>     <dbl>    <dbl>    <dbl> <chr>       
#1 Sepal.Length setosa     versicolor    50    50      6.11 1.02e- 9 1.53e- 9 ****        
#2 Sepal.Length setosa     virginica     50    50      9.74 2.00e-22 6.00e-22 ****        
#3 Sepal.Length versicolor virginica     50    50      3.64 2.77e- 4 2.77e- 4 ***         

#[[2]]
# A tibble: 3 x 9
#  .y.         group1     group2        n1    n2 statistic        p    p.adj p.adj.signif
#* <chr>       <chr>      <chr>      <int> <int>     <dbl>    <dbl>    <dbl> <chr>       
#1 Sepal.Width setosa     versicolor    50    50     -7.79 6.82e-15 2.05e-14 ****        
#2 Sepal.Width setosa     virginica     50    50     -5.37 7.68e- 8 1.15e- 7 ****        
#3 Sepal.Width versicolor virginica     50    50      2.41 1.58e- 2 1.58e- 2 * 
#...
#...
Другие вопросы по тегам