#r #tidyverse #fitdistrplus
#r #tidyverse #fitdistrplus
Вопрос:
У меня есть следующий набор данных (более 10 000 строк):
P_ID | SNUM | RNUM | X |
---|---|---|---|
ID_233 | 10 | 2 | 40.31 |
ID_233 | 10 | 3 | 23.21 |
ID_234 | 12 | 5 | 11.00 |
ID_234 | 12 | 6 | 0.31 |
ID_234 | 13 | 1 | 0.00 |
ID_235 | 10 | 2 | 66.23 |
Из этого набора данных я хочу подогнать каждое отдельное P_ID
распределение к гамма-распределению (игнорируя тестирование того, насколько хорошо отобранные данные соответствуют распределению)
Используя fitdistrplus
пакет, я могу добиться этого, извлекая X
для отдельного лица P_ID
в вектор, а затем прогоняя его, fw <- fitdist(data,"gamma")
а затем извлекая shape
rate
описательные переменные и, но все это очень вручную.
Я хотел бы найти метод, использующий tidyverse, для перехода от фрейма данных выше к:
P_ID | Распределение | G_Shape | G_Rate |
---|---|---|---|
ID_233 | Гамма | 1.21557116 | 0.09206639 |
ID_234 | Гамма | 3.23234542 | 0.34566432 |
ID_235 | Гамма | 2.34555553 | 0.92344521 |
Как бы я добился этого с помощью Tidyverse и Pipes и не выполнял последовательность циклов for?
Комментарии:
1. Как вы извлекаете
shape
иrate
описываете переменные изfw
?2.
fw$estimate['shape']
иfw$estmate['rate']
Ответ №1:
Вы можете подать fitdist
заявку на каждое индивидуальное использование group_by
и извлечь shape
rate
значения из каждой модели.
library(dplyr)
library(purrr)
library(fitdistrplus)
data %>%
group_by(P_ID) %>%
summarise(model = list(fitdist(X, "gamma"))) %>%
mutate(G_Shape = map_dbl(model, pluck, 'estimate', 'shape'),
G_rate = map_dbl(model, pluck, 'estimate', 'rate')) -> result
result