3. Generar los datos

Authors
Affiliation

Agenda

Parte I

  • Generar los datos
  • Explorar los datos
  • Preprocesar los datos
library(tidyverse)
set.seed(2025) # for reproducibility
n <- 500 # sample size
X <- matrix(rnorm(n * 5), ncol = 5) # 5 predictors
beta <- c(.3, -.2, .4, -.1, .2) # coefficients
y_linear <- X %*% beta + rnorm(n) # linear combination of X and beta with some noise
df_linear <- cbind(y_linear, X) |> as_tibble()
colnames(df_linear) <- c("Y", "X1", "X2", "X3", "X4", "X5")

arrow::write_parquet(df_linear, "data/df_linear.parquet")

Simular datos con interacción

# Add interaction terms
X_interaction <- cbind(X[, 1], X[, 2], X[, 3], X[, 4], X[, 5], X[, 1] * X[, 1], X[, 3] * X[, 3])

beta_interaction <- c(.3, -.2, .4, -.1, .2, .6, .8)

y_interaction <- X_interaction %*% beta_interaction + rnorm(n)

# Combine into a tibble
df_interaction <- cbind(y_interaction, X_interaction) |>
    as_tibble() |>
    select(-V7, -V8)
colnames(df_interaction) <- c("Y", "X1", "X2", "X3", "X4", "X5")

arrow::write_parquet(df_interaction, "data/df_interaction.parquet")

Simular datos aleatorios

y_random <- rnorm(n)
# Combine into a tibble
df_random <- cbind(y_random, X) %>% as_tibble()
colnames(df_random) <- c("Y", "X1", "X2", "X3", "X4", "X5")

Simular datos con muchos predictores (caso Lasso)

La siguiente base contiene decenas de predictores Gaussianos estandarizados donde solo un subconjunto pequeño tiene efecto real sobre Y. Es ideal para mostrar por qué la regresión Lasso (glmnet, penalty, mixture) ayuda a seleccionar variables relevantes y a reducir la varianza del modelo.

set.seed(9001)
n_lasso <- 600
p_lasso <- 60
X_lasso <- matrix(rnorm(n_lasso * p_lasso), nrow = n_lasso, ncol = p_lasso)

# Solo ocho coeficientes distintos de cero (positivos y negativos)
beta_signal <- c(runif(4, 0.6, 1.5), runif(4, -1.5, -0.6))
beta_noise <- rep(0, p_lasso - length(beta_signal))
beta_lasso <- c(beta_signal, beta_noise)

y_lasso <- X_lasso %*% beta_lasso + rnorm(n_lasso, sd = 1.5)

df_lasso <- X_lasso |>
    as_tibble() |>
    setNames(paste0("X", seq_len(p_lasso))) |>
    mutate(Y = as.numeric(y_lasso), .before = 1)

variables_importantes <- tibble(
    variable = paste0("X", seq_len(length(beta_signal))),
    beta_real = round(beta_signal, 3)
)

Usa df_lasso como entrada para un workflow con linear_reg(penalty = tune(), mixture = 1) y contrasta los coeficientes estimados frente a variables_importantes para ilustrar la selección automática de predictores.

Back to top