Я использую mle2
для оценки параметров нелинейной модели, и мне нужны оценки погрешности вокруг оценок параметров (стандартная ошибка). Кроме того, я хотел бы использовать модель для прогнозирования с использованием новых данных, и у меня возникают проблемы (ошибки) с несколькими шагами в этом процессе.
Вот данные:
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 - maximum likelihood estimator
m1<- mle2(minuslogl = LL1, start=list(tm=15, topt=20, pmax=150), control=list(maxit=5000))
summary(m1)
Это дает мне оценки параметров, но не оценки ошибок (стандартная ошибка) с warning message: In sqrt(diag(object@vcov)) : NaNs produced
. Тем не менее, оценки параметров являются хорошими и дают мне прогнозы, которые имеют смысл.
График нелинейной кривой с использованием оценок параметров
Я пробовал много разных оптимизаторов и методови получить ту же ошибку о невозможности рассчитать стандартное отклонение. ошибка, обычно с предупреждением о невозможности инвертировать гессиан. ИЛИ я получаю действительно сомнительные оценки своих параметров, которые не имеют смысла.
ЕСЛИ я использую:
confint(m1)
Я получаю 95% интервалы для каждого из моих параметров, но я не могу включить их в метод прогнозирования, который я мог бы использовать для создания графика, подобногониже, который я сделал, используя модель nls
и predict()
:
нелинейную модель с отображенной ошибкой
Если я воссоздаю свою модель mle2()
повстраивание формулы модели в функцию mle2
:
tpcfun<- function(t, tm.f, topt.f, pmax.f) {
perfmu = pi+(pmax.f-pi)*(1+((topt.f-t)/(topt.f-tm)))*(((t-ti)/(topt.f-ti))^((tm.f-ti)/(topt.f-tm.f)))
perfmu[perfmu<0] = 0.00001
return(perfmu)
}
m2<- mle2(performance ~ dnorm(mean=-sum(log(tpcfun(t=ac.temp, tm.f, topt.f, pmax.f))), sd=1), method='L-BFGS-B', lower=c(tm.f=1, topt.f=1, pmax.f=1), control=list(maxit=5000, parscale=c(tm.f=1e1, topt.f=1e1, pmax.f=1e2)), start=list(tm.f=15, topt.f=20, pmax.f=150), data=perfdat)
summary(m2)
Я получаю бессмысленные оценки для своих параметров и все еще не получаю оценки для ошибки.
Мой вопрос таков:Кто-нибудь может увидеть что-то не так с одной из моих моделей (функции модели и функции правдоподобия) или что-то еще, что я делаю неправильно? У меня есть ощущение, что я могу написать неправильную функцию вероятности, но я пробовал все виды дистрибутивов и разными способами, но, возможно, я все испортил.
ИЛИ есть ли способ получить оценки погрешности вокруг моих параметров, чтобы я мог использовать их для визуализации погрешности прогнозирования моей модели в графиках?
Спасибо,
Rylee
PS. Я решил построить график с точечными оценками, а затем с трендовой линией без ошибок вокруг него, но я хотел поставить столбцы для 95% -ного доверительного интервала на каждой из точечных оценок, но confint () дает мне повторно малые CI, которые не даютдаже не отображаются на графике, потому что они меньше, чем точечный символ, который я использую, ха.