library(tidyverse)
library(MASS)
set.seed(123)
n <- 100000
cor_matrix <- matrix(c(
  1.00,  0.20,  0.20, -0.10,  0.40,  # male
  0.20,  1.00,  0.30,  0.25,  0.50,  # white
  0.20,  0.30,  1.00,  0.35,  0.45,  # rich
 -0.10,  0.25,  0.35,  1.00, -0.30,  # college
  0.40,  0.50,  0.45, -0.30,  1.00   # vote.republican
), nrow = 5, byrow = TRUE)

# Simulate latent traits
latent <- mvrnorm(n = n, mu = rep(0, 5), Sigma = cor_matrix)

# Thresholds to get realistic marginal distributions:
# ~50% male, ~60% white, ~25% rich, ~55% college, ~40% vote.republican
male             <- latent[, 1] > 0
white            <- latent[, 2] > -0.25
rich             <- latent[, 3] > 0.67
college          <- latent[, 4] > -0.13
vote.republican  <- latent[, 5] > 0

# Combine into a data frame
pop <- data.frame(
  male = male,
  white = white,
  rich = rich,
  college = college,
  vote.republican = vote.republican
)

pop |> 
  summarise(across(everything(), mean))



samp <- pop[sample(1:nrow(pop), nrow(pop), replace=F),]

samp|> 
  summarise(across(everything(), mean))



samp <- pop[sample(1:nrow(pop), 50000, replace=F),]
samp |> 
  summarise(across(everything(), mean))

samp <- pop[sample(1:nrow(pop), 1000, replace=F),]
samp |> 
  summarise(across(everything(), mean))

samp <- pop[sample(1:nrow(pop), 100, replace=F),]
samp |> 
  summarise(across(everything(), mean))

pop |> 
  mutate(interview.prob = if_else(college==T, .20, .15)) -> pop

samp <- pop[sample(1:nrow(pop), 1000, replace=F, prob=pop$interview.prob),]
samp |> 
  summarise(across(everything(), mean))
