如何将 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。
我有以下代码:
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
.
定义您自己的方法(类似于您定义自己的函数的方式):
# 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。