dplyr组中的方差分析F统计值

时间:2019-04-01 00:27:41

标签: r dplyr anova

我可以使用分组来总结均值

 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))也将输出卡方检验的结果。

Pearson's Chi-squared test

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

我要做的是产生如下所示的输出,其中我将平均值,标准差和方差分析(X方检验统计量)的F统计量值相结合。

     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 :(得分:0)

一种选择是考虑所有想要的结果,以及如何操纵它们以具有相同的结构。然后,以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