代码之家  ›  专栏  ›  技术社区  ›  Rodrigo

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

  •  2
  • Rodrigo  · 技术社区  · 6 年前

    我在做一个 beta regression 在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.99999,则会出现不同的错误集:

    无法反转信息矩阵:迭代过早停止
    2: 单位:平方英尺(wpp): 错误chol.违约(K) 公司名称:

    只有当我使用0.0001和0.9999时,我才能运行而不出错。有什么方法可以用betareg改进这个最小值吗?还是我应该对此感到高兴?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ben Bolker    6 年前

    试试看 eps (从0到1的位移)首先等于1e-4(如这里所示),然后是1e-3。如果模型的结果与你所关心的没有任何不同,那就太好了。如果是的话,你就必须是 小心点,因为这表明你的答案对假设非常敏感。

    在下面的例子中,色散参数phi变化很大,但截距和斜率参数变化不大。

    • 删失数据
    • /

    关于这些步骤的问题可能更适合于 CrossValidated

    样本数据

    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