Accelerating the pace of engineering and science

# Documentation Center

• Trial Software

# stats::hodrickPrescottFilter

The Hodrick-Prescott filter

### Use only in the MuPAD Notebook Interface.

This functionality does not run in MATLAB.

## Syntax

```stats::hodrickPrescottFilter([x1, x2, …], p)
stats::hodrickPrescottFilter(s, <c>, p)
```

## Description

stats::hodrickPrescottFilter([x1, x2, …], p) returns a list of data from which cyclic variations of the time series given by the input data x1, x2 etc. are eliminated using the Hodrick-Prescott filter process.

The Hodrick-Prescott filter scheme tries to split a time series consisting of the data x1, x2 etc. into a "trend" that is approximately linear in time plus a "cyclic" contribution. The data returned by stats::hodrickPrescottFilter describe the trend. The cyclic part c may be computed by

x := [x1, x2, ...]:

y := stats::HodrickPrescottFilter(x, p):

c := zip(x, y, _subtract):

Thus, xi = yi + ci.

Large values of the penalty parameter p lead to smooth straight trend curves. Cf. Example 5.

If the data are provided by a stats::sample object containing only one non-string column, the column index c is optional. Cf. Example 3.

External statistical data stored in an ASCII file can be imported into a MuPAD® session via import::readdata. In particular, see Example 1 of the corresponding help page.

## Examples

### Example 1

We apply the Hodrick-Prescott filter to some data. The result shows an obvious trend towards increasing data values:

`stats::hodrickPrescottFilter([1, 2, 3, 2, 3, 4, 3, 4, 5], 10)`

### Example 2

We create a sample:

```s := stats::sample([[i + frandom() - 0.5, -i + frandom() - 0.5]
\$ i = 1..10])```
```0.7703581656  -0.6689628213
1.653156516   -1.505187219
2.766272902   -3.319835772
3.952083055   -3.821218044
4.854984926   -4.818141187
6.221918655   -6.026170226
7.288981492   -7.288474164
8.355687175   -8.455102606
9.379160127   -8.580615152
10.23505742   -9.712454973
```

The Hodrick-Prescott filter process applied to the data in the first column yields:

```p := 10:
stats::hodrickPrescottFilter(s, 1, p)```

`stats::hodrickPrescottFilter(s, 2, p)`

`delete s, p:`

### Example 3

We create a sample consisting of one string column and one non-string column:

```s := stats::sample([["1996", 1242],
["1997", 1353],
["1998", 1142],
["1999", 1255],
["2000", 1417],
["2001", 1312],
["2002", 1440],
["2003", 1422],
["2004", 1470]
])```
```"1996"  1242
"1997"  1353
"1998"  1142
"1999"  1255
"2000"  1417
"2001"  1312
"2002"  1440
"2003"  1422
"2004"  1470
```

We apply the Hodrick-Prescott filter to the second column. In this case, this column needs not be specified, since it is the only non-string column:

`y := stats::hodrickPrescottFilter(s, 10)`

We convert this list to a sample object:

`y := stats::sample(y)`
```1239.848378
1255.015604
1270.397993
1296.009146
1329.022865
1362.512038
1398.347268
1433.347951
1468.498758
```

We create a new sample consisting of the filtered data:

`stats::concatCol(stats::col(s, 1), y)`
```"1996"  1239.848378
"1997"  1255.015604
"1998"  1270.397993
"1999"  1296.009146
"2000"  1329.022865
"2001"  1362.512038
"2002"  1398.347268
"2003"  1433.347951
"2004"  1468.498758
```
`delete s, y:`

### Example 4

We model monthly data with a decaying trend of , where i is the index of the month. These trend data are obscured by cyclic contributions and random noise:

```monthlyData:= i ->
(   1/(1 + 0.01*i)             // the trend
+ 0.7*cos(i * 1.12*2*float(PI))  // cycle
+ 0.3*sin(i * 2.04*4*float(PI))  // cycle
+ 0.2*cos(i * 1.01*6*float(PI))  // cycle
+ 2.3*frandom()           // random noise
):```

We provide monthly data for 10 years, i.e., 120 months. The cyclic contributions and the noise are eliminated from the time series by the Hodrick-Prescott filter process:

```n := 120:
x := [monthlyData(i) \$ i = 1..n]:
trend := stats::hodrickPrescottFilter(x, 10^5):
cycle := zip(x, trend, _subtract):```

We visualize the splitting of the time series (black) into the approximately linear trend contribution (red) plus the cyclic part (blue):

```plot(
plot::Listplot([[i, x[i]] \$ i = 1..n], Color = RGB::Black),
plot::Listplot([[i, trend[i]] \$ i = 1..n], Color = RGB::Red),
plot::Listplot([[i, cycle[i]] \$ i = 1..n], Color = RGB::Blue)
)```

We use a scatterplot to visualize a linear regression of the unfiltered data. The regression line is in good accordance with the trend line above:

`plot(plot::Scatterplot([[i, x[i]] \$ i = 1..n]))`

`delete monthlyData, n, x, trend, cycle:`

### Example 5

We demonstrate the effect of the penalty parameter p by an animated plot:

```delete p:
n := 100:
data := [1/(1 + 0.01*i) + frandom() \$ i = 1..n]:
for i from 0 to 30 step 1/5 do
trend := stats::hodrickPrescottFilter(data, 10^(0.2*i));
L[i] := plot::Listplot([[i, trend[i]] \$ i = 1..n],
Color = RGB::Red, VisibleFromTo = i .. i + 0.2);
T[i] := plot::Text2d(expr2text(p = 10^(0.2*i)), [70, 1.7],
VisibleFromTo = i .. i + 0.2);
end_for:
plot(plot::Listplot([[i, data[i]] \$ i= 1..n], Color=RGB::Black),
L[i] \$ i = 0..30 step 1/5, T[i] \$ i = 0..30 step 1/5)```

Large penalty parameters p result in trend curves that are close to a straight line. This is not always the desired information. The following animation features a time series with a parabolic trend curve obscured by random noise. Too large values of p produce a trend curve that just displays the mean of the data:

```data := [8*frandom() + 5 - (i - 50)^2/100 \$ i = 1..n]:
for i from 0 to 50 do
trend := stats::hodrickPrescottFilter(data, 10^(0.2*i));
L[i] := plot::Listplot([[i, trend[i]] \$ i = 1..n],
Color = RGB::Red,
VisibleFromTo = i/5 .. (i + 1)/5);
T[i] := plot::Text2d(expr2text(p = 10^(0.2*i)), [50, -5],
VisibleFromTo = i/5 .. (i + 1)/5);
end_for:
plot(plot::Listplot([[i, data[i]] \$ i= 1..n], Color=RGB::Black),
L[i] \$ i = 0..50, T[i] \$ i = 0..50)```

`delete n, data, i, trend, L, T:`

## Parameters

 x1, x2, … The statistical data (time series): arithmetical expressions. s A sample of domain type stats::sample. c An integer representing a column index of the sample s. This column provides the data x1, x2 etc. p The penalty parameter of the Hodrick-Prescott scheme: a real positive numerical value. If the data x1, x2 etc. represent monthly measurements, the literature recommends values of p between 100 0 and 140 0. If the data represent quaterly measurements, values of p around 1600 are recommended. If the data represent yearly measurements, values of p between 6 and 14 are recommended.

## Return Values

List of floating-point data.

## References

Robert Hodrick and Edwad C. Prescott, "Postwar U.S. Business Cycles: An Empirical Investigation." Journal of Money, Credit and Banking, 1997.

Maravall, Agustin and Ana del Rio, "Time Aggregation and the Hodrick-Prescott Filter", Banco de Espana, 2001.