`

load("USA_data.RData")
attach(USA_data)
Imp <- read.csv("IMPGS.csv")
Ex <- read.csv("EXPGS.csv")
X<-ts(Ex$EXPGS, start= 1948, frequency=4)
M<-ts(Imp$IMPGS, start= 1948, frequency=4)
start_date <- as.Date("1951-10-01")
trade_balance<-(X-M)
log_trade_balance<-log(X/M)
read_to_ts <- function(file) {
  x <- read.csv(file, stringsAsFactors = FALSE)

  date_col <- names(x)[1]
  value_col <- names(x)[2]

  x[[date_col]] <- as.Date(x[[date_col]])
  x[[value_col]] <- as.numeric(x[[value_col]])

  x <- x[!is.na(x[[date_col]]) & !is.na(x[[value_col]]), ]

  # always drop observations before 1951-10-01
  x <- x[x[[date_col]] >= start_date, ]

  # if nothing remains, stop
  if (nrow(x) == 0) {
    stop(paste("No observations on or after", start_date, "in file", file))
  }

  first_date <- min(x[[date_col]])
  start_year <- as.integer(format(first_date, "%Y"))
  start_month <- as.integer(format(first_date, "%m"))
  start_quarter <- (start_month - 1) %/% 3 + 1

  ts(
    x[[value_col]],
    start = c(start_year, start_quarter),
    frequency = 4
  )
}

treasury      <- read_to_ts("BOGZ1FL263061130Q.csv")
fdi_outward   <- read_to_ts("BOGZ1FL263192141Q.csv")
trade_balance <- read_to_ts("NETEXP.csv")
imports_ind   <- read_to_ts("LA0000041Q027SBEA.csv")
gdp_deflator  <- read_to_ts("GDPDEF.csv")
gdp           <- read_to_ts("GDP.csv")
real_gdp      <- read_to_ts("GDPC1.csv")
min_wage      <- read_to_ts("FEDMINNFRWG.csv")
long_rate     <- read_to_ts("DGS10.csv")
ppg <- read.csv("PPG.csv", stringsAsFactors = FALSE, check.names = FALSE)

names(ppg) <- trimws(names(ppg))
ppg[[1]] <- trimws(ppg[[1]])
ppg[[2]] <- suppressWarnings(as.numeric(ppg[[2]]))
ppg[[3]] <- suppressWarnings(as.numeric(ppg[[3]]))

ppg <- ppg[grepl("^[0-9]{4}q[1-4]$", ppg[[1]]), ]

year <- as.numeric(substr(ppg[[1]], 1, 4))
quarter <- as.numeric(substr(ppg[[1]], 6, 6))

prod <- ts(ppg[[2]], start = c(year[1], quarter[1]), frequency = 4)
pay  <- ts(ppg[[3]], start = c(year[1], quarter[1]), frequency = 4)

wage_gap <- prod / pay

plot(wage_gap)

start_all <- c(1967, 1)
end_all   <- c(2025, 3)

treasury      <- window(treasury,      start = start_all, end = end_all)
fdi_outward   <- window(fdi_outward,   start = start_all, end = end_all)
trade_balance <- window(trade_balance, start = start_all, end = end_all)
imports_ind   <- window(imports_ind,   start = start_all, end = end_all)
gdp_deflator  <- window(gdp_deflator,  start = start_all, end = end_all)
gdp           <- window(gdp,           start = start_all, end = end_all)
real_gdp      <- window(real_gdp,      start = start_all, end = end_all)
min_wage      <- window(min_wage,      start = start_all, end = end_all)
long_rate     <- window(long_rate,     start = start_all, end = end_all)
wage_gap <- window(wage_gap, start = start_all, end = end_all)
log_trade_balance <- window(log_trade_balance, start = start_all, end = end_all)


start(treasury); end(treasury)
## [1] 1967    1
## [1] 2025    3
start(fdi_outward); end(fdi_outward)
## [1] 1967    1
## [1] 2025    3
start(trade_balance); end(trade_balance)
## [1] 1967    1
## [1] 2025    3
start(imports_ind); end(imports_ind)
## [1] 1967    1
## [1] 2025    3
start(gdp_deflator); end(gdp_deflator)
## [1] 1967    1
## [1] 2025    3
start(gdp); end(gdp)
## [1] 1967    1
## [1] 2025    3
start(real_gdp); end(real_gdp)
## [1] 1967    1
## [1] 2025    3
start(min_wage); end(min_wage)
## [1] 1967    1
## [1] 2025    3
start(long_rate); end(long_rate)
## [1] 1967    1
## [1] 2025    3
start(wage_gap); end(wage_gap)
## [1] 1967    1
## [1] 2025    3

##Scaling

treasury_gdp      <- treasury / gdp
fdi_outward_gdp   <- fdi_outward / gdp
trade_deficit_gdp <- -trade_balance / gdp

imports_ind_real_gdp <- imports_ind / real_gdp

min_wage_real <- min_wage / gdp_deflator

long_rate <- long_rate
wage_gap  <- wage_gap

log_treasury_gdp        <- log(treasury_gdp)
log_fdi_outward_gdp     <- log(fdi_outward_gdp)
log_trade_balance  <- log_trade_balance
log_imports_ind_real_gdp <- log(imports_ind_real_gdp)
log_min_wage_real       <- log(min_wage_real)
log_long_rate           <- log(long_rate)
log_wage_gap            <- log(wage_gap)

d_log_treasury_gdp         <- diff(log_treasury_gdp)
d_log_fdi_outward_gdp      <- diff(log_fdi_outward_gdp)
d_log_trade_balance    <- diff(log_trade_balance)
d_log_imports_ind_real_gdp <- diff(log_imports_ind_real_gdp)
d_log_min_wage_real        <- diff(log_min_wage_real)
d_log_long_rate            <- diff(log_long_rate)
d_log_wage_gap             <- diff(log_wage_gap)

##Plot

par(mfrow = c(1, 2))

plot(treasury_gdp, main = "Treasury Holdings / GDP")
plot(trade_deficit_gdp, main = "Trade Deficit / GDP")

plot(fdi_outward_gdp, main = "Outward FDI / GDP")
plot(imports_ind_real_gdp, main = "Industrial Imports / Real GDP")

plot(min_wage_real, main = "Real Minimum Wage")
plot(long_rate, main = "Long-Term Interest Rate")

# separate plot for dependent variable
par(mfrow = c(1,1))
plot(wage_gap, main = "Wage Gap")

## Log Plot

par(mfrow = c(1, 2))

plot(log_treasury_gdp, main = "Log Treasury Holdings / GDP")
plot(log_trade_balance, main = "Log Trade Balance Measure")

plot(log_fdi_outward_gdp, main = "Log Outward FDI / GDP")
plot(log_imports_ind_real_gdp, main = "Log Industrial Imports / Real GDP")

plot(log_min_wage_real, main = "Log Real Minimum Wage")
plot(log_long_rate, main = "Log Long-Term Interest Rate")

# separate plot for dependent variable
par(mfrow = c(1,1))
plot(log_wage_gap, main = "Log Wage Gap")

##Dlog PLot

par(mfrow = c(1, 2))

plot(d_log_treasury_gdp,         main = "D Log Treasury Holdings / GDP")
plot(d_log_trade_balance,    main = "D Log Trade Balance Measure")

plot(d_log_fdi_outward_gdp,      main = "D Log Outward FDI / GDP")
plot(d_log_imports_ind_real_gdp, main = "D Log Industrial Imports / Real GDP")

plot(d_log_min_wage_real,        main = "D Log Real Minimum Wage")
plot(d_log_long_rate,            main = "D Log Long-Term Interest Rate")

# separate plot for dependent variable
par(mfrow = c(1,1))
plot(d_log_wage_gap, main = "D Log Wage Gap")

ACF

par(mfrow = c(1, 2))

acf(treasury_gdp,      main = "ACF: Treasury / GDP")
acf(trade_deficit_gdp, main = "ACF: Trade Deficit / GDP")

acf(fdi_outward_gdp,   main = "ACF: Outward FDI / GDP")
acf(imports_ind_real_gdp, main = "ACF: Industrial Imports / Real GDP")

acf(min_wage_real,     main = "ACF: Real Minimum Wage")
acf(long_rate,         main = "ACF: Long-Term Interest Rate")

par(mfrow = c(1,1))
acf(wage_gap, main = "ACF: Wage Gap")

par(mfrow = c(1, 2))

pacf(treasury_gdp,      main = "ACF: Treasury / GDP")
pacf(trade_deficit_gdp, main = "ACF: Trade Deficit / GDP")

pacf(fdi_outward_gdp,   main = "ACF: Outward FDI / GDP")
pacf(imports_ind_real_gdp, main = "ACF: Industrial Imports / Real GDP")

pacf(min_wage_real,     main = "ACF: Real Minimum Wage")
pacf(long_rate,         main = "ACF: Long-Term Interest Rate")

par(mfrow = c(1,1))
pacf(wage_gap, main = "ACF: Wage Gap")

#every one of the correlograms shows slow decay, which suggests high persistence and possible unit-root behavior. A formal conclusion requires a DF/ADF unit-root test

Logged ACF

par(mfrow = c(1, 2))

acf(log_treasury_gdp,         main = "ACF: Log Treasury / GDP")
acf(log_trade_balance,    main = "ACF: Log Trade Balance Measure")

acf(log_fdi_outward_gdp,      main = "ACF: Log Outward FDI / GDP")
acf(log_imports_ind_real_gdp, main = "ACF: Log Industrial Imports / Real GDP")

acf(log_min_wage_real,        main = "ACF: Log Real Minimum Wage")
acf(log_long_rate,            main = "ACF: Log Long-Term Interest Rate")

par(mfrow = c(1,1))
acf(log_wage_gap, main = "ACF: Log Wage Gap")

par(mfrow = c(1, 2))

pacf(log_treasury_gdp,         main = "PACF: Log Treasury / GDP")
pacf(log_trade_balance,    main = "PACF: Log Trade Balance Measure")

pacf(log_fdi_outward_gdp,      main = "PACF: Log Outward FDI / GDP")
pacf(log_imports_ind_real_gdp, main = "PACF: Log Industrial Imports / Real GDP")

pacf(log_min_wage_real,        main = "PACF: Log Real Minimum Wage")
pacf(log_long_rate,            main = "PACF: Log Long-Term Interest Rate")

par(mfrow = c(1,1))
pacf(log_wage_gap, main = "PACF: Log Wage Gap")

##Dlog ACf

par(mfrow = c(1, 2))

acf(d_log_treasury_gdp,         main = "ACF: D Log Treasury / GDP")
acf(d_log_trade_balance,    main = "ACF: D Log Trade Balance Measure")

acf(d_log_fdi_outward_gdp,      main = "ACF: D Log Outward FDI / GDP")
acf(d_log_imports_ind_real_gdp, main = "ACF: D Log Industrial Imports / Real GDP")

acf(d_log_min_wage_real,        main = "ACF: D Log Real Minimum Wage")
acf(d_log_long_rate,            main = "ACF: D Log Long-Term Interest Rate")

par(mfrow = c(1,1))
acf(d_log_wage_gap, main = "ACF: D Log Wage Gap")

par(mfrow = c(1, 2))

pacf(d_log_treasury_gdp,         main = "PACF: D Log Treasury / GDP")
pacf(d_log_trade_balance,    main = "PACF: D Log Trade Balance Measure")

pacf(d_log_fdi_outward_gdp,      main = "PACF: D Log Outward FDI / GDP")
pacf(d_log_imports_ind_real_gdp, main = "PACF: D Log Industrial Imports / Real GDP")

pacf(d_log_min_wage_real,        main = "PACF: D Log Real Minimum Wage")
pacf(d_log_long_rate,            main = "PACF: D Log Long-Term Interest Rate")

par(mfrow = c(1,1))
pacf(d_log_wage_gap, main = "PACF: D Log Wage Gap")

ADF

# =========================
# ADF LAG-LENGTH TABLES
# =========================

library(urca)

# choose max lag to inspect
max_lag <- 8   # quarterly data: 4 or 8 are common choices

# helper function
make_adf_table <- function(series, series_name, type_adf = c("trend", "drift"), max_lag = 8) {
  type_adf <- match.arg(type_adf)
  
  y <- na.omit(as.numeric(series))
  
  out <- data.frame(
    series = character(),
    type = character(),
    lag = integer(),
    tau_stat = numeric(),
    AIC = numeric(),
    BIC = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (L in 0:max_lag) {
    fit <- ur.df(y, type = type_adf, lags = L, selectlags = "Fixed")
    
    tau_stat <- as.numeric(fit@teststat[1])
    
    # rebuild regression manually from residuals (safe workaround)
    res <- residuals(fit@testreg)
    n <- length(res)
    k <- length(coef(fit@testreg))
    sigma2 <- sum(res^2) / n
    
    logLik_val <- -n/2 * (log(2*pi) + log(sigma2) + 1)
    
    AIC_val <- -2*logLik_val + 2*k
    BIC_val <- -2*logLik_val + log(n)*k
    
    out <- rbind(
      out,
      data.frame(
        series = series_name,
        type = type_adf,
        lag = L,
        tau_stat = tau_stat,
        AIC = AIC_val,
        BIC = BIC_val,
        stringsAsFactors = FALSE
      )
    )
  }
  
  out
}
# -------------------------
# BUILD TABLES
# -------------------------

tab_wage_gap   <- make_adf_table(wage_gap, "wage_gap", "trend", max_lag)
tab_treasury   <- make_adf_table(treasury_gdp, "treasury_gdp", "trend", max_lag)
tab_trade      <- make_adf_table(trade_deficit_gdp, "trade_deficit_gdp", "trend", max_lag)
tab_fdi        <- make_adf_table(fdi_outward_gdp, "fdi_outward_gdp", "trend", max_lag)
tab_imports    <- make_adf_table(imports_ind_real_gdp, "imports_ind_real_gdp", "trend", max_lag)
tab_minwage    <- make_adf_table(min_wage_real, "min_wage_real", "trend", max_lag)
tab_longrate   <- make_adf_table(long_rate, "long_rate", "trend", max_lag)

# combine all into one big table
adf_lag_table <- rbind(
  tab_wage_gap,
  tab_treasury,
  tab_trade,
  tab_fdi,
  tab_imports,
  tab_minwage,
  tab_longrate
)

# view full table
adf_lag_table
##                  series  type lag   tau_stat        AIC        BIC
## 1              wage_gap trend   0 -2.7570671 -1508.5606 -1467.0968
## 2              wage_gap trend   1 -2.4822763 -1494.5787 -1439.3621
## 3              wage_gap trend   2 -2.5015532 -1479.5305 -1410.5958
## 4              wage_gap trend   3 -2.4518297 -1463.9835 -1381.3655
## 5              wage_gap trend   4 -2.4807530 -1450.7254 -1354.4591
## 6              wage_gap trend   5 -2.5487149 -1435.7025 -1325.8234
## 7              wage_gap trend   6 -2.5227045 -1420.7702 -1297.3138
## 8              wage_gap trend   7 -2.3473963 -1405.7865 -1268.7885
## 9              wage_gap trend   8 -2.1042924 -1391.7888 -1241.2853
## 10         treasury_gdp trend   0  0.1365410 -1885.5109 -1844.0471
## 11         treasury_gdp trend   1 -0.5478753 -1905.5294 -1850.3128
## 12         treasury_gdp trend   2 -0.7890855 -1892.7755 -1823.8408
## 13         treasury_gdp trend   3 -1.3553099 -1891.7857 -1809.1677
## 14         treasury_gdp trend   4 -1.7103327 -1882.2027 -1785.9365
## 15         treasury_gdp trend   5 -1.7473057 -1865.3189 -1755.4398
## 16         treasury_gdp trend   6 -1.7150523 -1847.9130 -1724.4566
## 17         treasury_gdp trend   7 -1.9353786 -1832.6533 -1695.6553
## 18         treasury_gdp trend   8 -1.7990972 -1815.5498 -1665.0462
## 19    trade_deficit_gdp trend   0 -1.7832215 -2022.9161 -1981.4523
## 20    trade_deficit_gdp trend   1 -2.1568217 -2011.7446 -1956.5280
## 21    trade_deficit_gdp trend   2 -1.9839331 -1994.9021 -1925.9673
## 22    trade_deficit_gdp trend   3 -2.0596669 -1977.6879 -1895.0699
## 23    trade_deficit_gdp trend   4 -1.8499342 -1961.2542 -1864.9880
## 24    trade_deficit_gdp trend   5 -1.7824518 -1943.7742 -1833.8951
## 25    trade_deficit_gdp trend   6 -1.9937341 -1928.4523 -1804.9959
## 26    trade_deficit_gdp trend   7 -2.1523792 -1912.0907 -1775.0927
## 27    trade_deficit_gdp trend   8 -2.0759985 -1894.3540 -1743.8505
## 28      fdi_outward_gdp trend   0 -3.8745228 -1216.8683 -1175.4045
## 29      fdi_outward_gdp trend   1 -3.9051151 -1203.0267 -1147.8101
## 30      fdi_outward_gdp trend   2 -4.2029625 -1191.5900 -1122.6552
## 31      fdi_outward_gdp trend   3 -3.9047922 -1177.9087 -1095.2906
## 32      fdi_outward_gdp trend   4 -3.7429086 -1163.7040 -1067.4378
## 33      fdi_outward_gdp trend   5 -4.0111449 -1151.9735 -1042.0944
## 34      fdi_outward_gdp trend   6 -3.6365507 -1138.9931 -1015.5367
## 35      fdi_outward_gdp trend   7 -3.2732670 -1126.8173  -989.8193
## 36      fdi_outward_gdp trend   8 -2.9406965 -1114.6101  -964.1066
## 37 imports_ind_real_gdp trend   0 -2.0669909 -2221.4416 -2179.9778
## 38 imports_ind_real_gdp trend   1 -3.4170431 -2246.1708 -2190.9542
## 39 imports_ind_real_gdp trend   2 -2.7129905 -2235.0666 -2166.1319
## 40 imports_ind_real_gdp trend   3 -2.7452659 -2216.5180 -2133.8999
## 41 imports_ind_real_gdp trend   4 -2.1750823 -2205.0220 -2108.7557
## 42 imports_ind_real_gdp trend   5 -2.3500078 -2187.7172 -2077.8381
## 43 imports_ind_real_gdp trend   6 -2.2639281 -2168.9548 -2045.4983
## 44 imports_ind_real_gdp trend   7 -2.1339925 -2150.3726 -2013.3746
## 45 imports_ind_real_gdp trend   8 -1.8351947 -2134.2289 -1983.7254
## 46        min_wage_real trend   0 -1.9474847 -2261.5597 -2220.0959
## 47        min_wage_real trend   1 -1.9533282 -2244.8119 -2189.5952
## 48        min_wage_real trend   2 -1.7413039 -2227.3488 -2158.4140
## 49        min_wage_real trend   3 -1.6808078 -2208.6825 -2126.0645
## 50        min_wage_real trend   4 -3.0574355 -2249.8385 -2153.5723
## 51        min_wage_real trend   5 -2.8240550 -2234.9761 -2125.0970
## 52        min_wage_real trend   6 -2.8897321 -2216.3938 -2092.9373
## 53        min_wage_real trend   7 -2.9857376 -2198.1344 -2061.1364
## 54        min_wage_real trend   8 -3.1007406 -2184.9929 -2034.4893
## 55            long_rate trend   0 -2.5048399   339.9844   381.4482
## 56            long_rate trend   1 -2.8036467   332.1495   387.3661
## 57            long_rate trend   2 -2.5975814   338.9532   407.8879
## 58            long_rate trend   3 -2.7629606   341.3623   423.9803
## 59            long_rate trend   4 -2.7532480   348.3269   444.5931
## 60            long_rate trend   5 -2.5205220   352.7278   462.6069
## 61            long_rate trend   6 -2.6795306   358.9543   482.4108
## 62            long_rate trend   7 -2.3555680   362.0712   499.0692
## 63            long_rate trend   8 -2.3192611   368.8120   519.3155
# -------------------------
# BEST LAG BY AIC
# -------------------------
best_by_AIC <- do.call(
  rbind,
  lapply(split(adf_lag_table, adf_lag_table$series), function(x) x[which.min(x$AIC), ])
)

best_by_AIC
##                                    series  type lag   tau_stat        AIC
## fdi_outward_gdp           fdi_outward_gdp trend   0 -3.8745228 -1216.8683
## imports_ind_real_gdp imports_ind_real_gdp trend   1 -3.4170431 -2246.1708
## long_rate                       long_rate trend   1 -2.8036467   332.1495
## min_wage_real               min_wage_real trend   0 -1.9474847 -2261.5597
## trade_deficit_gdp       trade_deficit_gdp trend   0 -1.7832215 -2022.9161
## treasury_gdp                 treasury_gdp trend   1 -0.5478753 -1905.5294
## wage_gap                         wage_gap trend   0 -2.7570671 -1508.5606
##                             BIC
## fdi_outward_gdp      -1175.4045
## imports_ind_real_gdp -2190.9542
## long_rate              387.3661
## min_wage_real        -2220.0959
## trade_deficit_gdp    -1981.4523
## treasury_gdp         -1850.3128
## wage_gap             -1467.0968
# -------------------------
# BEST LAG BY BIC
# -------------------------
best_by_BIC <- do.call(
  rbind,
  lapply(split(adf_lag_table, adf_lag_table$series), function(x) x[which.min(x$BIC), ])
)

best_by_BIC
##                                    series  type lag   tau_stat        AIC
## fdi_outward_gdp           fdi_outward_gdp trend   0 -3.8745228 -1216.8683
## imports_ind_real_gdp imports_ind_real_gdp trend   1 -3.4170431 -2246.1708
## long_rate                       long_rate trend   0 -2.5048399   339.9844
## min_wage_real               min_wage_real trend   0 -1.9474847 -2261.5597
## trade_deficit_gdp       trade_deficit_gdp trend   0 -1.7832215 -2022.9161
## treasury_gdp                 treasury_gdp trend   1 -0.5478753 -1905.5294
## wage_gap                         wage_gap trend   0 -2.7570671 -1508.5606
##                             BIC
## fdi_outward_gdp      -1175.4045
## imports_ind_real_gdp -2190.9542
## long_rate              381.4482
## min_wage_real        -2220.0959
## trade_deficit_gdp    -1981.4523
## treasury_gdp         -1850.3128
## wage_gap             -1467.0968

##ADF Logged

# =========================
# ADF LAG-LENGTH TABLES (LOGGED VARIABLES)
# =========================

library(urca)

# choose max lag to inspect
max_lag <- 8   # quarterly data: 4 or 8 are common choices

# helper function
make_adf_table <- function(series, series_name, type_adf = c("trend", "drift"), max_lag = 8) {
  type_adf <- match.arg(type_adf)
  
  y <- na.omit(as.numeric(series))
  
  out <- data.frame(
    series = character(),
    type = character(),
    lag = integer(),
    tau_stat = numeric(),
    AIC = numeric(),
    BIC = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (L in 0:max_lag) {
    fit <- ur.df(y, type = type_adf, lags = L, selectlags = "Fixed")
    
    tau_stat <- as.numeric(fit@teststat[1])
    
    # rebuild regression manually from residuals (safe workaround)
    res <- residuals(fit@testreg)
    n <- length(res)
    k <- length(coef(fit@testreg))
    sigma2 <- sum(res^2) / n
    
    logLik_val <- -n/2 * (log(2*pi) + log(sigma2) + 1)
    
    AIC_val <- -2*logLik_val + 2*k
    BIC_val <- -2*logLik_val + log(n)*k
    
    out <- rbind(
      out,
      data.frame(
        series = series_name,
        type = type_adf,
        lag = L,
        tau_stat = tau_stat,
        AIC = AIC_val,
        BIC = BIC_val,
        stringsAsFactors = FALSE
      )
    )
  }
  
  out
}

# -------------------------
# BUILD TABLES
# -------------------------

tab_log_wage_gap    <- make_adf_table(log_wage_gap, "log_wage_gap", "trend", max_lag)
tab_log_treasury    <- make_adf_table(log_treasury_gdp, "log_treasury_gdp", "trend", max_lag)
tab_log_trade       <- make_adf_table(log_trade_balance, "log_trade_balance", "trend", max_lag)
tab_log_fdi         <- make_adf_table(log_fdi_outward_gdp, "log_fdi_outward_gdp", "trend", max_lag)
tab_log_imports     <- make_adf_table(log_imports_ind_real_gdp, "log_imports_ind_real_gdp", "trend", max_lag)
tab_log_minwage     <- make_adf_table(log_min_wage_real, "log_min_wage_real", "trend", max_lag)
tab_log_longrate    <- make_adf_table(log_long_rate, "log_long_rate", "trend", max_lag)

# combine all into one big table
adf_lag_table_log <- rbind(
  tab_log_wage_gap,
  tab_log_treasury,
  tab_log_trade,
  tab_log_fdi,
  tab_log_imports,
  tab_log_minwage,
  tab_log_longrate
)

# view full table
adf_lag_table_log
##                      series  type lag  tau_stat        AIC        BIC
## 1              log_wage_gap trend   0 -2.152795 -1644.5272 -1603.0634
## 2              log_wage_gap trend   1 -1.915729 -1630.0405 -1574.8239
## 3              log_wage_gap trend   2 -2.032812 -1615.4071 -1546.4724
## 4              log_wage_gap trend   3 -1.895498 -1599.6429 -1517.0248
## 5              log_wage_gap trend   4 -1.879968 -1586.4856 -1490.2194
## 6              log_wage_gap trend   5 -1.851018 -1570.6030 -1460.7239
## 7              log_wage_gap trend   6 -1.801257 -1555.5103 -1432.0539
## 8              log_wage_gap trend   7 -1.606959 -1540.9641 -1403.9661
## 9              log_wage_gap trend   8 -1.444827 -1526.2226 -1375.7191
## 10         log_treasury_gdp trend   0 -0.877057  -632.1951  -590.7313
## 11         log_treasury_gdp trend   1 -1.487884  -639.5084  -584.2918
## 12         log_treasury_gdp trend   2 -1.782800  -632.2816  -563.3468
## 13         log_treasury_gdp trend   3 -2.572763  -644.7672  -562.1492
## 14         log_treasury_gdp trend   4 -3.119296  -644.0367  -547.7705
## 15         log_treasury_gdp trend   5 -3.045354  -648.9133  -539.0342
## 16         log_treasury_gdp trend   6 -2.943507  -636.9720  -513.5156
## 17         log_treasury_gdp trend   7 -2.393376  -628.8569  -491.8589
## 18         log_treasury_gdp trend   8 -2.497627  -623.3850  -472.8815
## 19        log_trade_balance trend   0 -2.110058  -987.0529  -945.5890
## 20        log_trade_balance trend   1 -2.461645  -980.3904  -925.1738
## 21        log_trade_balance trend   2 -2.226866  -969.9012  -900.9665
## 22        log_trade_balance trend   3 -2.436603  -959.7117  -877.0937
## 23        log_trade_balance trend   4 -2.381440  -946.7807  -850.5145
## 24        log_trade_balance trend   5 -2.336825  -933.4958  -823.6167
## 25        log_trade_balance trend   6 -2.654626  -926.9172  -803.4607
## 26        log_trade_balance trend   7 -2.786191  -915.8556  -778.8576
## 27        log_trade_balance trend   8 -2.638566  -902.7240  -752.2205
## 28      log_fdi_outward_gdp trend   0 -3.451794  -474.7437  -433.2799
## 29      log_fdi_outward_gdp trend   1 -3.387438  -463.6518  -408.4352
## 30      log_fdi_outward_gdp trend   2 -3.462563  -453.1305  -384.1958
## 31      log_fdi_outward_gdp trend   3 -3.225247  -442.5004  -359.8824
## 32      log_fdi_outward_gdp trend   4 -3.365638  -432.5517  -336.2855
## 33      log_fdi_outward_gdp trend   5 -3.424761  -421.9654  -312.0863
## 34      log_fdi_outward_gdp trend   6 -3.258453  -410.9269  -287.4704
## 35      log_fdi_outward_gdp trend   7 -2.957231  -400.9779  -263.9799
## 36      log_fdi_outward_gdp trend   8 -2.976957  -390.1059  -239.6024
## 37 log_imports_ind_real_gdp trend   0 -1.777954  -479.4511  -437.9873
## 38 log_imports_ind_real_gdp trend   1 -2.323239  -484.6957  -429.4791
## 39 log_imports_ind_real_gdp trend   2 -2.425845  -475.2361  -406.3013
## 40 log_imports_ind_real_gdp trend   3 -2.251132  -465.6324  -383.0144
## 41 log_imports_ind_real_gdp trend   4 -1.903878  -460.6499  -364.3837
## 42 log_imports_ind_real_gdp trend   5 -1.954196  -450.7028  -340.8237
## 43 log_imports_ind_real_gdp trend   6 -2.204074  -442.7818  -319.3254
## 44 log_imports_ind_real_gdp trend   7 -2.110196  -432.6514  -295.6534
## 45 log_imports_ind_real_gdp trend   8 -2.322061  -429.6479  -279.1444
## 46        log_min_wage_real trend   0 -1.814923 -1027.1857  -985.7219
## 47        log_min_wage_real trend   1 -1.817592 -1015.3303  -960.1137
## 48        log_min_wage_real trend   2 -1.628005 -1002.8295  -933.8947
## 49        log_min_wage_real trend   3 -1.588228  -989.4126  -906.7946
## 50        log_min_wage_real trend   4 -2.926927 -1031.2886  -935.0224
## 51        log_min_wage_real trend   5 -2.706675 -1020.2860  -910.4069
## 52        log_min_wage_real trend   6 -2.764631 -1006.9439  -883.4874
## 53        log_min_wage_real trend   7 -2.860411  -993.9505  -856.9525
## 54        log_min_wage_real trend   8 -2.930262  -984.1421  -833.6386
## 55            log_long_rate trend   0 -2.553984  -357.4551  -315.9913
## 56            log_long_rate trend   1 -3.272950  -373.5768  -318.3602
## 57            log_long_rate trend   2 -2.767409  -367.8754  -298.9406
## 58            log_long_rate trend   3 -2.857832  -358.4412  -275.8232
## 59            log_long_rate trend   4 -3.060612  -349.4439  -253.1777
## 60            log_long_rate trend   5 -3.163618  -339.6914  -229.8123
## 61            log_long_rate trend   6 -3.193413  -330.4749  -207.0185
## 62            log_long_rate trend   7 -2.817786  -321.5077  -184.5097
## 63            log_long_rate trend   8 -2.500949  -313.5662  -163.0627
# -------------------------
# BEST LAG BY AIC
# -------------------------
best_by_AIC_log <- do.call(
  rbind,
  lapply(split(adf_lag_table_log, adf_lag_table_log$series), function(x) x[which.min(x$AIC), ])
)

best_by_AIC_log
##                                            series  type lag  tau_stat
## log_fdi_outward_gdp           log_fdi_outward_gdp trend   0 -3.451794
## log_imports_ind_real_gdp log_imports_ind_real_gdp trend   1 -2.323239
## log_long_rate                       log_long_rate trend   1 -3.272950
## log_min_wage_real               log_min_wage_real trend   4 -2.926927
## log_trade_balance               log_trade_balance trend   0 -2.110058
## log_treasury_gdp                 log_treasury_gdp trend   5 -3.045354
## log_wage_gap                         log_wage_gap trend   0 -2.152795
##                                 AIC        BIC
## log_fdi_outward_gdp       -474.7437  -433.2799
## log_imports_ind_real_gdp  -484.6957  -429.4791
## log_long_rate             -373.5768  -318.3602
## log_min_wage_real        -1031.2886  -935.0224
## log_trade_balance         -987.0529  -945.5890
## log_treasury_gdp          -648.9133  -539.0342
## log_wage_gap             -1644.5272 -1603.0634
# -------------------------
# BEST LAG BY BIC
# -------------------------
best_by_BIC_log <- do.call(
  rbind,
  lapply(split(adf_lag_table_log, adf_lag_table_log$series), function(x) x[which.min(x$BIC), ])
)

best_by_BIC_log
##                                            series  type lag  tau_stat
## log_fdi_outward_gdp           log_fdi_outward_gdp trend   0 -3.451794
## log_imports_ind_real_gdp log_imports_ind_real_gdp trend   0 -1.777954
## log_long_rate                       log_long_rate trend   1 -3.272950
## log_min_wage_real               log_min_wage_real trend   0 -1.814923
## log_trade_balance               log_trade_balance trend   0 -2.110058
## log_treasury_gdp                 log_treasury_gdp trend   0 -0.877057
## log_wage_gap                         log_wage_gap trend   0 -2.152795
##                                 AIC        BIC
## log_fdi_outward_gdp       -474.7437  -433.2799
## log_imports_ind_real_gdp  -479.4511  -437.9873
## log_long_rate             -373.5768  -318.3602
## log_min_wage_real        -1027.1857  -985.7219
## log_trade_balance         -987.0529  -945.5890
## log_treasury_gdp          -632.1951  -590.7313
## log_wage_gap             -1644.5272 -1603.0634
#I will use difference stationary as they are not robust enough even with lags.

ADF Dlog

# =========================
# ADF LAG-LENGTH TABLES (DIFFERENCED LOGGED VARIABLES)
# =========================

library(urca)

max_lag <- 8

make_adf_table <- function(series, series_name, type_adf = c("trend", "drift"), max_lag = 8) {
  type_adf <- match.arg(type_adf)
  
  y <- na.omit(as.numeric(series))
  
  out <- data.frame(
    series = character(),
    type = character(),
    lag = integer(),
    tau_stat = numeric(),
    AIC = numeric(),
    BIC = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (L in 0:max_lag) {
    fit <- ur.df(y, type = type_adf, lags = L, selectlags = "Fixed")
    
    tau_stat <- as.numeric(fit@teststat[1])
    
    res <- residuals(fit@testreg)
    n <- length(res)
    k <- length(coef(fit@testreg))
    sigma2 <- sum(res^2) / n
    
    logLik_val <- -n/2 * (log(2*pi) + log(sigma2) + 1)
    
    AIC_val <- -2*logLik_val + 2*k
    BIC_val <- -2*logLik_val + log(n)*k
    
    out <- rbind(
      out,
      data.frame(
        series = series_name,
        type = type_adf,
        lag = L,
        tau_stat = tau_stat,
        AIC = AIC_val,
        BIC = BIC_val,
        stringsAsFactors = FALSE
      )
    )
  }
  
  out
}

# -------------------------
# BUILD TABLES
# -------------------------

tab_dlog_wage_gap    <- make_adf_table(d_log_wage_gap, "d_log_wage_gap", "drift", max_lag)
tab_dlog_treasury    <- make_adf_table(d_log_treasury_gdp, "d_log_treasury_gdp", "drift", max_lag)
tab_dlog_trade       <- make_adf_table(d_log_trade_balance, "d_log_log_trade_balance", "drift", max_lag)
tab_dlog_fdi         <- make_adf_table(d_log_fdi_outward_gdp, "d_log_fdi_outward_gdp", "drift", max_lag)
tab_dlog_imports     <- make_adf_table(d_log_imports_ind_real_gdp, "d_log_imports_ind_real_gdp", "drift", max_lag)
tab_dlog_minwage     <- make_adf_table(d_log_min_wage_real, "d_log_min_wage_real", "drift", max_lag)
tab_dlog_longrate    <- make_adf_table(d_log_long_rate, "d_log_long_rate", "drift", max_lag)

adf_lag_table_dlog <- rbind(
  tab_dlog_wage_gap,
  tab_dlog_treasury,
  tab_dlog_trade,
  tab_dlog_fdi,
  tab_dlog_imports,
  tab_dlog_minwage,
  tab_dlog_longrate
)

adf_lag_table_dlog
##                        series  type lag   tau_stat        AIC        BIC
## 1              d_log_wage_gap drift   0 -16.797359 -1642.1847 -1614.5764
## 2              d_log_wage_gap drift   1 -10.697666 -1627.0257 -1585.6649
## 3              d_log_wage_gap drift   2  -9.226296 -1611.7481 -1556.6695
## 4              d_log_wage_gap drift   3  -8.096398 -1598.7755 -1530.0140
## 5              d_log_wage_gap drift   4  -7.292272 -1583.0089 -1500.5995
## 6              d_log_wage_gap drift   5  -6.565813 -1568.0048 -1471.9832
## 7              d_log_wage_gap drift   6  -6.487873 -1554.0093 -1444.4109
## 8              d_log_wage_gap drift   7  -6.371046 -1539.6252 -1416.4859
## 9              d_log_wage_gap drift   8  -5.101409 -1529.3345 -1392.6904
## 10         d_log_treasury_gdp drift   0 -11.356198  -650.6504  -623.0421
## 11         d_log_treasury_gdp drift   1  -7.911956  -643.0935  -601.7327
## 12         d_log_treasury_gdp drift   2  -5.218183  -653.2464  -598.1677
## 13         d_log_treasury_gdp drift   3  -4.502470  -648.9344  -580.1729
## 14         d_log_treasury_gdp drift   4  -5.204037  -652.5928  -570.1834
## 15         d_log_treasury_gdp drift   5  -4.900130  -641.5546  -545.5329
## 16         d_log_treasury_gdp drift   6  -5.138738  -636.7122  -527.1138
## 17         d_log_treasury_gdp drift   7  -5.249132  -629.4731  -506.3338
## 18         d_log_treasury_gdp drift   8  -5.345472  -620.4230  -483.7790
## 19    d_log_log_trade_balance drift   0 -13.096281  -989.7602  -962.1519
## 20    d_log_log_trade_balance drift   1 -10.495544  -980.5509  -939.1900
## 21    d_log_log_trade_balance drift   2  -8.164372  -969.2259  -914.1473
## 22    d_log_log_trade_balance drift   3  -7.463667  -956.4267  -887.6651
## 23    d_log_log_trade_balance drift   4  -6.848674  -943.2919  -860.8826
## 24    d_log_log_trade_balance drift   5  -5.375662  -935.3624  -839.3407
## 25    d_log_log_trade_balance drift   6  -4.779512  -923.6881  -814.0897
## 26    d_log_log_trade_balance drift   7  -4.806531  -911.3541  -788.2148
## 27    d_log_log_trade_balance drift   8  -4.568558  -898.6340  -761.9900
## 28      d_log_fdi_outward_gdp drift   0 -15.806760  -468.2576  -440.6493
## 29      d_log_fdi_outward_gdp drift   1 -10.894188  -457.1867  -415.8259
## 30      d_log_fdi_outward_gdp drift   2  -9.621649  -448.0581  -392.9794
## 31      d_log_fdi_outward_gdp drift   3  -7.891300  -437.1507  -368.3891
## 32      d_log_fdi_outward_gdp drift   4  -6.979042  -426.1148  -343.7055
## 33      d_log_fdi_outward_gdp drift   5  -6.740719  -416.1221  -320.1004
## 34      d_log_fdi_outward_gdp drift   6  -6.835531  -408.0002  -298.4018
## 35      d_log_fdi_outward_gdp drift   7  -6.230063  -396.9641  -273.8249
## 36      d_log_fdi_outward_gdp drift   8  -6.176452  -387.2809  -250.6369
## 37 d_log_imports_ind_real_gdp drift   0 -11.784313  -492.8260  -465.2177
## 38 d_log_imports_ind_real_gdp drift   1  -9.511505  -482.3944  -441.0336
## 39 d_log_imports_ind_real_gdp drift   2  -7.867634  -474.2596  -419.1809
## 40 d_log_imports_ind_real_gdp drift   3  -8.239854  -470.0969  -401.3353
## 41 d_log_imports_ind_real_gdp drift   4  -7.409954  -459.4572  -377.0479
## 42 d_log_imports_ind_real_gdp drift   5  -5.955298  -450.7682  -354.7465
## 43 d_log_imports_ind_real_gdp drift   6  -5.890910  -440.6498  -331.0514
## 44 d_log_imports_ind_real_gdp drift   7  -6.011235  -434.8993  -311.7600
## 45 d_log_imports_ind_real_gdp drift   8  -5.496943  -433.7182  -297.0741
## 46        d_log_min_wage_real drift   0 -15.572182 -1027.8304 -1000.2221
## 47        d_log_min_wage_real drift   1 -11.709082 -1015.9080  -974.5472
## 48        d_log_min_wage_real drift   2  -9.359536 -1002.5671  -947.4884
## 49        d_log_min_wage_real drift   3  -5.433695 -1038.6180  -969.8564
## 50        d_log_min_wage_real drift   4  -5.781048 -1028.8107  -946.4014
## 51        d_log_min_wage_real drift   5  -5.374110 -1015.1140  -919.0923
## 52        d_log_min_wage_real drift   6  -4.917457 -1001.5437  -891.9453
## 53        d_log_min_wage_real drift   7  -4.298576  -991.2804  -868.1412
## 54        d_log_min_wage_real drift   8  -4.149236  -978.3714  -841.7274
## 55            d_log_long_rate drift   0 -11.125097  -378.8926  -351.2843
## 56            d_log_long_rate drift   1 -10.730823  -376.1560  -334.7952
## 57            d_log_long_rate drift   2  -8.344999  -366.1991  -311.1204
## 58            d_log_long_rate drift   3  -6.938223  -355.9738  -287.2122
## 59            d_log_long_rate drift   4  -6.117807  -345.5475  -263.1382
## 60            d_log_long_rate drift   5  -5.952598  -336.0811  -240.0594
## 61            d_log_long_rate drift   6  -6.247350  -329.3454  -219.7470
## 62            d_log_long_rate drift   7  -6.591986  -323.0809  -199.9416
## 63            d_log_long_rate drift   8  -6.715372  -315.3126  -178.6686
# -------------------------
# BEST LAG BY AIC
# -------------------------
best_by_AIC_dlog <- do.call(
  rbind,
  lapply(split(adf_lag_table_dlog, adf_lag_table_dlog$series), function(x) x[which.min(x$AIC), ])
)

best_by_AIC_dlog
##                                                series  type lag   tau_stat
## d_log_fdi_outward_gdp           d_log_fdi_outward_gdp drift   0 -15.806760
## d_log_imports_ind_real_gdp d_log_imports_ind_real_gdp drift   0 -11.784313
## d_log_log_trade_balance       d_log_log_trade_balance drift   0 -13.096281
## d_log_long_rate                       d_log_long_rate drift   0 -11.125097
## d_log_min_wage_real               d_log_min_wage_real drift   3  -5.433695
## d_log_treasury_gdp                 d_log_treasury_gdp drift   2  -5.218183
## d_log_wage_gap                         d_log_wage_gap drift   0 -16.797359
##                                   AIC        BIC
## d_log_fdi_outward_gdp       -468.2576  -440.6493
## d_log_imports_ind_real_gdp  -492.8260  -465.2177
## d_log_log_trade_balance     -989.7602  -962.1519
## d_log_long_rate             -378.8926  -351.2843
## d_log_min_wage_real        -1038.6180  -969.8564
## d_log_treasury_gdp          -653.2464  -598.1677
## d_log_wage_gap             -1642.1847 -1614.5764
# -------------------------
# BEST LAG BY BIC
# -------------------------
best_by_BIC_dlog <- do.call(
  rbind,
  lapply(split(adf_lag_table_dlog, adf_lag_table_dlog$series), function(x) x[which.min(x$BIC), ])
)

best_by_BIC_dlog
##                                                series  type lag  tau_stat
## d_log_fdi_outward_gdp           d_log_fdi_outward_gdp drift   0 -15.80676
## d_log_imports_ind_real_gdp d_log_imports_ind_real_gdp drift   0 -11.78431
## d_log_log_trade_balance       d_log_log_trade_balance drift   0 -13.09628
## d_log_long_rate                       d_log_long_rate drift   0 -11.12510
## d_log_min_wage_real               d_log_min_wage_real drift   0 -15.57218
## d_log_treasury_gdp                 d_log_treasury_gdp drift   0 -11.35620
## d_log_wage_gap                         d_log_wage_gap drift   0 -16.79736
##                                   AIC        BIC
## d_log_fdi_outward_gdp       -468.2576  -440.6493
## d_log_imports_ind_real_gdp  -492.8260  -465.2177
## d_log_log_trade_balance     -989.7602  -962.1519
## d_log_long_rate             -378.8926  -351.2843
## d_log_min_wage_real        -1027.8304 -1000.2221
## d_log_treasury_gdp          -650.6504  -623.0421
## d_log_wage_gap             -1642.1847 -1614.5764

##Baseline

library(urca)

# -------------------------
# Engle-Granger helper
# -------------------------
run_eg_test <- function(formula, data, model_name, max_lag = 8) {
  
  # step 1: long-run regression
  long_run <- lm(formula, data = data)
  uhat <- residuals(long_run)
  
  # step 2: ADF on residuals, no deterministics
  out <- data.frame(
    model = character(),
    lag = integer(),
    tau_stat = numeric(),
    AIC = numeric(),
    BIC = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (L in 0:max_lag) {
    fit <- ur.df(uhat, type = "none", lags = L, selectlags = "Fixed")
    
    tau_stat <- as.numeric(fit@teststat[1])
    res <- residuals(fit@testreg)
    n <- length(res)
    k <- length(coef(fit@testreg))
    sigma2 <- sum(res^2) / n
    
    logLik_val <- -n/2 * (log(2*pi) + log(sigma2) + 1)
    AIC_val <- -2*logLik_val + 2*k
    BIC_val <- -2*logLik_val + log(n)*k
    
    out <- rbind(
      out,
      data.frame(
        model = model_name,
        lag = L,
        tau_stat = tau_stat,
        AIC = AIC_val,
        BIC = BIC_val,
        stringsAsFactors = FALSE
      )
    )
  }
  
  best_AIC <- out[which.min(out$AIC), ]
  best_BIC <- out[which.min(out$BIC), ]
  
  list(
    long_run = long_run,
    resid = uhat,
    lag_table = out,
    best_AIC = best_AIC,
    best_BIC = best_BIC
  )
}

# -------------------------
# Baseline model
# -------------------------
eg_baseline <- run_eg_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real
  ),
  model_name = "baseline",
  max_lag = 8
)

summary(eg_baseline$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.121463 -0.023560  0.003558  0.029427  0.127988 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -0.040972   0.090631  -0.452    0.652    
## log_treasury_gdp   0.127807   0.004602  27.773  < 2e-16 ***
## log_trade_balance -0.127181   0.030401  -4.183 4.08e-05 ***
## log_min_wage_real -0.247699   0.035375  -7.002 2.72e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04563 on 231 degrees of freedom
## Multiple R-squared:  0.8866, Adjusted R-squared:  0.8852 
## F-statistic: 602.2 on 3 and 231 DF,  p-value: < 2.2e-16
eg_baseline$lag_table
##      model lag  tau_stat       AIC       BIC
## 1 baseline   0 -2.175216 -1391.764 -1377.943
## 2 baseline   1 -2.600341 -1384.724 -1357.116
## 3 baseline   2 -2.420255 -1370.938 -1329.577
## 4 baseline   3 -2.684569 -1360.566 -1305.487
## 5 baseline   4 -3.650744 -1373.498 -1304.736
## 6 baseline   5 -3.937740 -1366.675 -1284.265
## 7 baseline   6 -3.977723 -1354.678 -1258.656
## 8 baseline   7 -3.899353 -1343.107 -1233.509
## 9 baseline   8 -3.781179 -1328.532 -1205.393
eg_baseline$best_AIC
##      model lag  tau_stat       AIC       BIC
## 1 baseline   0 -2.175216 -1391.764 -1377.943
eg_baseline$best_BIC
##      model lag  tau_stat       AIC       BIC
## 1 baseline   0 -2.175216 -1391.764 -1377.943

Pathway 1

eg_pathway1 <- run_eg_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real + log_imports_ind_real_gdp,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_imports_ind_real_gdp
  ),
  model_name = "pathway1_imports",
  max_lag = 8
)

summary(eg_pathway1$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.107789 -0.028306  0.004052  0.028663  0.129872 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.005416   0.094756   0.057  0.95447    
## log_treasury_gdp          0.118547   0.007334  16.164  < 2e-16 ***
## log_trade_balance        -0.101697   0.034145  -2.978  0.00321 ** 
## log_min_wage_real        -0.246444   0.035260  -6.989 2.96e-11 ***
## log_imports_ind_real_gdp  0.015341   0.009481   1.618  0.10703    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04547 on 230 degrees of freedom
## Multiple R-squared:  0.8879, Adjusted R-squared:  0.886 
## F-statistic: 455.5 on 4 and 230 DF,  p-value: < 2.2e-16
eg_pathway1$lag_table
##              model lag  tau_stat       AIC       BIC
## 1 pathway1_imports   0 -2.120379 -1414.749 -1400.928
## 2 pathway1_imports   1 -2.452471 -1404.913 -1377.305
## 3 pathway1_imports   2 -2.301435 -1390.646 -1349.285
## 4 pathway1_imports   3 -2.548091 -1381.463 -1326.384
## 5 pathway1_imports   4 -3.524171 -1394.267 -1325.506
## 6 pathway1_imports   5 -3.878580 -1388.622 -1306.212
## 7 pathway1_imports   6 -3.893440 -1375.776 -1279.754
## 8 pathway1_imports   7 -3.700502 -1363.456 -1253.858
## 9 pathway1_imports   8 -3.644576 -1348.845 -1225.706
eg_pathway1$best_AIC
##              model lag  tau_stat       AIC       BIC
## 1 pathway1_imports   0 -2.120379 -1414.749 -1400.928
eg_pathway1$best_BIC
##              model lag  tau_stat       AIC       BIC
## 1 pathway1_imports   0 -2.120379 -1414.749 -1400.928

##Pathway 2

eg_pathway2 <- run_eg_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real + log_long_rate,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_long_rate
  ),
  model_name = "pathway2_longrate",
  max_lag = 8
)

summary(eg_pathway2$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.119299 -0.021536  0.001851  0.026837  0.086717 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -0.178064   0.083479  -2.133    0.034 *  
## log_treasury_gdp   0.093449   0.006178  15.127  < 2e-16 ***
## log_trade_balance -0.146187   0.027438  -5.328 2.36e-07 ***
## log_min_wage_real -0.297774   0.032486  -9.166  < 2e-16 ***
## log_long_rate     -0.056192   0.007506  -7.486 1.50e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.041 on 230 degrees of freedom
## Multiple R-squared:  0.9088, Adjusted R-squared:  0.9073 
## F-statistic: 573.3 on 4 and 230 DF,  p-value: < 2.2e-16
eg_pathway2$lag_table
##               model lag  tau_stat       AIC       BIC
## 1 pathway2_longrate   0 -2.465703 -1341.207 -1327.386
## 2 pathway2_longrate   1 -3.124985 -1339.214 -1311.605
## 3 pathway2_longrate   2 -2.800292 -1326.352 -1284.991
## 4 pathway2_longrate   3 -3.115943 -1314.884 -1259.805
## 5 pathway2_longrate   4 -3.734610 -1319.604 -1250.842
## 6 pathway2_longrate   5 -3.587004 -1308.218 -1225.808
## 7 pathway2_longrate   6 -3.871531 -1298.557 -1202.535
## 8 pathway2_longrate   7 -4.099868 -1286.729 -1177.130
## 9 pathway2_longrate   8 -3.776943 -1272.270 -1149.131
eg_pathway2$best_AIC
##               model lag  tau_stat       AIC       BIC
## 1 pathway2_longrate   0 -2.465703 -1341.207 -1327.386
eg_pathway2$best_BIC
##               model lag  tau_stat       AIC       BIC
## 1 pathway2_longrate   0 -2.465703 -1341.207 -1327.386

##Full

eg_optional <- run_eg_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_imports_ind_real_gdp + log_long_rate,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_imports_ind_real_gdp,
    log_long_rate
  ),
  model_name = "optional_both_pathways",
  max_lag = 8
)

summary(eg_optional$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.10205 -0.02525  0.00067  0.02572  0.06672 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              -0.036903   0.074346  -0.496   0.6201    
## log_treasury_gdp          0.020792   0.009937   2.092   0.0375 *  
## log_trade_balance        -0.028065   0.027448  -1.022   0.3076    
## log_min_wage_real        -0.327362   0.028437 -11.512  < 2e-16 ***
## log_imports_ind_real_gdp  0.079350   0.009132   8.690 7.04e-16 ***
## log_long_rate            -0.096682   0.008017 -12.060  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03564 on 229 degrees of freedom
## Multiple R-squared:  0.9314, Adjusted R-squared:  0.9299 
## F-statistic: 622.3 on 5 and 229 DF,  p-value: < 2.2e-16
eg_optional$lag_table
##                    model lag  tau_stat       AIC       BIC
## 1 optional_both_pathways   0 -2.899023 -1332.170 -1318.349
## 2 optional_both_pathways   1 -3.375103 -1324.764 -1297.155
## 3 optional_both_pathways   2 -3.185287 -1310.228 -1268.867
## 4 optional_both_pathways   3 -3.525251 -1299.067 -1243.988
## 5 optional_both_pathways   4 -3.812198 -1292.672 -1223.911
## 6 optional_both_pathways   5 -3.194575 -1284.557 -1202.147
## 7 optional_both_pathways   6 -3.293345 -1271.191 -1175.170
## 8 optional_both_pathways   7 -3.156587 -1256.384 -1146.785
## 9 optional_both_pathways   8 -3.332634 -1243.593 -1120.454
eg_optional$best_AIC
##                    model lag  tau_stat      AIC       BIC
## 1 optional_both_pathways   0 -2.899023 -1332.17 -1318.349
eg_optional$best_BIC
##                    model lag  tau_stat      AIC       BIC
## 1 optional_both_pathways   0 -2.899023 -1332.17 -1318.349

Residual testing

library(urca)

make_resid_adf_table <- function(resid_series, model_name, max_lag = 8) {
  y <- na.omit(as.numeric(resid_series))
  
  out <- data.frame(
    model = character(),
    lag = integer(),
    tau_stat = numeric(),
    AIC = numeric(),
    BIC = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (L in 0:max_lag) {
    fit <- ur.df(y, type = "none", lags = L, selectlags = "Fixed")
    
    tau_stat <- as.numeric(fit@teststat[1])
    res <- residuals(fit@testreg)
    n <- length(res)
    k <- length(coef(fit@testreg))
    sigma2 <- sum(res^2) / n
    
    logLik_val <- -n/2 * (log(2*pi) + log(sigma2) + 1)
    AIC_val <- -2*logLik_val + 2*k
    BIC_val <- -2*logLik_val + log(n)*k
    
    out <- rbind(
      out,
      data.frame(
        model = model_name,
        lag = L,
        tau_stat = tau_stat,
        AIC = AIC_val,
        BIC = BIC_val,
        stringsAsFactors = FALSE
      )
    )
  }
  
  out
}

resid_baseline <- residuals(eg_baseline$long_run)
resid_pathway1 <- residuals(eg_pathway1$long_run)
resid_pathway2 <- residuals(eg_pathway2$long_run)
resid_optional <- residuals(eg_optional$long_run)

tab_resid_baseline <- make_resid_adf_table(resid_baseline, "baseline", max_lag = 8)
tab_resid_pathway1 <- make_resid_adf_table(resid_pathway1, "pathway1_imports", max_lag = 8)
tab_resid_pathway2 <- make_resid_adf_table(resid_pathway2, "pathway2_longrate", max_lag = 8)
tab_resid_optional <- make_resid_adf_table(resid_optional, "optional_both", max_lag = 8)

eg_resid_table <- rbind(
  tab_resid_baseline,
  tab_resid_pathway1,
  tab_resid_pathway2,
  tab_resid_optional
)

eg_resid_table
##                model lag  tau_stat       AIC       BIC
## 1           baseline   0 -2.175216 -1391.764 -1377.943
## 2           baseline   1 -2.600341 -1384.724 -1357.116
## 3           baseline   2 -2.420255 -1370.938 -1329.577
## 4           baseline   3 -2.684569 -1360.566 -1305.487
## 5           baseline   4 -3.650744 -1373.498 -1304.736
## 6           baseline   5 -3.937740 -1366.675 -1284.265
## 7           baseline   6 -3.977723 -1354.678 -1258.656
## 8           baseline   7 -3.899353 -1343.107 -1233.509
## 9           baseline   8 -3.781179 -1328.532 -1205.393
## 10  pathway1_imports   0 -2.120379 -1414.749 -1400.928
## 11  pathway1_imports   1 -2.452471 -1404.913 -1377.305
## 12  pathway1_imports   2 -2.301435 -1390.646 -1349.285
## 13  pathway1_imports   3 -2.548091 -1381.463 -1326.384
## 14  pathway1_imports   4 -3.524171 -1394.267 -1325.506
## 15  pathway1_imports   5 -3.878580 -1388.622 -1306.212
## 16  pathway1_imports   6 -3.893440 -1375.776 -1279.754
## 17  pathway1_imports   7 -3.700502 -1363.456 -1253.858
## 18  pathway1_imports   8 -3.644576 -1348.845 -1225.706
## 19 pathway2_longrate   0 -2.465703 -1341.207 -1327.386
## 20 pathway2_longrate   1 -3.124985 -1339.214 -1311.605
## 21 pathway2_longrate   2 -2.800292 -1326.352 -1284.991
## 22 pathway2_longrate   3 -3.115943 -1314.884 -1259.805
## 23 pathway2_longrate   4 -3.734610 -1319.604 -1250.842
## 24 pathway2_longrate   5 -3.587004 -1308.218 -1225.808
## 25 pathway2_longrate   6 -3.871531 -1298.557 -1202.535
## 26 pathway2_longrate   7 -4.099868 -1286.729 -1177.130
## 27 pathway2_longrate   8 -3.776943 -1272.270 -1149.131
## 28     optional_both   0 -2.899023 -1332.170 -1318.349
## 29     optional_both   1 -3.375103 -1324.764 -1297.155
## 30     optional_both   2 -3.185287 -1310.228 -1268.867
## 31     optional_both   3 -3.525251 -1299.067 -1243.988
## 32     optional_both   4 -3.812198 -1292.672 -1223.911
## 33     optional_both   5 -3.194575 -1284.557 -1202.147
## 34     optional_both   6 -3.293345 -1271.191 -1175.170
## 35     optional_both   7 -3.156587 -1256.384 -1146.785
## 36     optional_both   8 -3.332634 -1243.593 -1120.454
best_resid_AIC <- do.call(
  rbind,
  lapply(split(eg_resid_table, eg_resid_table$model), function(x) x[which.min(x$AIC), ])
)

best_resid_BIC <- do.call(
  rbind,
  lapply(split(eg_resid_table, eg_resid_table$model), function(x) x[which.min(x$BIC), ])
)

best_resid_AIC
##                               model lag  tau_stat       AIC       BIC
## baseline                   baseline   0 -2.175216 -1391.764 -1377.943
## optional_both         optional_both   0 -2.899023 -1332.170 -1318.349
## pathway1_imports   pathway1_imports   0 -2.120379 -1414.749 -1400.928
## pathway2_longrate pathway2_longrate   0 -2.465703 -1341.207 -1327.386
best_resid_BIC
##                               model lag  tau_stat       AIC       BIC
## baseline                   baseline   0 -2.175216 -1391.764 -1377.943
## optional_both         optional_both   0 -2.899023 -1332.170 -1318.349
## pathway1_imports   pathway1_imports   0 -2.120379 -1414.749 -1400.928
## pathway2_longrate pathway2_longrate   0 -2.465703 -1341.207 -1327.386
eg_critical_values <- data.frame(
  n_variables = c(2, 3, 4, 5),
  cv_1pct = c(-3.96, -4.36, -4.73, -5.07),
  cv_5pct = c(-3.41, -3.80, -4.16, -4.49),
  cv_10pct = c(-3.12, -3.52, -3.84, -4.20)
)

eg_critical_values
##   n_variables cv_1pct cv_5pct cv_10pct
## 1           2   -3.96   -3.41    -3.12
## 2           3   -4.36   -3.80    -3.52
## 3           4   -4.73   -4.16    -3.84
## 4           5   -5.07   -4.49    -4.20
# =========================
# DLOG REGRESSIONS
# =========================
reg_dlog <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance,
  d_log_min_wage_real,
  d_log_imports_ind_real_gdp,
  d_log_long_rate
))
# baseline
mod_dlog_baseline <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + d_log_min_wage_real,
  data = reg_dlog
)

# pathway 1
mod_dlog_pathway1 <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_imports_ind_real_gdp,
  data = reg_dlog
)

# pathway 2
mod_dlog_pathway2 <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_long_rate,
  data = reg_dlog
)

# optional
mod_dlog_optional <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_imports_ind_real_gdp + d_log_long_rate,
  data = reg_dlog
)

summary(mod_dlog_baseline)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real, data = reg_dlog)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.018770 -0.004493 -0.000197  0.004490  0.035728 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.0016453  0.0004597   3.579  0.00042 ***
## d_log_treasury_gdp   0.0097489  0.0075370   1.293  0.19714    
## d_log_trade_balance -0.0019852  0.0161433  -0.123  0.90223    
## d_log_min_wage_real -0.0237185  0.0175976  -1.348  0.17904    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006921 on 230 degrees of freedom
## Multiple R-squared:  0.01535,    Adjusted R-squared:  0.002508 
## F-statistic: 1.195 on 3 and 230 DF,  p-value: 0.3123
summary(mod_dlog_pathway1)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_imports_ind_real_gdp, data = reg_dlog)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.019089 -0.004314 -0.000261  0.004415  0.034008 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.0017346  0.0004629   3.747 0.000226 ***
## d_log_treasury_gdp          0.0091665  0.0075312   1.217 0.224801    
## d_log_trade_balance         0.0013270  0.0162736   0.082 0.935080    
## d_log_min_wage_real        -0.0221815  0.0175911  -1.261 0.208610    
## d_log_imports_ind_real_gdp -0.0078086  0.0054736  -1.427 0.155060    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006906 on 229 degrees of freedom
## Multiple R-squared:  0.02402,    Adjusted R-squared:  0.006977 
## F-statistic: 1.409 on 4 and 229 DF,  p-value: 0.2317
summary(mod_dlog_pathway2)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_long_rate, data = reg_dlog)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0211883 -0.0041872  0.0000062  0.0043433  0.0297981 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.0016837  0.0004565   3.689 0.000282 ***
## d_log_treasury_gdp   0.0055615  0.0077295   0.720 0.472561    
## d_log_trade_balance -0.0017672  0.0160189  -0.110 0.912254    
## d_log_min_wage_real -0.0244248  0.0174647  -1.399 0.163308    
## d_log_long_rate     -0.0091641  0.0042739  -2.144 0.033069 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006868 on 229 degrees of freedom
## Multiple R-squared:  0.03473,    Adjusted R-squared:  0.01787 
## F-statistic:  2.06 on 4 and 229 DF,  p-value: 0.08693
summary(mod_dlog_optional)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_imports_ind_real_gdp + d_log_long_rate, 
##     data = reg_dlog)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0210582 -0.0043979 -0.0002173  0.0046279  0.0295994 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 1.728e-03  4.608e-04   3.750 0.000224 ***
## d_log_treasury_gdp          5.770e-03  7.742e-03   0.745 0.456859    
## d_log_trade_balance         3.561e-05  1.622e-02   0.002 0.998250    
## d_log_min_wage_real        -2.349e-02  1.753e-02  -1.340 0.181589    
## d_log_imports_ind_real_gdp -4.315e-03  5.800e-03  -0.744 0.457658    
## d_log_long_rate            -8.003e-03  4.554e-03  -1.757 0.080191 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006875 on 228 degrees of freedom
## Multiple R-squared:  0.03707,    Adjusted R-squared:  0.01595 
## F-statistic: 1.755 on 5 and 228 DF,  p-value: 0.123

##HAC

# =========================
# HAC STANDARD ERRORS
# =========================

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(sandwich)

coeftest(mod_dlog_baseline, vcov = NeweyWest(mod_dlog_baseline, lag = 4, prewhite = FALSE))
## 
## t test of coefficients:
## 
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.0016453  0.0004105  4.0081 8.27e-05 ***
## d_log_treasury_gdp   0.0097489  0.0091292  1.0679   0.2867    
## d_log_trade_balance -0.0019852  0.0173409 -0.1145   0.9090    
## d_log_min_wage_real -0.0237185  0.0220894 -1.0738   0.2841    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(mod_dlog_pathway1, vcov = NeweyWest(mod_dlog_pathway1, lag = 4, prewhite = FALSE))
## 
## t test of coefficients:
## 
##                               Estimate  Std. Error t value  Pr(>|t|)    
## (Intercept)                 0.00173465  0.00042367  4.0943 5.873e-05 ***
## d_log_treasury_gdp          0.00916654  0.00898214  1.0205    0.3086    
## d_log_trade_balance         0.00132703  0.01724654  0.0769    0.9387    
## d_log_min_wage_real        -0.02218153  0.02194877 -1.0106    0.3133    
## d_log_imports_ind_real_gdp -0.00780855  0.00564564 -1.3831    0.1680    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(mod_dlog_pathway2, vcov = NeweyWest(mod_dlog_pathway2, lag = 4, prewhite = FALSE))
## 
## t test of coefficients:
## 
##                        Estimate  Std. Error t value Pr(>|t|)    
## (Intercept)          0.00168371  0.00041997  4.0091 8.25e-05 ***
## d_log_treasury_gdp   0.00556146  0.00881407  0.6310  0.52869    
## d_log_trade_balance -0.00176716  0.01711402 -0.1033  0.91785    
## d_log_min_wage_real -0.02442475  0.02171936 -1.1246  0.26195    
## d_log_long_rate     -0.00916406  0.00524167 -1.7483  0.08175 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(mod_dlog_optional, vcov = NeweyWest(mod_dlog_optional, lag = 4, prewhite = FALSE))
## 
## t test of coefficients:
## 
##                               Estimate  Std. Error t value  Pr(>|t|)    
## (Intercept)                 1.7282e-03  4.2553e-04  4.0613 6.713e-05 ***
## d_log_treasury_gdp          5.7702e-03  8.8133e-03  0.6547    0.5133    
## d_log_trade_balance         3.5609e-05  1.7143e-02  0.0021    0.9983    
## d_log_min_wage_real        -2.3486e-02  2.1612e-02 -1.0867    0.2783    
## d_log_imports_ind_real_gdp -4.3151e-03  4.6677e-03 -0.9245    0.3562    
## d_log_long_rate            -8.0029e-03  5.0767e-03 -1.5764    0.1163    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Diagnostics

# =========================
# DIAGNOSTICS
# =========================

library(lmtest)

# Breusch-Godfrey
bgtest(mod_dlog_baseline, order = 4)
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  mod_dlog_baseline
## LM test = 4.0131, df = 4, p-value = 0.4042
bgtest(mod_dlog_pathway1, order = 4)
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  mod_dlog_pathway1
## LM test = 3.8627, df = 4, p-value = 0.4249
bgtest(mod_dlog_pathway2, order = 4)
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  mod_dlog_pathway2
## LM test = 3.7884, df = 4, p-value = 0.4354
bgtest(mod_dlog_optional, order = 4)
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  mod_dlog_optional
## LM test = 3.7443, df = 4, p-value = 0.4417
# Ljung-Box on residuals
Box.test(residuals(mod_dlog_baseline), lag = 12, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(mod_dlog_baseline)
## X-squared = 11.453, df = 12, p-value = 0.4905
Box.test(residuals(mod_dlog_pathway1), lag = 12, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(mod_dlog_pathway1)
## X-squared = 11.052, df = 12, p-value = 0.5245
Box.test(residuals(mod_dlog_pathway2), lag = 12, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(mod_dlog_pathway2)
## X-squared = 10.997, df = 12, p-value = 0.5292
Box.test(residuals(mod_dlog_optional), lag = 12, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(mod_dlog_optional)
## X-squared = 10.847, df = 12, p-value = 0.542
# Breusch-Pagan
bptest(mod_dlog_baseline)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_baseline
## BP = 2.3744, df = 3, p-value = 0.4984
bptest(mod_dlog_pathway1)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_pathway1
## BP = 4.5526, df = 4, p-value = 0.3364
bptest(mod_dlog_pathway2)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_pathway2
## BP = 22.799, df = 4, p-value = 0.0001389
bptest(mod_dlog_optional)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_optional
## BP = 22.981, df = 5, p-value = 0.0003404
# White-type using fitted values
bptest(mod_dlog_baseline, ~ fitted(mod_dlog_baseline) + I(fitted(mod_dlog_baseline)^2))
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_baseline
## BP = 1.4545, df = 2, p-value = 0.4832
bptest(mod_dlog_pathway1, ~ fitted(mod_dlog_pathway1) + I(fitted(mod_dlog_pathway1)^2))
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_pathway1
## BP = 12.784, df = 2, p-value = 0.001675
bptest(mod_dlog_pathway2, ~ fitted(mod_dlog_pathway2) + I(fitted(mod_dlog_pathway2)^2))
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_pathway2
## BP = 91.068, df = 2, p-value < 2.2e-16
bptest(mod_dlog_optional, ~ fitted(mod_dlog_optional) + I(fitted(mod_dlog_optional)^2))
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_dlog_optional
## BP = 86.431, df = 2, p-value < 2.2e-16
# RESET
resettest(mod_dlog_baseline, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_baseline
## RESET = 2.9059, df1 = 2, df2 = 228, p-value = 0.05673
resettest(mod_dlog_pathway1, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_pathway1
## RESET = 2.5092, df1 = 2, df2 = 227, p-value = 0.08359
resettest(mod_dlog_pathway2, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_pathway2
## RESET = 10.571, df1 = 2, df2 = 227, p-value = 4.079e-05
resettest(mod_dlog_optional, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_optional
## RESET = 10.382, df1 = 2, df2 = 226, p-value = 4.857e-05

Resid ACF/PACF

par(mfrow = c(2, 2))
acf(residuals(mod_dlog_baseline), main = "ACF Residuals: Baseline")
pacf(residuals(mod_dlog_baseline), main = "PACF Residuals: Baseline")
acf(residuals(mod_dlog_pathway2), main = "ACF Residuals: Pathway 2")
pacf(residuals(mod_dlog_pathway2), main = "PACF Residuals: Pathway 2")

par(mfrow = c(1, 1))
# =========================
# SMALL VAR IN DLOGS
# =========================

library(vars)
## Loading required package: MASS
## Loading required package: strucchange
var_data_core <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance
))

# lag selection
VARselect(var_data_core, lag.max = 8, type = "const")
## $selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      3      1      1      3 
## 
## $criteria
##                    1             2             3             4             5
## AIC(n) -2.284465e+01 -2.283257e+01 -2.287066e+01 -2.281672e+01 -2.277210e+01
## HQ(n)  -2.277136e+01 -2.270431e+01 -2.268742e+01 -2.257851e+01 -2.247892e+01
## SC(n)  -2.266303e+01 -2.251474e+01 -2.241660e+01 -2.222645e+01 -2.204562e+01
## FPE(n)  1.198665e-10  1.213293e-10  1.168087e-10  1.233075e-10  1.289763e-10
##                    6             7             8
## AIC(n) -2.273886e+01 -2.272943e+01 -2.271741e+01
## HQ(n)  -2.239071e+01 -2.232631e+01 -2.225931e+01
## SC(n)  -2.187616e+01 -2.173052e+01 -2.158227e+01
## FPE(n)  1.334006e-10  1.347531e-10  1.365025e-10
# choose lag, for example p = 1 or whatever AIC/BIC suggests
p_var <- 1

var_core <- VAR(var_data_core, p = p_var, type = "const")
summary(var_core)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: d_log_wage_gap, d_log_treasury_gdp, d_log_trade_balance 
## Deterministic variables: const 
## Sample size: 233 
## Log Likelihood: 1670.839 
## Roots of the characteristic polynomial:
## 0.2144 0.2144 0.08168
## Call:
## VAR(y = var_data_core, p = p_var, type = "const")
## 
## 
## Estimation results for equation d_log_wage_gap: 
## =============================================== 
## d_log_wage_gap = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + const 
## 
##                          Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1      -0.1043903  0.0658333  -1.586    0.114    
## d_log_treasury_gdp.l1   0.0057245  0.0075873   0.754    0.451    
## d_log_trade_balance.l1 -0.0097216  0.0161291  -0.603    0.547    
## const                   0.0019052  0.0004743   4.017 8.01e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.006938 on 229 degrees of freedom
## Multiple R-Squared: 0.01419, Adjusted R-squared: 0.001276 
## F-statistic: 1.099 on 3 and 229 DF,  p-value: 0.3504 
## 
## 
## Estimation results for equation d_log_treasury_gdp: 
## =================================================== 
## d_log_treasury_gdp = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1      -1.107813   0.546414  -2.027   0.0438 *  
## d_log_treasury_gdp.l1   0.300660   0.062974   4.774 3.22e-06 ***
## d_log_trade_balance.l1  0.196519   0.133871   1.468   0.1435    
## const                   0.009256   0.003937   2.351   0.0196 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.05758 on 229 degrees of freedom
## Multiple R-Squared: 0.1047,  Adjusted R-squared: 0.09298 
## F-statistic: 8.928 on 3 and 229 DF,  p-value: 1.283e-05 
## 
## 
## Estimation results for equation d_log_trade_balance: 
## ==================================================== 
## d_log_trade_balance = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)  
## d_log_wage_gap.l1       0.210328   0.266640   0.789   0.4310  
## d_log_treasury_gdp.l1  -0.032231   0.030730  -1.049   0.2954  
## d_log_trade_balance.l1  0.143694   0.065326   2.200   0.0288 *
## const                  -0.001426   0.001921  -0.742   0.4588  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.0281 on 229 degrees of freedom
## Multiple R-Squared: 0.0286,  Adjusted R-squared: 0.01588 
## F-statistic: 2.248 on 3 and 229 DF,  p-value: 0.08357 
## 
## 
## 
## Covariance matrix of residuals:
##                     d_log_wage_gap d_log_treasury_gdp d_log_trade_balance
## d_log_wage_gap           4.813e-05          2.698e-05          -1.490e-06
## d_log_treasury_gdp       2.698e-05          3.316e-03          -1.056e-04
## d_log_trade_balance     -1.490e-06         -1.056e-04           7.895e-04
## 
## Correlation matrix of residuals:
##                     d_log_wage_gap d_log_treasury_gdp d_log_trade_balance
## d_log_wage_gap            1.000000            0.06753           -0.007645
## d_log_treasury_gdp        0.067531            1.00000           -0.065292
## d_log_trade_balance      -0.007645           -0.06529            1.000000

VAR diagnostic

# serial correlation
serial.test(var_core, lags.pt = 16, type = "PT.asymptotic")
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 164, df = 135, p-value = 0.0453
serial.test(var_core, lags.bg = 8, type = "BG")
## 
##  Breusch-Godfrey LM test
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 108.46, df = 72, p-value = 0.003555
# heteroskedasticity
arch.test(var_core, lags.multi = 4)
## 
##  ARCH (multivariate)
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 323.54, df = 144, p-value = 7.772e-16
# normality
normality.test(var_core)
## $JB
## 
##  JB-Test (multivariate)
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 304.52, df = 6, p-value < 2.2e-16
## 
## 
## $Skewness
## 
##  Skewness only (multivariate)
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 3.5157, df = 3, p-value = 0.3187
## 
## 
## $Kurtosis
## 
##  Kurtosis only (multivariate)
## 
## data:  Residuals of VAR object var_core
## Chi-squared = 301.01, df = 3, p-value < 2.2e-16
# stability
roots(var_core)
## [1] 0.21442638 0.21442638 0.08168327
plot(stability(var_core))

## Granger

# does treasury + trade help predict wage gap?
causality(var_core, cause = "d_log_treasury_gdp")
## $Granger
## 
##  Granger causality H0: d_log_treasury_gdp do not Granger-cause
##  d_log_wage_gap d_log_trade_balance
## 
## data:  VAR object var_core
## F-Test = 0.82866, df1 = 2, df2 = 687, p-value = 0.4371
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: d_log_treasury_gdp and
##  d_log_wage_gap d_log_trade_balance
## 
## data:  VAR object var_core
## Chi-squared = 2.0226, df = 2, p-value = 0.3638
causality(var_core, cause = "d_log_trade_balance")
## $Granger
## 
##  Granger causality H0: d_log_trade_balance do not Granger-cause
##  d_log_wage_gap d_log_treasury_gdp
## 
## data:  VAR object var_core
## F-Test = 1.3249, df1 = 2, df2 = 687, p-value = 0.2665
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: d_log_trade_balance and
##  d_log_wage_gap d_log_treasury_gdp
## 
## data:  VAR object var_core
## Chi-squared = 0.99149, df = 2, p-value = 0.6091
# does wage gap help predict treasury or trade?
causality(var_core, cause = "d_log_wage_gap")
## $Granger
## 
##  Granger causality H0: d_log_wage_gap do not Granger-cause
##  d_log_treasury_gdp d_log_trade_balance
## 
## data:  VAR object var_core
## F-Test = 2.2716, df1 = 2, df2 = 687, p-value = 0.1039
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: d_log_wage_gap and
##  d_log_treasury_gdp d_log_trade_balance
## 
## data:  VAR object var_core
## Chi-squared = 1.0602, df = 2, p-value = 0.5885

##Impulse

# shock from treasury to wage gap
irf_treasury <- irf(
  var_core,
  impulse = "d_log_treasury_gdp",
  response = "d_log_wage_gap",
  n.ahead = 12,
  boot = TRUE,
  runs = 1000
)
plot(irf_treasury)

# shock from trade balance to wage gap
irf_trade <- irf(
  var_core,
  impulse = "d_log_trade_balance",
  response = "d_log_wage_gap",
  n.ahead = 12,
  boot = TRUE,
  runs = 1000
)
plot(irf_trade)

Forecast

fevd_core <- fevd(var_core, n.ahead = 12)
plot(fevd_core)

## VAR long-rate

var_data_longrate <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance,
  d_log_long_rate
))

VARselect(var_data_longrate, lag.max = 8, type = "const")
## $selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      1      1      1      1 
## 
## $criteria
##                    1             2             3             4             5
## AIC(n) -2.745763e+01 -2.743830e+01 -2.743086e+01 -2.732668e+01 -2.724948e+01
## HQ(n)  -2.733547e+01 -2.721842e+01 -2.711325e+01 -2.691134e+01 -2.673641e+01
## SC(n)  -2.715492e+01 -2.689344e+01 -2.664384e+01 -2.629749e+01 -2.597813e+01
## FPE(n)  1.189370e-12  1.212748e-12  1.222219e-12  1.357275e-12  1.467699e-12
##                    6             7             8
## AIC(n) -2.718986e+01 -2.715813e+01 -2.713104e+01
## HQ(n)  -2.657907e+01 -2.644961e+01 -2.632480e+01
## SC(n)  -2.567635e+01 -2.540246e+01 -2.513321e+01
## FPE(n)  1.560172e-12  1.613782e-12  1.662607e-12
var_longrate <- VAR(var_data_longrate, p = 1, type = "const")
summary(var_longrate)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: d_log_wage_gap, d_log_treasury_gdp, d_log_trade_balance, d_log_long_rate 
## Deterministic variables: const 
## Sample size: 233 
## Log Likelihood: 1887.101 
## Roots of the characteristic polynomial:
## 0.2772 0.2772 0.103 0.002769
## Call:
## VAR(y = var_data_longrate, p = 1, type = "const")
## 
## 
## Estimation results for equation d_log_wage_gap: 
## =============================================== 
## d_log_wage_gap = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_long_rate.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1      -0.119081   0.066242  -1.798   0.0736 .  
## d_log_treasury_gdp.l1   0.002666   0.007797   0.342   0.7327    
## d_log_trade_balance.l1 -0.009661   0.016074  -0.601   0.5484    
## d_log_long_rate.l1     -0.006977   0.004345  -1.606   0.1097    
## const                   0.001961   0.000474   4.137 4.94e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.006914 on 228 degrees of freedom
## Multiple R-Squared: 0.02522, Adjusted R-squared: 0.008116 
## F-statistic: 1.475 on 4 and 228 DF,  p-value: 0.2107 
## 
## 
## Estimation results for equation d_log_treasury_gdp: 
## =================================================== 
## d_log_treasury_gdp = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_long_rate.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1      -1.148063   0.552571  -2.078   0.0389 *  
## d_log_treasury_gdp.l1   0.292282   0.065043   4.494 1.11e-05 ***
## d_log_trade_balance.l1  0.196686   0.134083   1.467   0.1438    
## d_log_long_rate.l1     -0.019116   0.036241  -0.527   0.5984    
## const                   0.009409   0.003954   2.380   0.0181 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.05767 on 228 degrees of freedom
## Multiple R-Squared: 0.1058,  Adjusted R-squared: 0.09012 
## F-statistic: 6.744 on 4 and 228 DF,  p-value: 3.797e-05 
## 
## 
## Estimation results for equation d_log_trade_balance: 
## ==================================================== 
## d_log_trade_balance = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_long_rate.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)  
## d_log_wage_gap.l1       0.162598   0.268836   0.605   0.5459  
## d_log_treasury_gdp.l1  -0.042167   0.031645  -1.333   0.1840  
## d_log_trade_balance.l1  0.143892   0.065234   2.206   0.0284 *
## d_log_long_rate.l1     -0.022669   0.017632  -1.286   0.1999  
## const                  -0.001244   0.001924  -0.647   0.5184  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.02806 on 228 degrees of freedom
## Multiple R-Squared: 0.03559, Adjusted R-squared: 0.01867 
## F-statistic: 2.104 on 4 and 228 DF,  p-value: 0.08121 
## 
## 
## Estimation results for equation d_log_long_rate: 
## ================================================ 
## d_log_long_rate = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_long_rate.l1 + const 
## 
##                         Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1       4.217837   0.963103   4.379 1.81e-05 ***
## d_log_treasury_gdp.l1  -0.035799   0.113366  -0.316    0.752    
## d_log_trade_balance.l1 -0.186613   0.233699  -0.799    0.425    
## d_log_long_rate.l1      0.340377   0.063166   5.389 1.77e-07 ***
## const                  -0.007907   0.006891  -1.147    0.252    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.1005 on 228 degrees of freedom
## Multiple R-Squared: 0.1647,  Adjusted R-squared: 0.1501 
## F-statistic: 11.24 on 4 and 228 DF,  p-value: 2.431e-08 
## 
## 
## 
## Covariance matrix of residuals:
##                     d_log_wage_gap d_log_treasury_gdp d_log_trade_balance
## d_log_wage_gap           4.780e-05          2.561e-05          -3.254e-06
## d_log_treasury_gdp       2.561e-05          3.326e-03          -1.109e-04
## d_log_trade_balance     -3.254e-06         -1.109e-04           7.873e-04
## d_log_long_rate         -7.324e-05         -1.257e-03           1.275e-04
##                     d_log_long_rate
## d_log_wage_gap           -7.324e-05
## d_log_treasury_gdp       -1.257e-03
## d_log_trade_balance       1.275e-04
## d_log_long_rate           1.010e-02
## 
## Correlation matrix of residuals:
##                     d_log_wage_gap d_log_treasury_gdp d_log_trade_balance
## d_log_wage_gap             1.00000            0.06424            -0.01677
## d_log_treasury_gdp         0.06424            1.00000            -0.06854
## d_log_trade_balance       -0.01677           -0.06854             1.00000
## d_log_long_rate           -0.10539           -0.21675             0.04520
##                     d_log_long_rate
## d_log_wage_gap              -0.1054
## d_log_treasury_gdp          -0.2167
## d_log_trade_balance          0.0452
## d_log_long_rate              1.0000
serial.test(var_longrate, lags.pt = 16, type = "PT.asymptotic")
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object var_longrate
## Chi-squared = 253.07, df = 240, p-value = 0.2689
arch.test(var_longrate, lags.multi = 4)
## 
##  ARCH (multivariate)
## 
## data:  Residuals of VAR object var_longrate
## Chi-squared = 798.5, df = 400, p-value < 2.2e-16
roots(var_longrate)
## [1] 0.2771978 0.2771978 0.1030264 0.0027685

VAR Import

var_data_imports <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance,
  d_log_imports_ind_real_gdp
))

VARselect(var_data_imports, lag.max = 8, type = "const")
## $selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      4      1      1      4 
## 
## $criteria
##                    1             2             3             4             5
## AIC(n) -2.787851e+01 -2.791926e+01 -2.794509e+01 -2.802787e+01 -2.801697e+01
## HQ(n)  -2.775636e+01 -2.769937e+01 -2.762748e+01 -2.761253e+01 -2.750390e+01
## SC(n)  -2.757581e+01 -2.737440e+01 -2.715807e+01 -2.699868e+01 -2.674562e+01
## FPE(n)  7.807786e-13  7.497091e-13  7.308383e-13  6.732003e-13  6.812691e-13
##                    6             7             8
## AIC(n) -2.797594e+01 -2.800538e+01 -2.800994e+01
## HQ(n)  -2.736515e+01 -2.729687e+01 -2.720369e+01
## SC(n)  -2.646243e+01 -2.624971e+01 -2.601210e+01
## FPE(n)  7.108584e-13  6.916515e-13  6.903860e-13
var_imports <- VAR(var_data_imports, p = 1, type = "const")
summary(var_imports)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: d_log_wage_gap, d_log_treasury_gdp, d_log_trade_balance, d_log_imports_ind_real_gdp 
## Deterministic variables: const 
## Sample size: 233 
## Log Likelihood: 1932.949 
## Roots of the characteristic polynomial:
## 0.2583 0.2122 0.2122 0.07998
## Call:
## VAR(y = var_data_imports, p = 1, type = "const")
## 
## 
## Estimation results for equation d_log_wage_gap: 
## =============================================== 
## d_log_wage_gap = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_imports_ind_real_gdp.l1 + const 
## 
##                                 Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1             -0.1084483  0.0662459  -1.637    0.103    
## d_log_treasury_gdp.l1          0.0055043  0.0076058   0.724    0.470    
## d_log_trade_balance.l1        -0.0082362  0.0163274  -0.504    0.614    
## d_log_imports_ind_real_gdp.l1 -0.0034263  0.0055251  -0.620    0.536    
## const                          0.0019508  0.0004806   4.059 6.78e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.006947 on 228 degrees of freedom
## Multiple R-Squared: 0.01585, Adjusted R-squared: -0.001416 
## F-statistic: 0.918 on 4 and 228 DF,  p-value: 0.4542 
## 
## 
## Estimation results for equation d_log_treasury_gdp: 
## =================================================== 
## d_log_treasury_gdp = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_imports_ind_real_gdp.l1 + const 
## 
##                                Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1             -1.114168   0.550286  -2.025   0.0441 *  
## d_log_treasury_gdp.l1          0.300315   0.063179   4.753 3.54e-06 ***
## d_log_trade_balance.l1         0.198845   0.135627   1.466   0.1440    
## d_log_imports_ind_real_gdp.l1 -0.005366   0.045895  -0.117   0.9070    
## const                          0.009328   0.003992   2.336   0.0203 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.05771 on 228 degrees of freedom
## Multiple R-Squared: 0.1048,  Adjusted R-squared: 0.08906 
## F-statistic:  6.67 on 4 and 228 DF,  p-value: 4.294e-05 
## 
## 
## Estimation results for equation d_log_trade_balance: 
## ==================================================== 
## d_log_trade_balance = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_imports_ind_real_gdp.l1 + const 
## 
##                                Estimate Std. Error t value Pr(>|t|)  
## d_log_wage_gap.l1              0.207310   0.268530   0.772   0.4409  
## d_log_treasury_gdp.l1         -0.032395   0.030830  -1.051   0.2945  
## d_log_trade_balance.l1         0.144799   0.066184   2.188   0.0297 *
## d_log_imports_ind_real_gdp.l1 -0.002548   0.022396  -0.114   0.9095  
## const                         -0.001392   0.001948  -0.714   0.4758  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.02816 on 228 degrees of freedom
## Multiple R-Squared: 0.02866, Adjusted R-squared: 0.01162 
## F-statistic: 1.682 on 4 and 228 DF,  p-value: 0.1551 
## 
## 
## Estimation results for equation d_log_imports_ind_real_gdp: 
## =========================================================== 
## d_log_imports_ind_real_gdp = d_log_wage_gap.l1 + d_log_treasury_gdp.l1 + d_log_trade_balance.l1 + d_log_imports_ind_real_gdp.l1 + const 
## 
##                                Estimate Std. Error t value Pr(>|t|)    
## d_log_wage_gap.l1              1.385012   0.768036   1.803 0.072659 .  
## d_log_treasury_gdp.l1         -0.217382   0.088179  -2.465 0.014431 *  
## d_log_trade_balance.l1         0.044583   0.189295   0.236 0.814016    
## d_log_imports_ind_real_gdp.l1  0.248827   0.064056   3.885 0.000134 ***
## const                          0.007287   0.005572   1.308 0.192279    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.08054 on 228 degrees of freedom
## Multiple R-Squared: 0.09718, Adjusted R-squared: 0.08134 
## F-statistic: 6.136 on 4 and 228 DF,  p-value: 0.0001048 
## 
## 
## 
## Covariance matrix of residuals:
##                            d_log_wage_gap d_log_treasury_gdp
## d_log_wage_gap                  4.826e-05          2.697e-05
## d_log_treasury_gdp              2.697e-05          3.330e-03
## d_log_trade_balance            -1.557e-06         -1.062e-04
## d_log_imports_ind_real_gdp     -4.609e-05         -5.165e-05
##                            d_log_trade_balance d_log_imports_ind_real_gdp
## d_log_wage_gap                      -1.557e-06                 -4.609e-05
## d_log_treasury_gdp                  -1.062e-04                 -5.165e-05
## d_log_trade_balance                  7.930e-04                  3.153e-04
## d_log_imports_ind_real_gdp           3.153e-04                  6.487e-03
## 
## Correlation matrix of residuals:
##                            d_log_wage_gap d_log_treasury_gdp
## d_log_wage_gap                   1.000000            0.06727
## d_log_treasury_gdp               0.067272            1.00000
## d_log_trade_balance             -0.007961           -0.06535
## d_log_imports_ind_real_gdp      -0.082373           -0.01111
##                            d_log_trade_balance d_log_imports_ind_real_gdp
## d_log_wage_gap                       -0.007961                   -0.08237
## d_log_treasury_gdp                   -0.065354                   -0.01111
## d_log_trade_balance                   1.000000                    0.13902
## d_log_imports_ind_real_gdp            0.139016                    1.00000
serial.test(var_imports, lags.pt = 16, type = "PT.asymptotic")
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object var_imports
## Chi-squared = 336.45, df = 240, p-value = 3.896e-05
arch.test(var_imports, lags.multi = 4)
## 
##  ARCH (multivariate)
## 
## data:  Residuals of VAR object var_imports
## Chi-squared = 733.87, df = 400, p-value < 2.2e-16
roots(var_imports)
## [1] 0.25827270 0.21216369 0.21216369 0.07997633