I have a weekly revenue from selling products, named Chicken and Egg. I am trying to understand whether purchasing Chicken Granger-causes customers to buy Egg or vice versa.
I don't have a Ph.D. in Stats and have been really struggling for the past two days. So far, I have learned everything from Google search and StackOverflow. So, I thought of asking experts about some questions. Here's the sequence I followed to check Granger causality:
Step1: Check stationarity
I understand from Interpretation of VAR and causality that we need to run adf
and kpss
to check stationarity. Fortunately, I got small p-values
library(tseries)
adf.test(df$S_Chicken)
adf.test(df$W_Egg)
kpss.test(df$S_Chicken)
kpss.test(df$W_Egg)
Step 2: Estimate Lag
I wanted to estimate lag. Learning from Determining suitable time lag in Granger causality test, I used vars
package. Now, I am unsure what type
means in vars::VARselect
. I read VAR models in R: Constant, Trend, Constant+Trend, None and wasn't sure about the difference among const
, trend
etc. So, I decided to loop through all type and possible lags to see what I get.
#get optimal lag order
for (lag in seq(5,50,5)){
cat("Lag:",lag,"\n")
for (type in c("trend","both","none","const")){
cat(" Type:",type,"\n")
cat(" S:",vars::VARselect(df$S_Chicken,
lag.max = lag,
type=type)$selection,"\n")
cat(" W:",vars::VARselect(df$W_Egg,
lag.max = lag,
type=type)$selection,"\n")
}
}
I have skipped output for sake of brevity. Running above code, we see that p
(lag) varies in the set {1, 15, 35, 40}
as per AIC, HQ, SC, ,FPE
. I chose 5
and 50
as lower and upper limit based on business rules. i.e. if the product is purchased after 1 year (50 weeks), there is no Granger causal link.
Step 3: Run Granger test This is easy and straightforward. I am skipping this for sake of brevity.
Questions:
1. Can someone please guide me how to choose the lag? I understand the tradeoff as explained in Lag order for Granger causality test. What's the right way? I am asking this because changing p
(lag) changes the result of Granger causality in Step 3. From Lag order selection for Toda-Yamamoto procedure (Granger causality), I understand that we should set lag.max
sufficiently large. However, even when I do so, I get different values for different lag.max
. As a result of different p
from this test, the result of Granger causality test goes from statistically significant to insignificant.
2. Also, I have noticed that the value of p
from Step 2 is different for Chicken
and Egg
. What should I do? Should I pick the maximum of the two values for Granger test?
3 Should I use const
for type
in vars::VARselect
?
I'd appreciate any help extended during holiday season. My eternal gratitude to anyone willing to help this lost soul. This would be a good learning experience for me.
Here's my dataset:
dput(df)
structure(list(S_Chicken = c(0, 0, 0, 62774.57, 0, 0, 0, 110814.97007,
17435.364491, 3059.7, 295407.97001, 2642929.95251, 5877769.69099,
557964.289992, 302864.420001, 638515.511452, 199185.624302, 117253.769997,
140904.97657922, 867632.303131, 550196.801714, 959181.134732,
510807.875929, 460767.862837, 4341894.086142, 8136290.144111,
1368646.254693, 1023767.707093, 2682319.42977946, 5787105.90149718,
3237583.17954027, 2532539.333804, 3353335.006579, 8974108.26392648,
1641722.196719, 1630555.310797, 3330291.19102984, 5519552.49586992,
13552627.6585533, 1132458.511822, 1811601.00114292, 3352704.903924,
3879903.600603, 3022178.601945, 3503818.454007, 6098289.315593,
9186984.89554527, 4391072.428069, 3953562.096331, 3997384.107074,
6616468.884588, 29483968.6289028, 2265077.638747, 3753344.189456,
6211484.356152, 10899385.460533, 2752992.806802, 4879019.374517,
4628888.906388, 16838745.8250754, 5711482.034574, 3448962.807317,
7725682.404854, 18588887.276053, 55578639.337975, 4941760.321738,
3271579.288657, 5274534.441409, 3449127.992222, 3312029.77883,
3549183.24901, 4674703.52090884, 8799946.181313, 7702361.475478,
8852825.269613, 5642995.371033, 8969715.08304046, 18503348.282649,
5271072.893318, 5790800.1494897, 7240550.532071, 8322037.375561,
5234582.9219294, 7624888.19473199, 8239187.96494, 2187456.006063
), W_Egg = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 355089.47, 0, 15209.479993, 924.042453, 49012.43, 12426.07,
698.6, 330678.929743, 0, 36443.5, 25148.060002, 84604.679768,
408570.659992, 233561.797428, 225012.750019, 203913.99, 77868.23467,
214101.54993, 59247.335503, 1967160.321959, 458070.821242, 39208.328719,
39051.110083, 110831.968483, 630011.709975, 418487.590002, 300531.844468,
501681.160038, 438439.30002, 222852.409849, 126517.78, 313480.609164,
707647.297735, 5999546.142553, 50759.699997, 1525343.714895,
170811.704224, 1171865.505172, 701457.800012, 2311036.244954,
1261387.095132, 1112181.959579, 1783361.785215, 1215356.36973,
5182123.661543, 5779253.835316, 10078878.565432, 5579012.806055,
295489.775016, 1042592.990025, 770521.091289, 943591.552513,
400204.245813, 1623902.205893, 2469527.538234, 2552224.652401,
1151769.304545, 567841.577643, 1110740.89722, 9404018.52624101,
1249473.650353, 896099.041807, 1159826.185882, 2217336.297412,
1320907.977865, 1906507.779424, 4414587.639634, 1469215.877748
)), row.names = c(NA, -86L), class = "data.frame")