如何将 fitdistrplus::fitdist 摘要转换为整洁的格式?

How to convert fitdistrplus::fitdist summary into tidy format?

我有以下代码:

x <- c(
  0.367141764080875, 0.250037975705769, 0.167204185003365, 0.299794433447383,
  0.366885973041269, 0.300453205296379, 0.333686861081341, 0.33301168850398,
  0.400142004893329, 0.399433677388411, 0.366077304765104, 0.166402979455671,
  0.466624230750293, 0.433499934139897, 0.300017278751768, 0.333673696762895,
  0.29973685692478
)

fn <- fitdistrplus::fitdist(x,"norm")
summary(fn)
#> Fitting of the distribution ' norm ' by maximum likelihood 
#> Parameters : 
#>        estimate Std. Error
#> mean 0.32846024 0.01918923
#> sd   0.07911922 0.01355908
#> Loglikelihood:  19.00364   AIC:  -34.00727   BIC:  -32.34084 
#> Correlation matrix:
#>      mean sd
#> mean    1  0
#> sd      0  1

基本上,它需要一个向量并尝试拟合分布 使用 fitdistrplus package.

我试着查看 broom package,但它没有 涵盖该功能的功能。

不确定您需要什么,但您可以尝试:

tidy_fn <- rbind(fn$estimate,fn$sd)

https://stats.stackexchange.com/questions/23539/use-fitdist-parameters-in-variables

当您调用 broom::tidy(fn) 时,您会收到一条错误消息:

Error: No tidy method for objects of class fitdist

这是因为 broom 中的这个函数只有有限数量的对象 "good to use",完整列表请参见 methods(tidy)。 (Read more about S3 methods in R. More here).

因此该函数不适用于对象 fitdist 但适用于 MASS 中的 fitdistr 对象(更多 "famous")。

然后我们可以将 class 分配给 fn,然后使用 broom:

class(fn) <- ("fitdist", "fitdistr") 
# notice that I've kept the original class and added the other
# you shouldn't overwrite classes. ie: don't to this: class(fn) <- "fitdistr"

broom::tidy(fn)
# # A tibble: 2 x 3
# term  estimate std.error
# <chr>    <dbl>     <dbl>
# 1 mean    0.328     0.0192
# 2 sd      0.0791    0.0136

请注意,您只能看到 parameters。如果您希望看到更多内容并将所有内容组织成 "tidy",您应该告诉我们更多关于您的预期输出。

broom::tidy() 让你走到这一步,如果你想要更多,我会首先定义我自己的方法函数,它适用于 class fitdist 对象,使用 as reference tidy.fitdistr 方法,并对其进行调整。


我如何从原始 broom::tidy() 代码改编的示例,对 class fitdist.

使用 S3 方法

定义您自己的方法(类似于您定义自己的函数的方式):

# necessary libraries
library(dplyr)
library(broom)

# method definition:
tidy.fitdist <- function(x, ...) { # notice the use of .fitdist

  # you decide what you want to keep from summary(fn)
  # use fn$ecc... to see what you can harvest

  e1 <- tibble(
    term = names(x$estimate),
    estimate = unname(x$estimate),
    std.error = unname(x$sd)
  )

  e2 <- tibble(
    term = c("loglik", "aic", "bic"),
    value = c(unname(x$loglik), unname(x$aic), unname(x$bic))
  )

  e3 <- x$cor # I prefer this to: as_tibble(x$cor)

  list(e1, e2, e3) # you can name each element for a nicer result
  # example: list(params = e1, scores = e2, corrMatr = e3)
}

现在您可以这样称呼这个新 method

tidy(fn) # to be more clear this is calling your tidy.fitdist(fn) under the hood.
# [[1]]
# # A tibble: 2 x 3
# term  estimate std.error
# <chr>    <dbl>     <dbl>
# 1 mean    0.328     0.0192
# 2 sd      0.0791    0.0136
# 
# [[2]]
# # A tibble: 3 x 2
# term   value
# <chr>  <dbl>
# 1 loglik  19.0
# 2 aic    -34.0
# 3 bic    -32.3
# 
# [[3]]
#      mean sd
# mean    1  0
# sd      0  1

注意 class 是:

class(fn)
[1] "fitdist"

所以现在您实际上不需要像以前那样分配 fitdistr(来自 MASS)class。