#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. Рад помочь! Да, он не смог вычислить остатки таким образом, а также выдал предупреждение. Но это был просто фиктивный пример.