# read the data from the file
TeslaSearch <- read.csv("TeslaSearch.txt",header = FALSE,col.names=c("Tesla Search")) #%>% as.tbl
TeslaSale <- read.csv("TeslaSale.txt",header = FALSE, col.names=c("Tesla Sale")) #%>% as.tbl

AudiSale <- read.csv("AudiSale.txt",header = FALSE,col.names=c("Audi Sale")) #%>% as.tbl 
AudiSearch <- read.csv("AudiSearch.txt",header = FALSE,col.names = c("Audi Search")) #%>% as.tbl
TeslaSale <- na.omit(TeslaSale)
TeslaSearch <- na.omit(TeslaSearch)

AudiSale <- na.omit(AudiSale)
AudiSearch <- na.omit(AudiSearch)



# CONVERT THE DATA TO STATIONARY TIME SERIES
N1 <- nrow(AudiSale)
N2 <- nrow(AudiSearch)

Audi.ts1 <- cbind(log(AudiSearch[2:N1,] /AudiSearch[1:N1-1,]),log(AudiSale[2:N1,]/ AudiSale[1:N1-1,])) #%>% as.tbl
Tesla.ts1 <- cbind(log(TeslaSearch[2:N2,] /TeslaSearch[1:N2-1,]),log(TeslaSale[2:N2,]/ TeslaSale[1:N2-1,])) #%>% as.tbl
# **must** be added if not writing in `tidyverse`
colnames(Audi.ts1) <- c("Audi.Search","Audi.Sale")
colnames(Tesla.ts1) <- c("Tesla.Search","Tesla.Sale")
audi.var1 <- VAR(Audi.ts1, p =1 , type = "const")
causality(audi.var1, cause = "Audi.Search")
## $Granger
## 
##  Granger causality H0: Audi.Search do not Granger-cause Audi.Sale
## 
## data:  VAR object audi.var1
## F-Test = 0.94963, df1 = 1, df2 = 46, p-value = 0.3349
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: Audi.Search and Audi.Sale
## 
## data:  VAR object audi.var1
## Chi-squared = 2.2371, df = 1, p-value = 0.1347
tesla.var1 <- VAR(Tesla.ts1, p =1 , type = "const")
causality(tesla.var1, cause = "Tesla.Search")
## $Granger
## 
##  Granger causality H0: Tesla.Search do not Granger-cause
##  Tesla.Sale
## 
## data:  VAR object tesla.var1
## F-Test = 4.1115, df1 = 1, df2 = 46, p-value = 0.04841
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: Tesla.Search and
##  Tesla.Sale
## 
## data:  VAR object tesla.var1
## Chi-squared = 0.020411, df = 1, p-value = 0.8864

Under the confidance level \(\alpha = 0.05\), Audi.Search do not Granger-cause Audi.Sale. But Tesla.Search do Granger-cause Tesla.Sale with lag = 1.

## Compute the TE from AudiSearch to AudiSale
computeTE(AudiSearch,AudiSale,3,1,"MI_diff") ## should be circa 0.16
block_Tesla <- cbind(TeslaSearch,TeslaSale)

block_Audi <- cbind(AudiSearch,AudiSale)

vars <- colnames(block_Audi)


# generate all combinations of lib_column, target_column, tp
params <- expand.grid(lib_column = vars, 
                      target_column = vars, 
                      tp = 1:12)

# throw out cases where lib == target
params <- params[params$lib_column != params$target_column, ]

# E = 3 is optimal or very close to optimal for both vars
# In other circumstances, we should use the best univariate E for each lib_column
E <- 3


audi.output <- do.call(rbind, lapply(seq_len(NROW(params)), function(i) {
    ccm(block_Audi, E = 3, 
        lib_sizes = NROW(block_Audi), random_libs = FALSE, 
        lib_column = params$lib_column[i], 
        target_column = params$target_column[i], 
        tp = params$tp[i], silent = TRUE)
  }
  )
  )
kable(audi.output)
E tau tp nn lib_column target_column lib_size num_pred rho mae rmse
3 1 1 4 Audi.Sale Audi.Search 25 25 -0.3385121 52314.206 66393.950
3 1 1 4 Audi.Search Audi.Sale 25 25 0.0191074 1904.417 2217.216
3 1 2 4 Audi.Sale Audi.Search 24 24 -0.1476461 43404.824 55220.811
3 1 2 4 Audi.Search Audi.Sale 24 24 -0.4127977 2116.306 2534.869
3 1 3 4 Audi.Sale Audi.Search 23 23 -0.1812810 46779.375 56969.947
3 1 3 4 Audi.Search Audi.Sale 23 23 -0.0757697 1946.047 2320.873
3 1 4 4 Audi.Sale Audi.Search 22 22 -0.1995820 49556.055 56188.884
3 1 4 4 Audi.Search Audi.Sale 22 22 -0.0906235 1968.730 2428.806
3 1 5 4 Audi.Sale Audi.Search 21 21 -0.2766103 46434.128 53797.617
3 1 5 4 Audi.Search Audi.Sale 21 21 -0.3362113 2135.943 2709.511
3 1 6 4 Audi.Sale Audi.Search 20 20 -0.0505972 48428.394 52018.638
3 1 6 4 Audi.Search Audi.Sale 20 20 -0.4671800 2389.884 2844.199
3 1 7 4 Audi.Sale Audi.Search 19 19 0.3203341 40193.634 44686.696
3 1 7 4 Audi.Search Audi.Sale 19 19 -0.2800256 2241.120 2708.951
3 1 8 4 Audi.Sale Audi.Search 18 18 0.2330507 37466.867 47182.955
3 1 8 4 Audi.Search Audi.Sale 18 18 -0.0870362 2142.673 2616.568
3 1 9 4 Audi.Sale Audi.Search 17 17 -0.0769730 42037.955 51886.061
3 1 9 4 Audi.Search Audi.Sale 17 17 0.0298232 2052.421 2413.452
3 1 10 4 Audi.Sale Audi.Search 16 16 -0.0369256 39532.958 50132.288
3 1 10 4 Audi.Search Audi.Sale 16 16 0.1635485 1719.170 2204.214
3 1 11 4 Audi.Sale Audi.Search 15 15 -0.1460358 39841.024 47969.857
3 1 11 4 Audi.Search Audi.Sale 15 15 0.1761920 1839.425 2309.890
3 1 12 4 Audi.Sale Audi.Search 14 14 -0.1803175 36812.964 49435.587
3 1 12 4 Audi.Search Audi.Sale 14 14 -0.4665664 2144.504 2497.015
block_Tesla <- cbind(TeslaSearch,TeslaSale)

block_Audi <- cbind(AudiSearch,AudiSale)

varsTesla <- colnames(block_Tesla)


# generate all combinations of lib_column, target_column, tp
paramsTesla <- expand.grid(lib_column = varsTesla, 
                      target_column = varsTesla, 
                      tp = 1:12)

# throw out cases where lib == target
paramsTesla <- paramsTesla[paramsTesla$lib_column != paramsTesla$target_column, ]

# E = 3 is optimal or very close to optimal for both `varsTesla`
# In other circumstances, we should use the best univariate E for each lib_column
E <- 3


audi.output <- do.call(rbind, lapply(seq_len(NROW(paramsTesla)), function(i) {
    ccm(block_Tesla, E = 3, 
        lib_sizes = NROW(block_Audi), random_libs = FALSE, 
        lib_column = paramsTesla$lib_column[i], 
        target_column = paramsTesla$target_column[i], 
        tp = paramsTesla$tp[i], silent = TRUE)
  }
  )
  )
kable(audi.output)
E tau tp nn lib_column target_column lib_size num_pred rho mae rmse
3 1 1 4 Tesla.Sale Tesla.Search 25 25 -0.4379163 128596.2346 141197.7304
3 1 1 4 Tesla.Search Tesla.Sale 25 25 0.1940282 313.7523 376.4099
3 1 2 4 Tesla.Sale Tesla.Search 24 24 -0.4817647 123954.5471 138979.2202
3 1 2 4 Tesla.Search Tesla.Sale 24 24 -0.2936833 412.9776 481.8796
3 1 3 4 Tesla.Sale Tesla.Search 23 23 -0.3878509 123038.9718 139407.8717
3 1 3 4 Tesla.Search Tesla.Sale 23 23 -0.1879216 345.7714 453.1371
3 1 4 4 Tesla.Sale Tesla.Search 22 22 -0.3081341 120760.1752 137539.7316
3 1 4 4 Tesla.Search Tesla.Sale 22 22 0.5602586 225.9624 303.2620
3 1 5 4 Tesla.Sale Tesla.Search 21 21 -0.1855932 112310.1368 129239.5275
3 1 5 4 Tesla.Search Tesla.Sale 21 21 0.0796541 325.4930 403.9694
3 1 6 4 Tesla.Sale Tesla.Search 20 20 -0.0659118 108908.7504 120774.6342
3 1 6 4 Tesla.Search Tesla.Sale 20 20 0.0164671 361.0241 406.0969
3 1 7 4 Tesla.Sale Tesla.Search 19 19 -0.3907647 104052.2455 133635.0306
3 1 7 4 Tesla.Search Tesla.Sale 19 19 0.3488974 293.8169 358.8981
3 1 8 4 Tesla.Sale Tesla.Search 18 18 -0.4472347 104165.0476 130763.6715
3 1 8 4 Tesla.Search Tesla.Sale 18 18 -0.0980671 363.8159 429.8393
3 1 9 4 Tesla.Sale Tesla.Search 17 17 -0.3845198 92224.7485 113395.1526
3 1 9 4 Tesla.Search Tesla.Sale 17 17 0.0846541 332.3889 407.4171
3 1 10 4 Tesla.Sale Tesla.Search 16 16 -0.3086075 75239.9422 91281.4176
3 1 10 4 Tesla.Search Tesla.Sale 16 16 0.4863624 239.4919 308.9398
3 1 11 4 Tesla.Sale Tesla.Search 15 15 -0.2020883 71125.1843 83800.8791
3 1 11 4 Tesla.Search Tesla.Sale 15 15 0.0516980 337.8724 389.1706
3 1 12 4 Tesla.Sale Tesla.Search 14 14 -0.2807491 58209.1663 72596.4630
3 1 12 4 Tesla.Search Tesla.Sale 14 14 -0.3720290 371.4256 435.3282
audi.output$direction <- paste(output$lib_column, "xmap to", audi.output$target_column)

# visualize
ggplot(output, aes(x = tp, y = rho, color = direction)) + 
    geom_line() + theme_bw()

Exaple for CCM test

Following is the standard example from the r-blogger.

data(paramecium_didinium)


vars <- names(paramecium_didinium)[2:3] # c("paramecium", "didinium")

# generate all combinations of lib_column, target_column, tp
params <- expand.grid(lib_column = vars, 
                      target_column = vars, 
                      tp = -10:10)

# throw out cases where lib == target
params <- params[params$lib_column != params$target_column, ]

# E = 3 is optimal or very close to optimal for both vars
# In other circumstances, we should use the best univariate E for each lib_column
E <- 3

# Perform cross mapping runs

output <- do.call(rbind, lapply(seq_len(NROW(params)), function(i) {
    ccm(paramecium_didinium, E = 3, 
        lib_sizes = NROW(paramecium_didinium), random_libs = FALSE, 
        lib_column = params$lib_column[i], 
        target_column = params$target_column[i], 
        tp = params$tp[i], silent = TRUE)
}))

kable(output)
E tau tp nn lib_column target_column lib_size num_pred rho mae rmse
3 1 -10 4 didinium paramecium 61 61 0.0295085 70.34813 94.24059
3 1 -10 4 paramecium didinium 61 61 0.4114229 22.26645 27.81776
3 1 -9 4 didinium paramecium 62 62 0.0814710 66.93714 91.43848
3 1 -9 4 paramecium didinium 62 62 0.4213588 22.63818 28.33557
3 1 -8 4 didinium paramecium 63 63 -0.0183784 69.59975 94.27927
3 1 -8 4 paramecium didinium 63 63 0.4421479 21.97603 28.04247
3 1 -7 4 didinium paramecium 64 64 -0.0110335 68.04791 92.82893
3 1 -7 4 paramecium didinium 64 64 0.4747370 22.22587 27.85163
3 1 -6 4 didinium paramecium 65 65 0.3359370 62.50622 81.26970
3 1 -6 4 paramecium didinium 65 65 0.6182322 19.32392 24.22547
3 1 -5 4 didinium paramecium 66 66 0.7301911 43.42354 56.39094
3 1 -5 4 paramecium didinium 66 66 0.6926566 17.53715 22.62126
3 1 -4 4 didinium paramecium 67 67 0.8636567 31.91674 40.83279
3 1 -4 4 paramecium didinium 67 67 0.7142419 16.41135 21.57040
3 1 -3 4 didinium paramecium 68 68 0.8460469 35.24298 43.12551
3 1 -3 4 paramecium didinium 68 68 0.7022479 16.60132 21.50497
3 1 -2 4 didinium paramecium 69 69 0.8220896 36.45445 45.85722
3 1 -2 4 paramecium didinium 69 69 0.8244554 13.28106 16.84226
3 1 -1 4 didinium paramecium 69 69 0.7583648 36.47250 51.92012
3 1 -1 4 paramecium didinium 69 69 0.8808708 10.99742 13.89441
3 1 0 4 didinium paramecium 69 69 0.6496415 44.00072 61.47605
3 1 0 4 paramecium didinium 69 69 0.8429156 12.41947 15.56230
3 1 1 4 didinium paramecium 68 68 0.6251339 45.14225 63.60374
3 1 1 4 paramecium didinium 68 68 0.7982394 14.24096 17.36885
3 1 2 4 didinium paramecium 67 67 0.6999449 42.75334 58.23997
3 1 2 4 paramecium didinium 67 67 0.7896611 14.77443 17.82333
3 1 3 4 didinium paramecium 66 66 0.6529026 43.81703 62.94071
3 1 3 4 paramecium didinium 66 66 0.7525724 15.59011 19.38724
3 1 4 4 didinium paramecium 65 65 0.5492227 52.90417 70.77524
3 1 4 4 paramecium didinium 65 65 0.5928557 19.32684 24.28676
3 1 5 4 didinium paramecium 64 64 0.4834459 55.54542 75.09968
3 1 5 4 paramecium didinium 64 64 0.4570977 21.56946 27.63148
3 1 6 4 didinium paramecium 63 63 0.4902958 52.99690 72.09239
3 1 6 4 paramecium didinium 63 63 0.3751043 23.12912 28.83605
3 1 7 4 didinium paramecium 62 62 0.3706265 56.54052 79.55106
3 1 7 4 paramecium didinium 62 62 0.3350856 24.42825 30.03801
3 1 8 4 didinium paramecium 61 61 0.3514713 56.22364 82.28203
3 1 8 4 paramecium didinium 61 61 0.4494399 22.64310 27.66854
3 1 9 4 didinium paramecium 60 60 0.3416320 62.84974 82.99648
3 1 9 4 paramecium didinium 60 60 0.3932366 23.26772 28.93985
3 1 10 4 didinium paramecium 59 59 0.3568375 63.85717 81.35833
3 1 10 4 paramecium didinium 59 59 0.3301802 25.01866 30.41829