Используйте R dplyr / purrr для получения выходных матриц хи-квадрат по группам

#r #dplyr #purrr

#r #dplyr #purrr

Вопрос:

Я хотел бы получить выходные матрицы хи-квадрат (например, стандартизированные остатки, ожидаемые значения) по группам, используя элементы tidyverse. Используя набор данных mtcars, вот с чего я начал:

 mtcars %>% 
  dplyr::select(vs, am) %>%
  table() %>%
  chisq.test(.) 
  

Который выдает статистику теста хи-квадрат. Например, для получения стандартизированных остатков мой единственный успешный код — это:

 mtcars %>% 
  dplyr::select(vs, am) %>%
  table() %>%
  chisq.test(.) -> chi.out

chi.out$stdres

     vs am       Freq
1  0  0  0.9523038
2  1  0 -0.9523038
3  0  1 -0.9523038
4  1  1  0.9523038
  

В идеале я хотел бы получить наблюдаемые значения и стандартизированные остатки в формате dataframe. Что-то вроде этого:

 cbind(as.data.frame(chi.out$observed),as.data.frame(chi.out$stdres))

  vs am Freq vs am       Freq
1  0  0   12  0  0  0.9523038
2  1  0    7  1  0 -0.9523038
3  0  1    6  0  1 -0.9523038
4  1  1    7  1  1  0.9523038
  

Наконец, я хотел бы сделать это по группам, например, по столбцу cyl в наборе данных mtcars. Кажется, dplyr и некоторые другие версии карты purrr с map_dfr или map_dfc справились бы с задачей, но я не могу собрать все воедино. Заранее спасибо.

Комментарии:

1. «Я хотел бы получить выходные матрицы хи-квадрат по группе» В какой группе? Вы не группируете по какой-либо переменной. Можете ли вы добавить ожидаемый результат для случая, когда вы группируете по cyl ?

2. Должен был быть приведен пример того, как должен выглядеть вывод. Смотрите ответ / решение Хампельстильцхена ниже.

Ответ №1:

Итак, это мое предложение по решению.

 library(dplyr)
library(reshape2)

mtcars %>% 
  select(vs, am, cyl) %>%
  table() %>%
  apply(3, chisq.test) %>%
  lapply(`[`, c(6,9)) %>%
  melt() %>%
  spread(key = L2, value = value) %>%
  rename(cyl = L1) %>%
  select(cyl, vs, am, observed, stdres) %>%
  arrange(cyl)


   cyl vs am observed     stdres
1    4  0  0        0 -0.6422616
2    4  0  1        1  0.6422616
3    4  1  0        3  0.6422616
4    4  1  1        7 -0.6422616
5    6  0  0        0 -2.6457513
6    6  0  1        3  2.6457513
7    6  1  0        4  2.6457513
8    6  1  1        0 -2.6457513
9    8  0  0       12        NaN
10   8  0  1        2        NaN
11   8  1  0        0        NaN
12   8  1  1        0        NaN

  

Это выполняет тест хи-квадрат для каждой группы cyl . Группировка выполняется неявно в select() инструкции. В итоге вы получаете наблюдаемые значения и стандартизированные остатки для каждой комбинации cyl , vs , am . Должно быть применимо к любому фрейму данных.

Надеюсь, это то, что вы искали.

Комментарии:

1. Это работает отлично! Большое спасибо. Необходимо загрузить tidyr (или tidyverse), чтобы функция распространения работала. Значения NaN для 8-цилиндровых автомобилей являются результатом матрицы с нулями на полях.

2. Рад помочь! Да, он не смог вычислить остатки таким образом, а также выдал предупреждение. Но это был просто фиктивный пример.