2
$\begingroup$

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, trendetc. 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")
$\endgroup$
  • 1
    $\begingroup$ Regarding spelling, Sir Clive W.J. Granger was an outstanding econometrician and a Nobel prize winner; let us at least start his name with a capital letter. Regarding resources, Dave Giles has some great resources on testing Granger causality. A classic is this blog post but there are a few more related ones, just search the relevant keywords and you will find them. $\endgroup$ – Richard Hardy Dec 23 '18 at 20:09
  • $\begingroup$ And in this blog post Dave Giles includes a link for code for testing for Granger causality in R using the Toda-Yamamoto procedure. $\endgroup$ – Richard Hardy Dec 23 '18 at 20:25
  • $\begingroup$ @Richard Hardy: Thanks for correcting me about the name. I think I did follow your guidelines for running Granger causal test in other SO threads. They are very helpful. Prof. Giles' blog was a little unclear to me because I lack formal training in Statistics. Hope you understand my situation. Do you think you could help me with my questions? $\endgroup$ – watchtower Dec 23 '18 at 20:35
  • 1
    $\begingroup$ If I had some more time, I would write up an answer, but unfortunately I do not at the moment. Sorry. $\endgroup$ – Richard Hardy Dec 23 '18 at 20:53
  • $\begingroup$ @Richard Hardy: Thank you for considering my request. I will wait. It will be great if you could answer whenever you get a chance. $\endgroup$ – watchtower Dec 23 '18 at 21:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.