Таблица Dplyr с p-значением критерия Крускала Уоллиса - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть таблица со средним значением переменной (бюджета) по группам (размер и строгость) и p-значением критерия Крускалла-Уоллиса между бюджетом и строгостью (отдельно для каждой группы размеров, поэтому сравнение не проводится) Вот). Я делаю код отдельно, а затем объединяю все в Excel, так как я не знаю, как настроить код, чтобы получить автоматически. Каждый раз, когда я изменяю данные, мне приходится снова составлять таблицу. А также у меня есть несколько переменных, для которых мне нужно сделать это, что занимает много времени.

У меня есть следующий код:

small2017 <- subset(total2017, size=="Small")
medium2017 <- subset(total2017, size=="Medium")
large2017 <- subset(total2017, size=="Large")

library(dplyr)

total2017 %>% group_by(size, strictness) %>%
summarise(mean=mean(budget, na.rm=TRUE), sd=sd(budget, na.rm=TRUE), n=n()) %>%
filter(!is.na(strictness))

Kruskal.test(budget ~ strictness, data=small2017)
Kruskal.test(budget ~ strictness, data=medium2017)
Kruskal.test(budget ~ strictness, data=large2017)

Я сделал это в Excel и скопировал его в латекс. enter image description here

Пример моих данных вы можете найти ниже:




example <- tibble::tribble(

     ~size,     ~budget, ~strictness,

   "Small", "11,718183",          1L,

  "Medium",  "5,264815",          2L,

   "Large",  "-0,43848",          NA,

   "Small",  "0,658158",          2L,

  "Medium",   "-1,2867",          3L,

   "Large",   "-0,8482",          2L,

   "Small",  "4,584138",          1L,

  "Medium",   "7,26868",          1L,

   "Large",   "-7,1868",          NA,

   "Small",  "8,186884",          1L,

  "Medium",   "16,1548",          NA,

   "Large",  "1,516844",          2L,

   "Small",   "-5,1687",          2L,

  "Medium",  "11,15687",          2L,

   "Large",   "-4,1867",          3L,

   "Small",   "7,25687",          3L,

  "Medium", "5,1682186",          1L,

   "Large", "-6,186515",          2L,

   "Small",    "7,2687",          3L

  )



head(example)

#> # A tibble: 6 x 3

#>   size   budget    strictness

#>   <chr>  <chr>          <int>

#> 1 Small  11,718183          1

#> 2 Medium 5,264815           2

#> 3 Large  -0,43848          NA

#> 4 Small  0,658158           2

#> 5 Medium -1,2867            3

#> 6 Large  -0,8482            2

Создано в 2020-04-30 по представ пакет (v0.3.0)

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

Как заметил @ dc37, ваш вопрос немного сбивает с толку. KW-тест подходит, когда у вас есть одна зависимая переменная (бюджет) и одна независимая переменная с более чем двумя уровнями (например, размер). @ dc37 предоставил вам отличное решение для этого вопроса.

Если вы хотите сравнить бюджет с ОБА и размером строго по себе, вы можете изменить свой фрейм данных так, чтобы он достиг sh этого, но это будет неправильный тест, поскольку вы сейчас иметь непараметрический c двухсторонний ANOVA (бюджет ~ размер * строгий контроль над собой).

Если это то, что вы хотите сделать, то правильным тестом является, например, тест Scheirer Ray Hare, из которого вы можете запустить rcompanion как показано ниже. Не знаю, откуда вы взяли пример данных. Я превратил столбец бюджета в dbl вместо chr

# https://stackoverflow.com/questions/61527880
library(tibble)
library(rcompanion)

example <- tibble::tribble(
  ~size,     ~budget, ~strictself,
  "Small", 11718183,          1L,
  "Medium",  5264815,          2L,
  "Large",  -043848,          NA,
  "Small",  0658158,          2L,
  "Medium",   -12867,          3L,
  "Large",   -08482,          2L,
  "Small",  4584138,          1L,
  "Medium",   726868,          1L,
  "Large",   -71868,          NA,
  "Small",  8186884,          1L,
  "Medium",   161548,          NA,
  "Large",  1516844,          2L,
  "Small",   -51687,          2L,
  "Medium",  1115687,          2L,
  "Large",   -41867,          3L,
  "Small",   725687,          3L,
  "Medium", 51682186,          1L,
  "Large", -6186515,          2L,
  "Small",    72687,          3L
)

rcompanion::scheirerRayHare(budget ~ size * strictself, data = example)
#> 
#> DV:  budget 
#> Observations:  16 
#> D:  1 
#> MS total:  22.66667
#>                 Df  Sum Sq      H p.value
#> size             2  69.943 3.0857 0.21377
#> strictself       2 118.713 5.2373 0.07290
#> size:strictself  3  52.511 2.3166 0.50934
#> Residuals        8  98.833

Создано в 2020-04-30 по представ пакет (v0.3.0)

2 голосов
/ 30 апреля 2020

Используя broom и dplyr, вы можете выполнить тест kruskall-wallis для каждой группы строгих правил между размером и бюджетом и получить значение p.value для каждой:

library(broom)
library(dplyr)

example %>% filter(!is.na(strictself)) %>% group_by(strictself) %>%
  do(tidy(kruskal.test(x = .$budget, g = .$size)))

# A tibble: 3 x 5
# Groups:   strictself [3]
  strictself statistic p.value parameter method                      
       <int>     <dbl>   <dbl>     <int> <chr>                       
1          1     0.333   0.564         1 Kruskal-Wallis rank sum test
2          2     3.75    0.153         2 Kruskal-Wallis rank sum test
3          3     2.70    0.259         2 Kruskal-Wallis rank sum test

Это отвечает на ваш вопрос?

1 голос
/ 04 мая 2020

На самом деле вам не нужно создавать отдельные наборы данных. Вам просто нужно немного изменить ответ @ dc37, чтобы получить то, что вы хотите, оставив в стороне правильность обработки каждого размера независимо, как если бы не было возможности взаимодействия ... Я добавил новый ответ для вас ..

library(broom)
library(dplyr)
library(tibble)

example <- tibble::tribble(
  ~size,     ~budget, ~strictness,
  "Small", "11,718183",          1L,
  "Medium",  "5,264815",          2L,
  "Large",  "-0,43848",          NA,
  "Small",  "0,658158",          2L,
  "Medium",   "-1,2867",          3L,
  "Large",   "-0,8482",          2L,
  "Small",  "4,584138",          1L,
  "Medium",   "7,26868",          1L,
  "Large",   "-7,1868",          NA,
  "Small",  "8,186884",          1L,
  "Medium",   "16,1548",          NA,
  "Large",  "1,516844",          2L,
  "Small",   "-5,1687",          2L,
  "Medium",  "11,15687",          2L,
  "Large",   "-4,1867",          3L,
  "Small",   "7,25687",          3L,
  "Medium", "5,1682186",          1L,
  "Large", "-6,186515",          2L,
  "Small",    "7,2687",          3L
)

example$budget <- as.numeric(sub(",", ".", example$budget))

head(example)
#> # A tibble: 6 x 3
#>   size   budget strictness
#>   <chr>   <dbl>      <int>
#> 1 Small  11.7            1
#> 2 Medium  5.26           2
#> 3 Large  -0.438         NA
#> 4 Small   0.658          2
#> 5 Medium -1.29           3
#> 6 Large  -0.848          2

example %>%
  filter(!is.na(strictness)) %>%
  group_by(size, strictness) %>%
  summarise(mean=mean(budget, na.rm=TRUE),
            sd=sd(budget, na.rm=TRUE),
            n=n())
#> # A tibble: 8 x 5
#> # Groups:   size [3]
#>   size   strictness  mean       sd     n
#>   <chr>       <int> <dbl>    <dbl> <int>
#> 1 Large           2 -1.84  3.95        3
#> 2 Large           3 -4.19 NA           1
#> 3 Medium          1  6.22  1.49        2
#> 4 Medium          2  8.21  4.17        2
#> 5 Medium          3 -1.29 NA           1
#> 6 Small           1  8.16  3.57        3
#> 7 Small           2 -2.26  4.12        2
#> 8 Small           3  7.26  0.00837     2

example %>%
  filter(!is.na(strictness)) %>%
  group_by(size) %>%
  do(tidy(kruskal.test(x = .$budget,
                       g = .$strictness)))
#> # A tibble: 3 x 5
#> # Groups:   size [3]
#>   size   statistic p.value parameter method                      
#>   <chr>      <dbl>   <dbl>     <int> <chr>                       
#> 1 Large      0.200   0.655         1 Kruskal-Wallis rank sum test
#> 2 Medium     2.40    0.301         2 Kruskal-Wallis rank sum test
#> 3 Small      3.93    0.140         2 Kruskal-Wallis rank sum test

Создано в 2020-05-04 пакетом представ (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...