Load libraries and plot theme

library(tidyverse)
library(stargazer)
library(tidyquant)


theme <- 
  theme(
    plot.title = element_text(size = 30, lineheight = .9, face = "bold", hjust = .5, vjust = .75, family = "serif"
    ),
    plot.subtitle = element_text(hjust = .5, vjust = 1, family = "serif", size = 20),
    plot.caption = element_text(hjust = .5, family = "serif", size = 15),
    panel.background = element_rect(fill = "white"),
    axis.title = element_text(family = "serif", size = 20),
    axis.text = element_text(size = 20, family = "serif"),
    axis.line.y = element_line(color = "black"),
    axis.line.x = element_line(color = "black"),
    strip.text = element_text(size = 15, family = "serif", face = "bold"),
    strip.background.x = element_rect(fill = "lightblue"))

Create dataframes

median <- 
  c("MEDCPIM158SFRBCLE") %>% 
  tq_get(get = "economic.data", from = "1982-01-01") %>% 
  select(date, median = price) %>%
  mutate(median = 100*(((1 + (median / 100)) ^ (1/12)) - 1))

cpi <- 
  c("CPILFESL") %>% 
  tq_get(get = "economic.data", from = "1982-01-01") %>% 
  select(date, cpi = price) %>% 
  mutate(cpi = 100*((cpi / lag(cpi, 1)) - 1))

infl_df <- 
  cpi %>% 
  left_join(median, by = "date") %>% 
  drop_na %>% 
  mutate(non_xfe_shock = cpi - median)


ret_df <- 
  read_csv("indexes.csv") %>% 
  mutate(date = floor_date(mdy(date), "month")) 

df <- 
  infl_df %>% 
  left_join(ret_df, by = "date") 

# scatter

infl_df %>% 
  ggplot(aes(x = median, y = cpi)) +
  geom_point() +
  xlim(-.1, .5) +
  ylim(-.1, .5) +
  geom_abline(slope = 1, intercept = 0) +
  labs(x = "Median CPI", y = "XFE CPI") +
  theme

infl_df %>% 
  mutate(bin = cut(non_xfe_shock, breaks = c(-Inf, -1, -.5, -.4, -.3, -.2, -.1, 0, .1, .2, .3, .4, .5, 1, +Inf))) %>% 
  group_by(bin) %>% 
  summarize(n = n()) %>% 
  ungroup %>% 
  mutate(freq = 100*(n / sum(n))) %>% 
  ggplot(aes(x = bin, y = n)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = paste0(round(freq, 1), "%"), vjust = -1)) +
  labs(x = NULL, y = "count") +
  theme +
  theme(axis.text.x = element_text(size = 10),
        axis.ticks = element_blank())

Regressions (full sample)

# regressions (full sample)

mod1 <- 
df %>% 
  lm(tips ~ non_xfe_shock, data = .) 

mod2 <- 
df %>%
  lm(bci ~ non_xfe_shock, data = .) 

mod3 <- 
df %>% 
  lm(bills ~ non_xfe_shock, data = .)

mod4 <- 
df %>% 
  lm(sp ~ non_xfe_shock, data = .) 

mod5 <- 
df %>% 
  lm(real ~ non_xfe_shock, data = .) 


stargazer(mod1, mod2, mod3, mod4, mod5,
          ci = T,
          ci.level = 0.95,
          digits = 3,
          omit.stat = c("f", "chi2", "ser", "adj.rsq"),
          omit = c("Constant"),
          type = "html",
          out = "shock_regressions.html",
          notes = c("Standard errors are heteroskedasitity robust as suggested by residual behavior",
                    "Source: author's regressions"),
          dep.var.caption = "Dependent variable",
          dep.var.labels = c("TIPS", "BCI", "T-bill", "S&P 500", "Real assets"),
          model.numbers = T)
## 
## <table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5">Dependent variable</td></tr>
## <tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td>TIPS</td><td>BCI</td><td>T-bill</td><td>S&P 500</td><td>Real assets</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">non_xfe_shock</td><td>0.545</td><td>4.440<sup>*</sup></td><td>-0.248<sup>***</sup></td><td>2.628</td><td>1.365</td></tr>
## <tr><td style="text-align:left"></td><td>(-1.191, 2.280)</td><td>(-0.585, 9.465)</td><td>(-0.432, -0.064)</td><td>(-1.449, 6.704)</td><td>(-4.015, 6.745)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>323</td><td>283</td><td>334</td><td>426</td><td>112</td></tr>
## <tr><td style="text-align:left">R<sup>2</sup></td><td>0.001</td><td>0.011</td><td>0.021</td><td>0.004</td><td>0.002</td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## <tr><td style="text-align:left"></td><td colspan="5" style="text-align:right">Standard errors are heteroskedasitity robust as suggested by residual behavior</td></tr>
## <tr><td style="text-align:left"></td><td colspan="5" style="text-align:right">Source: author's regressions</td></tr>
## </table>

Regressions (common period)

# regressions (common period sample)

mod1 <- 
df %>% 
  drop_na %>% 
  lm(tips ~ non_xfe_shock, data = .) 

mod2 <- 
df %>%
  drop_na %>% 
  lm(bci ~ non_xfe_shock, data = .) 

mod3 <- 
df %>% 
  drop_na %>% 
  lm(bills ~ non_xfe_shock, data = .)

mod4 <- 
df %>% 
  drop_na %>% 
  lm(sp ~ non_xfe_shock, data = .) 

mod5 <- 
df %>% 
  drop_na %>% 
  lm(real ~ non_xfe_shock, data = .) 


stargazer(mod1, mod2, mod3, mod4, mod5,
          ci = T,
          ci.level = 0.95,
          digits = 3,
          omit.stat = c("f", "chi2", "ser", "adj.rsq"),
          omit = c("Constant"),
          type = "html",
          out = "shock_regressions.html",
          notes = c("Standard errors are heteroskedasitity robust as suggested by residual behavior",
                    "Source: author's regressions"),
          dep.var.caption = "Dependent variable",
          dep.var.labels = c("TIPS", "BCI", "T-bill", "S&P 500", "Real assets"),
          model.numbers = T)
## 
## <table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5">Dependent variable</td></tr>
## <tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td>TIPS</td><td>BCI</td><td>T-bill</td><td>S&P 500</td><td>Real assets</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">non_xfe_shock</td><td>0.578</td><td>5.044<sup>**</sup></td><td>-0.239<sup>**</sup></td><td>0.393</td><td>1.365</td></tr>
## <tr><td style="text-align:left"></td><td>(-1.344, 2.500)</td><td>(0.153, 9.935)</td><td>(-0.444, -0.034)</td><td>(-5.404, 6.190)</td><td>(-4.015, 6.745)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>112</td><td>112</td><td>112</td><td>112</td><td>112</td></tr>
## <tr><td style="text-align:left">R<sup>2</sup></td><td>0.003</td><td>0.036</td><td>0.045</td><td>0.0002</td><td>0.002</td></tr>
## <tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## <tr><td style="text-align:left"></td><td colspan="5" style="text-align:right">Standard errors are heteroskedasitity robust as suggested by residual behavior</td></tr>
## <tr><td style="text-align:left"></td><td colspan="5" style="text-align:right">Source: author's regressions</td></tr>
## </table>