I have a question: Objective function is undefined at initial point.

Hello,
I am trying to run a code and it always gave me the same error message:
Error using fminusub (line 16) Objective function is undefined at initial point. Fminunc cannot continue.
I really need some help with my initial starting values or objective function.
Any suggestions are welcomed!
Thanks.

 Accepted Answer

You have
function loglt = lnlt( b,yy)
and
a0=b(1:2);
a1=b(3:4);
b1=b(5:6);
c1=b(7:8);
pp=b(9:10);
where b is the parameters being passed in to be varied. The initial values that were passed in to fminunc for this purpose are in the variable start which is initialized to 3.1 * a where a=[a0 a1 b1 c1 pp]'; and a0=[1.0,1.5]; a1=[0.3,0.5];b1=[0.25,0.2]; c1=[0.65,0.5]; pp=[.2,.6]; .
Now, inside lnlt you have
for i = 2:nobs
hh(i)=a0(s(i))+a1(s(i))*indpositive(v(i-1))*log(v(i-1)^2)+b1(s(i))*indnegative(v(i-1))*log(v(i-1)^2);
h(i)=sqrt(exp((hh(i))))*h(i-1)^c1(s(i));
end
Observe the feedback, that the previous h^c1 is multiplied by a factor. If h becomes greater than 1 and c1 becomes greater than 1, then there is danger of an exponential explosion. With the initial values, c1 is indeed greater than 1, so the question becomes whether the multiplying factor is small enough to dampen the exponential growth. The answer to that is NO, that although some of the hh(i) are negative, so some of the sqrt(exp(hh)) are less than 1, the effect is not nearly enough to counter-act the exponential growth.
You need initial c1 values that involve at least one value less than 1 in order to have a hope in this, so that the sequence has some dampening.
However...
Your code is not suitable for use with fminunc() or fmincon() or any of the mathworks minimizers... including not being suitable for ga() .
All of the MATLAB minimizers rely upon the idea that if you process the same parameters twice, that you will get the same answer. But that is not true for your code: your code calls rando() to determine whether to use the first or second column of numbers, and rando() uses randn(), so your code is not deterministic and so cannot meaningfully be minimized.

More Answers (3)

It looks like you didn't test your objective function to make sure that it runs error-free.

3 Comments

If you can explain it in practice?
Thank you.
I mean you should run your objective function (separate from fminunc) with your initial point as input. If you get an error message or bad output, you'll know you haven't finished debugging your objective function code.

Sign in to comment.

Thank you a lot
=============================================
You need initial c1 values that involve at least one value less than 1 in order to have a hope in this, so that the sequence has some dampening.
=============================================
no hope of c1=[0.1,0.1]; or c1=[0.0,0.0]; or c1=[-0.2,0.3];
Thanks.

3 Comments

It turns out your code ignores h and hh after calculating them, so it doesn't matter what they are!
Instead your code calls Ms_logGARCH_Lik and inside that you have
for j=1:k %Getting full matrices for each state
%
%log((X_t)^2)=log((h_t)^2)+log((e_t)^2)
%
ARplus(:,j)=phi(:,j)+theta(:,j);
ARnega(:,j)=psi(:,j)+theta(:,j);
MA1(:,j)=theta(:,j)*log(e(:,j).^2);
if x>0
AR1(:,j)=ARplus(:,j)*log(x(:,j).^2);
Cond_mean(first_idx:end,j) = C(1,j)+AR1(first_idx-1:end-1,j)-MA1(first_idx-1:end-1,j);% Conditional mean for each state
elseif x<0
AR2(:,j)=ARnega(:,j)*log(x(:,j).^2);
Cond_mean(first_idx:end,j) = C(1,j)+AR2(first_idx-1:end-1,j)-MA1(first_idx-1:end-1,j);% Conditional mean for each state
end
e(:,j)=sqrt(exp(log(x(:,1).^2)-Cond_mean(:,j))); % Error for each state
end
That code is questionable because x is a vector of length 1000, so x>0 is testing all(x<0) and x>0 is testing all(x>0) -- neither of which is true. The code is not calculating according to the condition for each x value: it is ending up skipping those statements.
Now, in this function, m has not been pre-defined. So a few lines later:
case 'Normal'
m(:,j)=(e(:,j)./(sqrt(exp(Cond_mean(:,j)))*sqrt(2*pi))).*exp(-(e(:,j)).^2/2); % Normal prob density at each state
this is after the for j loop, so j is at its last value from the loop -- j = k, and in particular j = 2. So you are assigning into column 2 of m without having assigned anything into column 1 of m. So column 1 of m is 0.
After that,
f=Mmax(n,k);%ones(n,k);
k is 2, n is 1000. Mmax assigns 1:1000 as column 1 of f, and assigns [2;2:1000] as column 2 of f . This creates f and gives it an initial value, none of the entries of which are 0.
for i=first_idx:n
f(i,1)=ones(k,1)'*(p*E(i-1,:)'.*m(i,:)'); % MS Filter equation
E(i,:)=((p*E(i-1,:)'.*m(i,:)')/f(i,1)); % MS Filter equation for probabilities
end
Remember that m(:,1) is 0, so m(i,:) starts with a 0. In the first iteration, E(i-1,:) has been pre-defined (as a pair of integers), and f(2,1) ends up non-zero in the assignment to f(i,1) . But then in the assignment to E, because of the first entry of the row of m being 0 and the .* being used, the first entry of E(i,:) will be 0.
Then on the next iteration when you go to use that E, with the first element being 0 and with the 0 leading m... f(i,1) will become 0. Then on the next line you divide by that f(i,1) that is 0, so you get NaN and infinities...
Maybe the switch needs to be inside the for j loop.
Thanks Dear.
Based on your wonderful and important feedback, I have modified file Ms_logGARCH_Lik.m
I ran the program but I got
_Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN. _ In MSlogGARCH_Simulation_Fit (line 99)
Sum log likelihood for Normal distribution - MS(2)-logGARCH(1,1)-->-Inf
What is the reason in your opinion?
We would need your corrected source code to investigate further.

Sign in to comment.

Thanks Dear.
Based on your wonderful and important feedback, I have modified file Ms_logGARCH_Lik.m
I ran the program but I got
_Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN. _ In MSlogGARCH_Simulation_Fit (line 99)
Sum log likelihood for Normal distribution - MS(2)-logGARCH(1,1)-->-Inf
What is the reason in your opinion?

1 Comment

Please stop writing a new answer every time you want to make a comment. Learn to use a comment instead.

Sign in to comment.

Categories

Products

Release

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!