【问题标题】:Error: "initial value in 'vmmin' is not finite" not in mle2() but in confint()错误:“'vmmin' 中的初始值不是有限的”不在 mle2() 中而是在 confint() 中
【发布时间】:2014-12-12 14:50:58
【问题描述】:

我知道在尝试为 mle2 对象拟合参数时,网络上充斥着关于 'initial value in vmmim is not finite' 错误的问题(和答案)。我在创建 mle2 对象时没有出现此错误,但在尝试从 mle2 对象中查找参数的 95% CI 时确实出现此错误。

这是一个可重现的例子:

以下是数据:

d = structure(list(SST_1YR = c(11.6, 11.7, 11.9, 12, 12.1, 12.2, 
12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13, 13.1, 13.2, 13.3, 
13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14, 14.2, 14.3, 14.4, 14.5, 
14.6, 14.7, 14.8, 14.9, 15, 15.1, 15.2, 15.3, 15.4, 15.5, 15.6, 
15.7, 15.8, 15.9, 16, 16.2, 16.3, 16.5, 16.6, 16.7, 16.9, 17, 
17.1, 17.2, 17.3, 17.4, 17.5, 17.6, 17.7, 17.8, 17.9), DML = structure(c(84.5, 
71, 114.75, 90.9473684210526, 31.7631578947368, 92.5, 80.4, 98.7021276595745, 
70.8, 66.8382352941177, 70.2553191489362, 98.1111111111111, 86.5241379310345, 
59.7209302325581, 38.7692307692308, 78.2028985507246, 86.3503649635037, 
69.1161290322581, 61.9122807017544, 60.1212121212121, 98.5490196078431, 
94.3145161290323, 76.5643564356436, 39.4230769230769, 98.42, 
95.6129032258064, 65.9673202614379, 39, 64.0576923076923, 42.4166666666667, 
59.6989247311828, 62.8039215686275, 74.5263157894737, 50.8888888888889, 
64.35, 40.5, 53.7466666666667, 42, 49.5, 23.8888888888889, 39.6170212765957, 
74.8947368421053, 42.8518518518519, 40.0344827586207, 53, 39.3333333333333, 
24.1333333333333, 30, 39.4880952380952, 94.4883720930233, 69.1428571428571, 
33.7179487179487, 26.1538461538462, 37.8965517241379, 38.4117647058824, 
44.2727272727273, 68.3157894736842, 37.3, 43.4444444444444), .Dim = 59L, .Dimnames = list(
    c("11.6", "11.7", "11.9", "12", "12.1", "12.2", "12.3", "12.4", 
    "12.5", "12.6", "12.7", "12.8", "12.9", "13", "13.1", "13.2", 
    "13.3", "13.4", "13.5", "13.6", "13.7", "13.8", "13.9", "14", 
    "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "14.8", "14.9", 
    "15", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "15.7", 
    "15.8", "15.9", "16", "16.2", "16.3", "16.5", "16.6", "16.7", 
    "16.9", "17", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", 
    "17.7", "17.8", "17.9")))), .Names = c("SST_1YR", 
"DML"), row.names = c(NA, -59L), class = "data.frame")

这里是 mle2 对象的创建(没有警告...)

m = mle2(DML~dgamma(scale=(a+b*SST_1YR)/sh, shape=sh), start=list(a=170, b=-7.4, sh=10), data=d)

这里是参数b 的下限的NA 和vmmin 警告:

confint(m)

我尝试过更改起始值,但我尝试过的没有任何帮助。我创建了具有相同数据但分布不同且没有错误的其他模型。谁能帮我弄清楚是什么导致了这个错误?

使用包bbmle-1.0.17

【问题讨论】:

    标签: r mle


    【解决方案1】:

    这里有几件事可以尝试。首先查看数据(总是一个好主意):

    library("ggplot2"); theme_set(theme_bw())
    ggplot(d,aes(SST_1YR,DML)) + geom_point()+
        geom_smooth(method="glm",family=Gamma(link="identity"))+
            geom_smooth(method="lm",colour="red",fill="red")
    

    请注意,在这种情况下,Gamma 回归看起来与常规线性回归几乎相同(即形状参数很大)。此外,x 值的分布远离原点——这可能会导致数值问题。

    library("bbmle")
    m <- mle2(DML~dgamma(scale=(a+b*SST_1YR)/sh, shape=sh),
              start=list(a=170, b=-7.4, sh=10), data=d)
    confint(m)
    

    确认问题:

    ##        2.5 %     97.5 %
    ## a  132.05952 203.192159
    ## b         NA  -4.407289
    ## sh   6.83566  13.933383
    

    我认为设置 parscale 可能会有所帮助,但它似乎使问题变得更糟而不是更好:

    m2 <- update(m,control=list(parscale=c(a=170,b=8,sh=10)))
    confint(m2)
    ##       2.5 %     97.5 %
    ## a        NA 203.153230
    ## b        NA  -4.407281
    ## sh 6.835659  13.933383
    

    居中预测变量有帮助吗? scale(x,scale=FALSE) 居中但不能缩放 x ...(使用 SST_1YR-mean(SST_1YR) 可能更清晰,这样我们就不会在表达式中出现三个 scales 浮动...

    m3 <- mle2(DML~dgamma(scale=(a+b*scale(SST_1YR,scale=FALSE))/sh, shape=sh),
              start=list(a=170, b=-7.4, sh=10), data=d)
    
    confint(m3)
    ##       2.5 %    97.5 %
    ## a  56.462610 66.754118
    ## b  -9.421521 -4.407262
    ## sh  6.835662 13.933384
    

    看起来不错,尽管将截距项恢复到原始比例有点棘手(尽管我们可以从之前的未居中拟合中取它们)。

    原来你也可以通过

    来拟合这个模型
    glm(DML~SST_1YR,family=Gamma(link="identity"),data=d)
    

    尽管confint() 再次神秘地失败了 (Error in y/mu: non-conformable arrays)。

    我尝试过的其他一些效果不是特别好的东西(包括在这里只是为了完整性):

    1. 尽量防止线性回归变为负数:
    mle2(DML~dgamma(scale=pmin((a+b*SST_1YR)/sh,1e-5),
                          shape=sh),
              start=list(a=170, b=-7.4, sh=10), data=d)
    
    1. x&lt;0 时,使用dgamma 的惩罚形式而不是NA 来返回不良可能性:
    dgamma_pen <- function(x,...,log=FALSE) {
       r <- if (x<0) (-100) else dgamma(x,...,log=TRUE)
       if (log) r else exp(r)
    }
    
    m4 <- mle2(DML~dgamma_pen(scale=pmin((a+b*SST_1YR)/sh,1e-5),
                        shape=sh),
             start=list(a=170, b=-7.4, sh=10), data=d)
    

    【讨论】:

    • 太棒了!如果可以的话,我会投票两次!谢谢!
    • 我在搜索带有伽马错误的身份链接描述时找到了这个答案,这似乎是一个非常奇怪的组合。如果对均值的估计非常低,它不会遇到困难吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2011-06-07
    • 2015-09-03
    • 2020-01-29
    相关资源
    最近更新 更多