Alberto Grassi
2017-06-26 17:29:04 UTC
Hi! I was minimizing a negative likelihood with 6 parameters and everything was going well, but when I added a 7th parameter, then I obtained the error :
Error using fmincon (line 609)
Supplied objective function must return a scalar
value.
This is what I am trying to minimize:
function [neg_likelihood,nlh_grad]=nlh_garchmidas2(parameter,g1,K,r,X)
% this is negative likihood function
miu=parameter(1);
alpha=parameter(2);
beta=parameter(3);
theta=parameter(4);
w1=parameter(5);
w2=parameter(6);
m=parameter(7);
[T,C]=size(r);
% tau series construction -----------------------------------------------
tau = (m^2) + (theta^2) * ( X * betapolyn2(K,[(K-1):-1:1]',w1,w2) ); % function of theta and w
% -----------------------------------------------------------------------
tau_zero=find(tau<=0);
L_zero=length(tau_zero);
if L_zero >0
tau(tau_zero);
parameter
stop
else
end;
% g series construction --------------------------------------------------
g=zeros(T,1);
g(1)=g1;
for i=2:T
g(i)=(1-alpha-beta)...
+ alpha * ( (r(i-1)-miu)^2 ) / tau(i-1)...
+ beta * g(i-1);
end;
% ------------------------------------------------------------------------
% negative likelihood function --------------------------------------
neg_likelihood= T/2*log(2*pi) + (1/2)*sum( ((r-miu).^2)./(tau.*g) ) + (1/2)*sum( log(tau.*g) );
% -------------------------------------------------------------------
dg_dmiu=zeros(T,1);
dg_dalpha=zeros(T,1);
dg_dbeta=zeros(T,1);
dg_dtheta=zeros(T,1);
dg_dw1=zeros(T,1);
dg_dw2=zeros(T,1);
dg_dm=zeros(T,1);
k_vec=[(K-1):-1:1]';
dtau_dtheta = (2*theta) * ( X * betapolyn2(K,[(K-1):-1:1]',w1,w2) );
Nf=((k_vec/K)'.^(w1-1))*((1-k_vec/K).^(w2-1));
mf1=(((1-k_vec/K)'.^(w2-1))* ((k_vec/K).^(w1-1)).*log(k_vec/K) )/(Nf.^2);
mf2=(((k_vec/K)'.^(w1-1))* ((1-k_vec/K).^(w2-1)).*log(1-k_vec/K) )/(Nf.^2);
dtau_dw1 = (theta^2) * X * ( betapolyn2(K,k_vec,w1,w2).*log(k_vec/K) )/Nf...%%%%%%%%%%%%%%%%%%%%%%%
- (theta^2) * X * betapolyn2(K,k_vec,w1,w2) * mf1;
dtau_dw2 = (theta^2) * X * ( betapolyn2(K,k_vec,w1,w2).*log(1-k_vec/K) )/Nf...
- (theta^2) * X * betapolyn2(K,k_vec,w1,w2) * mf2;
dtau_dm = (2*m);
for i=2:T
dg_dmiu(i) = -2*alpha*(r(i-1)-miu)/tau(i-1) + beta*dg_dmiu(i-1);
dg_dalpha(i) = -1 + ((r(i-1)-miu)^2)/tau(i-1) + beta*dg_dalpha(i-1);
dg_dbeta(i) = -1 + g(i-1) + beta*dg_dbeta(i-1);
dg_dtheta(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dtheta(i-1) + beta*dg_dtheta(i-1);
dg_dw1(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dw1(i-1) + beta*dg_dw1(i-1);
dg_dw2(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dw2(i-1) + beta*dg_dw2(i-1);
dg_dm(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dm + beta*dg_dm(i-1);
end
dL_dmiu =(1/2)*( sum( -2*(r-miu)./tau./g ) - sum( ((r-miu).^2)./tau./(g.^2).*dg_dmiu ) + sum( dg_dmiu./g ) );
dL_dalpha =(1/2)*( -sum( ((r-miu).^2)./tau./(g.^2).*dg_dalpha ) + sum( dg_dalpha./g ) );
dL_dbeta =(1/2)*( -sum( ((r-miu).^2)./tau./(g.^2).*dg_dbeta ) + sum( dg_dbeta./g ) );
dL_dtheta =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dtheta.*g + tau.*dg_dtheta) ) + sum( (dtau_dtheta.*g + tau.*dg_dtheta)./tau./g ) );
dL_dw1 =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dw1.*g + tau.*dg_dw1) ) + sum( (dtau_dw1.*g + tau.*dg_dw1)./tau./g ) );
dL_dw2 =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dw2.*g + tau.*dg_dw2) ) + sum( (dtau_dw2.*g + tau.*dg_dw2)./tau./g ) );
dL_dm =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dm.*g + tau.*dg_dm) ) + sum( (dtau_dm.*g + tau.*dg_dm)./tau./g ) );
% gradient ---------------------------------------------------------
nlh_grad=[dL_dmiu;dL_dalpha;dL_dbeta;dL_dtheta;dL_dw1;dL_dw2;dL_dm];
% ------------------------------------------------------------------
All went bad when i used w1 and w2 instead of only w. Can someone explain me why?
Thanks in advance
Error using fmincon (line 609)
Supplied objective function must return a scalar
value.
This is what I am trying to minimize:
function [neg_likelihood,nlh_grad]=nlh_garchmidas2(parameter,g1,K,r,X)
% this is negative likihood function
miu=parameter(1);
alpha=parameter(2);
beta=parameter(3);
theta=parameter(4);
w1=parameter(5);
w2=parameter(6);
m=parameter(7);
[T,C]=size(r);
% tau series construction -----------------------------------------------
tau = (m^2) + (theta^2) * ( X * betapolyn2(K,[(K-1):-1:1]',w1,w2) ); % function of theta and w
% -----------------------------------------------------------------------
tau_zero=find(tau<=0);
L_zero=length(tau_zero);
if L_zero >0
tau(tau_zero);
parameter
stop
else
end;
% g series construction --------------------------------------------------
g=zeros(T,1);
g(1)=g1;
for i=2:T
g(i)=(1-alpha-beta)...
+ alpha * ( (r(i-1)-miu)^2 ) / tau(i-1)...
+ beta * g(i-1);
end;
% ------------------------------------------------------------------------
% negative likelihood function --------------------------------------
neg_likelihood= T/2*log(2*pi) + (1/2)*sum( ((r-miu).^2)./(tau.*g) ) + (1/2)*sum( log(tau.*g) );
% -------------------------------------------------------------------
dg_dmiu=zeros(T,1);
dg_dalpha=zeros(T,1);
dg_dbeta=zeros(T,1);
dg_dtheta=zeros(T,1);
dg_dw1=zeros(T,1);
dg_dw2=zeros(T,1);
dg_dm=zeros(T,1);
k_vec=[(K-1):-1:1]';
dtau_dtheta = (2*theta) * ( X * betapolyn2(K,[(K-1):-1:1]',w1,w2) );
Nf=((k_vec/K)'.^(w1-1))*((1-k_vec/K).^(w2-1));
mf1=(((1-k_vec/K)'.^(w2-1))* ((k_vec/K).^(w1-1)).*log(k_vec/K) )/(Nf.^2);
mf2=(((k_vec/K)'.^(w1-1))* ((1-k_vec/K).^(w2-1)).*log(1-k_vec/K) )/(Nf.^2);
dtau_dw1 = (theta^2) * X * ( betapolyn2(K,k_vec,w1,w2).*log(k_vec/K) )/Nf...%%%%%%%%%%%%%%%%%%%%%%%
- (theta^2) * X * betapolyn2(K,k_vec,w1,w2) * mf1;
dtau_dw2 = (theta^2) * X * ( betapolyn2(K,k_vec,w1,w2).*log(1-k_vec/K) )/Nf...
- (theta^2) * X * betapolyn2(K,k_vec,w1,w2) * mf2;
dtau_dm = (2*m);
for i=2:T
dg_dmiu(i) = -2*alpha*(r(i-1)-miu)/tau(i-1) + beta*dg_dmiu(i-1);
dg_dalpha(i) = -1 + ((r(i-1)-miu)^2)/tau(i-1) + beta*dg_dalpha(i-1);
dg_dbeta(i) = -1 + g(i-1) + beta*dg_dbeta(i-1);
dg_dtheta(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dtheta(i-1) + beta*dg_dtheta(i-1);
dg_dw1(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dw1(i-1) + beta*dg_dw1(i-1);
dg_dw2(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dw2(i-1) + beta*dg_dw2(i-1);
dg_dm(i) = -alpha*((r(i-1)-miu)^2)/(tau(i-1)^2)*dtau_dm + beta*dg_dm(i-1);
end
dL_dmiu =(1/2)*( sum( -2*(r-miu)./tau./g ) - sum( ((r-miu).^2)./tau./(g.^2).*dg_dmiu ) + sum( dg_dmiu./g ) );
dL_dalpha =(1/2)*( -sum( ((r-miu).^2)./tau./(g.^2).*dg_dalpha ) + sum( dg_dalpha./g ) );
dL_dbeta =(1/2)*( -sum( ((r-miu).^2)./tau./(g.^2).*dg_dbeta ) + sum( dg_dbeta./g ) );
dL_dtheta =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dtheta.*g + tau.*dg_dtheta) ) + sum( (dtau_dtheta.*g + tau.*dg_dtheta)./tau./g ) );
dL_dw1 =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dw1.*g + tau.*dg_dw1) ) + sum( (dtau_dw1.*g + tau.*dg_dw1)./tau./g ) );
dL_dw2 =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dw2.*g + tau.*dg_dw2) ) + sum( (dtau_dw2.*g + tau.*dg_dw2)./tau./g ) );
dL_dm =(1/2)*( -sum( ((r-miu).^2)./(tau.^2)./(g.^2).*(dtau_dm.*g + tau.*dg_dm) ) + sum( (dtau_dm.*g + tau.*dg_dm)./tau./g ) );
% gradient ---------------------------------------------------------
nlh_grad=[dL_dmiu;dL_dalpha;dL_dbeta;dL_dtheta;dL_dw1;dL_dw2;dL_dm];
% ------------------------------------------------------------------
All went bad when i used w1 and w2 instead of only w. Can someone explain me why?
Thanks in advance