## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 6,
  fig.height = 4
)

## ----setup--------------------------------------------------------------------
library(CCI)

## -----------------------------------------------------------------------------
normal_data <- function(n) {
  Z1 <- rnorm(n)
  Z2 <- rnorm(n)
  X <- Z1 + Z2 + rnorm(n)
  Y <- Z1 + Z2 + rnorm(n)
  data.frame(Z1, Z2, X, Y)
}
set.seed(123)
dat <- normal_data(500)

## -----------------------------------------------------------------------------
res_true <- CCI.test(Y ~ X | Z1 + Z2, data = dat, seed = 1, progress = FALSE)
summary(res_true)

## -----------------------------------------------------------------------------
res_false <- CCI.test(Y ~ X | Z1, data = dat, seed = 1, progress = FALSE)
summary(res_false)

## -----------------------------------------------------------------------------
res_false

## -----------------------------------------------------------------------------
plot(res_false)

## ----eval = FALSE-------------------------------------------------------------
# Y ~ X | Z1 + Z2
# Y ~ X + Z1 + Z2   # the first variable after ~ is X, the rest is Z
# X ~ Y | Z1 + Z2   # conditional independence is symmetric in X and Y

## -----------------------------------------------------------------------------
set.seed(2)
uncond <- data.frame(X = rnorm(300))
uncond$Y <- sin(2 * uncond$X) + rnorm(300, sd = 0.5)   # dependent, but almost uncorrelated
cor(uncond$X, uncond$Y)
summary(CCI.test(Y ~ X | 1, data = uncond, seed = 1, progress = FALSE))

## -----------------------------------------------------------------------------
summary(CCI.test(Y ~ X | Z1, data = dat, method = "xgboost",
                 nrounds = 200, eta = 0.1, max_depth = 3,
                 nperm = 100, seed = 1, progress = FALSE))

## -----------------------------------------------------------------------------
three_classes <- function(n) {
  Z1 <- rnorm(n)
  Z2 <- rnorm(n)
  X <- exp(Z1) + Z2 + rnorm(n, sd = 0.2)
  score <- log(abs(Z1) + 1) + Z2
  Y <- ifelse(score > 0.5, "high", ifelse(score > 0, "medium", "low"))
  data.frame(Z1, Z2, X, Y)
}
set.seed(3)
cat_data <- three_classes(500)
summary(CCI.test(Y ~ X | Z1 + Z2, data = cat_data, seed = 1, progress = FALSE))
summary(CCI.test(Y ~ X | Z1, data = cat_data, metric = "LogLoss", seed = 1, progress = FALSE))

## -----------------------------------------------------------------------------
hard_case <- function(n) {
  Z1 <- runif(n, -2, 2)
  Z2 <- runif(n, -2, 2)
  hZ <- sin(Z1) * cos(Z2)
  X <- hZ + 0.2 * rnorm(n)
  Y <- hZ^2 + 0.2 * rnorm(n)
  data.frame(X, Y, Z1, Z2)
}
set.seed(4)
big <- hard_case(5000)
start <- Sys.time()
res_big <- CCI.test(Y ~ X | Z1 + Z2, data = big, method = "KNN", seed = 1, progress = FALSE)
Sys.time() - start
summary(res_big)

