## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(rvinecopulib)
set.seed(501)

## ----select-copula------------------------------------------------------------
n <- 180
z <- rnorm(n)
x <- cbind(
  response1 = z + rnorm(n),
  response2 = -0.5 * z + rnorm(n),
  driver1 = z + rnorm(n, sd = 0.5),
  driver2 = 0.4 * z + rnorm(n)
)
u <- pseudo_obs(x)

fit <- vinecop(
  u,
  family_set = "onepar",
  conditioning_set = c("driver1", "driver2")
)
get_structure(fit)

## ----conditional-copula-------------------------------------------------------
condition <- c(0.25, 0.8)
draws <- rvinecop(
  100,
  fit,
  u_cond = condition,
  conditioning_set = c("driver1", "driver2")
)
stopifnot(
  isTRUE(all.equal(draws[, "driver1"], rep(condition[1], 100))),
  isTRUE(all.equal(draws[, "driver2"], rep(condition[2], 100)))
)
head(draws)

## ----row-specific-conditions--------------------------------------------------
conditions <- cbind(
  driver1 = seq(0.1, 0.9, length.out = 5),
  driver2 = rep(0.5, 5)
)
row_draws <- rvinecop(
  5,
  fit,
  u_cond = conditions,
  conditioning_set = c("driver1", "driver2")
)
stopifnot(isTRUE(all.equal(row_draws[, 3:4], conditions)))

## ----conditional-original-scale-----------------------------------------------
full_fit <- vine(
  as.data.frame(x),
  margins_controls = list(family_set = "kde1d"),
  copula_controls = list(
    family_set = "onepar",
    conditioning_set = c("driver1", "driver2")
  )
)

original_condition <- data.frame(driver1 = -0.5, driver2 = 1.25)
original_draws <- rvine(
  6,
  full_fit,
  x_cond = original_condition,
  conditioning_set = c("driver1", "driver2")
)
stopifnot(
  isTRUE(all.equal(original_draws[, "driver1"], rep(-0.5, 6))),
  isTRUE(all.equal(original_draws[, "driver2"], rep(1.25, 6)))
)

## ----rosenblatt---------------------------------------------------------------
simulated <- rvinecop(100, fit)
independent <- rosenblatt(simulated, fit)
reconstructed <- inverse_rosenblatt(independent, fit)
max(abs(simulated - reconstructed))

## ----conditional-rosenblatt---------------------------------------------------
transformed <- rosenblatt(
  simulated,
  fit,
  conditioning_set = c("driver1", "driver2")
)
inverse_rosenblatt(
  transformed,
  fit,
  conditioning_set = c("driver1", "driver2")
)[1:3, ]

