File: perron97.inp

package info (click to toggle)
gretl 2022c-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 59,552 kB
  • sloc: ansic: 409,074; sh: 4,449; makefile: 3,222; cpp: 2,777; xml: 599; perl: 364
file content (126 lines) | stat: -rw-r--r-- 3,093 bytes parent folder | download | duplicates (5)
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
123
124
125
126
set verbose off

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)

      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)
         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
   string breakper = obslabel(Tbstar)

   printf "\n*** minimized t_alpha = %g in %s (k=%d) ***\n", \
     t_a_min, breakper, Tbk
   printf "\nRegression with break at %s", breakper

   # 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 (2 = moderate)
scalar verbosity = 2

perron_test(y, maxlag, testsig, verbosity)