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")
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
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 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 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
##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
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 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)
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
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
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
# =========================
# 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