使用mle2进行错误和预测的参数估计

时间:2019-10-30 21:45:44

标签: r predict mle hessian non-linear

我正在使用mle2来估计非线性模型的参数,并且我希望在参数估计值周围估计误差(标准误差)。同样,我想使用该模型然后对newdata进行预测,并且在此过程中,我在几个步骤中遇到了问题(错误)。

以下是数据:

table<- "ac.temp performance
1      2.17   47.357923
4      2.17  234.255317
7      2.17  138.002633
10     2.17  227.545902
13     2.17   28.118072
16     9.95  175.638448
19     9.95  167.392218
22     9.95  118.162747
25     9.95  102.770622
28     9.95  191.874867
31    16.07  206.897159
34    16.07   74.741619
37    16.07  127.219884
40    16.07  208.231559
42    16.07   89.544612
44    20.14  314.946107
47    20.14  290.994063
50    20.14  243.322497
53    20.14  192.335133
56    20.14  133.841776
58    23.83  139.746673
61    23.83  224.135993
64    23.83  126.726493
67    23.83  246.443386
70    23.83  163.019896
83    28.04    4.614154
84    28.04    2.851866
85    28.04    2.935584
86    28.04  153.868415
87    28.04  103.884295
88    30.60    0.000000
89    29.60    0.000000
90    30.30    0.000000
91    29.90    0.000000
92    30.80    0.000000
93    28.90    0.000000
94    30.00    0.000000
95    30.20    0.000000
96    30.40    0.000000
97    30.70    0.000000
98    27.90    0.000000
99    28.60    0.000000
100   28.60    0.000000
101   30.40    0.000000
102   30.60    0.000000
103   29.70    0.000000
104   30.50    0.000000
105   29.30    0.000000
106   28.90    0.000000
107   30.40    0.000000
108   30.20    0.000000
109   30.10    0.000000
110   29.50    0.000000
111   31.00    0.000000
112   30.60    0.000000
113   30.90    0.000000
114   31.10    0.000000"

perfdat<- read.table(text=table, header=T)

首先,我必须为动物的温度性能非线性模型设置几个固定参数

pi = mean(subset(perfdat, ac.temp<5)$performance)
ti = min(perfdat$ac.temp)

定义x变量(温度)

t = perfdat$ac.temp

为非线性模型创建函数

tpc = function(tm, topt, pmax) {
    perfmu = pi+(pmax-pi)*(1+((topt-t)/(topt-tm)))*(((t-ti)/(topt-ti))^((tm-ti)/(topt-tm)))
    perfmu[perfmu<0] = 0.00001
    return(perfmu)
}

创建负对数似然函数

LL1 = function(tm, topt, pmax, performance=perfdat$performance) {
    perfmu = tpc(tm=tm, topt=topt, pmax=pmax)
    loglike = -sum(dnorm(x=performance, mean=perfmu, log=TRUE))
    return(loglike)
}

使用mle 2-{{​​1}}

建立模型性能
maximum likelihood estimator

这给了我参数估计,但没有m1<- mle2(minuslogl = LL1, start=list(tm=15, topt=20, pmax=150), control=list(maxit=5000)) summary(m1) 的误差(标准误差)估计。但是,参数估计值很好,可以为我做出有意义的预测。

Plot of non-linear curve using parameter estimates

我尝试了许多不同的优化器和方法,但由于无法计算std而收到相同的错误。错误,通常带有关于无法反转粗麻布的警告。或者,我得到了对我的参数的真实估算,这毫无意义。

如果我使用:

warning message: In sqrt(diag(object@vcov)) : NaNs produced

每个参数的间隔都为95%,但是我无法将这些间隔合并到可用于制作如下图的预测方法中,该方法是我使用confint(m1) 模型和{{ 1}}:

non-linear model with error graphed

如果我通过将模型公式嵌入到nls函数中来重新创建predict()模型:

mle2()

我对参数的估算没有意义,而对误差的估算仍然没有。

我的问题是,有人能看到我的两个模型(模型函数和似然函数)或我做错的任何其他事情有问题吗?我有一种感觉,就是我可能将似然函数写错了,但是我尝试了各种分布和不同方式,但我可能完全搞砸了。

或者是否有一种方法可以获取参数周围的误差估计,以便可以使用它们来可视化图形中模型预测的误差?

谢谢

Rylee

PS。我决定制作一个仅包含点估计值的曲线,然后在趋势线周围没有误差,但是我想在每个点估计上放置95%CI的条形,但是confint()给了我很小的CI值,甚至没有出现在图表上,因为它们小于我使用的点字符ha。

1 个答案:

答案 0 :(得分:0)

我认为问题出在“ maxint” arg中。尝试使用良好的起始值并避免高干扰。第二个问题是算法“ L-BFGS-B”,除非默认设置。当我们使用confint函数时,通常会获取mle2优化是否收敛的间隔。检查是否可以将轮廓制作成图(plotprofmle函数)。更安全。 如果应用日志时您的数据包含零值,则通常是“ NaN产生”错误。我建议使用以下顺序:

loglike = -sum(dnorm(x =性能,平均值= perfmu,log = TRUE),na.rm = TRUE)

验证结果是否合理。