fitdistr()在使用dbeta时发出警告:“在densfun(x,parm[1],parm[2],...)中:产生NaNs”

6

我看到以下警告信息。尽管拟合似乎工作正常,但是否有人知道为什么会出现这些警告?有没有办法让优化工作得更好,以便不会生成这些警告?

R> library(MASS) 
R> set.seed(0)
R> x=rbeta(1000, shape1=1, shape2=1)
R> fitdistr(x, dbeta, list(shape1=1,shape2=1)) 
     shape1       shape2  
  1.00959537   0.99603351 
 (0.04183720) (0.04116276)
Warning messages:
1: In densfun(x, parm[1], parm[2], ...) : NaNs produced
2: In densfun(x, parm[1], parm[2], ...) : NaNs produced
R> x=rbeta(1000, shape1=10, shape2=10)
R> fitdistr(x, dbeta, list(shape1=1,shape2=1)) 
    shape1      shape2  
  8.5038157   8.5794416 
 (0.3749814) (0.3784147)
1个回答

8
问题在于fitdistr不限制形状和比例为正数。
library(MASS) 
set.seed(0)
x <- rbeta(1000, shape1=1, shape2=1)
f1 <- fitdistr(x, dbeta, list(shape1=1,shape2=1))

如果优化算法在寻找可行解时尝试了一些不可行的参数值,通常情况下这并不是问题,但我认为尽可能避免警告更好。

您可以自己指定下限:

...:附加参数,可以用于“densfun”或“optim”。特别是,它可以用于通过“lower”或“upper”或两者同时指定边界。

f2 <- fitdistr(x, dbeta, list(shape1=1,shape2=1),
               lower=c(0,0))

(无警告)。答案并不完全相同,但它们非常接近(这是从数值优化结果中预期的)。

all.equal(coef(f1),coef(f2),tol=1e-6)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接