拟合截断正态分布时 R 崩溃

R crashes when fitting truncated normal distribution

每次我 运行 以下代码在两个不同的 R 版本上崩溃。我敢打赌我做错了什么(也许我无意中将优化驱动到它无法到达的地方?)但我看不到什么。我的想法是通过提供几乎不错的 ameansd 来尽可能地帮助 MLE。如您所见,我生成了一个非常接近拟合参数的数据样本(有意)。

library(truncnorm)
library(fitdistrplus)
fitdist(rtruncnorm(100, a=8, mean=10, sd=1),
        "truncnorm", fix.arg=list(a=8),
        start = list(mean = 10+0.5, sd = 1+0.1))

此代码崩溃(因此它退出 R 会话)并出现错误:Linux 上的“Process R floating point exception at Wed Apr 27 18:03:47 2022”和 RStudio 上的“session aborted” Windows。我尝试了 meansd 的几个启动参数,但结果是一样的:崩溃。我使用 R 版本 4.0.3.

tl;dr fitdistr() 试图通过将 xnumeric(0) 传递给它来测试分布函数,这会导致崩溃 dtruncnorm()。您可能会编写一个不这样做的包装器。


调试顺序

library(truncnorm)
library(fitdistrplus)
set.seed(101)
x <- rtruncnorm(100, a=8, mean=10, sd=1)
debug(fitdist)
fitdist(x,
        distr = "truncnorm", fix.arg=list(a=8),
        start = list(mean = 10+0.5, sd = 1+0.1))

失败

 resdpq <- testdpqfun(distname, dpq2test, start.arg = arg_startfix$start.arg, 
    fix.arg = arg_startfix$fix.arg, discrete = discrete)

更多minimal/deeper例子:

library(truncnorm)
library(fitdistrplus)
distname <- "truncnorm"
dpq2test <- c("d", "p")
arg_startfix <- list(start.arg = list(mean = 10.5, sd = 1.1), fix.arg = list(
    a = 8))
discrete <- FALSE
debug(fitdistrplus:::testdpqfun)
fitdistrplus:::testdpqfun(distname, dpq2test, start.arg = arg_startfix$start.arg, 
    fix.arg = arg_startfix$fix.arg, discrete = discrete)

所以我们甚至不需要 x!

失败于

res <- rbind(res, test1fun(paste0("d", distr), start.arg, fix.arg))

所以:

library(truncnorm)
library(fitdistrplus)
arg_startfix <- list(start.arg = list(mean = 10.5, sd = 1.1), fix.arg = list(
    a = 8))
fitdistrplus:::test1fun("dtruncnorm",
   arg_startfix$start.arg, 
    fix.arg = arg_startfix$fix.arg)

这让我们想到

 res0 <- try(do.call(fn, c(list(numeric(0)), start.arg, fix.arg)), 
    silent = TRUE)

这表明

dtruncnorm(numeric(0))

足以触发错误。