r - 如何返回在函数中创建的对象并忽略带有错误/NA 的对象?

标签 r fitdistrplus

我已编辑我的问题

目标

我只想保留那些成功创建的对象,并忽略那些引发错误的对象。

示例

请注意,这只是一个可重现的示例。我的原始数据集不同。

以下函数采用 mtcars 数据集的任意变量,拟合三个理论分布,然后返回拟合统计的优度:

library(fitdistrplus)

fit_distt <- function(var) {
  
v <- mtcars[, var]
  
f1 <- fitdist(data = v, distr = "norm")

f2 <- fitdist(data = v, distr = "nbinom")

f3 <- fitdist(data = v, distr = "gamma")

gofstat(f = list(f1, f2, f3), 
        chisqbreaks = c(0, 3, 3.5, 4, 4.5, 
                        5, 10, 20, 30, 40),
        fitnames = c("normal", "nbinom", "gamma"))

}

例如:

> fit_distt("gear")
Goodness-of-fit statistics
                                normal    nbinom     gamma
Kolmogorov-Smirnov statistic 0.2968616 0.4967268 0.3030232
Cramer-von Mises statistic   0.4944390 1.5117544 0.5153004
Anderson-Darling statistic   3.1060083 7.2858460 3.1742713

Goodness-of-fit criteria
                                 normal   nbinom    gamma
Akaike's Information Criterion 74.33518 109.9331 72.07507
Bayesian Information Criterion 77.26665 112.8646 75.00655

问题

某些理论分布无法成功拟合变量,并且 fitdist 会抛出错误:

> fit_distt("mpg")
<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,     gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,     lower = lower, upper = upper, ...): function cannot be evaluated at initial parameters>
 Error in fitdist(data = v, distr = "nbinom") : 
  the function mle failed to estimate the parameters, 
                with the error code 100 

尝试将 nbinom 拟合到连续变量 mpg 时,f2 发生此错误。但范数gamma成功吻合。

我想返回成功拟合分布的 gofstat 并忽略引发错误的分布。

预期输出

即使在函数中指定了f2,如果它抛出错误,我仍然想要以下输出:

> fit_distt("mpg")
Goodness-of-fit statistics
                                 normal      gamma
Kolmogorov-Smirnov statistic 0.12485059 0.08841088
Cramer-von Mises statistic   0.08800019 0.03793323
Anderson-Darling statistic   0.58886727 0.28886166

Goodness-of-fit criteria
                                 normal    gamma
Akaike's Information Criterion 208.7555 205.8416
Bayesian Information Criterion 211.6870 208.7731

我尝试了什么

显然,我可以从函数中删除 f2 。但这意味着为每个变量重复所有代码。这是很多代码!所以,我还是想用这个功能。

我希望能够对任何变量使用该函数。对于 mtcars$mpg,该函数对于 nbinom 失败,但对于 mtcars$vs,该函数对于 gamma 失败。对于任何情况,我想跳过引发错误的拟合,并报告 gofstat 是否有效。

我可以使用purrr::possously悄悄地返回一个合适的结果或抛出错误而不在错误处停止。但我不知道如何仅在 gofstat 中返回成功拟合的值。

最佳答案

您可以尝试使用try。尝试适应分布,并且仅将其添加到传递给 gofstat 的列表(如果有效):

library(fitdistrplus)
#> Loading required package: MASS
#> Loading required package: survival


fit_distt <- function(var) {
  
  v <- mtcars[, var]
  
  distributions <- c("norm", "nbinom", "gamma")
  
  fs <- list()
  fitted_distributions <- vector(mode = "character")
  for (i in seq_along(distributions)) {
    # try to fit the model
    fit <- try(fitdist(data = v, distr = distributions[i]), silent = TRUE)    
    
    # if it works, add it to fs. If not, ¯\_(ツ)_/¯
    if (!inherits(fit, "try-error")) {
      fs[[length(fs)+1]] <- fit
      fitted_distributions[length(fitted_distributions)+1] <-  distributions[i]
    }
  }
  
  gofstat(f = fs,
          chisqbreaks = c(0, 3, 3.5, 4, 4.5, 
                          5, 10, 20, 30, 40),
          fitnames = fitted_distributions)
  
}

fit_distt("mpg")
#> <simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,     gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,     lower = lower, upper = upper, ...): function cannot be evaluated at initial parameters>
#> Goodness-of-fit statistics
#>                                    norm      gamma
#> Kolmogorov-Smirnov statistic 0.12485059 0.08841088
#> Cramer-von Mises statistic   0.08800019 0.03793323
#> Anderson-Darling statistic   0.58886727 0.28886166
#> 
#> Goodness-of-fit criteria
#>                                    norm    gamma
#> Akaike's Information Criterion 208.7555 205.8416
#> Bayesian Information Criterion 211.6870 208.7731

reprex package于2020年10月7日创建(v0.3.0)

关于r - 如何返回在函数中创建的对象并忽略带有错误/NA 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247202/

相关文章:

r - 如何使轴从 R 中的包 fitdistrplus 中的零开始

r - 使用 fitdistrplus 拟合截断对数正态分布

r - ggplot2:在同一图中绘制不同的密度

r - ggplot 在只需要一个图例时生成两个图例

r - 无法安装 Plotly

R 列和 type.convert(data[[i]] 中的错误,特别是在 Mac 上

r - 当从两个数据框构建绘图时有两个图例

r - 为什么在使用 plotstyle ="ggplot"时 qqcomp 函数中没有显示任何点?

r - 如何将逆高斯分布拟合到我的数据中,最好使用 fitdist {fitdistrplus}