将truncnorm分布与distrplus拟合会导致致命错误R崩溃

问题描述

这是使R崩溃的代码,没有任何有用的错误消息。有任何想法吗?我要疯了。谢谢,

library(fitdistrplus)
library(truncnorm)
set.seed(0)
x = rtruncnorm(n=30,a=0,b=Inf,mean=1,sd=0.45)
my_fit = fitdist(x,"truncnorm",method='mle',fix.arg=list(a=0,b=Inf),start=list(mean=mean(x),sd=sd(x)))

解决方法

作为其机制的一部分,fitdistx的{​​{1}}参数调用指定的密度函数。这会导致numeric(0)崩溃,该调用将调用C ++代码,而该代码并不期望...

dtruncnorm

是一种更快到达相同崩溃的方法。我试图通过创建自己的dtruncnorm(numeric(0)) 包装器来解决此问题:

dtruncnorm()

但是到目前为止,它仍然沿线的某个地方崩溃。

联系dtruncnorm <- function(x,a,b,mean,sd) { if (length(x)==0) numeric(0) else truncnorm::dtruncnorm(x,sd) } 的维护者/提出问题here ...

,

一旦Ben Bolker发现问题是truncnorm而不是fitdist,我决定简单地使用其他库。以下代码对我来说执行得很好:

library(fitdistrplus)
library(extraDistr)
set.seed(0)
x = rtnorm(n=30,a=0,b=Inf,mean=1,sd=0.45)
my_fit = fitdist(x,"tnorm",method='mle',fix.arg=list(a=0,b=Inf),start=list(mean=mean(x),sd=sd(x)))