我正在R中执行beta regression,该值需要介于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来提高此最小值?还是我应该对此感到满意?
答案 0 :(得分:3)
先尝试eps
(从0和1的位移)等于1e-4(如此处所示),然后再尝试1e-3。如果模型的结果在您关心的任何方面都没有不同,那就太好了。如果是这样,您需要非常,因为这表明您的答案对假设非常敏感。
在下面的示例中,色散参数phi发生了很大变化,但是intercept和lope参数没有太大变化。
如果您确实发现参数的变化令人担忧特定数据的数量,那么您需要更深入地思考零和一的产生过程,并为该过程建模,例如
关于这些步骤的问题可能比{SO}更适合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()