Нет «1» или бесконечные значения, и я все еще получаю: начальное значение в «vmmin» не является конечным - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь найти параметры распределения бета.

Диапазон моего числового вектора (myVector) составляет от 1 до 1,4.

Запись

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

он всегда возвращает

Ошибка в статистике :: optim (x = c (1.11751038937534, 1.18870025337922, 1.02241252436603,: начальное значение в 'vmmin' не является конечным

Так что ясоздан myVector_2 без значений, равных 1, но

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

по-прежнему возвращает

Ошибка в статистике :: optim (x = c (1.15007774000921, 1.01353198754175, 1.00201948705843,:начальное значение в 'vmmin' не является конечным

Итак, я попытался проверить, являются ли значения конечными, но

is.finite(myVector_2)

возвращает все 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 ...

Я искал часы, но ни одно из предложенных решений, похоже, не работает.

1 Ответ

2 голосов
/ 30 сентября 2019

Бета-распределение имеет диапазон (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).

...