Phillips curve: The output-inflation trade-off

Jaromír Baxa & Eva Hromádková

IES FSV UK

Introduction

  • Phillips curve suggests a link between economic activity and inflation: the fall in inflation implies fall of GDP and increase of unemployment (and vice versa).

  • Empirical relationship: this trade-off was used as a guidance for policy-makers especially in 1960’s (quite successfully). But in 1970’s, this relationship supposedly disappeared when stagflation occurred.

  • Long-run and short-run Phillips curve (E. Phelps); implied natural rate of unemployment as an equilibrium level of unemployment to which the economy tends notwithstanding the levels of inflation (M. Friedman).

  • This seminar: Exploring the empirics of the Phillips curve, revealing changes in equilibrium level of unemployment and slope of the Phillips curve as such.

Outline

  • The output-inflation trade-off – stylized facts.

  • Can we find the Phillips curve in the data?

  • Estimation of the Phillips curve

  • The natural level of unemployment and NAIRU and its evolution

  • The Great Recession and the output-inflation trade-off

  • Summary

Stylized facts

  • The stylized facts are somewhat contradictory:

  • In recessions, inflation usually falls and unemployment increases.

  • The short-run trade-off between inflation π and unemployment U (defined as \(π = k – aU\)) is sometimes insignificant and estimates of the slope coefficient \(a\) are inconsistent across countries and samples.

  • The Phillips curve in its most simple form does not provide reliable signals about future inflation or future unemployment.

  • The following plots illustrate these points for the United States. Data from FRED, codes of series cpiaucsl and unrate; data converted to quarterly data by using the end-values; inflation obtained as y-o-y change of 100*log(cpiaucsl).

Stylized facts: R code

library(xts)
library(pdfetch) #Library for loading FRED data
library(ggplot2) #Library for plotting
library(mFilter) #Library for HP filter

data_pc <- pdfetch_FRED(c("GDPC1", "UNRATE", "CPIAUCSL", "PPIACO", "CPILFESL"))
# Convert data to quarterly frequency
data_pc <- to.period(data_pc, period = "quarter", OHLC = FALSE)
#View(data_pc)

#Transformations
data_pc$lgdp <- log(data_pc$GDPC1) # Take logs
hp_gdp <- hpfilter(data_pc$lgdp, freq = 1600, type="lambda")
data_pc$gdpgap <- 100*hp_gdp$cycle
data_pc$l_cpi <- log(data_pc$CPIAUCSL)
data_pc$l_cpi_core <- log(data_pc$CPILFESL)
data_pc$l_ppiaco <- log(data_pc$PPIACO)
data_pc$unrate <- (data_pc$UNRATE)

#Series for plots of the Phillips curve
data_pc$inflation <- 100*diff(data_pc$l_cpi, 4)
#plot.xts(data_pc$inflation)

#Add recession bars
recessions.df = read.table(textConnection(
  "Peak, Trough
  1957-08-01, 1958-04-01
  1960-04-01, 1961-02-01
  1969-12-01, 1970-11-01
  1973-11-01, 1975-03-01
  1980-01-01, 1980-07-01
  1981-07-01, 1982-11-01
  1990-07-01, 1991-03-01
  2001-03-01, 2001-11-01
  2007-12-01, 2009-06-01
  2020-02-01, 2020-05-01"), sep=',',
  colClasses=c('Date', 'Date'), header=TRUE)

ggplot() +
  geom_line(data = data_pc$unrate, aes(x = Index, y = data_pc$unrate, color = "Unemployment"), lwd = 1) +
  geom_line(data = data_pc$inflation, aes(x = Index, y = data_pc$inflation, color = "Inflation"), lwd = 1) +
  geom_rect(data=recessions.df, inherit.aes=F, aes(xmin=Peak, xmax=Trough, ymin=-Inf, ymax=+Inf), fill='darkgray', alpha=0.5) +
  theme_classic() +
  labs(title = "US Unemployment rate and Inflation", x = "Quarter", y = "") +
  labs(color="Legend") +
  theme(legend.position="bottom")

Stylized facts 1: Disinflations and recesions

Stylized facts 2: Slope of the Phillips curve

Stylized facts 3: Phillips curve over time (Since 1957)

Stylized facts 4: Phillips curve in the 1960s

Stylized facts 5: Phillips curve in the 1970s

Stylized facts 6: Phillips curve since 1999

Phillips curve: Empirics

  • First step: simple regression \[π = k - aU\]

  • Framework might be extended for the equilibrium level of unemployment and expectations \[π = π^e - a(U-U^*) + v\]

  • \(v\)… supply shock and error term.

  • The economic activity can be represented by output gap as well, in that case, the coefficient a shall be positive.

  • \(U^*\) … unemployment rate consistent with stable inflation.

Phillips curve: Natural rate of unemployment

  • Possible interpretations of \(U^*\):
  1. the natural rate of unemployment (Friedman, 1968, only voluntary and frictional)

  2. the NAIRU – non-accelerating inflation rate of unemployment. It is the New Keynesian counterpart to the concept of natural rate of unemployment, it admits existence of involuntary unemployment due to imperfect competition and business cycle.

  • Both, the NAIRU and natural rate of unemployment might change over time, mainly in response to changes in structure of the economy, likely at lower than business cycles frequency.

Phillips curve: Empirics

Data for the expectations-augmented Phillips curve     \(π_t = π_t^e - a(U_t-U^*) + v_t\)

  • Inflation: Quarterly rate, annualized:     \(\pi_t = 4*100*(log P_t - log P_{t-1})\)

  • Inflation expectations: different approaches in literature – adaptive (\(π_{t-1}\)), rational or from surveys (some definitions in Additional slides)

  • Empirically, the difference among the rational and the adaptive expectations is not that striking. Here we follow Ball and Mazumder (2011) and consider the inflation expectations formed on past inflation rates such that: \[π_t^e = ¼ (π_{t-1}+π_{t-2} + π_{t-3}+ π_{t-4})\]

  • Dependent variable is expressed in the form of the inflation gap: \(π_{gap,t} = π_t - π_t^e\), therefore: \[π_{gap,t} = – a(U_t-U^*) + v_t \]

  • OLS is used to estimate:     \(π_{gap,t} = k – aU_t + v_t\)     with     \(k = aU^*\).

  • Alternatively with the output gap     \(π_{gap} = a*y_{gap} + v\).

Data preparation

#Quarterly inflation, annualized
data_pc$inflation_q = 4*100*diff(data_pc$l_cpi)

#Inflation expectations as an average of 4 past y-o-y inflation rates
data_pc$infexp <- 1/4*(lag(data_pc$inflation, k=1) + lag(data_pc$inflation, k=2) + lag(data_pc$inflation, k=3) + lag(data_pc$inflation, k=4))

plot.xts(data_pc$inflation, col = "black", lwd = 2)
addSeries(data_pc$infexp, on = 1, col = "red", lwd = 2 )

#Creating inflation gap
data_pc$infgap <- data_pc$inflation_q-data_pc$infexp
plot.xts(data_pc$inflation_q)
addSeries(data_pc$infgap, on = 1, col = "red", lwd = 2 )

#Supply shocks
data_pc$ss1 <- 4*diff(data_pc$l_cpi)*100 - 4*diff(data_pc$l_cpi_core)*100
data_pc$ss2 <- 100*diff(data_pc$l_ppiaco)

Data preparation: Inflation and inflation expectations

Data preparation: Inflation and Inflation gap

Results I: Simple regressions

model1 <- lm(infgap ~ unrate, data = data_pc)
model2 <- lm(infgap ~ 0 + gdpgap, data = data_pc)

===================================================================
                                  Dependent variable:              
                    -----------------------------------------------
                                        infgap                     
                              (1)                     (2)          
-------------------------------------------------------------------
unrate                     -0.343***                               
                            (0.094)                                
                                                                   
gdpgap                                             0.650***        
                                                    (0.098)        
                                                                   
Constant                   2.027***                                
                            (0.574)                                
                                                                   
-------------------------------------------------------------------
Observations                  263                     263          
R2                           0.048                   0.145         
Adjusted R2                  0.045                   0.142         
Residual Std. Error    2.519 (df = 261)        2.383 (df = 262)    
F Statistic         13.267*** (df = 1; 261) 44.358*** (df = 1; 262)
===================================================================
Note:                                   *p<0.1; **p<0.05; ***p<0.01

Results II: Adding supply shocks

  • The residuals \(v\) in equation \(π_{gap,t} = k – aU_t + v_t\) can be decomposed into supply shocks and other effects.

  • Inclusion of supply shocks would account for cost-push inflation explicitly.

Supply shocks:

  • Difference between core and headline inflation (from CPI)

  • Producer price index (commodities)

#Supply shocks
data_pc$ss1 <- 4*diff(data_pc$l_cpi)*100 - 4*diff(data_pc$l_cpi_core)*100
data_pc$ss2 <- 100*diff(data_pc$l_ppiaco)

Results II: Model with supply shocks

model3a <- lm(infgap ~ unrate + ss1, data = data_pc)
model3b <- lm(infgap ~ unrate + ss2, data = data_pc)
model4 <- lm(infgap ~ 0 + gdpgap + ss1, data = data_pc)

==============================================================================================
                                               Dependent variable:                            
                    --------------------------------------------------------------------------
                                                      infgap                                  
                              (1)                      (2)                      (3)           
----------------------------------------------------------------------------------------------
unrate                     -0.239***                -0.337***                                 
                            (0.062)                  (0.065)                                  
                                                                                              
gdpgap                                                                        0.417***        
                                                                              (0.066)         
                                                                                              
ss1                         1.006***                                          0.961***        
                            (0.054)                                           (0.053)         
                                                                                              
ss2                                                  0.860***                                 
                                                     (0.051)                                  
                                                                                              
Constant                    1.398***                 1.313***                                 
                            (0.379)                  (0.398)                                  
                                                                                              
----------------------------------------------------------------------------------------------
Observations                  263                      263                      263           
R2                           0.590                    0.549                    0.624          
Adjusted R2                  0.587                    0.546                    0.621          
Residual Std. Error     1.657 (df = 260)         1.737 (df = 260)         1.583 (df = 261)    
F Statistic         187.038*** (df = 2; 260) 158.371*** (df = 2; 260) 216.656*** (df = 2; 261)
==============================================================================================
Note:                                                              *p<0.1; **p<0.05; ***p<0.01

Results III: Recent data

model1c <- lm(infgap ~ unrate + ss1, data = data_pc_recent)
model1d <- lm(infgap ~ 0 + gdpgap + ss1, data = data_pc_recent)

===================================================================
                                  Dependent variable:              
                    -----------------------------------------------
                                        infgap                     
                              (1)                     (2)          
-------------------------------------------------------------------
unrate                      -0.064                                 
                            (0.076)                                
                                                                   
gdpgap                                               0.122         
                                                    (0.096)        
                                                                   
ss1                        1.088***                1.081***        
                            (0.058)                 (0.057)        
                                                                   
Constant                     0.336                                 
                            (0.462)                                
                                                                   
-------------------------------------------------------------------
Observations                  95                      95           
R2                           0.796                   0.799         
Adjusted R2                  0.792                   0.795         
Residual Std. Error     1.376 (df = 92)         1.362 (df = 93)    
F Statistic         179.487*** (df = 2; 92) 184.873*** (df = 2; 93)
===================================================================
Note:                                   *p<0.1; **p<0.05; ***p<0.01

Results III: Implications

  • We can see that during the last two decades the coefficients at unemployment rate and GDP gap become insignificant and with opposite signs than expected.

  • Hence, it seems that the slope of the Phillips curve flattened and that the sensitivity of inflation on economic activity changed.

  • This feature is obtained by number of empirical studies and not only for the U.S., but also for other developed and some emerging countries. The international evidence is provided in IMF WEO April, 2013, Ch. 3 (Simon, J. et al.: „The Dog that Didn’t Bark: Has Inflation Been Muzzled or Was It Just Sleeping?)

  • Consequence: if the full sample estimates were used for forecasting of inflation during the crisis, then for example in the U.S. the inflation were significantly below zero since 2010.

Investigating time-variation

Time-variation I: Slope

  • Time-variation in slope can be investigated explicitly, using rolling OLS estimation (other methods include time-varying coefficient model estimated using Kalman filter)

Iterative procedure:

  1. Estimate the model on window of size \(h\),

  2. save the value of the coefficient and its standard deviation,

  3. move the window for one observation ahead, reestimate the model, and repeat until the end of the sample is reached.

  • \(h\) will determine smoothness of the estimated coefficient; high h will likely underestimate the time-variation.
install.packages("roll")
library(roll)

data1 <- na.omit(data_pc)

x <- cbind(data1$unrate, data1$ss1)
y <- data1$infgap

width <- 40 # Window size
rolling_result <- roll_lm(x, y, width = width)

data1$intercept <- rolling_result$coefficients[, 1]

# Plot the rolling intercept
# plot.xts(xts(data1$slope, order.by = index(data1)),
#         main = "Rolling Regression Slope for Phillips Curve",
#         ylab = "Slope Coefficient", xlab = "Time")

#data1$slope <- rolling_result$coefficients[, 2]

# Plot the rolling slope
plot.xts(xts(data1$slope, order.by = index(data1)),
         main = "Rolling Regression Slope for Phillips Curve",
         ylab = "Slope Coefficient", xlab = "Time")

#Note that in rolling regression, all coefficients are allowed to vary over time.

#An alternative to the roll package is to write your own loop and to save additional statistics, or to keep intercept equal to the full-sample estimates.

Time-variation I: Slope

Time-variation I: Slope

  • Why the Phillips curve became flat is still subject to debate, as well as whether the slope remains small or not.
  • If the slope fell, the monetary policy might be much less powerful in attempts to stabilize output, and the divine coincidence of the NK models that stable inflation brings stable growth breaks down.

Two competing hypotheses explaining flattening:

  1. Strong anchoring of inflation expectations to inflation targets, hence the actual inflation has rather moderate effect on decision making. => Expansionary monetary policy (even unconventional one) would not have inflationary effects as long as inflation expectations remain anchored.

  2. Increase in equilibrium unemployment due to increasing long-term unemployment making the low and not falling inflation consistent with higher unemployment rates. => The expansionary policy is not likely to decrease the unemployment.

  • Verification of the first step somewhat complex, on the other hand potential evolution of the NAIRU can be investigated relatively easily.

Time-variation II: NAIRU

  • Starting point: \(π_{gap,t} = – a(U_t-U^*) + v_t\) where the \(aU^*\) is the constant in the regression

  • This equation can be used to estimation of time-varying \(U^*\) (follows Ball and Mankiw (2002)

  • After some algebra we can obtain: \(π_{gap,t}/a + U_t = U^* + v/a\)

  • The left hand side is obtained from the data and regression results (Model 3).

  • The \(U^*\) can be obtained by HP-filter from of the product at the LHS. The smoothing parameter should be higher than for business cycles frequencies.

data_pc$un_pi_gap <- data_pc$unrate + data_pc$infgap/0.3
#Note that -0.3 was the estimated coefficient at unemployment rate in model 3a.
plot.xts(data_pc$un_pi_gap)
#Get trend using the HP filter with high lambda (much higner than for business cycles frequencies)
hp_un_pi_gap <- hpfilter(data1$un_pi_gap, freq = 100000, type="lambda")
plot(hp_un_pi_gap)
#This plot however hasn't been very informative...
data2$unpigapcycle <- hp_un_pi_gap$cycle
data2$nairu <- data2$un_pi_gap - data2$unpigapcycle
plot_nairu <- plot.xts(data2$unrate, col = "black", lwd = 2)
plot_nairu <- addSeries(data2$nairu, on = 1, col = "red", lwd = 2 )
plot_nairu

Time-variation II: NAIRU

Plot of unemployment gap, HP-filtered

Time-variation II: NAIRU

Final plot of NAIRU

Time-variation II: NAIRU (data till 2022)

Final plot of NAIRU with two alternative values of \(\lambda\) :

Time-variation II: NAIRU

  • Increase in NAIRU in the 70’s, since mid of 80’s the rate decreased, but after 2000 it increased back again.

  • Ball and Mankiw provide survey of alternative hypotheses explaining the decrease of NAIRU in the 90’s: more efficient job market and increase in productivity. However, they admit they were unable to explain the changes in NAIRU precisely.

  • NAIRU remained high even after the Great Recession. Perhaps due to hysteresis effect: those who became unemployed during the crisis were unable to find job even after the end of the recession (some evidence in the Appendix). Hence, it took much more time until unemployment rate decreased and now inflation in the U.S. is steadily rising.

  • Results in the other literature: Dickens and Triest (BE Journal of Macroeconomics, 2012) estimate the NAIRU using structural model. At the end of nineties and in the 2000’s the NAIRU was at 5% with an increase in 2010 to 6%. Their sample ends in 1Q 2011.

  • Hence, the increase in NAIRU somewhat supported by the evidence.

  • Based on the data till 2022, the recent inflation surge increased the NAIRU, but with the new data, the increase is gone, and the data suggest the opposite.

Summary

  • First of all, the relationship between inflation and economic activity is unstable.

  • When accounting for expectations, the inverse relationship between inflation and unemployment used to be significant and negative till the late 2000’s.

  • Evidence shows that the Phillips curve flattened in recent years, most likely well ahead of the Great Recession.

  • Why the Phillips curve flattened and whether it is temporary phenomenon is subject to ongoing research.

  • The recent studies suggest that the link between activity and inflation is stronger in recessions and thus highly nonlinear (Stock-Watson – Modelling inflation after the crisis, mimeo; Koop-Onorante, ECB WP 2011, provide similar evidence for the Eurozone with different methodology).

Summary

  • Recent papers by Pierpaolo Benigno and Gauti B. Eggertson analyze the recent inflation surge through the lens of the nonlinear nature of the Phillips curve. The authors show that the Phillips curve is flat when inflation is low and labour market is loose. On the other hand, its slope is steep when inflation is higher and labour market appears as tight, i.e., the number of vacancies is higher than the number of people searching for a job. See It’s Baaack: The Surge in Inflation in the 2020s and the Return of the Non-Linear Phillips Curve, https://www.nber.org/papers/w31197, Apr 2023; and The Slanted-L Phillips Curve, https://www.nber.org/papers/w32172, Feb 2024.

  • Methodologically, they show that the recent events with high inflation and subsequent disinflation without a surge of unemployment can be rationalized when we measure the labour market slack as a ratio of firms’ job vacancies over the number of unemployed people, and a nonlinear Phillips curve can be generated using a New Keynesian model with search and matching frictions, complemented by wage rigidities simultaneously.

  • The research on the Phillips curve of the past decade led the Fed and the ECB to refer to more labour market indicators, not just to unemployment, when communicating their monetary policy decisions.

Additional slides

Types of inflation

Various approaches to inflation and various classifications. For policy analysis, it is often relevant to think about three main types of inflation:

  • Demand-pull inflation: caused by increases in aggregate demand due to increased private and government spending

  • Cost-push inflation (“supply shock inflation”): caused by large increases in prices of inputs such as natural resources. Sometimes caused also by a drop in aggregate supply.

  • Built-in inflation: induced by expectations, and is often linked to the “price/wage spiral”.

In practice, distinguishing between these types of inflation uneasy.

  • Goal of policy: low, but stable inflation with anchored inflation expectations, occassional supply shocks leading to temporary increases of inflation, but not persistent.

  • Different ways, how to achieve this goal, prior crisis, inflation targeting focused on anchoring of inflation expectations by public announcement of the targeted inflation rate dominant.

Inflation expectations

  • Naïve expectations:     \(\pi_t^e = \pi_{t-1}\)

  • Adaptive expectations:     \(\pi_t^e = \pi_{t-1}^e - \lambda(\pi_{t-1}^e - \pi_{t-1})\)

(learns from its past mistakes; can be approximated by stating that expected inflation equals to weighted averages of past expectations)

  • Rational expectations:     \(\pi_t^e = E (\pi_t^e \vert \Omega_t)\)

(forecast errors are unbiased and predictions take into account all available information available to the agent for the given period)

  • In advanced countries when inflation volatility is not extreme large, the difference between survey expectations and adaptive expectations relatively moderate, there is also an extensive literature that tries to test whether the inflation expectations are more on the adaptive side or more consistent with rational expectations.