My program gives the following error messages:
C:\Users\kullanici\Desktop\gaussdeneme\bit(120) : error G0152 : Variable not initialized
Currently active call: campbell [120] C:\Users\kullanici\Desktop\gaussdeneme\bit
Stack trace:
campbell called from C:\Users\kullanici\Desktop\gaussdeneme\bit, line 165
ilt_ssr called from C:\Users\kullanici\Desktop\gaussdeneme\bit, line 25
Below is the part of the program that has the problem:
proc (1) = campbell(x,pmax); local i,j,p,xl,z,b,dx,u,s,tr,out,t; t = rows(x); p = pmax; do while p >= 1; xl = x[p+1:t-1]; dx = x[p+2:t] - xl; z = ones(t-p-1,1)~xl~lagp((x[1:t-1]-x[2:t]),p-1); b = inv(z'z)*(z'dx); u = dx - z*b; s = (u'u)/(t-p-2); s = sqrt(diag(s*inv(z'z))); tr = abs(b[rows(b),1]/s[rows(s),1]); /* j=0; added to avoid initialize problem */ if tr > 1.96; j = p-1; goto out; endif; p = p - 1; endo; out: ------------here 120 line retp(j); endp;
Anyone help me to solve this problem ?
thanks
1 Answer
0
The cause of the problem
I think the problem is actually on the line of code just below the line that you reference. The problem is that the variable j is only assigned a value if tr > 1.96 during one of the iterations. If that never happens, then your code tries to return j, but j has never been given a value.
How to resolve it
The simplest way to resolve this problem is to give j a value at the beginning of the procedure. For example, something like this:
proc (1) = campbell(x,pmax);
local i,j,p,xl,z,b,dx,u,s,tr,out,t;
//New line below
j = 0;
t = rows(x);
.
.
.
endp;
If you do this, then the procedure will return 0 if tr is never greater than 1.96. While you can do that, we can remove the goto statement and make the program a little simpler which I would recommend.
Simplifying the program and removing the goto
The GAUSS keyword break ends a do or for loop. So we can remove the goto by changing this chunk of code:
if tr > 1.96; j = p-1; goto out; endif; p = p - 1; endo; out:
to this code:
//Move the line below above the 'if' p = p - 1; if tr > 1.96; //Replace 'goto' with 'break' break; endif; endo;
In the second code snippet, I placed the line:
p = p - 1;
above the if statement. With that line before the if block, when we hit the break statement, p will equal what j would have equaled. So we do not need to use the j variable at all and we can return the value of p every time.
Full version of the simplified procedure
Below is the full code for the version of the procedure that reflects the changes recommended above.
proc (1) = campbell(x,pmax); local i,j,p,xl,z,b,dx,u,s,tr,out,t; t = rows(x); p = pmax; do while p >= 1; xl = x[p+1:t-1]; dx = x[p+2:t] - xl; z = ones(t-p-1,1)~xl~lagp((x[1:t-1]-x[2:t]),p-1); b = inv(z'z)*(z'dx); u = dx - z*b; s = (u'u)/(t-p-2); s = sqrt(diag(s*inv(z'z))); tr = abs(b[rows(b),1]/s[rows(s),1]); //move p = p - 1 up to here //since we will do it on every //iteration of the 'do' loop p = p - 1; if tr > 1.96; //'break' will exit the 'do loop' break; endif; endo; //Always return 'p' retp(p); endp;
Your Answer
1 Answer
The cause of the problem
I think the problem is actually on the line of code just below the line that you reference. The problem is that the variable j is only assigned a value if tr > 1.96 during one of the iterations. If that never happens, then your code tries to return j, but j has never been given a value.
How to resolve it
The simplest way to resolve this problem is to give j a value at the beginning of the procedure. For example, something like this:
proc (1) = campbell(x,pmax);
local i,j,p,xl,z,b,dx,u,s,tr,out,t;
//New line below
j = 0;
t = rows(x);
.
.
.
endp;
If you do this, then the procedure will return 0 if tr is never greater than 1.96. While you can do that, we can remove the goto statement and make the program a little simpler which I would recommend.
Simplifying the program and removing the goto
The GAUSS keyword break ends a do or for loop. So we can remove the goto by changing this chunk of code:
if tr > 1.96; j = p-1; goto out; endif; p = p - 1; endo; out:
to this code:
//Move the line below above the 'if' p = p - 1; if tr > 1.96; //Replace 'goto' with 'break' break; endif; endo;
In the second code snippet, I placed the line:
p = p - 1;
above the if statement. With that line before the if block, when we hit the break statement, p will equal what j would have equaled. So we do not need to use the j variable at all and we can return the value of p every time.
Full version of the simplified procedure
Below is the full code for the version of the procedure that reflects the changes recommended above.
proc (1) = campbell(x,pmax); local i,j,p,xl,z,b,dx,u,s,tr,out,t; t = rows(x); p = pmax; do while p >= 1; xl = x[p+1:t-1]; dx = x[p+2:t] - xl; z = ones(t-p-1,1)~xl~lagp((x[1:t-1]-x[2:t]),p-1); b = inv(z'z)*(z'dx); u = dx - z*b; s = (u'u)/(t-p-2); s = sqrt(diag(s*inv(z'z))); tr = abs(b[rows(b),1]/s[rows(s),1]); //move p = p - 1 up to here //since we will do it on every //iteration of the 'do' loop p = p - 1; if tr > 1.96; //'break' will exit the 'do loop' break; endif; endo; //Always return 'p' retp(p); endp;