2016-03-12 4 views
0

Я использую constrOptim() в R для оценки параметров модели. Я получаю ошибку, что моя целевая функция имеет результат длины 0 вместо 1. Проблема может быть начальными значениями, которые я выбрал. Я использую R в первый раз, и я не знаком с самим алгоритмом constrOptim. Может ли кто-нибудь помочь мне с оптимизацией?Как определить начальные значения для constrOptim()?

мой вход:

library(quantmod) 
getSymbols('^GDAXI', src='yahoo', return.class='ts',from="2005-01-01", to="2015-01-31") 
GDAXI.DE=GDAXI[ , "GDAXI.Close"] 
log_r1=diff(log(GDAXI.DE[39:2575])) 

sigma=matrix(nrow=length(log_r1)-1, ncol=1) 
for(i in 2:length(log_r1)) 
{ 
sigma[i-1]=var(log_r1[1:i]) 
} 

error=matrix(nrow=length(log_r1), ncol=1) 
mu=mean(log_r1) 
for(i in 1:length(log_r1)) 
{ 
error[i]=log_r1[i]-mu 
} 

функция я хочу, чтобы свести к минимуму:

LogLik=function(th) 
{ 
input=garch(th) 
sig=input 
for(i in 1:length(sigma)) 
{ 
LL=(-1/2)*log(2*pi)-(1/2)*log(sig[i])-(1/2)*er[i]/sig[i] 
} 
} 

функция вычисления входа выше:

sig=var(log_r1) 
er=error 
Sigma_garch=matrix(nrow=length(sigma), ncol=1) 
garch=function(th) 
{ 
omega.0=th[1] 
alpha.0=th[2] 
beta.0=th[3] 
for(i in 1:length(sigma)) 
{ 
if(i==1) 
{ 
    Sigma_ga=sig 
}else 
{ 
    Sigma_ga=Sigma_garch[i-1] 
} 
Sigma_garch[i]=omega.0+alpha.0*er[i]^2+beta.0*Sigma_ga 
} 
return(Sigma_garch) 
} 

мои ограничения и процедуры оптимизации:

ui=matrix(c(diag(1,3),c(0,(-1),(-1))),4,3, byrow = T) 
ci=c(0.01,0,0,(-0.99)) 
theta=c(0.02,0.01,0.95) 
est=constrOptim(c(0.02,0.01,0.95),LogLik, grad=NULL, ui,ci,hessian=FALSE) 

ошибка, которую я получаю: Error in optim(theta.old, fun, gradient, control = control, method = method, : Zielfunktion gibt Ergebnis der Länge 0 zurück, nicht Länge 1.

Может ли кто-нибудь сказать мне, что может быть проблемой здесь?

ответ

0

Ваша целевая функция, LogLik, оленья кожа возвращает значение, что приводит к target function has a result of length 0 instead 1.

LogLik=function(th) 
{ 
input=garch(th) 
sig=input 
for(i in 1:length(sigma)) 
{ 
LL=(-1/2)*log(2*pi)-(1/2)*log(sig[i])-(1/2)*er[i]/sig[i] 
} 
return(LL) 
}