拟合截断正态分布时 R 崩溃
R crashes when fitting truncated normal distribution
每次我 运行 以下代码在两个不同的 R 版本上崩溃。我敢打赌我做错了什么(也许我无意中将优化驱动到它无法到达的地方?)但我看不到什么。我的想法是通过提供几乎不错的 a
、mean
和 sd
来尽可能地帮助 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。我尝试了 mean
和 sd
的几个启动参数,但结果是一样的:崩溃。我使用 R 版本 4.0.3.
tl;dr fitdistr()
试图通过将 x
值 numeric(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))
足以触发错误。
每次我 运行 以下代码在两个不同的 R 版本上崩溃。我敢打赌我做错了什么(也许我无意中将优化驱动到它无法到达的地方?)但我看不到什么。我的想法是通过提供几乎不错的 a
、mean
和 sd
来尽可能地帮助 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。我尝试了 mean
和 sd
的几个启动参数,但结果是一样的:崩溃。我使用 R 版本 4.0.3.
tl;dr fitdistr()
试图通过将 x
值 numeric(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))
足以触发错误。