如何按功能分组进行 shapiro 测试

Bra*_*lon 1 r normal-distribution dplyr

Type <- c("Bark", "Redwood", "Oak")
size <- c(10,15,13)
width <- c(3,4,5)
Ratio <- size/width
df <- data.frame(Type, size, width, Ratio)
mutate(df, ratio_log = log10(Ratio))
df %>% group_by(Type) %>% shapiro.test(ratio_log)
Run Code Online (Sandbox Code Playgroud)

shapiro.test(., ratio_log) 中的错误:未使用的参数 (ratio_log)

我正在尝试将夏皮罗测试应用于所有类型,例如树皮、红木、橡木。并不是所有的比率都加在一起。我有一个更大的数据集,其中包含更多的比率。

Lod*_*ert 6

您至少需要 tidyverse 来处理 purrr 和 dplyr。

我在示例中制作了更多样本,因为您需要一个向量shapiro.test而不是单个比率。所以这里有 100 个来自正态分布、二项分布和均匀分布的样本。

library(tidyverse)

Type <- c("Bark", "Redwood", "Oak")
size <- c(10,15,13)
width <- c(3,4,5)
Ratio <- c(rnorm(100),
           rbinom(100, size = 2, prob = 0.2),
           runif(100))
Run Code Online (Sandbox Code Playgroud)

将这些放在 data.frame 中

# Need minimum sample size for shapiro test
df <- data.frame(Type = rep(Type, each = 100),
                 Size = rep(size, each = 100),
                 width = rep(size, each = 100),
                 Ratio)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用ratio_log,在这种情况下我冒昧地使用相同的比率。您可以分组Type并使用每组nest嵌套数据的 data.frame。

df %>%
  mutate(ratio_log = Ratio) %>%
  group_by(Type) %>%
  mutate(N_Samples = n()) %>%
  nest()

# A tibble: 3 x 2
  Type    data              
  <fct>   <list>            
1 Bark    <tibble [100 x 5]>
2 Redwood <tibble [100 x 5]>
3 Oak     <tibble [100 x 5]>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该map函数与mutate基本上lapply应用于嵌套的 data.frames(或 tibbles,这里基本上是相同的事情。)对于每组的每个 data.frame,我们将该shapiro.test函数应用于ratio_log列中的值。

# Use purrr::nest and purrr::map to do shapiro tests per group
df.shapiro <- df %>%
  mutate(ratio_log = Ratio) %>%
  group_by(Type) %>%
  mutate(N_Samples = n()) %>%
  nest() %>%
  mutate(Shapiro = map(data, ~ shapiro.test(.x$ratio_log)))


# A tibble: 3 x 3
  Type    data               Shapiro    
  <fct>   <list>             <list>     
1 Bark    <tibble [100 x 5]> <S3: htest>
2 Redwood <tibble [100 x 5]> <S3: htest>
3 Oak     <tibble [100 x 5]> <S3: htest>
Run Code Online (Sandbox Code Playgroud)

现在您有嵌套的shapiro.test结果,应用于每个组。

要获取相关参数,您可以glancebroom包中使用。然后unnestglance函数的结果。

# Use broom::glance and purrr::unnest to get all relevant statistics
library(broom)
df.shapiro.glance <- df.shapiro %>%
  mutate(glance_shapiro = Shapiro %>% map(glance)) %>%
  unnest(glance_shapiro)

 Type    data               Shapiro     statistic  p.value method                     
  <fct>   <list>             <list>          <dbl>    <dbl> <fct>                      
1 Bark    <tibble [100 x 5]> <S3: htest>     0.967 1.30e- 2 Shapiro-Wilk normality test
2 Redwood <tibble [100 x 5]> <S3: htest>     0.638 2.45e-14 Shapiro-Wilk normality test
3 Oak     <tibble [100 x 5]> <S3: htest>     0.937 1.31e- 4 Shapiro-Wilk normality test
Run Code Online (Sandbox Code Playgroud)