我正在使用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。
答案 0 :(得分:0)
我认为问题出在“ maxint” arg中。尝试使用良好的起始值并避免高干扰。第二个问题是算法“ L-BFGS-B”,除非默认设置。当我们使用confint函数时,通常会获取mle2优化是否收敛的间隔。检查是否可以将轮廓制作成图(plotprofmle函数)。更安全。 如果应用日志时您的数据包含零值,则通常是“ NaN产生”错误。我建议使用以下顺序:
loglike = -sum(dnorm(x =性能,平均值= perfmu,log = TRUE),na.rm = TRUE)
验证结果是否合理。