2

我在 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, weights, offset, link, link.phi, type, control) 中:无法反转信息矩阵:迭代过早停止
2:在 sqrt(wpp) 中:chol 中的错误。 default(K) : 4 阶的前导小调不是正定的

只有当我使用 0.0001 和 0.9999 时,我才能正常运行。有什么办法可以用 betareg 提高这个最小值吗?还是我应该对此感到高兴?

4

1 回答 1

2

尝试使用eps(从 0 到 1 的位移)首先等于 1e-4(就像你在这里一样),然后使用 1e-3。如果模型的结果在您关心的任何方面都没有差异,那就太好了。如果是,您需要非常小心,因为这表明您的答案对假设非常敏感。

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

如果您确实发现特定数据的参数发生了令人担忧的变化,那么您需要更加仔细地考虑产生零和一的过程,并适当地对该过程进行建模,例如

  • 删失数据模型:通过最小/最大检测阈值出现零/一,将零/一值建模为实际上在尾部某处或
  • 障碍/零一通货膨胀模型:零和一通过与其余数据分开的过程产生,使用二项式或多项式模型来表征零与(0,1)与一,然后使用Beta回归(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()

在此处输入图像描述

于 2018-09-18T14:07:44.187 回答