## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")

## ----setup--------------------------------------------------------------------
library(fabricatr)
set.seed(343)

## ----eval = FALSE-------------------------------------------------------------
# # install.packages("remotes")
# remotes::install_github("DeclareDesign/fabricatr@rewrite", build_vignettes = TRUE)

## ----eval = FALSE-------------------------------------------------------------
# library(fabricatr)
# vignette("getting-started")   # a first tour, for someone new to the package
# vignette("fabricatr2.0")      # this document

## -----------------------------------------------------------------------------
fabricate(N = 6, U = rnorm(N), X = rbinom(N, 1, 0.5), Y = U + 0.5 * X)

## -----------------------------------------------------------------------------
fabricate(
  villages = add_level(N = 3, v_income = rnorm(N)),
  citizens = add_level(N = 2, income = v_income + rnorm(N))
)

## -----------------------------------------------------------------------------
fabricate(
  villages = add_level(N = 3, v_income = rnorm(N)),
  citizens = nest_level(N = 2, income = v_income + rnorm(N))
)

## -----------------------------------------------------------------------------
fabricate(
  villages = add_level(N = 3),
  citizens = nest_level(N = 2, rows_at_this_level = N)
)

## -----------------------------------------------------------------------------
fabricate(
  villages = add_level(N = 3, v = rnorm(N)),
  citizens = add_level(N = c(1, 2, 3), y = v + rnorm(N))
)

## -----------------------------------------------------------------------------
fabricate(data = data.frame(x = 1:5), y = x ^ 2)

## -----------------------------------------------------------------------------
fabricate(
  N = 5,
  x = rnorm(N),
  binary = draw_binary(latent = x, link = "logit"),
  counts = draw_count(mean = 3, N = N),
  likert = draw_likert(x, min = -3, max = 3, bins = 5),
  cat    = draw_categorical(prob = c(0.2, 0.5, 0.3), N = N)
)

## -----------------------------------------------------------------------------
fabricate(
  clusters = add_level(N = 4),
  units    = add_level(N = 3, y = draw_normal_icc(clusters = clusters, ICC = 0.4))
)

## -----------------------------------------------------------------------------
po <- fabricate(N = 6, U = rnorm(N), potential_outcomes(Y ~ 0.5 * Z + U))
fabricate(data = po, Z = rbinom(N, 1, 0.5), Y = reveal_outcomes(Y ~ Z))

## -----------------------------------------------------------------------------
fabricate(
  N = 4, U = rnorm(N),
  potential_outcomes(Y ~ 0.3 * Z1 + 0.5 * Z2 + U,
                     conditions = list(Z1 = 0:1, Z2 = 0:1))
)

## -----------------------------------------------------------------------------
dat <- fabricate(
  clusters = add_level(N = 4, g = rnorm(N)),
  units    = add_level(N = 3, y = rnorm(N))
)
resample_data(dat, N = c(clusters = 2, units = 2))
resample_data(dat, N = c(clusters = ALL, units = 2))

## -----------------------------------------------------------------------------
score  <- rnorm(200, mean = 75, sd = 10)
offers <- correlate(draw_count, mean = 3, given = score, rho = 0.6)
cor(score, offers, method = "spearman")

## -----------------------------------------------------------------------------
fabricate(
  countries = add_level(N = 3, gdp = runif(N), nest = FALSE)
)

## -----------------------------------------------------------------------------
fabricate(
  countries = declare_level(N = 3, gdp = runif(N, 1, 10)),
  years     = declare_level(N = 2, shock = runif(N, 0, 1)),
  obs       = cross_levels(.by = c("countries", "years"), Y = gdp + shock)
)

## -----------------------------------------------------------------------------
students <- fabricate(
  primary   = declare_level(N = 20, p_quality = runif(N, 1, 10)),
  secondary = declare_level(N = 15, s_quality = runif(N, 1, 10)),
  students  = link_levels(N = 2000, .by = c("primary", "secondary"), rho = 0.8,
                          score = p_quality + s_quality + rnorm(N))
)
cor(as.numeric(students$primary), as.numeric(students$secondary),
    method = "spearman")

## -----------------------------------------------------------------------------
fabricate(
  N = 12,
  cluster = rep(1:3, each = 4),
  Y = rnorm(N),
  modify_level(cluster_mean = mean(Y), .by = "cluster")
)

## -----------------------------------------------------------------------------
fabricate(
  N = 12, cluster = rep(1:3, each = 4), Y = rnorm(N),
  modify_level(cluster_mean = mean(Y), by = "cluster")
)

## -----------------------------------------------------------------------------
fabricate(
  regions = add_level(N = 3, a = 1:3),
  cities  = add_level(N = 2, b = rnorm(N)),
  regions = modify_level(z = rnorm(N), a2 = a * 2)
)

## -----------------------------------------------------------------------------
set.seed(1)
likert <- fabricate(
  N = 200, U = rnorm(N),
  potential_outcomes(Y ~ draw_ordered(0.6 * Z + U, breaks = c(-1, 1),
                                      labels = c("lo", "mid", "hi")))
)
revealed <- fabricate(data = likert, Z = rbinom(200, 1, 0.5),
                      Yobs = reveal_outcomes(Y ~ Z))
levels(revealed$Yobs)

## -----------------------------------------------------------------------------
fabricate(
  clusters = add_level(N = 12),
  units    = add_level(N = 2)
)

## -----------------------------------------------------------------------------
fabricate(N = 3, Y = rnorm(N), ID_label = "respondent")
fabricate(N = 3, Y = rnorm(N), ID_label = NA)

## -----------------------------------------------------------------------------
y <- draw_normal_icc(clusters = rep(1:10, each = 10), ICC = 0.4)
y <- (y - mean(y)) * 2 / sd(y) + mean(y)
sd(y)

## -----------------------------------------------------------------------------
cl <- rep(1:20, each = 10)
sd(draw_normal_icc(clusters = cl, total_sd = 3, sd_between = 2))

## -----------------------------------------------------------------------------
set.seed(7)
reference <- runif(6)
set.seed(7)
fabricate(data = data.frame(u = 1:6), Z = runif(6))$Z
reference

## -----------------------------------------------------------------------------
fabricate(N = 3, n_obs = N, Y = rnorm(N))

## ----eval = FALSE-------------------------------------------------------------
# # nest = FALSE          -> declare_level()
# # join_using(           -> .by = c("level1", "level2"), with rho = beside it
# # modify_level(... by = -> .by =
# # break_labels|category_labels -> labels =
# # fabricate(<number>,   -> fabricate(N = <number>,
# # draw_*(prob|mean = ..., link = ) -> draw_*(latent = ..., link = )

## -----------------------------------------------------------------------------
individuals <- data.frame(individuals = c("ann", "bob", "cyd"),
                          ind_shock = c(-0.4, 0.1, 0.8))
periods <- data.frame(year = 2020:2022, period_shock = c(0.2, -0.1, 0.3))

fabricate(
  individuals = import_level(individuals),
  period      = import_level(periods, .id = "year"),
  obs         = cross_levels(.by = c("individuals", "period"),
                             Y = ind_shock + period_shock + rnorm(N))
)

## -----------------------------------------------------------------------------
fabricate(
  villages = import_level(data.frame(villages = c("v1", "v2"),
                                     v_income = c(10, 12))),
  citizens = nest_level(N = 3, income = v_income + rnorm(N))
)

## -----------------------------------------------------------------------------
fabricate(
  villages = add_level(N = 3, wealth = rnorm(n())),
  citizens = nest_level(N = 2, income = wealth + rnorm(n())),
  villages = modify_level(n_villages = n())
)

## -----------------------------------------------------------------------------
fabricate(
  N = 12,
  cluster = rep(1:3, each = 4),
  Y = rnorm(N),
  modify_level(cluster_sd = sd(Y), .by = "cluster")
)

## -----------------------------------------------------------------------------
fabricate(N = 5, x = rnorm(N), l = draw_likert(x, breaks = c(-1, 0, 1)))

## -----------------------------------------------------------------------------
fabricate(N = 6, x = rnorm(N), visits = draw_count(latent = x, link = "log"))

## -----------------------------------------------------------------------------
counts <- fabricate(
  N = 10000,
  poisson = draw_count(mean = 3, N = N),
  overdispersed = draw_count(mean = 3, N = N, dispersion = 0.5)
)
sapply(counts[c("poisson", "overdispersed")], function(y) round(c(mean = mean(y), var = var(y)), 2))

## -----------------------------------------------------------------------------
x <- rnorm(200)
y <- correlate(rnorm, mean = 0, sd = 1, given = x, rho = -0.5)
cor(x, y, method = "spearman")

## -----------------------------------------------------------------------------
panel <- fabricate(
  units = declare_level(N = 100, unit_effect = rnorm(N)),
  periods = declare_level(N = 10),
  obs = cross_levels(
    .by = c("units", "periods"),
    e = draw_normal_ar(clusters = units, time = periods, rho = 0.8),
    Y = unit_effect + e,
    voted = draw_binary(latent = Y, link = "probit"),
    contacts = draw_count(mean = 2, quantile_y = pnorm(e))
  )
)
head(panel)

