Как найти минимальное значение с плавающей точкой, принятое пакетом betareg? - PullRequest
0 голосов
/ 18 сентября 2018

Я делаю бета-регрессию в R, которая требует значений от 0 до 1, исключая конечные точки, то есть (0,1) вместо [0,1].

У меня есть несколько значений 0 и 1 в моем наборе данных, поэтому я хотел бы преобразовать их в наименьший возможный сосед, например, 0,0000 ... 0001 и 0,9999 ... 9999. Я использовал .Machine$double.xmin (что дает мне 2.225074e-308), но betareg() по-прежнему выдает ошибку:

неверная зависимая переменная, все наблюдения должны быть в (0, 1)

Если я использую 0.000001 и 0.999999, я получаю другой набор ошибок:

1: в betareg.fit (X, Y, Z, веса, смещение, ссылка, link.phi, тип, элемент управления): не удалось инвертировать информационную матрицу: итерация преждевременно остановлена ​​
2: в sqrt (wpp): Ошибка в chol.default (K): старший несовершеннолетний порядка 4 не является положительно определенным

Только если я использую 0,0001 и 0,9999, я могу работать без ошибок. Можно ли как-нибудь улучшить эти минимальные значения с помощью бетарег? Или я должен быть счастлив этим?

1 Ответ

0 голосов
/ 18 сентября 2018

Попробуйте с eps (смещение от 0 и 1) сначала равным 1e-4 (как у вас здесь), а затем с 1e-3.Если результаты моделей ничем не отличаются от вас, это здорово.Если это так, вы должны быть очень осторожными, потому что это говорит о том, что ваши ответы будут очень чувствительны к предположениям.

В приведенном ниже примере параметр дисперсии phi сильно меняется, но параметр перехвата и наклона не сильно меняется.

Если вы обнаружите, что параметры меняются на тревожную величину дляваши конкретные данные, то вам нужно больше думать о процессе, с помощью которого возникают нули и единицы, и моделировать этот процесс соответствующим образом, например,

  • a censored-data модель: ноль /один возникает через минимальный / максимальный порог обнаружения, моделирует нулевые / единичные значения как фактически находящиеся где-то в хвостах или
  • a препятствие / инфляция нуля-один модель: нули и единицы возникают в результате отдельного процесса от остальных данных, используйте биномиальную или полиномиальную модель, чтобы охарактеризовать ноль по сравнению с (0,1) по сравнению с единицей, затем используйте бета-регрессию для компонента (0,1))

Вопросы об этих шагах, вероятно, больше подходят для CrossValidated , чем для SO.

образец данных

set.seed(101)
library(betareg)
dd <- data.frame(x=rnorm(500))
rbeta2 <- function(n, prob=0.5, d=1) {
    rbeta(n, shape1=prob*d, shape2=(1-prob)*d)
}
dd$y <- rbeta2(500,plogis(1+5*dd$x),d=1)
dd$y[dd$y<1e-8] <- 0

пробная настройкафункция

ss <- function(eps) {
    dd <- transform(dd,
                    y=pmin(1-eps,pmax(eps,y)))
    m <- try(betareg(y~x,data=dd))
    if (inherits(m,"try-error")) return(rep(NA,3))
    return(coef(m))
}
ss(0)  ## fails
ss(1e-8) ## fails
ss(1e-4)
## (Intercept)           x       (phi) 
##   0.3140810   1.5724049   0.7604656
ss(1e-3)  ## also fails
ss(1e-2)
## (Intercept)           x       (phi) 
##   0.2847142   1.4383922   1.3970437
ss(5e-3)
## (Intercept)           x       (phi) 
##   0.2870852   1.4546247   1.2029984

попробуйте для диапазона значений

evec <- seq(-4,-1,length=51)
res <- t(sapply(evec, function(e) ss(10^e)) )
library(ggplot2)
ggplot(data.frame(e=10^evec,reshape2::melt(res)),
       aes(e,value,colour=Var2))+
    geom_line()+scale_x_log10()

enter image description here

...