【问题标题】:How to preform shapiro test with group by function如何按功能执行 shapiro 测试
【发布时间】:2018-05-04 22:42:07
【问题描述】:
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)

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

【问题讨论】:

  • 对于 shapiro.test,您需要 3 到 5000 之间的最小样本量。你能举一个所有比率的更大数据框的例子吗?
  • 您的错误是由于您没有将存储ratio_log 添加到您的df 中。以下代码是一个解决方案:df &lt;- data.frame(Type, size, width, Ratio) %&gt;% mutate(ratio_log = log10(Ratio))。对于夏皮罗测试,请添加合适的示例

标签: r dplyr normal-distribution


【解决方案1】:

你至少需要 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))

将这些放在 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(或小标题,这里基本上相同。)对于每个组的每个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>

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

要获取相关参数,您可以使用broom 包中的glance。然后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

【讨论】:

  • 感谢 Lodewic,这正是我需要的解决方案,而且效果很好。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多