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

时间:2018-05-04 22:42:07

标签: r dplyr normal-distribution

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)
  

shapiro.test(。,ratio_log)出错:未使用的参数(ratio_log)

我试图对所有类型进行夏皮罗测试,例如树皮,红木,橡木。并非所有的比率合并。我有一个更大的数据集,包含更多的比率。

2 个答案:

答案 0 :(得分:1)

至少你需要为purrr和dplyr提供tidyverse。

我在示例中制作了更多样本,因为您需要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))

将这些放在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)

然后你可以使用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]>

然后,您可以将map函数与mutate一起使用,基本上将lapply应用于嵌套的data.frames(或基本上相同的东西。)到每个数据。每组帧数我们将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>

现在您已经嵌套了shapiro.test个结果,并应用于每个组。

要获取相关参数,您可以使用glance包中的broom。然后unnest来自glance函数的结果。

# 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

答案 1 :(得分:0)

library(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)

df %>% 
  mutate(ratio_log = log10(Ratio)) %>% 
  group_by(Type) %>% 
  summarise(results = data_frame(shapiro.test(.$ratio_log)))

您还可以在此处查看其他解决方案:purrr map a t.test onto a split df