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 <- trade_balance
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)
d_long_rate                <- diff(long_rate)

##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_long_rate,             main = "D 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_long_rate,            main = "ACF: D 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_long_rate,            main = "ACF: D 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.8462324 -2074.7900 -2033.3261
## 20    trade_deficit_gdp trend   1 -2.4129121 -2071.3929 -2016.1763
## 21    trade_deficit_gdp trend   2 -2.1759419 -2055.0474 -1986.1127
## 22    trade_deficit_gdp trend   3 -2.2058318 -2037.7789 -1955.1609
## 23    trade_deficit_gdp trend   4 -1.9272386 -2022.1232 -1925.8570
## 24    trade_deficit_gdp trend   5 -1.8964612 -2004.0925 -1894.2134
## 25    trade_deficit_gdp trend   6 -2.1246209 -1989.0557 -1865.5992
## 26    trade_deficit_gdp trend   7 -2.1928589 -1971.5282 -1834.5302
## 27    trade_deficit_gdp trend   8 -2.1748725 -1953.5381 -1803.0345
## 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.8462324 -2074.7900
## 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    -2033.3261
## 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.8462324 -2074.7900
## 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    -2033.3261
## 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_d_long_rate    <- make_adf_table(d_long_rate, "d_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_d_long_rate
)

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_long_rate drift   0 -11.903493   324.2814   351.8897
## 56                d_long_rate drift   1 -10.110563   329.9770   371.3378
## 57                d_long_rate drift   2  -7.373983   333.1767   388.2553
## 58                d_long_rate drift   3  -6.931956   340.1683   408.9299
## 59                d_long_rate drift   4  -7.202899   343.4078   425.8171
## 60                d_long_rate drift   5  -6.449179   350.5815   446.6032
## 61                d_long_rate drift   6  -6.894670   352.0574   461.6558
## 62                d_long_rate drift   7  -5.947507   358.5412   481.6804
## 63                d_long_rate drift   8  -5.725846   365.7572   502.4012
# -------------------------
# 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_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
## d_long_rate                               d_long_rate drift   0 -11.903493
##                                   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_min_wage_real        -1038.6180  -969.8564
## d_log_treasury_gdp          -653.2464  -598.1677
## d_log_wage_gap             -1642.1847 -1614.5764
## d_long_rate                  324.2814   351.8897
# -------------------------
# 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_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
## d_long_rate                               d_long_rate drift   0 -11.90349
##                                   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_min_wage_real        -1027.8304 -1000.2221
## d_log_treasury_gdp          -650.6504  -623.0421
## d_log_wage_gap             -1642.1847 -1614.5764
## d_long_rate                  324.2814   351.8897

This ends stationirity discussions

##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 + long_rate,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    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.125863 -0.015625  0.003122  0.027976  0.080492 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -0.147345   0.080279  -1.835   0.0677 .  
## log_treasury_gdp   0.098135   0.005336  18.391  < 2e-16 ***
## log_trade_balance -0.137220   0.026624  -5.154 5.49e-07 ***
## log_min_wage_real -0.280810   0.031195  -9.002  < 2e-16 ***
## long_rate         -0.010623   0.001254  -8.473 2.87e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03992 on 230 degrees of freedom
## Multiple R-squared:  0.9136, Adjusted R-squared:  0.9121 
## F-statistic:   608 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.525201 -1347.956 -1334.135
## 2 pathway2_longrate   1 -3.091753 -1343.256 -1315.647
## 3 pathway2_longrate   2 -2.818058 -1329.993 -1288.632
## 4 pathway2_longrate   3 -3.266233 -1321.095 -1266.016
## 5 pathway2_longrate   4 -3.774381 -1323.736 -1254.974
## 6 pathway2_longrate   5 -3.578861 -1313.420 -1231.011
## 7 pathway2_longrate   6 -3.846233 -1303.468 -1207.446
## 8 pathway2_longrate   7 -3.996482 -1291.320 -1181.722
## 9 pathway2_longrate   8 -3.841300 -1276.556 -1153.417
eg_pathway2$best_AIC
##               model lag  tau_stat       AIC       BIC
## 1 pathway2_longrate   0 -2.525201 -1347.956 -1334.135
eg_pathway2$best_BIC
##               model lag  tau_stat       AIC       BIC
## 1 pathway2_longrate   0 -2.525201 -1347.956 -1334.135

##Full

eg_optional <- run_eg_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_imports_ind_real_gdp + long_rate,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_imports_ind_real_gdp,
    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.105629 -0.020135  0.003562  0.024151  0.057869 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.047982   0.067807   0.708   0.4799    
## log_treasury_gdp          0.018311   0.008542   2.144   0.0331 *  
## log_trade_balance         0.008905   0.025521   0.349   0.7274    
## log_min_wage_real        -0.299771   0.025463 -11.773   <2e-16 ***
## log_imports_ind_real_gdp  0.092810   0.008551  10.854   <2e-16 ***
## long_rate                -0.019144   0.001288 -14.865   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03251 on 229 degrees of freedom
## Multiple R-squared:  0.943,  Adjusted R-squared:  0.9417 
## F-statistic:   757 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 -3.403251 -1319.774 -1305.953
## 2 optional_both_pathways   1 -3.664035 -1308.718 -1281.110
## 3 optional_both_pathways   2 -3.506091 -1294.320 -1252.959
## 4 optional_both_pathways   3 -4.074916 -1286.876 -1231.797
## 5 optional_both_pathways   4 -4.021806 -1276.480 -1207.718
## 6 optional_both_pathways   5 -3.238854 -1270.827 -1188.418
## 7 optional_both_pathways   6 -3.034365 -1256.373 -1160.351
## 8 optional_both_pathways   7 -2.636213 -1243.851 -1134.253
## 9 optional_both_pathways   8 -2.866977 -1232.581 -1109.442
eg_optional$best_AIC
##                    model lag  tau_stat       AIC       BIC
## 1 optional_both_pathways   0 -3.403251 -1319.774 -1305.953
eg_optional$best_BIC
##                    model lag  tau_stat       AIC       BIC
## 1 optional_both_pathways   0 -3.403251 -1319.774 -1305.953

Break

# -------------------------
# BREAK TERMS
# -------------------------

time_index <- seq_along(log_wage_gap)
break_date <- 1985

# if your data are ts quarterly, replace with your actual year vector if available
# example:
# year_vec <- floor(time(time_series_object))

# if you already have a year variable, use that instead of constructing one
# here assume you have a vector called year_vec
year_vec <- floor(time(log_wage_gap))

D2000  <- ifelse(year_vec >= 1985, 1, 0)
DT2000 <- ifelse(year_vec >= 1985, year_vec - 1985, 0)

Engle

library(urca)

run_eg_break_test <- function(formula, data, model_name, max_lag = 8) {
  long_run <- lm(formula, data = data)
  uhat <- residuals(long_run)
  
  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)
    
    out <- rbind(
      out,
      data.frame(
        model = model_name,
        lag = L,
        tau_stat = tau_stat,
        AIC = -2 * logLik_val + 2 * k,
        BIC = -2 * logLik_val + log(n) * k,
        stringsAsFactors = FALSE
      )
    )
  }
  
  list(
    long_run = long_run,
    resid = uhat,
    lag_table = out,
    best_AIC = out[which.min(out$AIC), ],
    best_BIC = out[which.min(out$BIC), ]
  )
}

##Baseline

eg_baseline_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    D2000,
    DT2000
  ),
  model_name = "baseline_break",
  max_lag = 8
)

summary(eg_baseline_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.049915 -0.011584  0.000691  0.011835  0.062202 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        0.1203246  0.0396218   3.037  0.00267 ** 
## log_treasury_gdp   0.0322321  0.0036098   8.929  < 2e-16 ***
## log_trade_balance -0.0599880  0.0135385  -4.431 1.45e-05 ***
## log_min_wage_real -0.0441632  0.0162462  -2.718  0.00706 ** 
## D2000              0.0925368  0.0048529  19.068  < 2e-16 ***
## DT2000             0.0050046  0.0002068  24.197  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01898 on 229 degrees of freedom
## Multiple R-squared:  0.9806, Adjusted R-squared:  0.9801 
## F-statistic:  2310 on 5 and 229 DF,  p-value: < 2.2e-16
eg_baseline_break$lag_table
##            model lag  tau_stat       AIC       BIC
## 1 baseline_break   0 -4.086399 -1513.723 -1499.902
## 2 baseline_break   1 -3.893353 -1498.252 -1470.643
## 3 baseline_break   2 -4.000286 -1484.189 -1442.828
## 4 baseline_break   3 -3.834560 -1468.768 -1413.689
## 5 baseline_break   4 -3.877163 -1458.553 -1389.791
## 6 baseline_break   5 -3.852356 -1444.779 -1362.370
## 7 baseline_break   6 -3.949512 -1430.648 -1334.626
## 8 baseline_break   7 -3.812361 -1415.776 -1306.178
## 9 baseline_break   8 -3.588235 -1400.412 -1277.272
eg_baseline_break$best_AIC
##            model lag  tau_stat       AIC       BIC
## 1 baseline_break   0 -4.086399 -1513.723 -1499.902
eg_baseline_break$best_BIC
##            model lag  tau_stat       AIC       BIC
## 1 baseline_break   0 -4.086399 -1513.723 -1499.902
#significant for 10% -3.84

#Pathway Imports

eg_pathway1_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_imports_ind_real_gdp + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_imports_ind_real_gdp,
    D2000,
    DT2000
  ),
  model_name = "pathway1_break",
  max_lag = 8
)

summary(eg_pathway1_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.037394 -0.009267 -0.000868  0.008884  0.054585 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.2375217  0.0318617   7.455 1.86e-12 ***
## log_treasury_gdp          0.0029515  0.0036194   0.815  0.41564    
## log_trade_balance         0.0047511  0.0116101   0.409  0.68276    
## log_min_wage_real        -0.0332802  0.0125261  -2.657  0.00844 ** 
## log_imports_ind_real_gdp  0.0390924  0.0030997  12.612  < 2e-16 ***
## D2000                     0.0939561  0.0037345  25.159  < 2e-16 ***
## DT2000                    0.0053730  0.0001618  33.218  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0146 on 228 degrees of freedom
## Multiple R-squared:  0.9885, Adjusted R-squared:  0.9882 
## F-statistic:  3280 on 6 and 228 DF,  p-value: < 2.2e-16
eg_pathway1_break$lag_table
##            model lag  tau_stat       AIC       BIC
## 1 pathway1_break   0 -5.601425 -1515.975 -1502.153
## 2 pathway1_break   1 -5.404486 -1500.716 -1473.108
## 3 pathway1_break   2 -5.516314 -1486.862 -1445.501
## 4 pathway1_break   3 -5.317519 -1471.756 -1416.677
## 5 pathway1_break   4 -5.134274 -1458.105 -1389.344
## 6 pathway1_break   5 -4.638021 -1444.003 -1361.594
## 7 pathway1_break   6 -4.733226 -1429.729 -1333.707
## 8 pathway1_break   7 -4.353213 -1414.441 -1304.842
## 9 pathway1_break   8 -3.981757 -1399.806 -1276.667
eg_pathway1_break$best_AIC
##            model lag  tau_stat       AIC       BIC
## 1 pathway1_break   0 -5.601425 -1515.975 -1502.153
eg_pathway1_break$best_BIC
##            model lag  tau_stat       AIC       BIC
## 1 pathway1_break   0 -5.601425 -1515.975 -1502.153
#significant  for 1%, -5.07

#pathway Long

eg_pathway2_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    long_rate + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    long_rate,
    D2000,
    DT2000
  ),
  model_name = "pathway2_break",
  max_lag = 8
)

summary(eg_pathway2_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.046665 -0.011300 -0.002023  0.010694  0.055750 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        0.1752163  0.0383595   4.568 8.07e-06 ***
## log_treasury_gdp   0.0296124  0.0034144   8.673 8.02e-16 ***
## log_trade_balance -0.0507250  0.0127928  -3.965 9.82e-05 ***
## log_min_wage_real -0.0049636  0.0167011  -0.297    0.767    
## long_rate          0.0042992  0.0007523   5.715 3.41e-08 ***
## D2000              0.1017543  0.0048261  21.084  < 2e-16 ***
## DT2000             0.0058564  0.0002445  23.949  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01779 on 228 degrees of freedom
## Multiple R-squared:  0.983,  Adjusted R-squared:  0.9825 
## F-statistic:  2196 on 6 and 228 DF,  p-value: < 2.2e-16
eg_pathway2_break$lag_table
##            model lag  tau_stat       AIC       BIC
## 1 pathway2_break   0 -4.627894 -1495.590 -1481.769
## 2 pathway2_break   1 -4.230933 -1480.569 -1452.961
## 3 pathway2_break   2 -4.209188 -1466.039 -1424.678
## 4 pathway2_break   3 -4.005554 -1450.700 -1395.622
## 5 pathway2_break   4 -4.127371 -1439.309 -1370.547
## 6 pathway2_break   5 -4.080110 -1425.272 -1342.862
## 7 pathway2_break   6 -4.185009 -1411.012 -1314.990
## 8 pathway2_break   7 -3.910591 -1396.076 -1286.478
## 9 pathway2_break   8 -3.761426 -1380.700 -1257.560
eg_pathway2_break$best_AIC
##            model lag  tau_stat      AIC       BIC
## 1 pathway2_break   0 -4.627894 -1495.59 -1481.769
eg_pathway2_break$best_BIC
##            model lag  tau_stat      AIC       BIC
## 1 pathway2_break   0 -4.627894 -1495.59 -1481.769
#significant  for 5%, -4.49

##pathway FDI

eg_fdi_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_fdi_outward_gdp + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_fdi_outward_gdp,
    D2000,
    DT2000
  ),
  model_name = "fdi_break",
  max_lag = 8
)

summary(eg_fdi_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.048665 -0.011880 -0.000847  0.010295  0.066828 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.1286678  0.0391794   3.284 0.001184 ** 
## log_treasury_gdp     0.0292938  0.0037149   7.885 1.29e-13 ***
## log_trade_balance   -0.0521640  0.0136456  -3.823 0.000170 ***
## log_min_wage_real   -0.0566335  0.0166429  -3.403 0.000788 ***
## log_fdi_outward_gdp  0.0206063  0.0074722   2.758 0.006292 ** 
## D2000                0.0873728  0.0051378  17.006  < 2e-16 ***
## DT2000               0.0044717  0.0002809  15.918  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01871 on 228 degrees of freedom
## Multiple R-squared:  0.9812, Adjusted R-squared:  0.9807 
## F-statistic:  1982 on 6 and 228 DF,  p-value: < 2.2e-16
eg_fdi_break$lag_table
##       model lag  tau_stat       AIC       BIC
## 1 fdi_break   0 -3.976920 -1532.493 -1518.671
## 2 fdi_break   1 -3.750253 -1517.024 -1489.416
## 3 fdi_break   2 -3.758020 -1502.289 -1460.928
## 4 fdi_break   3 -3.714094 -1486.902 -1431.823
## 5 fdi_break   4 -3.799557 -1477.653 -1408.891
## 6 fdi_break   5 -3.969803 -1465.287 -1382.878
## 7 fdi_break   6 -4.088392 -1451.216 -1355.194
## 8 fdi_break   7 -4.060585 -1436.697 -1327.099
## 9 fdi_break   8 -3.846544 -1421.200 -1298.061
eg_fdi_break$best_AIC
##       model lag tau_stat       AIC       BIC
## 1 fdi_break   0 -3.97692 -1532.493 -1518.671
eg_fdi_break$best_BIC
##       model lag tau_stat       AIC       BIC
## 1 fdi_break   0 -3.97692 -1532.493 -1518.671
# not significant

Full without FDI

eg_optional_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_imports_ind_real_gdp + long_rate + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_imports_ind_real_gdp,
    long_rate,
    D2000,
    DT2000
  ),
  model_name = "optional_break",
  max_lag = 8
)

summary(eg_optional_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.039487 -0.008948 -0.000494  0.008031  0.055959 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.2331160  0.0317425   7.344 3.69e-12 ***
## log_treasury_gdp         -0.0001286  0.0039231  -0.033  0.97387    
## log_trade_balance         0.0102534  0.0118723   0.864  0.38870    
## log_min_wage_real        -0.0465407  0.0141575  -3.287  0.00117 ** 
## log_imports_ind_real_gdp  0.0445228  0.0041372  10.762  < 2e-16 ***
## long_rate                -0.0016201  0.0008240  -1.966  0.05049 .  
## D2000                     0.0906796  0.0040682  22.290  < 2e-16 ***
## DT2000                    0.0051032  0.0002114  24.145  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01451 on 227 degrees of freedom
## Multiple R-squared:  0.9887, Adjusted R-squared:  0.9884 
## F-statistic:  2847 on 7 and 227 DF,  p-value: < 2.2e-16
eg_optional_break$lag_table
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.648021 -1516.875 -1503.054
## 2 optional_break   1 -5.558592 -1502.037 -1474.429
## 3 optional_break   2 -5.743504 -1488.854 -1447.493
## 4 optional_break   3 -5.601091 -1474.077 -1418.998
## 5 optional_break   4 -5.341079 -1460.255 -1391.493
## 6 optional_break   5 -4.757504 -1446.257 -1363.847
## 7 optional_break   6 -4.836077 -1431.931 -1335.910
## 8 optional_break   7 -4.425451 -1416.680 -1307.081
## 9 optional_break   8 -3.993372 -1402.460 -1279.321
eg_optional_break$best_AIC
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.648021 -1516.875 -1503.054
eg_optional_break$best_BIC
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.648021 -1516.875 -1503.054
#significant  for 1%, -5.52

Full with FDI

eg_optional_break <- run_eg_break_test(
  log_wage_gap ~ log_treasury_gdp + log_trade_balance + log_min_wage_real +
    log_fdi_outward_gdp + log_imports_ind_real_gdp + long_rate + D2000 + DT2000,
  data = data.frame(
    log_wage_gap,
    log_treasury_gdp,
    log_trade_balance,
    log_min_wage_real,
    log_fdi_outward_gdp,
    log_imports_ind_real_gdp,
    long_rate,
    D2000,
    DT2000
  ),
  model_name = "optional_break",
  max_lag = 8
)

summary(eg_optional_break$long_run)
## 
## Call:
## lm(formula = formula, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.039466 -0.008956 -0.000425  0.008017  0.055998 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.2331297  0.0318164   7.327 4.12e-12 ***
## log_treasury_gdp         -0.0001274  0.0039321  -0.032  0.97419    
## log_trade_balance         0.0102652  0.0119061   0.862  0.38950    
## log_min_wage_real        -0.0466128  0.0144223  -3.232  0.00141 ** 
## log_fdi_outward_gdp       0.0001703  0.0061116   0.028  0.97779    
## log_imports_ind_real_gdp  0.0444850  0.0043629  10.196  < 2e-16 ***
## long_rate                -0.0016156  0.0008418  -1.919  0.05623 .  
## D2000                     0.0906453  0.0042587  21.285  < 2e-16 ***
## DT2000                    0.0050993  0.0002530  20.152  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01454 on 226 degrees of freedom
## Multiple R-squared:  0.9887, Adjusted R-squared:  0.9883 
## F-statistic:  2480 on 8 and 226 DF,  p-value: < 2.2e-16
eg_optional_break$lag_table
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.645322 -1517.047 -1503.226
## 2 optional_break   1 -5.555426 -1502.205 -1474.596
## 3 optional_break   2 -5.738728 -1489.005 -1447.645
## 4 optional_break   3 -5.597447 -1474.230 -1419.151
## 5 optional_break   4 -5.338254 -1460.412 -1391.651
## 6 optional_break   5 -4.756290 -1446.410 -1364.001
## 7 optional_break   6 -4.834955 -1432.084 -1336.063
## 8 optional_break   7 -4.425290 -1416.829 -1307.231
## 9 optional_break   8 -3.993911 -1402.604 -1279.465
eg_optional_break$best_AIC
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.645322 -1517.047 -1503.226
eg_optional_break$best_BIC
##            model lag  tau_stat       AIC       BIC
## 1 optional_break   0 -5.645322 -1517.047 -1503.226
#significant  for 1%, -5.64

##Log Diff

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_fdi_outward_gdp,
  d_log_imports_ind_real_gdp,
  d_long_rate
))

# =========================
# LOG-DIFFERENCE MODELS
# =========================

# 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: FDI
mod_dlog_fdi <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp,
  data = reg_dlog
)

# pathway: imports
mod_dlog_imports <- 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: long rate
mod_dlog_longrate <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_long_rate,
  data = reg_dlog
)

# full model WITH FDI
mod_dlog_full_with_fdi <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp +
    d_log_imports_ind_real_gdp + d_long_rate,
  data = reg_dlog
)

# full model WITHOUT FDI
mod_dlog_full_no_fdi <- 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_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_fdi)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp, data = reg_dlog)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0159010 -0.0049354  0.0000971  0.0043097  0.0315491 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            0.0015207  0.0004516   3.367 0.000891 ***
## d_log_treasury_gdp     0.0097612  0.0073795   1.323 0.187237    
## d_log_trade_balance   -0.0001592  0.0158156  -0.010 0.991977    
## d_log_min_wage_real   -0.0249489  0.0172338  -1.448 0.149076    
## d_log_fdi_outward_gdp  0.0171434  0.0051867   3.305 0.001101 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006777 on 229 degrees of freedom
## Multiple R-squared:  0.06019,    Adjusted R-squared:  0.04377 
## F-statistic: 3.666 on 4 and 229 DF,  p-value: 0.006463
summary(mod_dlog_imports)
## 
## 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_longrate)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_long_rate, data = reg_dlog)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.019016 -0.004455 -0.000132  0.004307  0.035418 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.0016587  0.0004607   3.600  0.00039 ***
## d_log_treasury_gdp   0.0083743  0.0078522   1.066  0.28733    
## d_log_trade_balance -0.0020291  0.0161645  -0.126  0.90022    
## d_log_min_wage_real -0.0233011  0.0176328  -1.321  0.18767    
## d_long_rate         -0.0006201  0.0009782  -0.634  0.52679    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.00693 on 229 degrees of freedom
## Multiple R-squared:  0.01708,    Adjusted R-squared:  -9.344e-05 
## F-statistic: 0.9946 on 4 and 229 DF,  p-value: 0.4113
summary(mod_dlog_full_with_fdi)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp + d_log_imports_ind_real_gdp + 
##     d_long_rate, data = reg_dlog)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0150731 -0.0047300 -0.0001001  0.0043519  0.0293386 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.0016221  0.0004545   3.569 0.000438 ***
## d_log_treasury_gdp          0.0087582  0.0076635   1.143 0.254305    
## d_log_trade_balance         0.0037126  0.0159673   0.233 0.816351    
## d_log_min_wage_real        -0.0231238  0.0172335  -1.342 0.181003    
## d_log_fdi_outward_gdp       0.0177830  0.0051953   3.423 0.000735 ***
## d_log_imports_ind_real_gdp -0.0089920  0.0055545  -1.619 0.106865    
## d_long_rate                -0.0001501  0.0009865  -0.152 0.879195    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006763 on 227 degrees of freedom
## Multiple R-squared:  0.07227,    Adjusted R-squared:  0.04774 
## F-statistic: 2.947 on 6 and 227 DF,  p-value: 0.008659
summary(mod_dlog_full_no_fdi)
## 
## 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_long_rate, 
##     data = reg_dlog)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.019188 -0.004274 -0.000234  0.004350  0.033953 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.0017363  0.0004638   3.743  0.00023 ***
## d_log_treasury_gdp          0.0085511  0.0078413   1.091  0.27664    
## d_log_trade_balance         0.0011333  0.0163200   0.069  0.94470    
## d_log_min_wage_real        -0.0220657  0.0176310  -1.252  0.21202    
## d_log_imports_ind_real_gdp -0.0074005  0.0056636  -1.307  0.19264    
## d_long_rate                -0.0002913  0.0010086  -0.289  0.77294    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.00692 on 228 degrees of freedom
## Multiple R-squared:  0.02438,    Adjusted R-squared:  0.002986 
## F-statistic:  1.14 on 5 and 228 DF,  p-value: 0.3402
#FDI may have immediate effecs as companies invest with the intention to relocate, while imports only hurt in longer terms.
# =========================
# SERIAL CORRELATION TESTS
# SHORT-RUN MODELS WITH FDI
# =========================

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
# Breusch-Godfrey + Ljung-Box helper
run_serial_tests <- function(model, model_name, bg_order = 4, lb_lag = 12) {
  cat("\n================", model_name, "================\n")
  
  # Breusch-Godfrey test
  bg <- bgtest(model, order = bg_order)
  print(bg)
  
  # Ljung-Box test on residuals
  lb <- Box.test(resid(model), lag = lb_lag, type = "Ljung-Box")
  print(lb)
  
  invisible(list(
    bg = bg,
    lb = lb
  ))
}

# 1) FDI pathway short-run model
serial_fdi <- run_serial_tests(
  mod_dlog_fdi,
  "mod_dlog_fdi",
  bg_order = 4,
  lb_lag = 12
)
## 
## ================ mod_dlog_fdi ================
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  model
## LM test = 2.9135, df = 4, p-value = 0.5724
## 
## 
##  Box-Ljung test
## 
## data:  resid(model)
## X-squared = 13.327, df = 12, p-value = 0.3458
# 2) Full short-run model with FDI
serial_full_with_fdi <- run_serial_tests(
  mod_dlog_full_with_fdi,
  "mod_dlog_full_with_fdi",
  bg_order = 4,
  lb_lag = 12
)
## 
## ================ mod_dlog_full_with_fdi ================
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  model
## LM test = 2.8919, df = 4, p-value = 0.5761
## 
## 
##  Box-Ljung test
## 
## data:  resid(model)
## X-squared = 13.775, df = 12, p-value = 0.3153
# =========================
# HETEROSKEDASTICITY TESTS
# SHORT-RUN MODELS WITH FDI
# =========================

library(lmtest)

run_hetero_tests <- function(model, model_name) {
  cat("\n================", model_name, "================\n")
  
  # Breusch-Pagan test
  bp <- bptest(model)
  print(bp)
  
  # White-type test using fitted values
  fitvals <- fitted(model)
  white_fit <- bptest(model, ~ fitvals + I(fitvals^2))
  print(white_fit)
  
  invisible(list(
    bp = bp,
    white_fit = white_fit
  ))
}

# 1) FDI pathway short-run model
hetero_fdi <- run_hetero_tests(
  mod_dlog_fdi,
  "mod_dlog_fdi"
)
## 
## ================ mod_dlog_fdi ================
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 2.9842, df = 4, p-value = 0.5605
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 10.591, df = 2, p-value = 0.005015
# 2) Full short-run model with FDI
hetero_full_with_fdi <- run_hetero_tests(
  mod_dlog_full_with_fdi,
  "mod_dlog_full_with_fdi"
)
## 
## ================ mod_dlog_full_with_fdi ================
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 3.7785, df = 6, p-value = 0.7066
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 26.951, df = 2, p-value = 1.405e-06
# =========================
# RESIDUAL PLOTS
# =========================

par(mfrow = c(2, 2))

# mod_dlog_fdi
plot(resid(mod_dlog_fdi), type = "l",
     main = "Residuals: mod_dlog_fdi",
     ylab = "Residual", xlab = "Time")
abline(h = 0, lty = 2)

plot(fitted(mod_dlog_fdi), resid(mod_dlog_fdi),
     main = "Residuals vs Fitted: mod_dlog_fdi",
     xlab = "Fitted values", ylab = "Residual")
abline(h = 0, lty = 2)

# mod_dlog_full_with_fdi
plot(resid(mod_dlog_full_with_fdi), type = "l",
     main = "Residuals: mod_dlog_full_with_fdi",
     ylab = "Residual", xlab = "Time")
abline(h = 0, lty = 2)

plot(fitted(mod_dlog_full_with_fdi), resid(mod_dlog_full_with_fdi),
     main = "Residuals vs Fitted: mod_dlog_full_with_fdi",
     xlab = "Fitted values", ylab = "Residual")
abline(h = 0, lty = 2)

par(mfrow = c(1, 1))

par(mfrow = c(2, 2))

hist(resid(mod_dlog_fdi), main = "Histogram: mod_dlog_fdi", xlab = "Residual")
qqnorm(resid(mod_dlog_fdi), main = "QQ Plot: mod_dlog_fdi")
qqline(resid(mod_dlog_fdi))

hist(resid(mod_dlog_full_with_fdi), main = "Histogram: mod_dlog_full_with_fdi", xlab = "Residual")
qqnorm(resid(mod_dlog_full_with_fdi), main = "QQ Plot: mod_dlog_full_with_fdi")
qqline(resid(mod_dlog_full_with_fdi))

par(mfrow = c(1, 1))
sort(abs(rstandard(mod_dlog_fdi)), decreasing = TRUE)[1:10]
##      213       16       55       20        4      212       19       45 
## 4.770182 2.412763 2.397923 2.361370 2.316640 2.158691 2.144638 2.129413 
##       15       28 
## 2.033163 1.986011
sort(abs(rstandard(mod_dlog_full_with_fdi)), decreasing = TRUE)[1:10]
##      213       55        4       16       19       20      212       45 
## 4.532058 2.561237 2.393118 2.352379 2.259471 2.237474 2.206765 2.051029 
##       58       15 
## 1.967330 1.945639

Short run FDI with pandemic dummy

# =========================
# PANDEMIC DUMMY: 2020 Q1
# SHORT-RUN FDI MODELS
# =========================

library(lmtest)

# 1) Build dummy aligned with reg_dlog
pandemic_q1 <- ifelse(floor(time(d_log_wage_gap)) == 2020 &
                        cycle(d_log_wage_gap) == 1, 1, 0)

# Put it into the short-run data frame
reg_dlog_pandemic <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance,
  d_log_min_wage_real,
  d_log_fdi_outward_gdp,
  d_log_imports_ind_real_gdp,
  d_long_rate,
  pandemic_q1
))

# 2) Re-estimate short-run FDI models with dummy

# FDI pathway + pandemic dummy
mod_dlog_fdi_pandemic <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp + pandemic_q1,
  data = reg_dlog_pandemic
)

# Full with FDI + pandemic dummy
mod_dlog_full_with_fdi_pandemic <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp +
    d_log_imports_ind_real_gdp + d_long_rate + pandemic_q1,
  data = reg_dlog_pandemic
)

summary(mod_dlog_fdi_pandemic)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp + pandemic_q1, 
##     data = reg_dlog_pandemic)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.016157 -0.004887  0.000025  0.004162  0.032038 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            0.0016008  0.0004495   3.561 0.000449 ***
## d_log_treasury_gdp     0.0099514  0.0073205   1.359 0.175366    
## d_log_trade_balance    0.0008764  0.0156953   0.056 0.955519    
## d_log_min_wage_real   -0.0252373  0.0170954  -1.476 0.141254    
## d_log_fdi_outward_gdp  0.0148510  0.0052516   2.828 0.005102 ** 
## pandemic_q1           -0.0149755  0.0068814  -2.176 0.030565 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006722 on 228 degrees of freedom
## Multiple R-squared:  0.07931,    Adjusted R-squared:  0.05912 
## F-statistic: 3.928 on 5 and 228 DF,  p-value: 0.001953
summary(mod_dlog_full_with_fdi_pandemic)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp + d_log_imports_ind_real_gdp + 
##     d_long_rate + pandemic_q1, data = reg_dlog_pandemic)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0152232 -0.0046667 -0.0001021  0.0042497  0.0297711 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.0017072  0.0004523   3.775 0.000205 ***
## d_log_treasury_gdp          0.0086644  0.0075977   1.140 0.255330    
## d_log_trade_balance         0.0047723  0.0158372   0.301 0.763437    
## d_log_min_wage_real        -0.0233253  0.0170856  -1.365 0.173545    
## d_log_fdi_outward_gdp       0.0154269  0.0052583   2.934 0.003693 ** 
## d_log_imports_ind_real_gdp -0.0090196  0.0055067  -1.638 0.102831    
## d_long_rate                -0.0002792  0.0009798  -0.285 0.775924    
## pandemic_q1                -0.0153064  0.0068765  -2.226 0.027008 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.006704 on 226 degrees of freedom
## Multiple R-squared:  0.09217,    Adjusted R-squared:  0.06405 
## F-statistic: 3.278 on 7 and 226 DF,  p-value: 0.002449
# =========================
# 3) SERIAL CORRELATION TESTS
# =========================

run_serial_tests <- function(model, model_name, bg_order = 4, lb_lag = 12) {
  cat("\n================", model_name, "================\n")
  
  bg <- bgtest(model, order = bg_order)
  print(bg)
  
  lb <- Box.test(resid(model), lag = lb_lag, type = "Ljung-Box")
  print(lb)
  
  invisible(list(bg = bg, lb = lb))
}

serial_fdi_pandemic <- run_serial_tests(
  mod_dlog_fdi_pandemic,
  "mod_dlog_fdi_pandemic",
  bg_order = 4,
  lb_lag = 12
)
## 
## ================ mod_dlog_fdi_pandemic ================
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  model
## LM test = 1.4919, df = 4, p-value = 0.8281
## 
## 
##  Box-Ljung test
## 
## data:  resid(model)
## X-squared = 12.913, df = 12, p-value = 0.3754
serial_full_with_fdi_pandemic <- run_serial_tests(
  mod_dlog_full_with_fdi_pandemic,
  "mod_dlog_full_with_fdi_pandemic",
  bg_order = 4,
  lb_lag = 12
)
## 
## ================ mod_dlog_full_with_fdi_pandemic ================
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  model
## LM test = 1.6237, df = 4, p-value = 0.8045
## 
## 
##  Box-Ljung test
## 
## data:  resid(model)
## X-squared = 13.55, df = 12, p-value = 0.3303
# =========================
# 4) HETEROSKEDASTICITY TESTS
# =========================

run_hetero_tests <- function(model, model_name) {
  cat("\n================", model_name, "================\n")
  
  bp <- bptest(model)
  print(bp)
  
  fitvals <- fitted(model)
  white_fit <- bptest(model, ~ fitvals + I(fitvals^2))
  print(white_fit)
  
  invisible(list(bp = bp, white_fit = white_fit))
}

hetero_fdi_pandemic <- run_hetero_tests(
  mod_dlog_fdi_pandemic,
  "mod_dlog_fdi_pandemic"
)
## 
## ================ mod_dlog_fdi_pandemic ================
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 4.6277, df = 5, p-value = 0.463
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 4.1829, df = 2, p-value = 0.1235
hetero_full_with_fdi_pandemic <- run_hetero_tests(
  mod_dlog_full_with_fdi_pandemic,
  "mod_dlog_full_with_fdi_pandemic"
)
## 
## ================ mod_dlog_full_with_fdi_pandemic ================
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 5.7121, df = 7, p-value = 0.5737
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 8.1773, df = 2, p-value = 0.01676
#Short run, FDI without other variables should be used.
library(lmtest)

# RESET test for your final short-run model
resettest(mod_dlog_fdi_pandemic, power = 2, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_fdi_pandemic
## RESET = 0.19101, df1 = 1, df2 = 227, p-value = 0.6625
resettest(mod_dlog_fdi_pandemic, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_fdi_pandemic
## RESET = 0.10177, df1 = 2, df2 = 226, p-value = 0.9033
library(lmtest)

resettest(mod_dlog_full_with_fdi_pandemic, power = 2, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_full_with_fdi_pandemic
## RESET = 2.7387, df1 = 1, df2 = 225, p-value = 0.09934
resettest(mod_dlog_full_with_fdi_pandemic, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_full_with_fdi_pandemic
## RESET = 4.1712, df1 = 2, df2 = 224, p-value = 0.01665
# full model is less specified, it is both economically and statistically better to use not full one.
# -------------------------
# BREAK TERMS
# -------------------------

time_index <- seq_along(d_log_wage_gap)
break_date <- 1985

year_vec <- floor(time(d_log_wage_gap))

D2000  <- ifelse(year_vec >= 1985, 1, 0)
DT2000 <- ifelse(year_vec >= 1985, year_vec - 1985, 0)

# -------------------------
# SHORT-RUN DATA WITH BREAK
# -------------------------

reg_dlog_break <- na.omit(data.frame(
  d_log_wage_gap,
  d_log_treasury_gdp,
  d_log_trade_balance,
  d_log_min_wage_real,
  d_log_fdi_outward_gdp,
  pandemic_q1,
  D2000,
  DT2000
))

# -------------------------
# SHORT-RUN FDI MODEL WITH BREAK
# -------------------------

mod_dlog_fdi_break <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp +
    pandemic_q1 + D2000 + DT2000,
  data = reg_dlog_break
)

summary(mod_dlog_fdi_break)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp + pandemic_q1 + 
##     D2000 + DT2000, data = reg_dlog_break)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.016181 -0.004747  0.000004  0.004230  0.032323 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)   
## (Intercept)            1.624e-03  8.114e-04   2.001  0.04658 * 
## d_log_treasury_gdp     9.632e-03  7.417e-03   1.299  0.19537   
## d_log_trade_balance    8.759e-04  1.580e-02   0.055  0.95584   
## d_log_min_wage_real   -2.562e-02  1.721e-02  -1.489  0.13788   
## d_log_fdi_outward_gdp  1.479e-02  5.290e-03   2.795  0.00564 **
## pandemic_q1           -1.475e-02  6.950e-03  -2.123  0.03488 * 
## D2000                  2.729e-04  1.322e-03   0.206  0.83664   
## DT2000                -1.523e-05  4.569e-05  -0.333  0.73924   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.00675 on 226 degrees of freedom
## Multiple R-squared:  0.07977,    Adjusted R-squared:  0.05126 
## F-statistic: 2.799 on 7 and 226 DF,  p-value: 0.008211
# -------------------------
# SHORT-RUN FDI MODEL WITH BREAK
# -------------------------

mod_dlog_fdi_break <- lm(
  d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance +
    d_log_min_wage_real + d_log_fdi_outward_gdp +
    pandemic_q1 + D2000 + DT2000,
  data = reg_dlog_break
)

summary(mod_dlog_fdi_break)
## 
## Call:
## lm(formula = d_log_wage_gap ~ d_log_treasury_gdp + d_log_trade_balance + 
##     d_log_min_wage_real + d_log_fdi_outward_gdp + pandemic_q1 + 
##     D2000 + DT2000, data = reg_dlog_break)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.016181 -0.004747  0.000004  0.004230  0.032323 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)   
## (Intercept)            1.624e-03  8.114e-04   2.001  0.04658 * 
## d_log_treasury_gdp     9.632e-03  7.417e-03   1.299  0.19537   
## d_log_trade_balance    8.759e-04  1.580e-02   0.055  0.95584   
## d_log_min_wage_real   -2.562e-02  1.721e-02  -1.489  0.13788   
## d_log_fdi_outward_gdp  1.479e-02  5.290e-03   2.795  0.00564 **
## pandemic_q1           -1.475e-02  6.950e-03  -2.123  0.03488 * 
## D2000                  2.729e-04  1.322e-03   0.206  0.83664   
## DT2000                -1.523e-05  4.569e-05  -0.333  0.73924   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.00675 on 226 degrees of freedom
## Multiple R-squared:  0.07977,    Adjusted R-squared:  0.05126 
## F-statistic: 2.799 on 7 and 226 DF,  p-value: 0.008211
# =========================
# 3) SERIAL CORRELATION TESTS
# =========================

run_serial_tests <- function(model, model_name, bg_order = 4, lb_lag = 12) {
  cat("\n================", model_name, "================\n")
  
  bg <- bgtest(model, order = bg_order)
  print(bg)
  
  lb <- Box.test(resid(model), lag = lb_lag, type = "Ljung-Box")
  print(lb)
  
  invisible(list(bg = bg, lb = lb))
}

serial_fdi_break <- run_serial_tests(
  mod_dlog_fdi_break,
  "mod_dlog_fdi_break",
  bg_order = 4,
  lb_lag = 12
)
## 
## ================ mod_dlog_fdi_break ================
## 
##  Breusch-Godfrey test for serial correlation of order up to 4
## 
## data:  model
## LM test = 1.5814, df = 4, p-value = 0.8121
## 
## 
##  Box-Ljung test
## 
## data:  resid(model)
## X-squared = 13.021, df = 12, p-value = 0.3675
# =========================
# 4) HETEROSKEDASTICITY TESTS
# =========================

run_hetero_tests <- function(model, model_name) {
  cat("\n================", model_name, "================\n")
  
  bp <- bptest(model)
  print(bp)
  
  fitvals <- fitted(model)
  white_fit <- bptest(model, ~ fitvals + I(fitvals^2))
  print(white_fit)
  
  invisible(list(bp = bp, white_fit = white_fit))
}

hetero_fdi_break <- run_hetero_tests(
  mod_dlog_fdi_break,
  "mod_dlog_fdi_break"
)
## 
## ================ mod_dlog_fdi_break ================
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 12.636, df = 7, p-value = 0.08148
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 3.5552, df = 2, p-value = 0.169
# =========================
# 5) RESET TESTS
# =========================

library(lmtest)

resettest(mod_dlog_fdi_break, power = 2, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_fdi_break
## RESET = 0.072584, df1 = 1, df2 = 225, p-value = 0.7879
resettest(mod_dlog_fdi_break, power = 2:3, type = "fitted")
## 
##  RESET test
## 
## data:  mod_dlog_fdi_break
## RESET = 0.13928, df1 = 2, df2 = 224, p-value = 0.8701
# out of all short run models, short run FDI pandemic without break is better