## Lumsdaine-Papell Unit Root Test

For questions regarding programming in the EViews programming language.

Moderators: EViews Gareth, EViews Jason, EViews Moderator, EViews Matt

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Lumsdaine-Papell Unit Root Test

Hello,

I have written the following programme for Lumsdaine-Papell Unit root test for two structural breaks.

Code: Select all

`smpl @allfor !i = 9 to 41for !k = !i+2 to 39series DU1 = @trend> !iseries DT1 = DU1*(@trend-!i)series DU2 = @trend>!kseries DT2 = DU2*(@trend-!k)series DSY = D(SY)equation LPA{!i}{!k}.ls DSY c SY(-1) DU1 DT1 DU2 DT2 DSY(-1 TO -2)nextnext`

My problem is how to programme to ask Eviews to shows the selected structural break1 and break2?

Thank you,

Regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:50 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

I have modified your code and added a simulation exercise into the beginning. Although the following code seems to be working and identifying the structural breaks correctly, you can make all the necessary modifications and revisions for more efficient and accurate use.

Code: Select all

`'Simulate a series that has two level shiftswfcreate u 100!b1=17 'First break!b2=45 'Second breaksmpl @first !b1-1series sy=@trend + 10*nrndsmpl !b1 !b2-1sy = 5*@trend + 20*nrndsmpl !b2 @lastsy = 7*@trend + 30*nrnd'Apply Lumsdaine-Papell unit-root testsmpl @all!trim = 0.1 'Trimming parameter!t_min = 1000vector(2) breaksfor !i = @round(@obs(sy)*!trim) to @round(@obs(sy)*(1-!trim))  for !k = !i+2 to @round(@obs(sy)*(1-!trim))-2    series DSY = D(SY)     equation temp.ls DSY c SY(-1) (@trend>!i) (@trend>!i)*(@trend-!i) (@trend>!k) (@trend>!k)*(@trend-!k) DSY(-1 TO -2)       if temp.@tstats(2) < !t_min then        !t_min = temp.@tstats(2)        breaks(1) = !i+2 'Identified first break point.        breaks(2) = !k+2 'Identified second break point        series DU1 = @trend> !i         series DT1 = DU1*(@trend-!i)        series DU2 = @trend>!k        series DT2 = DU2*(@trend-!k)        equation LPA.ls DSY c SY(-1) DU1 DT1 DU2 DT2 DSY(-1 TO -2) 'Selected equation       endif  nextnextdelete temp`

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

Thank you very much for the coding. I am really appreciate your help..

Warmest regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:50 am, edited 1 time in total.

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

I have modified the code for Zivot-Andrews (1992) unit root test and also include the lag length selection criterion AIC. My problem is that: How to write a command to ask Eviews to select the lag length from 0 to maxlag. The command I modified only select from 1 to Maxlag.

The modified code is presented as follow:

Code: Select all

`smpl @all!trim = 0.15 'Trimming parameter!t_min = 1000!min_aic = 1000vector(1) breaksfor !i = @round(@obs(sy)*!trim) to @round(@obs(sy)*(1-!trim))       for !lag = 1 to 4    series DSY = D(SY)     equation temp.ls DSY c SY(-1) (@trend>!i) (@trend>!i)*(@trend-!i) DSY(-1 TO -!lag)   if temp.@aic < !min_aic then     !best_lag = !lag     !min_aic = temp.@aic       if temp.@tstats(2) < !t_min then        !t_min = temp.@tstats(2)        breaks(1) = !i+2 'Identified first break point.                series DU1 = @trend> !i        series DT1 = DU1*(@trend-!i)              equation ZA.ls DSY c SY(-1) DU1 DT1 DSY(-1 TO -!best_lag) 'Selected equation       endif       endif  nextnextdelete temp`

Thank you,

Regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:51 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

The following version should be doing what you want. Let me know, if encounter any problems.

Code: Select all

`smpl @all!trim = 0.15 'Trimming parameter!t_min = 1000!min_aic = 1000vector(1) breaksseries DSY = D(SY)for !lag=0 to 4  for !i = @round(@obs(sy)*!trim) to @round(@obs(sy)*(1-!trim))     if !lag = 0 then        equation temp.ls DSY c SY(-1) (@trend>!i) (@trend>!i)*(@trend-!i)      else        equation temp.ls DSY c SY(-1) (@trend>!i) (@trend>!i)*(@trend-!i) DSY(-1 TO -!lag)     endif     if temp.@aic < !min_aic then     !best_lag = !lag     !min_aic = temp.@aic       if temp.@tstats(2) < !t_min then         !t_min = temp.@tstats(2)         breaks(1) = !i+2 'Identified first break point.         series DU1 = @trend> !i         series DT1 = DU1*(@trend-!i)           if !best_lag = 0 then             equation ZA.ls DSY c SY(-1) DU1 DT1 'Selected equation           else             equation ZA.ls DSY c SY(-1) DU1 DT1 DSY(-1 TO -!best_lag) 'Selected equation           endif                    endif     endif  nextnextdelete temp`

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

I have tested the programme code and it is running well. However, I found that this programme tend to select the zero lag length even when the AIC for lag one is smaller that AIC for lag zero. In addition, I have modified the Lumsdaine-Papell code according to your suggestion. I also detected the same problem that the programme test to select lag zero. I suspect that there are some mistake in the coding. Overall, the code that you write is rational, I also failed to find the gap or problem cause this.

Here, I hope you could do something.

Thank you,

Regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:51 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

If you are using the simulated series from the first code, then it is normal to expect the code to select zero lag since those series were generated that way. Please try the following simulated series, and you'll see that the code works fine (both in terms of estimating the parameters and locating the break). Yet, if you still think there is a problem, just let me know and I'll look into it in detail.

Code: Select all

`'Simulate a series that has a single breakwfcreate u 100!b1=21 'Location of the breakseries sy=0smpl @first+3 @lastsy = 7 -.2*sy(-1) + 130*(@trend>!b1-2) + 8*(@trend>!b1-2)*(@trend-!b1+2) +.8*d(sy(-1)) +.5*d(sy(-2)) + 20*nrnd`

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

Thank you very much for spending time to modified the code. I make a mistake and the code should be not problem because I am confusing the structural break selection procedure is based on t-statistics on the one period lagged level variable and not the AIC. I have tested again, although I can get smaller AIC but the t-statistics is not the smallest. So your code is no problem.

Apart from that, do you know how to ask Eviews to run the modified code for structural break unit root test for a group of variables?

Thank you,

Regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:52 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

I also referred to the original study to verify it. And yes, selection procedure becomes more complicated when you also decide to find the optimum lag order along with the identification of the structural break. This is mainly due to interaction between AIC and t-value, where the latter has a priority in pinpointing the structural break. Therefore, I conducted a more general simulation exercise to see the efficiency and the accuracy of the code. I generated a series that has one structural break and two autoregressive orders. I ran the code 10,000 times and it correctly identified the location of the break in 9,828 cases, whereas it has successfully selected the correct lag order in 6,731 cases. Of course, results are sensitive to magnitude of disturbance term, where I preffered not to generate a conservative one.

You can refer to i-th series in a group (e.g. grp) via the command grp(i). So it is relatively straightforward to use the code for each series in a group. For instance, you can put another for-loop around the original code and repeat the analysis for all the series in the group. Something like:

Code: Select all

`for !s=1 to !nseries y{!s} = grp(!s)series dy{!s} = d(y{!s})..........next`

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

Thank you very much your help and I get your idea and I have programme it. My second plan is to write a programme for Gregory-Hansen (1996) cointegration I will post to the forum get your comment and improvement. Of course, it is much more appreciate if you can write it as usually the way I write the programme is very long compare to the expert.

Thank you,

Regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:52 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

It would be my pleasure to help you write another procedure. Looking forward to it...

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

Thank you for your time spent and willingness to help me. Regarding the unit root programme, I encountered some problems within the programme written for Zivot-Andrews unit root for a group of series. According to your advice, I have came out the following code for group of series:

Code: Select all

`Group g lnm2 lny r lnextable ZAZfor !kk = 1 to g.@count%name = g.@seriesname(!kk)series Y  = {%name}!trim = 0.15 'Trimming parameter!t_min = 1000!min_aic = 1000vector(1) breaksseries DY = D(Y)for !lag=0 to 4  for !i = @round(@obs(Y)*!trim) to @round(@obs(Y)*(1-!trim))     if !lag = 0 then        equation temp.ls DY Y(-1) C @trend (@trend>!i)       else        equation temp.ls DY Y(-1) C @trend (@trend>!i) DY(-1 to -!lag)endifif temp.@aic < !min_aic then     !best_lag = !lag     !min_aic = temp.@aic   if temp.@tstats(1) < !t_min then         !t_min = temp.@tstats(1)         breaks(1) = !i+2 'Identified first break point.         series DU1 = @trend> !i                    if !best_lag = 0 then             equation ZA.ls DY Y(-1) C @trend DU1 'Selected equation           else             equation ZA.ls DY Y(-1) C @trend DU1 DY(-1 to -!best_lag) 'Selected equation           endif                  endifendif  nextnextZAZ(1,1) = "Variables"setline(ZAZ, 2)ZAZ(3,1) = "t-stat"ZAZ(4,1) = "Lag"ZAZ(5,1) = "Breaks1"ZAZ(6,1) = "DU1-tstat"ZAZ(1,1+!kk) = %nameZAZ(3,1+!kk) = ZA.@tstat(1)ZAZ(4,1+!kk) = !best_lagZAZ(5,1+!kk) = breaks(1)ZAZ(6,1+!kk) = @tstat(4)nextdelete tempshow ZAZ`

Regret to inform that, the lag length shows in table "ZAZ(4,1)" is not the lag order used to compute the ZA test. For example, if I run the programe without grouping the series(i.e. individual series programme) then the lag length show on the estimated equation output is zero, while when I use the above command its lag length has been changed to three (3). How can I modified the programme code, thus the results in table ZAZ become consistent to the output?

Apart from that, for table "ZAZ(6,1)", I have programmed to show the t-statistics for the dummy variables, but is it plausible to show p-value?

Finally, why the "setline(ZAZ, 2)" command does not perform for the last variable result? - For your information, this is not an important issue, don't spend to much time at this stage.

Warmest regards,
tcfoon
Last edited by tcfoon on Tue Sep 28, 2010 2:53 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

The following version might help:

Code: Select all

`Group g lnm2 lny r lnextable ZAZfor !kk = 1 to g.@count%name = g.@seriesname(!kk)series Y  = {%name}call zivot(Y)ZAZ(1,1) = "Variables"ZAZ(3,1) = "t-stat"ZAZ(4,1) = "Lag"ZAZ(5,1) = "Breaks1"ZAZ(6,1) = "DU1 p-value"ZAZ(1,1+!kk) = %nameZAZ(3,1+!kk) = !t_minZAZ(4,1+!kk) = !best_lagZAZ(5,1+!kk) = breaks(1)ZAZ(6,1+!kk) = @tdist(za.@tstat(4),za.@regobs-za.@ncoef) 'I would prefer t-statistics, since this will yield very small p-values.setline(ZAZ, 2)nextshow ZAZsubroutine zivot(series y)!trim = 0.15 'Trimming parameter!t_min = 1000!min_aic = 1000vector(1) breaksseries DY = D(Y)for !lag=0 to 4    for !i = @round(@obs(Y)*!trim) to @round(@obs(Y)*(1-!trim))     if !lag = 0 then        equation temp.ls DY Y(-1) C @trend (@trend>!i)       else        equation temp.ls DY Y(-1) C @trend (@trend>!i) DY(-1 to -!lag)    endif    if temp.@aic < !min_aic then     !best_lag = !lag     !min_aic = temp.@aic      if temp.@tstats(1) < !t_min then         !t_min = temp.@tstats(1)         breaks(1) = !i+2 'Identified first break point.         series DU1 = @trend> !i           if !best_lag = 0 then           equation ZA.ls DY Y(-1) C @trend DU1 'Selected equation           else           equation ZA.ls DY Y(-1) C @trend DU1 DY(-1 to -!best_lag) 'Selected equation           endif                   endif    endif  nextnextdelete tempendsub`

tcfoon
Posts: 54
Joined: Fri May 15, 2009 4:33 am

### Re: Lumsdaine-Papell Unit Root Test

Thank you for modified the programme for me. The results is same as before that is the final ZA output is zero lag that yield higher absolute value of t-statistics, but the group series programme show that the selected lag length is 4. The rest of the thing is consistent, except lag only. In fact, the former and later programme should yield the same results as the different only (1) running inside the programme, while (2) running outside the sub-routine. With this email, I attached the workfile for you to have a try..

Thank you,

Regards,
tcfoon
Attachments
Japan M2.WF1
Last edited by tcfoon on Tue Sep 28, 2010 2:54 am, edited 1 time in total.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: Lumsdaine-Papell Unit Root Test

I think the following minor revision will solve the problem. Yet, I still believe that the procedure itself is not very efficient in identifying the optimal lag order.

Code: Select all

`Group g lnm2 lny r lnextable ZAZvector(4) lagsfor !kk = 1 to g.@count%name = g.@seriesname(!kk)series Y  = {%name}ZAZ(1,1) = "Variables"ZAZ(3,1) = "t-stat"ZAZ(4,1) = "Lag"ZAZ(5,1) = "Breaks1"ZAZ(6,1) = "DU1 p-value"call zivot(Y)ZAZ(1,1+!kk) = %nameZAZ(3,1+!kk) = !t_minZAZ(4,1+!kk) = !final_lagZAZ(5,1+!kk) = breaks(1)ZAZ(6,1+!kk) = @tdist(za.@tstat(4),za.@regobs-za.@ncoef) 'I would prefer t-statistics, since this will yield very small p-values.setline(ZAZ, 2)nextshow ZAZsubroutine zivot(series y)!trim = 0.15 'Trimming parameter!t_min = 1000!min_aic = 1000vector(1) breaksseries DY = D(Y)for !lag=0 to 4    for !i = @round(@obs(Y)*!trim) to @round(@obs(Y)*(1-!trim))    if !lag = 0 then        equation temp.ls DY Y(-1) C @trend (@trend>!i)       else        equation temp.ls DY Y(-1) C @trend (@trend>!i) DY(-1 to -!lag)    endif    if temp.@aic < !min_aic then     !best_lag = !lag     !min_aic = temp.@aic      if temp.@tstats(1) < !t_min then         !t_min = temp.@tstats(1)         breaks(1) = !i+2 'Identified first break point.         series DU1 = @trend> !i           if !best_lag = 0 then           equation ZA.ls DY Y(-1) C @trend DU1 'Selected equation           !final_lag=!best_lag           else           equation ZA.ls DY Y(-1) C @trend DU1 DY(-1 to -!best_lag) 'Selected equation           !final_lag=!best_lag           endif                   endif    endif  nextnextdelete tempendsub`