没有“1”或无限值,我仍然得到: 'vmmin' 中的初始值不是有限的

No "1" or infinite values and I still get: initial value in 'vmmin' is not finite

我正在尝试查找 Beta 分布的参数。

我的数值向量的范围 (myVector) 是从 1 到 1.4。

写作

fitdistr(myVector, "beta", start=list(shape1=1/2, shape2=1/2))

总是returns

Error in stats::optim(x = c(1.11751038937534, 1.18870025337922, 1.02241252436603, : initial value in 'vmmin' is not finite

所以我创建了 myVector_2,没有任何值等于 1,但是

fitdistr(myVector_2, "beta", start=list(shape1=1/2, shape2=1/2))

还是returns

Error in stats::optim(x = c(1.15007774000921, 1.01353198754175, 1.00201948705843, : initial value in 'vmmin' is not finite

所以,我尝试检查这些值是否有限,但是

is.finite(myVector_2)

returns全部TRUE.

这是命令的开头myVector_2:

[1] 1.010020 1.010051 1.010068 1.010070 1.010073 1.010076 1.010082 1.010115
[9] 1.010125 1.010168 1.010201 1.010204 1.010228 1.010236 1.010244 1.010267
[17] 1.010268 1.010296 1.010297 1.010307 1.010335 1.010343 1.010353 1.010356
[25] 1.010357 1.010402 1.010403 ...

我搜索了几个小时,但 none 的建议解决方案似乎有效。

beta 分布的范围为 (0,1),因此您的数据必须在此范围内。如果您知道范围是 1 到 1.4(边界上没有值),您可以轻松缩放数据以将它们放入 (0,1)。

生成数据:

set.seed(101)
rng <- c(1,1.4)
x1 <- rbeta(100,shape1=1/2,shape2=1/2)
x2 <- (x1*diff(rng)) + rng[1]
range(x2)
## [1] 1.000112 1.399849

现在将数据缩放回 (0,1):

x3 <- (x2-rng[1])/diff(rng)
range(x3)
## [1] 0.0002793899 0.9996217487

现在适合:

MASS::fitdistr(x3,"beta",start=list(shape1=1,shape2=1))

工作正常,尽管有警告。

如果您的数据在 [1,1.4] 范围内(即包括末端),那么 eps <- .0001; x3 <- (x2-rng[1]+eps)/(diff(rng)+2*eps) 之类的东西应该可以使其在 (0,1) 范围内。