## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
## Loading required package: MASS
## Loading required package: strucchange
## Loading required package: sandwich
## Loading required package: urca
## Loading required package: lmtest
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:xts':
##
## first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## samadb 0.3.1, see help(samadb). Commercial users require a license at https://econdata.co.za/support/
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:PerformanceAnalytics':
##
## kurtosis, skewness
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Registered S3 methods overwritten by 'forecast':
## method from
## fitted.Arima TSA
## plot.Arima TSA
##
## Attaching package: 'imputeTS'
## The following object is masked from 'package:zoo':
##
## na.locf
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ stringr::boundary() masks strucchange::boundary()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first() masks xts::first()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks xts::last()
## ✖ dplyr::select() masks MASS::select()
## ✖ readr::spec() masks TSA::spec()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Attaching package: 'matrixStats'
##
##
## The following object is masked from 'package:dplyr':
##
## count
##
##
## ── Attaching core tidyquant packages ─────────────────────── tidyquant 1.0.11 ──
## ✔ quantmod 0.4.26 ✔ TTR 0.24.4
## ── Conflicts ────────────────────────────────────────── tidyquant_conflicts() ──
## ✖ zoo::as.Date() masks base::as.Date()
## ✖ zoo::as.Date.numeric() masks base::as.Date.numeric()
## ✖ stringr::boundary() masks strucchange::boundary()
## ✖ matrixStats::count() masks dplyr::count()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first() masks xts::first()
## ✖ TSA::kurtosis() masks PerformanceAnalytics::kurtosis()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks xts::last()
## ✖ PerformanceAnalytics::legend() masks graphics::legend()
## ✖ imputeTS::na.locf() masks zoo::na.locf()
## ✖ dplyr::select() masks MASS::select()
## ✖ TSA::skewness() masks PerformanceAnalytics::skewness()
## ✖ readr::spec() masks TSA::spec()
## ✖ quantmod::summary() masks urca::summary(), base::summary()
## ✖ tidyquant::VAR() masks vars::VAR()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Attaching package: 'tidyquant'
##
##
## The following object is masked from 'package:vars':
##
## VAR
## Warning in system(paste(x13.bin, file.path(tdir, "Testairline")), intern =
## TRUE, : running command
## '/Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/library/x13binary/bin/x13ashtml
## /var/folders/pn/jl67ndws11b3dw5mstg6xx6r0000gn/T//RtmpWDtCyZ/x13binary__d7b37a748bf1__dir/Testairline
## 2>/dev/null' had status 134
## The binaries provided by 'x13binary' do not work on this
## machine. To get more information, run:
## x13binary::checkX13binary()
##
## You can set 'X13_PATH' manually if you intend to use your own
## binaries. See ?seasonal for details.
##
##
## Attaching package: 'seasonal'
##
## The following object is masked from 'package:tibble':
##
## view
Any intro to macroeconomics class, at some point, presents students with the duality of centralized economic policy. Fiscal and monetary policy are set up as two alternative policy paradigms towards manipulating or “steering” macro-economic variables. The ideal state of the economy is stated to be when it is aligned with the natural rate of unemployment (NRU), also referred to as the non-accelerating inflation rate of unemployment (NAIRU) or, simply, full employment. This is the rate of inflation where the trade-off between inflation and lower unemployment breaks down, and monetary inflation is reflected in price inflation without decreases in unemployment/increases in employment. This would be precisely the kind of scenario where the assumptions of classical monetary economists like John Stuart-Mill (yeah, that guy), held credence. At full employment, monetary inflation is reflected through price inflation and not an expansion in final output. This is a scenario where the T in MV=PT isn’t increasing as a result of increases in MV, forcing P to take the brunt of the expansion of MV. This is also known as an “overheating” economy and it can spiral into a degradation in the people’s trust that a unit of currency will hold it’s value over time, which then imposes a “use it or lose it” mentality that feeds into itself; people try to spend their income as fast or as soon as possible and hyperinflation takes hold.
Now, I’ve spent a lot discussing the features of full employment for good reason. Full employment is influenced by the institutional structures within an economy, remember that. The Non Accelerating Inflation Rate of Unemployment can be higher or lower depending on factors like labor market rigidity, legislative efficiency, bureaucratic and Government reliability and infrastructural integrity and capacity.
Two countries that are identical in most ways (population, real income, Capital Accumulation etc.) but differ in terms of labor market rigidity and the weight and reliability of their bureaucratic burden. country A (for Alabasta), having more flexible labor markets and a particularly efficient and reliable bureaucracy, will tend to have a lower natural rate of unemployment than country D (for Dressrosa), with more rigid labor market controls and an inconsistent or corrupt bureaucratic system.
Labor Market rigidity can occur because of institutional and legislative matters making it harder or easier to hire and/or fire talent. Even then there’s a trade-off; the harder it is to fire an individual (the more pro-labor the institutions), the more the marginal cost of employing new talent becomes. Employers become more selective and cautious about taking on new hires as the information about the efficacy of the employee’s skills-set is asymmetric and potentially incomplete. Signaling mechanisms like degrees and diplomas become less important (It helps more and more to have multiple) while experience takes on more importance, because experience means a proven track record of working under an employer. Something that can inform employers about the risk of hiring new talent.
I don’t think I need to harp on about where that leaves young people with degrees, limited work experience and limited connections to circumvent that requirement… It leaves them unemployed and, I cannot stress enough, the NAIRU is determined at the institutional level.
Monetary and fiscal policy are legitimate tools for influencing economies. Government spending contributes to GDP and thus contributes to employment in some manner. So does Monetary Policy. Monetary policy is often described as the sledgehammer tool that influences consumer and producer behavior across the economy, in the short term. We will be making use of a bespoke Divisia Monetary Aggregate as well as a simple sum analogue to approximate changes in the quantity of money. The internal rate of return for cash and notes is the negative of the monthly inflation rate (annual rate/12).
The ultimate Goal is to demonstrate, broadly, that the unemployment experienced by South Africa is rooted in institutions other than Central Bank policy, and, to the extent that Government spending is financed through debt-monetisation, fiscal policy has little sway on the NAIRU.
Fiscal and monetary policy are kept separate by convention. The state insists on financing it’s spending through taxation and not through the expansion of fiat money and the monetizing of it’s debts (for good reason).
According to modern monetary theorists, the central Bank can finance Government spending if it Simply buys a lot of bonds from the treasury and zeroes-out the debt. The effect of such an action is likely to depend on the proportion of Government debt being held by the Reserve Bank compared to the proportion held by third party investors (domestic and foreign).The point still stands, however, that debt monetisation is a legitimate policy proposal and that through monetary policy, fiscal policy can be momentarily freed from the burden of it’s debt. The benefits of this, however, tend to be short lived.
As we said, every economy has a NIRU, which depends loosely on policy actions. Government spending of fiat money in an attempt to push the economy below it’s NAIRU is inflationary. Government spending from taxation tries to avoid this, as leaving individuals with a lower disposable income through higher taxes, naturally leads to a state of reduced private spending, which gives breathing room for the Government to spend without having to worry about pushing up against the NAIRU.
Separating the power of the mint and the powers of the state is by no means strictly necessary and you’ll often come across individuals who question the need for an independant Central Bank. So why is it that, in South Africa and around the world, it seems the prevailing wisdom is the functional or formal seperation of the mint/printing press and the state?
Central Banks serve the institutional functions of being a banker to the banks, a regulator of the banks as well as a lender of last resort. Through open market operations (the purchase and sale of debt securities on the market so as to increase or decrease the amount of money circulating in an economy) Banks typically manipulate short-run interest rates towards the “natural” rate of interest. This can be done directly or indirectly. Focusing on inflation and an estimated output gap, the Taylor rule is essentially a means of aligning money rates of interest with that rate (r-star) which is consistent with stable economic growth and low levels of inflation. This rate is the natural rate. Under the dualist paradigm of classical economics, this is an attempt to keep the money rate of interest identical to the natural rate implied by the real economy. If money market rates are low relative to the “natural” rate, Then the incentive is to gain credit on the money markets to expand the provision of real goods (which have a higher internal rate of return) putting rationing pressure on real output, thus raising prices.
This interpretation is somewhat antiquated, having been introduced by Knutt Wicksell in his writings on Capital and Interest in the late 19th Century. However it’s implications are still used by policy makers today. The natural rate of interest is defined as the rate of interest that neither leads to price deflation nor price inflation; the rate of interest consistent with the neutrality of money.
That and what is called the classical duality whereby monetary policy has little influence on the real ecoomy regardless
df.MonQ<- df.MQB%>%
dplyr::select(date,
KBP1312M, ## 1 CASH AND COIN CIRCULATING (own rate of return is negative CPI inflation/12)
KBP1313M, ## 2 Cheque and Transmission Deposits
KBP1314M, ## 3 DEMAND DEPOSITS (orr is KBP1601M)
KBP1321M, ## 4 SAVINGS DEPOSITS (orr KBP1606M)
KBP1316M, ## 5 SHORT-TERM DEPOSITS (orr is KBP1609M)
KBP1322M, ## 6 MEDIUM-TERM DEPOSITS (orr is KBP2007M / KBP1611M)
KBP1319M, ## 7 LONG-TERM DEPOSITS (orr is KBP1612M)
KBP1070M, ## 8 Cash managed, cheque and transmission deposits
KBP1082M, ## 9 Debt securities
KBP1369M, ## 10 LOANS and ADVANCES
KBP1334M, ## 11 Domestic capital and reserves
KBP1155M, ## - 12 DEPOSITS BY MONETARY INSTITUTIONS
KBP1161M, ## 13 DISCOUNTED TREASURY BILLS
KBP1200M, ## 14 MUTUAL BANK TRANSMISSION DEPOSITS
KBP1201M, ## 15 M BANK SAVINGS DEPOSITS
KBP1202M, ## 16 M BANK OTHER SHORT-MED TERM DEPOSITS
KBP1203M, ## 17 M BANK LONG TERM DEPOSITS
KBP1209M, ## 18 POSTBANK DEPOSITS
)
MonQ.imp <- imputeTS::na_mean(df.MonQ, option = "mode") ## impute the empty values with the modal value of the column (the empty columns have a modal value of 1 so I doubt they'll be consequential)
########################################################################################################
Instead of relying entirely on textbook theory, I believe getting our hands dirty by looking at the data on Unemployment, Real and nominal output, inflation and the money supply. Our starting hypothesis is that Monetary Policy has little influence on real economic growth. We are using a measure of the money supply that I constructed using data from SARB’s quarterly bulletin. I will show the code and process used to construct the Törnqvist monetary index before conducting statistical tests on the data.
Keep in mind, I’m reverse engineering some of these tools so if you’re expecting an explanation… why? These are the musings of an idiot with a hyperfixation on economics and econometrics because they’re the only numbers I can understand without my brain cells overheating.
I decided on making the internal rate of return for cash and notes in circulation -1/12 of the monthly yoy core inflation figures. (core inflation is CPI excluding volatile prices such as energy and food and alcohol). I think this is reasonable.
The rate of return for deposits is the average rate offered on deposit accounts: the amount, in nominal terms, that your deposits will accrue in interest. What of coins and notes? they don’t increase in value over time, except as the rate of inflation increases or decreases. As such, this inherent cost to holding base currency is worked into the tanbe for internal returns.
It should be noted that due to some difficulties with the samadb package on my workstation, many rates of returns are approximates, making use of surrogate rates of return. The alternative/preferred rates will be included in the discussion section.
df.irr1 <- df.MQB %>% ## a df of internal rates of return for calculating the opportunity cost of different monies
dplyr::select(
date,
KBP7146A # 1 CPI
)
df.irr2 <- df.MQB.monbank %>%
dplyr::select(
KBP1604M_M_N_N_LVL, ## 2 BA930 Deposit Rates: Household Sector: Cheque Accounts
KBP1605M_M_N_N_LVL, ## 3 BA930 Deposit Rates: Household Sector: Call Deposits
KBP1612M_M_N_N_LVL, ## 4 BA930 Deposit Rates: Household Sector: Fixed Deposits(5yrs+) Weighted Average (%). , Nominal
KBP1609M_M_N_N_LVL, ## 5 BA930 Deposit Rates: Household Sector: Fixed Deposits(0-1yr)
KBP1610M_M_N_N_LVL, ## 6 BA930 Deposit Rates: Household Sector: Fixed Deposits (1<x<3)
KBP1611M_M_N_N_LVL, ## 7 BA930 Deposit Rates: Household Sector: Fixed Deposits(3yrs+>&<5yrs) Weighted Average (%). , Nominal
KBP1616M_M_N_N_LVL, ## 8 BA930 Deposit Rates: Corporate Sector: Call Deposits Weighted Average (%). , Nominal
KBP1603M_M_N_N_LVL, ## 9 Yield on Bonds Traded on the Stock Exchange: Government Bonds (20-30yrs)
KBP1626M_M_N_N_LVL, ## 10 BA930 Lending Rates: All Domestic Private Sectors: Leasing Transactions: Flexible Rate Weighted Average. , Nominal
KBP1606M_M_N_N_LVL, ## 11 BA930 Deposit Rates: Household Sector: Notice Deposit
KBP1634M_M_N_N_LVL, ## 12 BA930 Lending Rates: Household Sector: Instalment Sale
KBP1618M_M_N_N_LVL, ## 13 Prime Overdraft Rate. End of Period, Nominal,
KBP1615M_M_N_N_LVL, ## 14 BA930 Deposit Rates: Corporate Sector: Cheque Accounts Weighted Average (%). , Nominal
KBP1617M_M_N_N_LVL, ## 15 BA930 Deposit Rates: Corporate Sector: Notice Deposits (1-32 days)
KBP1620M_M_N_N_LVL, ## 16 BA930 Deposit Rates: Corporate Sector: Fixed Deposits
KBP1622M_M_N_N_LVL, ## 17 BA930 Deposit Rates: Corporate Sector: Fixed Deposits (3yrs & More, but less than 5yrs) Weighted Average (%). , Nominal
KBP1602M_M_N_N_LVL ## 18 BA930 Deposit Rates: All Domestic Private Sectors: Other Weighted Average (%). , Nominal
)
########################################################################################################
monthly_xts <- xts(, order.by = MonQ.imp$date)
#////////////////////////////////////////////////////////////
df.unem <- df.QQB%>%
dplyr::select(date,
KBP7019K)
#////////////////////////////////////////////////////////////
df.NGDP <- df.QQB%>%
dplyr::select(date,
KBP6006L)
#////////////////////////////////////////////////////////////
df.RGDP <- df.QQB%>%
dplyr::select(date,
KBP6006D)
#////////////////////////////////////////////////////////////
unemployment.xts <- xts(df.unem[,-1], order.by = df.QQB$date)
nominalGDP.xts <- xts(df.NGDP[,-1], order.by = df.NGDP$date)
realGDP.xts <- xts(df.RGDP[,-1], order.by = df.RGDP$date)
M.rGDP <- cbind(monthly_xts, realGDP.xts)%>%
na_interpolation()
M.Unem <- cbind(monthly_xts, unemployment.xts)%>%
na_interpolation()
M.nGDP <- cbind(monthly_xts, nominalGDP.xts)%>%
na_interpolation()
###########################################################################
plot(M.rGDP)
plot(M.Unem)
plot(M.nGDP)
I have officially turned quarterly data into monthly data. Kalman smoothing made the plots look angy and aggressive so I used interpolation instead. Don’t ask me if it’s linear or quadratic interpolation, it was whichever one that gave plots that didn’t look like the mood chart for someone with borderline personality disorder who was “actually doing better than she was the last time you talked”. Anyways, I think we should brace ourselves for some outliers in the data due to the 2020-2021 COVID 19 shutdown.
Whatever though, we have all of our nice data in monthly form over a decade because data becomes sparse for internal rates of return before then (unfortunately, we can’t look at the Great Recession because SARB only decided to start collecting and publishing deposit rate data in 2013 (sus… what are they hiding from before then, what don’t they want us to know?). The Scale of these are very different, so I’m going to log transform all of the data to give the general scale a bit of comparability. Though this doesn’t fix the non-stationary means so we’ll work up towards taking first differences of log transformed data. instead.
Beginning with two time series matrices we can begin to calculate the user cost (R-irr)/1+R. Our Benchmark rate is the Bank Rate. I created a new matrix by joining the CPI time-series with the other 18 rates of return so that the own rate of return for cash and notes was reflected as being influenced by inflation. Seeing as monthly CPI inflation data reflects how much prices change over a year; taking a 12th of that to represent the monthly carrying cost for cash and notes means our monetary aggregate Mt is already likely to be related to CPI inflation due to its inclusion in the user cost of cash. This is why I decided to include the GDP-Deflator as an independent measure of general price-inflation.
Our benchmark rate is set as the bank-rate, i.e. the interest rate that the Central Bank pays commercial banks for the reserves they keep with it. It is also known as the base rate; its inclusion in the Divisia aggregate is what allows us to use the Mt as a gauge of monetary policy regardless of whether the primary tool is the Base rate, open market operations or Quantity targeting… All of that data is included in one statistic.
df.bankrate <- df.MQB %>% ## our benchmark rate in the formula for user cost: [(R-irr)/(1+R)]
dplyr::select(
date,
KBP1401M ## Bankrate
)
bankrate.xts <- xts(df.bankrate[,-1], order.by = df.bankrate$date)
bankrate.xtsimp <- na_ma(bankrate.xts)
plot(bankrate.xtsimp)
align.benchmark <- bankrate.xtsimp[index(irr.xts)] ## aligning the indexes of the benchmark rate data
benchmrk.vec <- as.numeric(align.benchmark) ## create a numeric vector of the indexed bank rate data
usercost.xts <- irr.xts
for(i in 1:ncol(irr.xts)) { ## cycle through each column of the xts object
asset_rate <- as.numeric(irr.xts[, i]) ## treating each irr entry as a numeric object
usercost.xts[, i] <- (benchmrk.vec - asset_rate) / (1 + benchmrk.vec) ## calculate the user cost using irr and benchmark rate
}
plot(usercost.xts)
This is a time series object tracking the value of the user cost of each monetary asset, based on proxy rates of return in cases where the relevant rate of return was unavailable. As we can see, the base rate has influence witch permiates the aggregate, which goues through a large drop, leading to more negative user costs, which incentivises a substitution effect.
common_dates <- index(MonQ.xts) ##alining the indexes
usercost.xts <- usercost.xts[common_dates,]
quant.money.xts <- MonQ.xts[common_dates, ]
## This one we keep in case we need to convert quarterly data into monthly data for VAR or VECM models
# Calculate expenditure shares (s_{i,t})
# s_{i,t} = (user_cost_{i,t} * quantity_{i,t}) / total_expenditure_t
expenditure.xts <- usercost.xts * quant.money.xts
total_expenditure <- rowSums(expenditure.xts, na.rm = TRUE)
shares <- expenditure.xts / total_expenditure ## s_{i,t}
plot(shares)
plot(expenditure.xts)
These are the expendature shares over time. Yes, the expendature is negative, that,s because it is user cost is negative
# 3. Compute lagged quantities and shares
lag_quantities <- lag.xts(quant.money.xts, 1)
lag_shares <- lag.xts(shares, 1)
# 4. Calculate Törnqvist index components
# a. Quantity growth ratios
lag_quantities[lag_quantities < 1e-10] <- NA
growth_ratios <- quant.money.xts / lag_quantities
growth_ratios[growth_ratios <= 0 | is.infinite(growth_ratios)] <- NA
growth_ratios[growth_ratios > 1e100] <- NA
# b. Weighted average of shares (t and t-1), this is the chaining of weights
weights <- (shares + lag_shares) / 2
# c. Compute log-growth contributions
log_growth <- log(growth_ratios) * weights
# 5. Sum contributions across assets (for each period)
sum_log_growth <- rowSums(log_growth, na.rm = TRUE)
sumlog.growth.xts <- xts(sum_log_growth, order.by = common_dates)
summary(sumlog.growth.xts) # Look for -Inf/Inf
## Index sumlog.growth.xts
## Min. :2013-01-01 Min. :-0.033261
## 1st Qu.:2015-07-01 1st Qu.:-0.002606
## Median :2018-01-01 Median : 0.004283
## Mean :2017-12-31 Mean : 0.004690
## 3rd Qu.:2020-07-01 3rd Qu.: 0.011814
## Max. :2023-01-01 Max. : 0.034683
cumulative_log_growth <- cumsum(replace(sum_log_growth, is.na(sum_log_growth), 0))
tornqvist_vals <- 100 * exp(cumulative_log_growth - cumulative_log_growth[1])
tornqvist_index <- xts(tornqvist_vals, order.by = common_dates)
n <- length(common_dates)
tornqvist_vals <- rep(NA_real_, n)
tornqvist_vals[1] <- 100 # Base period
for (i in 2:n) {
if (!is.na(sum_log_growth[i])) {
tornqvist_vals[i] <- tornqvist_vals[i-1] * exp(sum_log_growth[i])
}
}
# 8. Create final xts object
tornqvist_index <- xts(tornqvist_vals, order.by = common_dates)
# 7. (Optional) Rename and inspect
colnames(tornqvist_index) <- "Tornqvist_Index"
head(tornqvist_index)
## Tornqvist_Index
## 2013-01-01 100.00000
## 2013-02-01 99.83094
## 2013-03-01 99.86428
## 2013-04-01 99.81844
## 2013-05-01 101.76989
## 2013-06-01 99.99276
plot(sumlog.growth.xts)
plot(tornqvist_index)
And finally, we have a Törnqvist Index that actually looks reasonable (compared to the one I had made before with incomplete data for internal returns). the implication is that monetary policy was somehow still tightening in june of 2020 which last 6 months before more expansive monetary policy since around June 2021
I avoid making use of Inflation data directly as a measure of price changes seeing as inflation is already factored into the user cost of holding cash and notes, any correlation between Mt and CPI may be spurious and due to the double accounting for inflation. We use the GDP deflator and log transform that. The most obvious takeaway from these time series is that they are not exactly stationary. The trend is quite clear, although Okun’s Law is looking more like a suggestion since unemployment and real GDP are, apparently, moving together. This country is broken.
Another visual observation is that nominal GDP grows faster than real GDP. What does that imply? If anything it seems as though inflation is getting worse as the real economy may be reaching it’s limits, as allowed by the institutions the economy is couched in.
Another thing to keep in mind at this point is that we’re eyeballing log transformed data. Not a very rigorous approach to just go “look at these graphs” and say the economy is fucked. I came here with a mission: to see if I can figure out how fucked we are, y’know put a number on the fuckedness. Like if I could say we are 50 fucks deep or we’re 20% more fucked than the average country, or even (knock on wood, that’s a threat) if we’re less fucked than I thought. I just want to be able to do a bit more than say “look at these graphs”. Ok I’m rambling. Let’s take a look at the simple sum measure of money and compare it, with our very unbiased eyes, to the superlative index that we definitely constructed ourselves
sim.M<- rowSums(MonQ.xts)
M.sim <- xts(sim.M, order.by = df.MonQ$date)
ln.Msum <- log(M.sim)
plot(ln.Msum)
So like, this is the simple sum version of my monetary aggregate. It seems a lot more consistent, relative to the Törqvist index. Though that may be an artifact of the proxies being used being inapropriate or perhaps needing to be scaled to monthly percentages.
Seeing as our data is mostly non sttionary, having an increasing mean, bar 2020 , which makes it non stationary on the face of it. However, we can take first differences of the data and see if that exhibits a sense of stationarity.
##The data has a general trend, so since we've taken the log transform of it already, we're just collecting the differenced forms of the data real quick.
diff.Unem <- xts(diff(ln.Unemployment), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.rGDP <- xts(diff(ln.RealGDP), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.nGDP <- xts(diff(ln.NomGDP), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.Mt <- xts(diff(log.Mt), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.Msum <- xts(diff(ln.Msum), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.deflate <- xts(diff(ln.def), order.by = MonQ.imp$date)%>%
na_interpolation()
diff.CPI <- xts(diff(ln.CCPI), order.by = MonQ.imp$date )%>%
na_interpolation()
###############################################################################################
##Just to show what forward differencing does:
diff.Msum.deflate<-xts(cbind(diff.Msum, diff.deflate), order.by = df.MonQ$date)
colnames(diff.Msum.deflate) = c("diff.Msum", "diff.Deflator")
diff.Msum_filtered <- diff.Msum.deflate[!index(diff.Msum.deflate) %in% as.Date("2013-01-01")]
df.diffMsumDef <- fortify(diff.Msum_filtered)
base::colnames(df.diffMsumDef) = c("Index", "diff.Msum", "diff.deflate")
df.diffMsumDef$decade <- paste0(floor(as.numeric(format(df.diffMsumDef$Index, "%Y")) / 10) * 10, "s")
ggplot(df.diffMsumDef, aes(x = diff.Msum, y = diff.deflate, colour = decade)) +
geom_point() +
geom_smooth(method = "glm", se = FALSE)+
labs(
title = "differenced ln(Msum) and (ln(GDPdeflator)) by Decade",
x = "differences on ln(Msum)",
y = "differenced Log(deflate)",
colour = "Decade"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
#######################################################################################################
diff.YnU <- xts(cbind(diff.rGDP, diff.Unem), order.by = df.MonQ$date)
diff.YnU.f <- diff.YnU[!index(diff.YnU) %in% as.Date("2013-01-01")]
df.diffYnU <- fortify(diff.YnU.f)
colnames(df.diffYnU) = c( "Index", "diff.rGDP", "diff.Unem")
df.diffYnU$decade <- paste0(floor(as.numeric(format(df.diffYnU$Index, "%Y")) / 10) * 10, "s")
ggplot(df.diffYnU, aes(x= diff.rGDP, y= diff.Unem, colour = decade))+
geom_point() +
geom_smooth(method = "glm", se = FALSE)+
labs(
title =" differenced ln(rGDP) and ln(Unemployment)",
x = " differenced log (realGDP)",
y = " differenced log (Unemployment)",
colour = "Decade"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
#######################################################################################################
nomGDP.Mt <- xts(cbind(diff.nGDP, diff.Mt), order.by = MonQ.imp$date)
nomGDP.Mt <- nomGDP.Mt[!index(nomGDP.Mt) %in% as.Date("2013-01-01")]
df.nomGDP.mt <- fortify(nomGDP.Mt)
colnames(df.nomGDP.mt) = c('Index', 'differenced log(nominal GDP)', 'differenced log(Mt)')
df.nomGDP.mt$decade <- paste0(floor(as.numeric(format(df.nomGDP.mt$Index, "%Y")) / 10) * 10, "s")
ggplot(df.nomGDP.mt, aes(x= `differenced log(nominal GDP)`, y= `differenced log(Mt)`, colour = decade))+
geom_point() +
geom_smooth(method = "glm", se = FALSE)+
labs(
title =" differenced ln(nGDP) and ln(Mt)",
x = " differenced log (nGDP)",
y = " differenced log (Mt)",
colour = "Decade"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
#######################################################################################################
CCPI.Mt <- xts(cbind(diff.CPI, diff.Mt), order.by = MonQ.imp$date)
CCPI.Mt <- CCPI.Mt[!index(CCPI.Mt) %in% as.Date("2013-01-01")]
df.CCPI.Mt <- fortify(CCPI.Mt)
colnames(df.CCPI.Mt) = c('Index', 'differenced log(CPI)', 'differenced log(Mt)')
df.CCPI.Mt$decade <- paste0(floor(as.numeric(format(df.CCPI.Mt$Index, "%Y")) / 10) * 10, "s")
ggplot(df.CCPI.Mt, aes(x= `differenced log(CPI)`, y= `differenced log(Mt)`, colour = decade))+
geom_point() +
geom_smooth(method = "glm", se = FALSE)+
labs(
title =" differenced ln(CPI) and ln(Mt)",
x = " differenced log (CPI)",
y = " differenced log (Mt)",
colour = "Decade"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
#######################################################################################################
Unem.CPI <- xts(cbind(diff.Unem, diff.CPI), order.by = MonQ.imp$date)
Unem.CPI <- Unem.CPI[!index(Unem.CPI) %in% as.Date("2013-01-01")]
dfUnem.CPI <- fortify(Unem.CPI)
colnames(dfUnem.CPI) = c('Index', 'differenced log(Unemployment)', 'differenced log(CPI)')
dfUnem.CPI$decade <- paste0(floor(as.numeric(format(dfUnem.CPI$Index, "%Y")) / 10) * 10, "s")
ggplot(dfUnem.CPI, aes(x= `differenced log(Unemployment)`, y= `differenced log(CPI)`, colour = decade))+
geom_point() +
geom_smooth(method = "glm", se = FALSE)+
labs(
title =" differenced ln(Unemployment) and ln(CPI)",
x = " differenced log (Unemployment)",
y = " differenced log (CPI)",
colour = "Decade"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
The Msum-deflate plot shows that there isn’t much of a relationship between the two.
The rGDP-UNem barely shows a relationship, its almost like it’s teasing Okun’s law but it also seems to be quite a ways more complicated than that. Though one could tease out hints of a positive relationship.
The quantity of money in Mt is irrelevant to the level of real GDP and nominal GDP, with them being inelastic to the Mt money supply. The data should be coloured in by decade but I have no clue how to do that so here you go.
I figured it out!! if you need to interrogate a particular data-set it should be the 2010s data. So the 2020s may have a Covid 19 problem, it gets swayed by obvious outliers. Though, we have essentially recreated a form of empirical proof that changes in nominal GDP are ultimately inelastic with respect to changes in the money suppy in Mt.
The more complex relationship, a wider range of CPI changes are associated with a narrow range of Unemployment changes, there seems to be a very small negative relationship between between the two (Unemployment and inflation trade-off in contemporaneous shocks?). The plots show the differenced data at each observation, which should only be used to gain an idea of contemporaneous movements in the variables.
That of Mt and Changes in Nominal GDP that seems to illustrate the long run relationship between the two is visually neutral. A wide range of first differences of the log of Mt is associated with a narrower range of contemporaneous GDP changes.
Surprisingly, we have a negative relation between Mt and CPI
varYnU <- cbind(diff.rGDP, diff.Unem)
colnames(varYnU) <- c("dfln.rGDP", "dfln.Unem")
varYnU_lag.selection <- vars::VARselect(varYnU, type = "const")
varYnU_optilag <- varYnU_lag.selection$selection["AIC(n)"]
rYnU.model <- vars::VAR(
y = varYnU,
p = varYnU_optilag,
type = "const",
season = NULL,
exogen = NULL
)
summary(rYnU.model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: dfln.rGDP, dfln.Unem
## Deterministic variables: const
## Sample size: 111
## Log Likelihood: 793.089
## Roots of the characteristic polynomial:
## 0.971 0.9704 0.9704 0.9462 0.9462 0.945 0.945 0.9389 0.9389 0.919 0.8706 0.8706 0.8325 0.8325 0.8322 0.8322 0.8253 0.8253 0.7092 0.3098
## Call:
## vars::VAR(y = varYnU, p = varYnU_optilag, type = "const", exogen = NULL)
##
##
## Estimation results for equation dfln.rGDP:
## ==========================================
## dfln.rGDP = dfln.rGDP.l1 + dfln.Unem.l1 + dfln.rGDP.l2 + dfln.Unem.l2 + dfln.rGDP.l3 + dfln.Unem.l3 + dfln.rGDP.l4 + dfln.Unem.l4 + dfln.rGDP.l5 + dfln.Unem.l5 + dfln.rGDP.l6 + dfln.Unem.l6 + dfln.rGDP.l7 + dfln.Unem.l7 + dfln.rGDP.l8 + dfln.Unem.l8 + dfln.rGDP.l9 + dfln.Unem.l9 + dfln.rGDP.l10 + dfln.Unem.l10 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.rGDP.l1 0.9053326 0.2041012 4.436 2.59e-05 ***
## dfln.Unem.l1 -0.0931533 0.1115563 -0.835 0.405910
## dfln.rGDP.l2 0.0212616 0.2679349 0.079 0.936928
## dfln.Unem.l2 -0.0254679 0.1441503 -0.177 0.860160
## dfln.rGDP.l3 -1.2112455 0.2679487 -4.520 1.87e-05 ***
## dfln.Unem.l3 0.1588514 0.1441742 1.102 0.273486
## dfln.rGDP.l4 1.0241439 0.3097827 3.306 0.001360 **
## dfln.Unem.l4 -0.2102667 0.1637953 -1.284 0.202536
## dfln.rGDP.l5 0.0265984 0.3295830 0.081 0.935857
## dfln.Unem.l5 -0.0327686 0.1742937 -0.188 0.851294
## dfln.rGDP.l6 -1.3088750 0.3295982 -3.971 0.000144 ***
## dfln.Unem.l6 0.4231636 0.1743283 2.427 0.017199 *
## dfln.rGDP.l7 0.9714289 0.3229696 3.008 0.003412 **
## dfln.Unem.l7 -0.3495436 0.1659966 -2.106 0.038013 *
## dfln.rGDP.l8 0.0079049 0.2847328 0.028 0.977913
## dfln.Unem.l8 -0.0157385 0.1459009 -0.108 0.914338
## dfln.rGDP.l9 -0.7773374 0.2847276 -2.730 0.007616 **
## dfln.Unem.l9 0.3449661 0.1459117 2.364 0.020219 *
## dfln.rGDP.l10 0.4864559 0.2213736 2.197 0.030556 *
## dfln.Unem.l10 -0.2479709 0.1126185 -2.202 0.030231 *
## const 0.0006318 0.0008858 0.713 0.477584
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.008594 on 90 degrees of freedom
## Multiple R-Squared: 0.6283, Adjusted R-squared: 0.5457
## F-statistic: 7.608 on 20 and 90 DF, p-value: 4.158e-12
##
##
## Estimation results for equation dfln.Unem:
## ==========================================
## dfln.Unem = dfln.rGDP.l1 + dfln.Unem.l1 + dfln.rGDP.l2 + dfln.Unem.l2 + dfln.rGDP.l3 + dfln.Unem.l3 + dfln.rGDP.l4 + dfln.Unem.l4 + dfln.rGDP.l5 + dfln.Unem.l5 + dfln.rGDP.l6 + dfln.Unem.l6 + dfln.rGDP.l7 + dfln.Unem.l7 + dfln.rGDP.l8 + dfln.Unem.l8 + dfln.rGDP.l9 + dfln.Unem.l9 + dfln.rGDP.l10 + dfln.Unem.l10 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.rGDP.l1 -0.093743 0.382353 -0.245 0.806879
## dfln.Unem.l1 0.727395 0.208984 3.481 0.000774 ***
## dfln.rGDP.l2 0.049063 0.501935 0.098 0.922351
## dfln.Unem.l2 -0.051034 0.270044 -0.189 0.850530
## dfln.rGDP.l3 -0.746770 0.501961 -1.488 0.140324
## dfln.Unem.l3 -0.528151 0.270088 -1.955 0.053629 .
## dfln.rGDP.l4 0.454465 0.580331 0.783 0.435617
## dfln.Unem.l4 0.361927 0.306846 1.180 0.241304
## dfln.rGDP.l5 0.062126 0.617424 0.101 0.920074
## dfln.Unem.l5 -0.067313 0.326513 -0.206 0.837134
## dfln.rGDP.l6 -1.299392 0.617452 -2.104 0.038128 *
## dfln.Unem.l6 0.133929 0.326578 0.410 0.682707
## dfln.rGDP.l7 0.709009 0.605034 1.172 0.244351
## dfln.Unem.l7 -0.042085 0.310969 -0.135 0.892650
## dfln.rGDP.l8 0.021877 0.533404 0.041 0.967376
## dfln.Unem.l8 -0.033385 0.273323 -0.122 0.903057
## dfln.rGDP.l9 -0.260742 0.533394 -0.489 0.626148
## dfln.Unem.l9 -0.039802 0.273343 -0.146 0.884553
## dfln.rGDP.l10 -0.205794 0.414710 -0.496 0.620938
## dfln.Unem.l10 0.171176 0.210974 0.811 0.419299
## const 0.001816 0.001659 1.094 0.276821
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.0161 on 90 degrees of freedom
## Multiple R-Squared: 0.6157, Adjusted R-squared: 0.5302
## F-statistic: 7.208 on 20 and 90 DF, p-value: 1.577e-11
##
##
##
## Covariance matrix of residuals:
## dfln.rGDP dfln.Unem
## dfln.rGDP 7.386e-05 0.0001261
## dfln.Unem 1.261e-04 0.0002592
##
## Correlation matrix of residuals:
## dfln.rGDP dfln.Unem
## dfln.rGDP 1.0000 0.9113
## dfln.Unem 0.9113 1.0000
After taking the first differences of all the time series data (since the eye test implies non-stationarity). Starting with Real GDP and Unemployment, we conduct a VAR(“AIC(n)”) on the differenced data of real GDP and Unemployment. The sample size is 110 and the log-likelihood is consistently high, implying a relatively decent fit; although this is something we’ll be comparing with our other models.
The results are somewhat confusing. Real GDP is extremely autoregressive with significant lags 1, 3, 4, 6, 7, 9 and 10 months preceding the present period. The sign of the influence oscilated between negative and positive influences. It also has significant influences from lagged variables of Unemployment (l10, l9, l7, l6) at the 5% level.
Log Unemployment is mostly disconnected from real GDP, with only two significant lags, Unem L1 (at 0.001 level and and rGDP l6 at a 0.5 significance level. Okun’s Law suggests that increases in real GDP are correlated with lower unemployment rates. The 6th lag presents extremely weak evidence that Okun’s law may still hold influence, albeit loosely.
The charecteristic roots of the polynomial are less than 1, which imply that shocks to the system are going to peter out, instead of blowing up or remaining persistently high.
The most significant predictors for changes in real GDP are its own past values, which is typical for time series data. However, changes in unemployment from lags 6, 7, 9, and 10 also have a statistically significant impact on current real GDP growth. The negative coefficient of dfln.Unem.l7 (-0.3512113) suggests that a past increase in unemployment leads to a decrease in real GDP growth, which is consistent with economic theory. Though the relationship seems to reverse in the 9th lag, before being reinforced in the tenth.
Model Fit: The adjusted R2 is 0.5448, which means that about 54.48% of the variability in dfln.rGDP is explained by the model’s regressors. The overall model is highly significant, as indicated by the F-statistic (p-value = 6.225e-12).
This equation models the change in the natural log of unemployment as a function of its own past values and past values of the change in the natural log of real GDP.
Significance of lagged variables: Only two lagged variables are statistically significant at a 5% level or better:
dfln.Unem.l1 (p-value = 0.000942)
dfln.rGDP.l6 (p-value = 0.039174)
dfln.Unem.l3 (p-value = 0.054831) is significant at the 10% level.
Interpretation: The most significant predictor for changes in unemployment is its own immediate past value. The coefficient of dfln.Unem.l1 (0.722228) is positive, suggesting that a past increase in unemployment tends to persist. A significant negative relationship exists with real GDP growth from 6 periods ago (dfln.rGDP.l6), which is consistent with Okun’s law, where higher economic growth (rGDP) is associated with lower unemployment. The negative coefficient of dfln.rGDP.l6 (-1.299244) confirms this relationship, indicating that a past increase in real GDP growth leads to a decrease in unemployment.
Model Fit: The adjusted R2 is 0.5291, indicating that about 52.91% of the variability in dfln.Unem is explained by the model. The overall model is highly significant, as indicated by the F-statistic (p-value = 2.361e-11).
These data are in line with conventional economic theory, though it seems real GDP is more dependent on lagged values of unemployment than the reverse. The adjusted R2 for both are significant to an extent.
The next step is to look into an impulse resoponse function to visualise the propagation of shocks to real GDP
rYnU_results <- vars::irf(rYnU.model,
impulse = "dfln.rGDP",
n.ahead = 20,
ortho = TRUE,
boot = TRUE,
ci = 0.99)
plot(rYnU_results)
UnrY_results <- vars::irf(rYnU.model,
impulse = "dfln.Unem",
n.ahead = 20,
ortho = TRUE,
boot = TRUE,
ci = 0.99)
plot(UnrY_results)
The impoulse response function sugessts a shock to real GDP begins by increasing unemployment, before decreasing over the next lags, before rising back up to zero. A similar pattern is followed by real GDP, which is an odd outcome, suggesting unemployment and real GDP are directly correlated in the extremely short run.
varMt.inf <- cbind(diff.Mt, diff.deflate)
colnames(varMt.inf) <- c("dfln.Mt", "dfln.GDPdef")
varMt.inf_lag.selection <- vars::VARselect(varMt.inf, type = "const")
varMt.inf_optilag <- varMt.inf_lag.selection$selection["AIC(n)"]
Mt.inf.model <- vars::VAR(
y = varMt.inf,
p = varMt.inf_optilag,
type = "const",
season = NULL,
exogen = NULL
)
summary(Mt.inf.model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: dfln.Mt, dfln.GDPdef
## Deterministic variables: const
## Sample size: 117
## Log Likelihood: 915.189
## Roots of the characteristic polynomial:
## 0.7805 0.7805 0.7693 0.7007 0.7007 0.6289 0.3562 0.2607
## Call:
## vars::VAR(y = varMt.inf, p = varMt.inf_optilag, type = "const",
## exogen = NULL)
##
##
## Estimation results for equation dfln.Mt:
## ========================================
## dfln.Mt = dfln.Mt.l1 + dfln.GDPdef.l1 + dfln.Mt.l2 + dfln.GDPdef.l2 + dfln.Mt.l3 + dfln.GDPdef.l3 + dfln.Mt.l4 + dfln.GDPdef.l4 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.Mt.l1 -0.115303 0.096931 -1.190 0.2368
## dfln.GDPdef.l1 -0.273672 0.625255 -0.438 0.6625
## dfln.Mt.l2 -0.149510 0.095102 -1.572 0.1189
## dfln.GDPdef.l2 0.239568 0.709482 0.338 0.7363
## dfln.Mt.l3 0.227736 0.095084 2.395 0.0183 *
## dfln.GDPdef.l3 -0.423603 0.708693 -0.598 0.5513
## dfln.Mt.l4 -0.044031 0.096838 -0.455 0.6502
## dfln.GDPdef.l4 0.061208 0.616916 0.099 0.9212
## const 0.006967 0.003541 1.968 0.0517 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.01309 on 108 degrees of freedom
## Multiple R-Squared: 0.1072, Adjusted R-squared: 0.04112
## F-statistic: 1.622 on 8 and 108 DF, p-value: 0.1269
##
##
## Estimation results for equation dfln.GDPdef:
## ============================================
## dfln.GDPdef = dfln.Mt.l1 + dfln.GDPdef.l1 + dfln.Mt.l2 + dfln.GDPdef.l2 + dfln.Mt.l3 + dfln.GDPdef.l3 + dfln.Mt.l4 + dfln.GDPdef.l4 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.Mt.l1 -0.0117084 0.0144140 -0.812 0.418410
## dfln.GDPdef.l1 0.7621219 0.0929779 8.197 5.52e-13 ***
## dfln.Mt.l2 -0.0047219 0.0141421 -0.334 0.739109
## dfln.GDPdef.l2 -0.0084571 0.1055028 -0.080 0.936258
## dfln.Mt.l3 -0.0032677 0.0141394 -0.231 0.817669
## dfln.GDPdef.l3 -0.5124774 0.1053854 -4.863 3.95e-06 ***
## dfln.Mt.l4 0.0080165 0.0144001 0.557 0.578885
## dfln.GDPdef.l4 0.2939470 0.0917378 3.204 0.001781 **
## const 0.0020215 0.0005265 3.839 0.000208 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.001946 on 108 degrees of freedom
## Multiple R-Squared: 0.5041, Adjusted R-squared: 0.4673
## F-statistic: 13.72 on 8 and 108 DF, p-value: 1.414e-13
##
##
##
## Covariance matrix of residuals:
## dfln.Mt dfln.GDPdef
## dfln.Mt 1.713e-04 1.699e-06
## dfln.GDPdef 1.699e-06 3.789e-06
##
## Correlation matrix of residuals:
## dfln.Mt dfln.GDPdef
## dfln.Mt 1.00000 0.06668
## dfln.GDPdef 0.06668 1.00000
This equation models the current change in money supply as a function of its own past values and past changes in the deflator.
Significance of Lagged Variables: The only statistically significant lagged variable is diff.Mt.l3 (p-value = 0.0154). The constant term is also marginally significant (p-value = 0.0793). This suggests that changes in money supply are primarily influenced by their own value from three periods ago. Past changes in the deflator do not have a significant impact on the current change in money supply in this model.
Model Fit: The adjusted R2 is 0.1062, meaning that only about 10.62% of the variability in the change in money supply is explained by the model’s regressors. The F-statistic (p-value of 0.05868) indicates that the overall model is not statistically significant at the 5% level. This is a poor-fitting model.
This equation models the current change in the deflator (a proxy for inflation) as a function of its own past values and past changes in the money supply.
Significance of Lagged Variables: This equation has several highly significant lagged variables:
diff.deflate.l1 (p-value = 6.22e-13): The most significant predictor, indicating a strong positive relationship between current deflation change and its previous value. This suggests that inflation has a high degree of inertia.
diff.deflate.l3 (p-value = 4.30e-06): The change in the deflator three periods ago has a highly significant negative effect on the current change.
diff.deflate.l4 (p-value = 0.002119): The change in the deflator four periods ago has a significant positive effect.
The constant term is also highly significant (p-value = 0.000195).
None of the lagged changes in money supply (diff.Mt) are statistically significant in this equation, suggesting that in this model, changes in the money supply do not Granger-cause changes in the deflator.
Model Fit: The adjusted R2 is 0.5457, indicating that about 54.57% of the variability in the change in the deflator is explained by the model, which is a much better fit than the diff.Mt equation. The overall model is highly significant, as indicated by the F-statistic (p-value of 5.771e-12).
The covariance matrix of residuals shows a very low covariance (1.848e-06) and a low correlation (0.07236) between the residuals of the two equations. This low correlation suggests that a random shock (or unmodeled event) affecting the change in money supply at a given time is largely unrelated to a contemporaneous shock affecting the change in the deflator. This is in contrast to many VAR models, where high residual correlation indicates a need to model the variables simultaneously.
Mt.inf_results <- vars::irf(Mt.inf.model,
impulse = "dfln.Mt",
n.ahead = 20,
ortho = TRUE,
boot = TRUE,
ci = 0.99)
inf.Mt_results <- vars::irf(Mt.inf.model,
impulse = "dfln.GDPdef",
n.ahead = 20,
ortho = TRUE,
boot = TRUE,
ci = 0.99)
plot(inf.Mt_results)
plot(Mt.inf_results)
infcoint_test <- ca.jo(varMt.inf, type = "trace", K = varMt.inf_optilag, ecdet = "const")
summary(infcoint_test)
##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: trace statistic , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 1.972115e-01 1.370979e-01 5.551115e-17
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 1 | 17.25 7.52 9.24 12.97
## r = 0 | 42.95 17.85 19.96 24.60
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## dfln.Mt.l4 dfln.GDPdef.l4 constant
## dfln.Mt.l4 1.000000000 1.00000000 1.0000000
## dfln.GDPdef.l4 1.093505911 -11.23472424 -2.7607466
## constant -0.009515505 0.04257779 0.1106895
##
## Weights W:
## (This is the loading matrix)
##
## dfln.Mt.l4 dfln.GDPdef.l4 constant
## dfln.Mt.d -1.0173753 -0.06373168 2.412952e-17
## dfln.GDPdef.d -0.0483528 0.03667127 1.648504e-18
vecm_infmon <- cajorls(infcoint_test, r = 1)
summary(vecm_infmon[["rlm"]])
## Response dfln.Mt.d :
##
## Call:
## lm(formula = dfln.Mt.d ~ ect1 + dfln.Mt.dl1 + dfln.GDPdef.dl1 +
## dfln.Mt.dl2 + dfln.GDPdef.dl2 + dfln.Mt.dl3 + dfln.GDPdef.dl3 -
## 1, data = data.mat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.031975 -0.008479 0.000258 0.006886 0.036355
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## ect1 -1.01738 0.20287 -5.015 2.05e-06 ***
## dfln.Mt.dl1 -1.10054 0.09541 -11.535 < 2e-16 ***
## dfln.GDPdef.dl1 -0.62782 0.51693 -1.215 0.227
## dfln.Mt.dl2 -1.23262 0.13963 -8.828 1.87e-14 ***
## dfln.GDPdef.dl2 -0.39772 0.51173 -0.777 0.439
## dfln.Mt.dl3 -0.98785 0.18145 -5.444 3.20e-07 ***
## dfln.GDPdef.dl3 -0.82848 0.51035 -1.623 0.107
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01303 on 110 degrees of freedom
## Multiple R-squared: 0.6035, Adjusted R-squared: 0.5782
## F-statistic: 23.91 on 7 and 110 DF, p-value: < 2.2e-16
##
##
## Response dfln.GDPdef.d :
##
## Call:
## lm(formula = dfln.GDPdef.d ~ ect1 + dfln.Mt.dl1 + dfln.GDPdef.dl1 +
## dfln.Mt.dl2 + dfln.GDPdef.dl2 + dfln.Mt.dl3 + dfln.GDPdef.dl3 -
## 1, data = data.mat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0055806 -0.0004204 -0.0000632 0.0003271 0.0101014
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## ect1 -0.04835 0.03211 -1.506 0.1349
## dfln.Mt.dl1 -0.02020 0.01510 -1.338 0.1836
## dfln.GDPdef.dl1 -0.03410 0.08181 -0.417 0.6776
## dfln.Mt.dl2 -0.03496 0.02210 -1.582 0.1166
## dfln.GDPdef.dl2 -0.03711 0.08099 -0.458 0.6477
## dfln.Mt.dl3 -0.04803 0.02872 -1.672 0.0973 .
## dfln.GDPdef.dl3 -0.54547 0.08077 -6.753 7.13e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.002062 on 110 degrees of freedom
## Multiple R-squared: 0.3009, Adjusted R-squared: 0.2564
## F-statistic: 6.762 on 7 and 110 DF, p-value: 1.137e-06
summary(vecm_infmon[["beta"]])
## ect1
## Min. :-0.009515
## 1st Qu.: 0.495242
## Median : 1.000000
## Mean : 0.694663
## 3rd Qu.: 1.046753
## Max. : 1.093506
The trace statistic test determines the number of long-run equilibrium relationships, or cointegrating vectors.
H0:r=0 (no cointegrating vectors): The test statistic is 30.82. This is greater than the 1%, 5%, and 10% critical values (24.60, 19.96, and 17.85, respectively). We reject the null hypothesis, concluding that there is at least one cointegrating relationship.
H0:r≤1 (at most one cointegrating vector): The test statistic is 8.26. This is less than the 5% critical value of 9.24. We fail to reject the null hypothesis at the 5% significance level.
The test results consistently point to one cointegrating
vector (r=1) between the variables dfln.Mt.l10
and
dfln.GDPdef.l10
. This means the two series share a long-run
equilibrium relationship.
The eigenvectors represent the long-run
cointegrating relationship. Since the test identified one relationship,
we focus on the first column of the Eigenvectors
table,
which is normalized to 1 for dfln.Mt.l10
.
The cointegrating relationship is:
1.0⋅dfln.Mt.l10+2.5536⋅dfln.GDPdef.l10−0.0158⋅constant
This equation represents the long-run equilibrium to which the variables revert. The negative of this expression is the Error Correction Term (ECT), which measures the deviation from equilibrium.
The Weights W
matrix (or loading matrix) shows how each
variable adjusts to a deviation from the long-run equilibrium. The
coefficients in the first column correspond to the single cointegrating
relationship.
dfln.Mt.d
: The coefficient is
-1.3305. This negative and significant coefficient
(from the VECM results below) confirms that the money supply growth rate
adjusts to correct for disequilibrium.
dfln.GDPdef.d
: The coefficient is
-0.1469. This negative and significant coefficient also
shows that the GDP deflator growth rate adjusts to correct the
disequilibrium.
The magnitude of the dfln.Mt.d
coefficient is
significantly larger than the dfln.GDPdef.d
coefficient,
suggesting that money supply growth adjusts more
rapidly to restore equilibrium than GDP deflator growth.
The two linear models confirm the results from the Johansen test.
Response dfln.Mt.d
: The
ect1
coefficient is
-1.3305 and is highly significant
(p=0.000897), confirming that money supply growth adjusts to the
long-run equilibrium.
Response dfln.GDPdef.d
: The
ect1
coefficient is
-0.14691 and is significant
(p=0.00394), confirming that GDP deflator growth also adjusts to the
long-run equilibrium.
the implication is that the quantity of money equilibrates extremely quickly, making little positive influence on inflation, as measured by the GDP deflator.
varnY.Mt <- cbind(diff.nGDP, diff.Mt)
colnames(varnY.Mt) <- c("ln.nGDP", "ln.Mt")
varnY.Mtlag.selection <- vars::VARselect(varnY.Mt, type = "const")
varnY.Mt_optilag <- varnY.Mtlag.selection$selection["AIC(n)"]
nY.Mt.model <- vars::VAR(
y = varnY.Mt,
p = varnY.Mt_optilag,
type = "const",
season = NULL,
exogen = NULL
)
summary(nY.Mt.model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: ln.nGDP, ln.Mt
## Deterministic variables: const
## Sample size: 114
## Log Likelihood: 717.885
## Roots of the characteristic polynomial:
## 0.8577 0.8577 0.8542 0.8542 0.8509 0.8509 0.829 0.829 0.8146 0.8146 0.7737 0.7719 0.7719 0.5612
## Call:
## vars::VAR(y = varnY.Mt, p = varnY.Mt_optilag, type = "const",
## exogen = NULL)
##
##
## Estimation results for equation ln.nGDP:
## ========================================
## ln.nGDP = ln.nGDP.l1 + ln.Mt.l1 + ln.nGDP.l2 + ln.Mt.l2 + ln.nGDP.l3 + ln.Mt.l3 + ln.nGDP.l4 + ln.Mt.l4 + ln.nGDP.l5 + ln.Mt.l5 + ln.nGDP.l6 + ln.Mt.l6 + ln.nGDP.l7 + ln.Mt.l7 + const
##
## Estimate Std. Error t value Pr(>|t|)
## ln.nGDP.l1 0.733782 0.098326 7.463 3.33e-11 ***
## ln.Mt.l1 0.007139 0.072669 0.098 0.921945
## ln.nGDP.l2 -0.015310 0.116528 -0.131 0.895737
## ln.Mt.l2 -0.068422 0.072272 -0.947 0.346087
## ln.nGDP.l3 -0.757564 0.115985 -6.532 2.83e-09 ***
## ln.Mt.l3 0.010746 0.072569 0.148 0.882583
## ln.nGDP.l4 0.515467 0.128287 4.018 0.000114 ***
## ln.Mt.l4 -0.027503 0.074035 -0.371 0.711066
## ln.nGDP.l5 -0.017045 0.115737 -0.147 0.883216
## ln.Mt.l5 0.059627 0.072581 0.822 0.413323
## ln.nGDP.l6 -0.389746 0.115788 -3.366 0.001087 **
## ln.Mt.l6 -0.013458 0.072654 -0.185 0.853420
## ln.nGDP.l7 0.210711 0.098331 2.143 0.034575 *
## ln.Mt.l7 -0.030130 0.072032 -0.418 0.676640
## const 0.003783 0.001592 2.376 0.019404 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.009567 on 99 degrees of freedom
## Multiple R-Squared: 0.5584, Adjusted R-squared: 0.496
## F-statistic: 8.943 on 14 and 99 DF, p-value: 2.739e-12
##
##
## Estimation results for equation ln.Mt:
## ======================================
## ln.Mt = ln.nGDP.l1 + ln.Mt.l1 + ln.nGDP.l2 + ln.Mt.l2 + ln.nGDP.l3 + ln.Mt.l3 + ln.nGDP.l4 + ln.Mt.l4 + ln.nGDP.l5 + ln.Mt.l5 + ln.nGDP.l6 + ln.Mt.l6 + ln.nGDP.l7 + ln.Mt.l7 + const
##
## Estimate Std. Error t value Pr(>|t|)
## ln.nGDP.l1 -0.054481 0.133401 -0.408 0.68386
## ln.Mt.l1 -0.119546 0.098592 -1.213 0.22819
## ln.nGDP.l2 0.104801 0.158097 0.663 0.50894
## ln.Mt.l2 -0.155350 0.098054 -1.584 0.11631
## ln.nGDP.l3 -0.074752 0.157360 -0.475 0.63581
## ln.Mt.l3 0.204893 0.098457 2.081 0.04001 *
## ln.nGDP.l4 0.065233 0.174051 0.375 0.70862
## ln.Mt.l4 0.001557 0.100445 0.016 0.98766
## ln.nGDP.l5 0.109213 0.157024 0.696 0.48836
## ln.Mt.l5 -0.077486 0.098473 -0.787 0.43324
## ln.nGDP.l6 -0.047029 0.157093 -0.299 0.76529
## ln.Mt.l6 -0.034652 0.098572 -0.352 0.72593
## ln.nGDP.l7 0.059217 0.133409 0.444 0.65810
## ln.Mt.l7 -0.226095 0.097728 -2.314 0.02276 *
## const 0.005927 0.002160 2.744 0.00721 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.01298 on 99 degrees of freedom
## Multiple R-Squared: 0.1656, Adjusted R-squared: 0.04759
## F-statistic: 1.403 on 14 and 99 DF, p-value: 0.1658
##
##
##
## Covariance matrix of residuals:
## ln.nGDP ln.Mt
## ln.nGDP 9.154e-05 -3.236e-06
## ln.Mt -3.236e-06 1.685e-04
##
## Correlation matrix of residuals:
## ln.nGDP ln.Mt
## ln.nGDP 1.00000 -0.02606
## ln.Mt -0.02606 1.00000
All the provided roots are less than one (ranging from 0.5685 to 0.8652).
Since all roots lie within the unit circle (i.e., their modulus is less than 1), the VAR process is stable.
The results show the estimated coefficients for the two equations in
the VAR model: one for ln.nGDP
and one for
ln.Mt
.
ln.nGDP
This equation models how current nominal GDP is influenced by its own past values and past values of the money supply.
Significant Lags: The coefficients for lagged
ln.nGDP
at periods 1, 3, 4, 6, and 7 are statistically
significant (at the 5% or 1% level). This indicates that past
nominal GDP values are strong predictors of current nominal
GDP.
Effect of ln.Mt
: The coefficients
for all lagged ln.Mt
variables are not statistically
significant at the 5% level. This suggests that, within this model
specification, past money supply values do not have a
significant direct effect on nominal GDP. This is in line with
our plot of the differenced data.
Model Fit: The high R-squared value (0.5578) and a very low p-value for the F-statistic (4.172×10−12) indicate that the model for nominal GDP has a good overall fit, explaining a significant portion of the variance.
ln.Mt
This equation models how current money supply is influenced by its own past values and past values of nominal GDP.
Significant Lags: The coefficients for lagged
ln.Mt
at periods 2 and 7 are statistically significant, and
the coefficient for period 3 is significant at the 10% level. This means
that past values of the money supply are important in explaining
its current value.
Effect of ln.nGDP
: None of the
coefficients for the lagged ln.nGDP
variables are
statistically significant. This suggests that past nominal GDP
values do not have a significant direct effect on the money
supply.
Model Fit: The R-squared value
is much lower (0.181), and the p-value for the
F-statistic (0.1087) is not significant at the standard 5% level. This
indicates that the model for the money supply has a weaker
overall fit compared to the ln.nGDP
equation.
The covariance and correlation matrices of the residuals provide information about the relationship between the unexpected shocks to the two variables.
The correlation coefficient between the residuals is very low at −0.02689.
A correlation close to zero suggests that the unexplained
shocks to ln.nGDP
are largely independent of the
unexplained shocks to ln.Mt
. This indicates that
the model is well-specified and that there are no major omitted
variables that would cause the residuals to move together.
##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: trace statistic , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 1.504999e-01 4.116104e-02 -6.938894e-18
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 1 | 4.67 7.52 9.24 12.97
## r = 0 | 22.77 17.85 19.96 24.60
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## dfln.rGDP.l10 dfln.Unem.l10 constant
## dfln.rGDP.l10 1.000000000 1.000000000 1.0000000
## dfln.Unem.l10 0.297263707 -0.574208236 -0.6859858
## constant -0.001434615 0.001077383 -0.0526419
##
## Weights W:
## (This is the loading matrix)
##
## dfln.rGDP.l10 dfln.Unem.l10 constant
## dfln.rGDP.d -0.6179116 -0.23642000 7.600094e-18
## dfln.Unem.d -1.2846062 -0.02529568 -2.442250e-18
## Response dfln.rGDP.d :
##
## Call:
## lm(formula = dfln.rGDP.d ~ ect1 + dfln.rGDP.dl1 + dfln.Unem.dl1 +
## dfln.rGDP.dl2 + dfln.Unem.dl2 + dfln.rGDP.dl3 + dfln.Unem.dl3 +
## dfln.rGDP.dl4 + dfln.Unem.dl4 + dfln.rGDP.dl5 + dfln.Unem.dl5 +
## dfln.rGDP.dl6 + dfln.Unem.dl6 + dfln.rGDP.dl7 + dfln.Unem.dl7 +
## dfln.rGDP.dl8 + dfln.Unem.dl8 + dfln.rGDP.dl9 + dfln.Unem.dl9 -
## 1, data = data.mat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.055010 -0.002191 0.000024 0.002074 0.035646
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## ect1 -0.617912 0.170591 -3.622 0.000478 ***
## dfln.rGDP.dl1 -0.028459 0.187430 -0.152 0.879648
## dfln.Unem.dl1 -0.125520 0.104160 -1.205 0.231266
## dfln.rGDP.dl2 -0.007787 0.187258 -0.042 0.966920
## dfln.Unem.dl2 -0.151833 0.105166 -1.444 0.152209
## dfln.rGDP.dl3 -1.219405 0.187032 -6.520 3.73e-09 ***
## dfln.Unem.dl3 0.006253 0.106562 0.059 0.953336
## dfln.rGDP.dl4 -0.140300 0.233672 -0.600 0.549705
## dfln.Unem.dl4 -0.231782 0.131169 -1.767 0.080538 .
## dfln.rGDP.dl5 -0.114540 0.233091 -0.491 0.624317
## dfln.Unem.dl5 -0.265515 0.133572 -1.988 0.049806 *
## dfln.rGDP.dl6 -1.423906 0.232183 -6.133 2.14e-08 ***
## dfln.Unem.dl6 0.156692 0.136610 1.147 0.254357
## dfln.rGDP.dl7 -0.394137 0.225161 -1.750 0.083372 .
## dfln.Unem.dl7 -0.226412 0.116012 -1.952 0.054024 .
## dfln.rGDP.dl8 -0.387342 0.225020 -1.721 0.088546 .
## dfln.Unem.dl8 -0.242636 0.117803 -2.060 0.042254 *
## dfln.rGDP.dl9 -1.165432 0.224298 -5.196 1.22e-06 ***
## dfln.Unem.dl9 0.101798 0.119902 0.849 0.398080
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.008534 on 92 degrees of freedom
## Multiple R-squared: 0.6134, Adjusted R-squared: 0.5336
## F-statistic: 7.683 on 19 and 92 DF, p-value: 4.755e-12
##
##
## Response dfln.Unem.d :
##
## Call:
## lm(formula = dfln.Unem.d ~ ect1 + dfln.rGDP.dl1 + dfln.Unem.dl1 +
## dfln.rGDP.dl2 + dfln.Unem.dl2 + dfln.rGDP.dl3 + dfln.Unem.dl3 +
## dfln.rGDP.dl4 + dfln.Unem.dl4 + dfln.rGDP.dl5 + dfln.Unem.dl5 +
## dfln.rGDP.dl6 + dfln.Unem.dl6 + dfln.rGDP.dl7 + dfln.Unem.dl7 +
## dfln.rGDP.dl8 + dfln.Unem.dl8 + dfln.rGDP.dl9 + dfln.Unem.dl9 -
## 1, data = data.mat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.083523 -0.004881 -0.000152 0.003896 0.071430
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## ect1 -1.28461 0.31829 -4.036 0.000112 ***
## dfln.rGDP.dl1 -0.08666 0.34971 -0.248 0.804841
## dfln.Unem.dl1 -0.27607 0.19434 -1.421 0.158841
## dfln.rGDP.dl2 -0.03766 0.34939 -0.108 0.914400
## dfln.Unem.dl2 -0.32719 0.19622 -1.667 0.098826 .
## dfln.rGDP.dl3 -0.78447 0.34897 -2.248 0.026968 *
## dfln.Unem.dl3 -0.85542 0.19883 -4.302 4.21e-05 ***
## dfln.rGDP.dl4 -0.32413 0.43599 -0.743 0.459123
## dfln.Unem.dl4 -0.49647 0.24474 -2.029 0.045395 *
## dfln.rGDP.dl5 -0.26209 0.43491 -0.603 0.548240
## dfln.Unem.dl5 -0.56388 0.24922 -2.263 0.026016 *
## dfln.rGDP.dl6 -1.56153 0.43322 -3.605 0.000507 ***
## dfln.Unem.dl6 -0.43006 0.25489 -1.687 0.094951 .
## dfln.rGDP.dl7 -0.84628 0.42011 -2.014 0.046887 *
## dfln.Unem.dl7 -0.47573 0.21646 -2.198 0.030474 *
## dfln.rGDP.dl8 -0.82452 0.41985 -1.964 0.052567 .
## dfln.Unem.dl8 -0.50917 0.21980 -2.317 0.022751 *
## dfln.rGDP.dl9 -1.08535 0.41850 -2.593 0.011056 *
## dfln.Unem.dl9 -0.54903 0.22372 -2.454 0.016005 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01592 on 92 degrees of freedom
## Multiple R-squared: 0.6229, Adjusted R-squared: 0.545
## F-statistic: 7.998 on 19 and 92 DF, p-value: 1.715e-12
## ect1
## Min. :-0.001435
## 1st Qu.: 0.147915
## Median : 0.297264
## Mean : 0.431943
## 3rd Qu.: 0.648632
## Max. : 1.000000
The Johansen trace test indicates the presence of one
cointegrating relationship between dfln.rGDP.l10
and dfln.Unem.l10
.
Test for r=0: The test statistic (22.77) is greater than the 5% critical value (19.96). We reject the null hypothesis of no cointegration. This suggests that the two variables are not simply random walks and are linked in the long run.
Test for r≤1: The test statistic (4.67) is less than the 10% critical value (7.52). We fail to reject the null hypothesis that there is at most one cointegrating relationship.
Conclusion: Since we reject r=0 but fail to reject r≤1, we can conclude there is exactly one cointegrating relationship. The variables share a long-run equilibrium.
The two regression outputs are the short-run dynamics of the VECM for
each variable. The most crucial part of this is the
ect1
coefficient, which represents the
error correction term. This term’s role is to measure
the speed at which each variable adjusts to correct any deviations from
the long-run equilibrium.
dfln.rGDP.d
ect1
Coefficient: The coefficient
for ect1
is -0.617912 and is highly
statistically significant (p-value < 0.001).
Interpretation: This indicates that
dfln.rGDP
adjusts by approximately 61.8% of the
previous period’s disequilibrium each period. This negative and
significant value confirms that dfln.rGDP
is actively
correcting to restore the long-run relationship.
dfln.Unem.d
ect1
Coefficient: The coefficient
for ect1
is -1.28461 and is also highly
statistically significant (p-value < 0.001).
Interpretation: This implies that
dfln.Unem
adjusts by roughly 128.5% of the previous
period’s disequilibrium. The negative and significant value
confirms that dfln.Unem
also adjusts to correct the
long-run disequilibrium. A value greater than 1 suggests an
over-correction in the short run to get back to the long-run
path.
The results of the VECM confirm the findings from the Johansen test.
Both dfln.rGDP.d
and dfln.Unem.d
are
endogenously adjusting to the long-run cointegrating
relationship, as shown by the highly significant negative coefficients
on the ect1
term. This is strong evidence that the two
variables are indeed cointegrated and do not diverge from each other in
the long run. The dfln.Unem
variable adjusts more
aggressively to correct disequilibrium than the dfln.rGDP
variable.
Monetary policy has little relation with nominal output. The Unemployment rate and the rate of real GDP seem to be closely related and responsive to deviations from equilibrium, with unemployment over-correcting in the first period.
colnames(CCPI.Mt) <- c("dfln.CPI", "dfln.Mt")
CPIM_lag.selection <- vars::VARselect(CCPI.Mt, type = "const")
CPIM_optilag <- CPIM_lag.selection$selection["AIC(n)"]
MtCPI.model <- vars::VAR(
y = CCPI.Mt,
p = CPIM_optilag,
type = "const",
season = NULL,
exogen = NULL
)
summary(MtCPI.model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: dfln.CPI, dfln.Mt
## Deterministic variables: const
## Sample size: 119
## Log Likelihood: 411.703
## Roots of the characteristic polynomial:
## 0.2544 0.1422
## Call:
## vars::VAR(y = CCPI.Mt, p = CPIM_optilag, type = "const", exogen = NULL)
##
##
## Estimation results for equation dfln.CPI:
## =========================================
## dfln.CPI = dfln.CPI.l1 + dfln.Mt.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.CPI.l1 0.254504 0.090265 2.820 0.00566 **
## dfln.Mt.l1 0.073718 1.007470 0.073 0.94180
## const -0.001658 0.013934 -0.119 0.90551
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.1434 on 116 degrees of freedom
## Multiple R-Squared: 0.0646, Adjusted R-squared: 0.04847
## F-statistic: 4.006 on 2 and 116 DF, p-value: 0.02079
##
##
## Estimation results for equation dfln.Mt:
## ========================================
## dfln.Mt = dfln.CPI.l1 + dfln.Mt.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## dfln.CPI.l1 -0.0008146 0.0083378 -0.098 0.922
## dfln.Mt.l1 -0.1423304 0.0930612 -1.529 0.129
## const 0.0054351 0.0012871 4.223 4.82e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.01325 on 116 degrees of freedom
## Multiple R-Squared: 0.01981, Adjusted R-squared: 0.002915
## F-statistic: 1.172 on 2 and 116 DF, p-value: 0.3132
##
##
##
## Covariance matrix of residuals:
## dfln.CPI dfln.Mt
## dfln.CPI 0.0205732 -0.0002131
## dfln.Mt -0.0002131 0.0001755
##
## Correlation matrix of residuals:
## dfln.CPI dfln.Mt
## dfln.CPI 1.0000 -0.1121
## dfln.Mt -0.1121 1.0000
Well, that’s a poor fit all around.
What of our simple sum index and the log of deflated GDP.
MsD_lag.selection <- vars::VARselect(diff.Msum.deflate, type = "const")
MsD_optilag <- MsD_lag.selection$selection["AIC(n)"]
MsDef.model <- vars::VAR(
y = diff.Msum.deflate,
p = MsD_optilag,
type = "const",
season = NULL,
exogen = NULL
)
summary(MsDef.model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: diff.Msum, diff.Deflator
## Deterministic variables: const
## Sample size: 111
## Log Likelihood: 966.263
## Roots of the characteristic polynomial:
## 0.9606 0.9389 0.9389 0.9327 0.9327 0.927 0.927 0.9221 0.9221 0.8917 0.8917 0.8849 0.8849 0.8474 0.8474 0.8196 0.8196 0.7457 0.7457 0.7158
## Call:
## vars::VAR(y = diff.Msum.deflate, p = MsD_optilag, type = "const",
## exogen = NULL)
##
##
## Estimation results for equation diff.Msum:
## ==========================================
## diff.Msum = diff.Msum.l1 + diff.Deflator.l1 + diff.Msum.l2 + diff.Deflator.l2 + diff.Msum.l3 + diff.Deflator.l3 + diff.Msum.l4 + diff.Deflator.l4 + diff.Msum.l5 + diff.Deflator.l5 + diff.Msum.l6 + diff.Deflator.l6 + diff.Msum.l7 + diff.Deflator.l7 + diff.Msum.l8 + diff.Deflator.l8 + diff.Msum.l9 + diff.Deflator.l9 + diff.Msum.l10 + diff.Deflator.l10 + const
##
## Estimate Std. Error t value Pr(>|t|)
## diff.Msum.l1 -0.144472 0.103319 -1.398 0.16546
## diff.Deflator.l1 -0.340314 0.370287 -0.919 0.36052
## diff.Msum.l2 -0.335393 0.103461 -3.242 0.00167 **
## diff.Deflator.l2 0.247197 0.458493 0.539 0.59111
## diff.Msum.l3 0.027481 0.108150 0.254 0.79999
## diff.Deflator.l3 0.305502 0.459073 0.665 0.50745
## diff.Msum.l4 0.081759 0.105456 0.775 0.44020
## diff.Deflator.l4 -0.571669 0.536465 -1.066 0.28944
## diff.Msum.l5 -0.281450 0.104763 -2.687 0.00860 **
## diff.Deflator.l5 0.050276 0.553596 0.091 0.92784
## diff.Msum.l6 0.062001 0.106463 0.582 0.56178
## diff.Deflator.l6 -0.050012 0.553628 -0.090 0.92822
## diff.Msum.l7 -0.258675 0.107642 -2.403 0.01831 *
## diff.Deflator.l7 0.202390 0.564030 0.359 0.72056
## diff.Msum.l8 0.039067 0.109821 0.356 0.72287
## diff.Deflator.l8 -0.866672 0.516726 -1.677 0.09697 .
## diff.Msum.l9 0.048003 0.104580 0.459 0.64733
## diff.Deflator.l9 0.577343 0.524040 1.102 0.27352
## diff.Msum.l10 -0.186140 0.100602 -1.850 0.06756 .
## diff.Deflator.l10 -0.181833 0.410567 -0.443 0.65891
## const 0.013587 0.004738 2.868 0.00515 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.00653 on 90 degrees of freedom
## Multiple R-Squared: 0.3847, Adjusted R-squared: 0.248
## F-statistic: 2.814 on 20 and 90 DF, p-value: 0.0004503
##
##
## Estimation results for equation diff.Deflator:
## ==============================================
## diff.Deflator = diff.Msum.l1 + diff.Deflator.l1 + diff.Msum.l2 + diff.Deflator.l2 + diff.Msum.l3 + diff.Deflator.l3 + diff.Msum.l4 + diff.Deflator.l4 + diff.Msum.l5 + diff.Deflator.l5 + diff.Msum.l6 + diff.Deflator.l6 + diff.Msum.l7 + diff.Deflator.l7 + diff.Msum.l8 + diff.Deflator.l8 + diff.Msum.l9 + diff.Deflator.l9 + diff.Msum.l10 + diff.Deflator.l10 + const
##
## Estimate Std. Error t value Pr(>|t|)
## diff.Msum.l1 -0.035149 0.029003 -1.212 0.228716
## diff.Deflator.l1 0.802485 0.103944 7.720 1.53e-11 ***
## diff.Msum.l2 0.002774 0.029043 0.096 0.924128
## diff.Deflator.l2 -0.018853 0.128705 -0.146 0.883866
## diff.Msum.l3 -0.031175 0.030359 -1.027 0.307236
## diff.Deflator.l3 -0.812170 0.128868 -6.302 1.06e-08 ***
## diff.Msum.l4 -0.010641 0.029603 -0.359 0.720093
## diff.Deflator.l4 0.663595 0.150593 4.407 2.89e-05 ***
## diff.Msum.l5 0.006664 0.029408 0.227 0.821236
## diff.Deflator.l5 -0.007522 0.155402 -0.048 0.961502
## diff.Msum.l6 0.003644 0.029886 0.122 0.903224
## diff.Deflator.l6 -0.583871 0.155411 -3.757 0.000305 ***
## diff.Msum.l7 0.061206 0.030217 2.026 0.045771 *
## diff.Deflator.l7 0.424161 0.158330 2.679 0.008780 **
## diff.Msum.l8 0.026672 0.030828 0.865 0.389238
## diff.Deflator.l8 0.030566 0.145052 0.211 0.833576
## diff.Msum.l9 0.051898 0.029357 1.768 0.080477 .
## diff.Deflator.l9 -0.472857 0.147105 -3.214 0.001815 **
## diff.Msum.l10 0.010525 0.028240 0.373 0.710245
## diff.Deflator.l10 0.355945 0.115252 3.088 0.002676 **
## const 0.002182 0.001330 1.641 0.104389
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.001833 on 90 degrees of freedom
## Multiple R-Squared: 0.6332, Adjusted R-squared: 0.5517
## F-statistic: 7.77 on 20 and 90 DF, p-value: 2.445e-12
##
##
##
## Covariance matrix of residuals:
## diff.Msum diff.Deflator
## diff.Msum 4.264e-05 -6.345e-09
## diff.Deflator -6.345e-09 3.360e-06
##
## Correlation matrix of residuals:
## diff.Msum diff.Deflator
## diff.Msum 1.0000000 -0.0005302
## diff.Deflator -0.0005302 1.0000000
Once again, it seems inflation and the simple sum index are mostly independent in the short run. Inflation is influenced by changes in the money supply 7 lagged periods ago. While at the 90% confidence level the 9th lag of Msum is relevant.
Overall, the only variable that unemployment seems to respond to in a structural manner is GDP. Yet these are structurally determined. Either the real economy’s capacity needs to increase in scope and scale or current productive capacity needs to be utilised more economically. The simple answer is education, investment and specialisation; except this shoild be done with intention. Incentivising training in industries which may be on the uptick with regards to requirement. Community production projects to provide cheap and affordable, locally owned and State sanctioned food stores.
The ideal method is found through entrepreneurial thinking on a national scale with responsible constraints. What does it mean to allow labour markets to be flexible? The most important part is making it as easy as possible for excess labour supply to be absorbed. The politically painful element of this is the institution of anti-trust laws in the markets of labour (break apart workers Unions, just as we would a Monopoly). Unfortunately this makes it easier for workers to get fired, the influence of such institutional factors as property rights and wealth distribution must be addressed.
Econometrics can only really show us so much; particularly when it’s so surface-level. But it does remind us that, for all their contrived assumptions, classical economists had it, seemingly, right on the neutrality of money. Frustration with economic institutions is well earned, it would be vain to suggest otherwise. And, although such inquiries do not offer immediate answers, it does chip away at the issue. By finding out what doesn’t work, we can narrow in on what does.