File: perron97.inp

package info (click to toggle)
gretl 2016d-1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 48,620 kB
  • ctags: 22,779
  • sloc: ansic: 345,830; sh: 4,648; makefile: 2,712; xml: 570; perl: 364
file content (122 lines) | stat: -rw-r--r-- 3,001 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
function scalar perron_test (series y, int maxlag, scalar testsig, 
                             int verbose)

   # generate trend, first lag, first difference
   genr time
   series y_1 = y(-1)
   series dyt = diff(y)

   # starting year for the series (the first non-missing obs)
   scalar startyr = firstobs(y)
    
   scalar t_a_min = 1.0E20
   scalar Tbstar = 0
   scalar Tbk = 0

   # loop across possible breakpoints

   scalar Tbmin = startyr + maxlag + 2
   scalar Tbmax = max(time) - 3

   loop for (Tb=Tbmin; Tb<=Tbmax; Tb+=1) --quiet

      if verbose > 1
         printf "Trying break in %s:\n", obslabel(Tb)
      endif

      series DU = (time > Tb)
      series DT = (time = (Tb + 1))
      scalar kstar = 0

      # Try trimming the list of lags
      loop for (k=maxlag; k>0; k-=1) --quiet
         ols y 0 DU time DT y_1 dyt(-1 to -k) --quiet

         # test significance of the last lag
         scalar tstat = $coeff(dyt_$k) / $stderr(dyt_$k)
         scalar pv = 2 * pvalue(z, abs(tstat))

         if verbose > 2
            printf "\tlast lag (%2d): t = %8.4f, asy. p-value = %6.4f\n", \ 
            k, tstat, pv
         endif

         if pv < testsig
            kstar = k
            break
         endif
      endloop

      # Re-run the regression with zero lags if need be
      if kstar = 0
         ols y 0 DU time DT y_1 --quiet
      endif
   
      scalar t_alpha = ($coeff(y_1) - 1.0) / $stderr(y_1)
      if verbose > 1
         printf "\tt_alpha = %8g (k=%d)\n\n", t_alpha, kstar
      endif
   
      if t_alpha < t_a_min
         t_a_min = t_alpha
         Tbstar = Tb
         Tbk = kstar
      endif
   
   endloop

   series DU = time > Tbstar
   series DT = time == (Tbstar + 1)
   # print -o time yr DU DT

   printf "\n*** min(t_alpha) = %g in %s (k=%d) ***\n", \
   t_a_min, obslabel(Tbstar), Tbk

   # print the regression ("Model 1") with the selected break year

   if verbose > 0
      if Tbk > 0
         ols y 0 DU time DT y_1 dyt(-1 to -Tbk)
      else
         ols y 0 DU time DT y_1
      endif
   else
      if Tbk > 0
         ols y 0 DU time DT y_1 dyt(-1 to -Tbk) --quiet
      else
         ols y 0 DU time DT y_1 --quiet
      endif
   endif

   # just checking
   scalar t_alpha = ($coeff(y_1) - 1.0) / $stderr(y_1)
   printf "check: t_alpha = %g\n", t_alpha

   return t_alpha
    
end function

# -------------------------------------------------------------------

/*
 Replicate the analysis of Perron, "Further evidence on
 breaking trend functions in macroeconomic variables" (Journal
 of Econometrics, 1997, pp. 355-385), Table 3.
*/

# Open Nelson-Plosser data (supplied with gretl)
open np.gdt

# Select the variable to test (here, the natural log of real GNP)
series y = log(rgnp)

# Maximum lag to try for the first difference of y
scalar maxlag = 10

# Max significance level for retaining the last lag
scalar testsig = 0.10

# Verbosity level (1 = not much)
scalar verbosity = 1

perron_test(y, maxlag, testsig, verbosity)