Skip to contents

A wrapper around sim_hier_mnl (R/sim_hier_mnl.R) providing simpler control over common DGPs using a custom betabar function. Fixes p=3, nXa=1, nXd=1, const=TRUE, ncomp=1. Allows specifying target variances for betabar_i (with mean zero for the first coef) and eps_i.

Usage

simple_sim_hier_mnl(
  nlgt,
  nT,
  nz,
  het_observed = c("none", "linear", "step", "friedman"),
  target_var_betabar = 1,
  target_var_eps = 0.5,
  seed = NULL
)

Arguments

nlgt

Number of individuals.

nT

Number of observations per individual.

nz

Number of Z variables.

het_observed

Character. Functional form of observed heterogeneity (betabar_i = f(Z_i)). Options: "none", "linear", "step", "friedman".

target_var_betabar

Numeric. Target variance for the first coefficient of the observed component betabar_i = f(Z_i). Must be non-negative. The first coefficient will be centered to have mean zero. The remaining coefficients (2 to ncoef) are fixed constants -1, 1, -1, 1. Ignored if het_observed = "none".

target_var_eps

Numeric. Target variance for each coefficient in the unobserved component eps_i. Must be non-negative. Controls sigma_inv_diag.

seed

Integer. Optional random seed.

Value

Output list from sim_hier_mnl.

Examples

if (FALSE) { # \dontrun{
# --- Simulate data with linear observed heterogeneity ---
sim_lin <- simple_sim_hier_mnl(nlgt = 100, nT = 10, nz = 5,
                                 het_observed = "linear",
                                 target_var_betabar = 2.0,
                                 target_var_eps = 0.5,
                                 seed = 123)

# Check dimensions and structure
print(names(sim_lin))
print(sim_lin$true_values$dimensions)
print(str(sim_lin$lgtdata[[1]])) # Structure for one individual
if (!is.null(sim_lin$Z)) print(dim(sim_lin$Z))

# Plot observed vs unobserved components for first coefficient
beta_1 <- sim_lin$true_values$beta_true[, 1]
betabar_1 <- sim_lin$true_values$betabar_true[, 1]
eps_1 <- beta_1 - betabar_1

print(paste("Var(betabar_k1) =", round(var(betabar_1), 2)))
print(paste("Var(eps_k1) =", round(var(eps_1), 2)))

# --- Simulate data with Friedman observed heterogeneity ---
sim_fried <- simple_sim_hier_mnl(nlgt = 100, nT = 10, nz = 5,
                                   het_observed = "friedman",
                                   target_var_betabar = 1.5,
                                   target_var_eps = 0.2,
                                   seed = 456)

# Plot Z vs betabar for the first coefficient
if (!is.null(sim_fried$Z) && ncol(sim_fried$Z) > 0) {
  plot(sim_fried$Z[, 1], sim_fried$true_values$betabar_true[, 1],
       xlab = "Z1", ylab = "betabar_k1 (Friedman)")
}

# --- Simulate data with no observed heterogeneity ---
sim_none <- simple_sim_hier_mnl(nlgt = 100, nT = 10, nz = 5,
                                  het_observed = "none",
                                  target_var_betabar = 0, # Should be ignored
                                  target_var_eps = 1.0,
                                  seed = 789)

# Check if betabar is zero
print(all(sim_none$true_values$betabar_true == 0))
print(paste("Var(eps_k1) =", round(var(sim_none$true_values$beta_true[, 1]), 2)))
} # }