Skip to main content
edited body; edited title
Source Link
Richard Hardy
  • 69.5k
  • 13
  • 126
  • 278

Estimating lag order in granger casualityGranger causality test

I have a weekly revenue from selling products, named Chicken and Egg. I am trying to understand whether purchasing Chicken granger causesGranger-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 googleGoogle search and StackOverflow. So, I thought of asking experts about some questions. Here's the sequence I followed to check grangerGranger causality:

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 grangerGranger causal link.

Step 3: Run grangerGranger test This is easy and straightforward. I am skipping this for sake of brevity.

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 grangerGranger 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 grangerGranger 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 grangerGranger test?

Estimating lag order in granger casuality test

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:

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.

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?

Estimating lag order in Granger causality test

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:

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.

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?

added 221 characters in body
Source Link
watchtower
  • 243
  • 2
  • 6
#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)$$S_Chicken,
                                       lag.max = lag,
                                       type=type)$selection,"\n")  #14
    cat("          W:",vars::VARselect(df$W_Egg,lag.max = lag,type=type)$$W_Egg,
                                       lag.max = lag,
                                       type=type)$selection,"\n")
  }
}

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.

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)$selection,"\n")  #14
    cat("          W:",vars::VARselect(df$W_Egg,lag.max = lag,type=type)$selection,"\n")
  }
}

I'd appreciate any help extended during holiday season. My eternal gratitude to anyone willing to help this lost soul.

#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'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.

Source Link
watchtower
  • 243
  • 2
  • 6

Estimating lag order in granger casuality test

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.

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)$selection,"\n")  #14
    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.


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