Как выполнить тест Шапиро с группой по функции - PullRequest
0 голосов
/ 05 мая 2018
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 голосов
/ 05 мая 2018

Тиреверс нужен как минимум для мурлыканья и 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, примененную к вложенным элементам данных. Кадрам (или тибблам, то же самое по существу здесь). К каждому элементу данных. Кадрам для каждой группы, к которой мы применяем Функция 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
0 голосов
/ 05 мая 2018
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 отображает t.test на сплит df

...