使用 Tidyverse 和 fitdistrplus 进行批量分布拟合

Batch distribution fitting using Tidyverse and 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 拟合到 Gamma 分布(忽略对采样数据与分布的拟合程度的测试)

使用 fitdistrplus 包,我可以通过将个体 P_IDX 提取到向量中然后通过 fw <- fitdist(data,"gamma") 运行 来实现此目的] 然后提取出 shaperate 描述性变量,但这都是非常手动的。

我想找到一种使用 tidyverse 从上面的数据框转到:

P_ID Distrib G_Shape G_Rate
ID_233 Gamma 1.21557116 0.09206639
ID_234 Gamma 3.23234542 0.34566432
ID_235 Gamma 2.34555553 0.92344521

我如何使用 Tidyverse 和 Pipes 实现这一点,而不是连续执行 for 循环?

您可以使用 group_by 为每个人应用 fitdist,并从每个模型中提取 shaperate 值。

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