繁体   English   中英

如何找到betareg软件包接受的最小浮点值?

[英]How to find the minimum floating-point value accepted by betareg package?

我正在R中进行Beta回归 ,该回归需要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时,我才能正常运行。 有什么办法可以使用betareg来提高此最小值? 还是我应该对此感到满意?

尝试用eps (位移从0和1开始)先等于1e-4(如此处所示),然后再尝试1e-3。 如果模型的结果在您关心的任何方面都没有不同,那就太好了。 如果是这样,则需要非常小心,因为这表明您的答案将对假设非常敏感。

在下面的示例中,色散参数phi发生了很大变化,但是拦截和斜率参数变化不大。

如果确实发现特定数据的参数变化量令人担忧,那么您需要更认真地考虑零和一出现的过程,并为该过程建模,例如

  • 审查数据模型:零/一通过最小/最大检测阈值出现,将零/一值建模为实际上位于尾巴中或
  • 障碍 / 零一通货膨胀模型:零和一通货膨胀是通过与其他数据分开的过程产生的,使用二项式或多项式模型来表征零对(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()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM