Значение статистики ANOVA F в группе dplyr - PullRequest
0 голосов
/ 01 апреля 2019

Я могу суммировать среднее значение по группам, используя

 t(mtcars %>%
    group_by(gear) %>%
    dplyr::summarize(Mean_Mpg = mean(mpg, na.rm=TRUE),
                 StdD_Mpg = sd(mpg, na.rm=TRUE)

                 ))

    gear      3         4         5
    Mean_Mpg  16.106667 24.533333 21.380000
    StdD_Mpg  3.371618  5.276764  6.658979

Я знаю, summary(aov(gear ~ mpg , mtcars)) будет выводить результаты теста ANOVA, включая статистику F.

             Df Sum Sq  Mean Sq F value Pr(>F)   
mpg          1  3.893   3.893   8.995 0.0054 **
Residuals    30 12.982  0.433                  

Также chisq.test(table(mtcars$gear,mtcars$carb))выдаст результаты теста Chi.Square.

Pearson's Chi-squared test

    X-squared = 16.518, df = 10, p-value = 0.08573 

Я пытаюсь создать вывод, подобный приведенному ниже, где я объединяю среднее значение, стандартное отклонение и значение F Statistic из ANOVA, X- Квадратная статистика теста.

     gear            3         4         5          Test-Statistic   Test
    Mpg (Mean)       16.106667 24.533333 21.380000   8.995           ANOVA
        (StdD)       3.371618  5.276764  6.658979
    Carb(N)                                          16.518          Chi.Square
                     3         4         0
                     4         4         2
                     3         0         0
                     5         4         1
                     0         0         1
                     0         0         1

Я не уверен, как собрать такую ​​таблицу, комбинируя среднее значение, стандартное отклонение, F-статистику, значения статистики Chiq.Square и т. Д.помощь сообщества в форматировании результатов, подобных этому.

1 Ответ

0 голосов
/ 01 апреля 2019

Один из вариантов - подумать обо всех желаемых результатах и ​​о том, как ими манипулировать, чтобы иметь одинаковую структуру. Затем, например, используйте bind_rows(), чтобы собрать все результаты в одну таблицу.

Функции group_by() и summarise() способны вычислять среднее (и другие) для нескольких переменных (и результат представляет собой data.frame), тогда как функция apply() позволяет применять ту же функцию или комбинацию функций (например, summary(aov(...))) для нескольких переменных. Результатом второго является вектор.

library(tidyverse)

  # mean (± sd) of x per group
mtcars %>%
  group_by(gear) %>%
  summarise_at(
    vars(mpg, carb),
    funs(paste0(round(mean(.), 2), '(±', round(sd(.) / sqrt(n()), 1), ')'))
  ) %>% 
  mutate(gear = as.character(gear)) %>% 

  # add ANOVA: gear ~ x
  bind_rows(
    c(gear = 'ANOVA',
      apply(mtcars %>% select(mpg, carb), 2, 
            function(x) summary(aov(mtcars$gear ~ x))[[1]]$`F value`[1] %>% round(3) %>% as.character()
      ))
  ) %>% 

  # add Chi-Square: gear ~ x
  bind_rows(
    c(gear = 'CHI-SQUARE',
      apply(mtcars %>% select(mpg, carb), 2, 
            function(x) chisq.test(table(mtcars$gear, x))$statistic %>% round(3) %>% as.character()
      ))
  )

# # A tibble: 5 x 3
#   gear       mpg         carb      
#   <chr>      <chr>       <chr>     
# 1 3          16.11(±0.9) 2.67(±0.3)
# 2 4          24.53(±1.5) 2.33(±0.4)
# 3 5          21.38(±3)   4.4(±1.2) 
# 4 ANOVA      8.995       2.436     
# 5 CHI-SQUARE 54.667      16.518
...