N <- 1e6               # número de individuos
var_error <- 1         # varianza de cada característica (normal con var=1)

set.seed(123)          # para reproducibilidad

Cada característica \(j\) sigue \(N(\mu_j, 1)\), con \(\mu_j\) entero aleatorio entre 1 y 100.

simular_datos <- function(P, N) {
  # Generar las medias verdaderas (enteros entre 1 y 100)
  medias <- sample(1:100, size = P, replace = TRUE)
  
  # Matriz de datos: N filas, P columnas
  # Para eficiencia, generamos todos los valores de una vez con matrix(rnorm(...))
  # rnorm(N*P) genera un vector, luego lo reordenamos por columnas (cada columna es una característica)
  datos <- matrix(rnorm(N * P, mean = rep(medias, each = N), sd = sqrt(var_error)),
                  nrow = N, ncol = P, byrow = FALSE)
  colnames(datos) <- paste0("Var", 1:P)
  return(list(datos = datos, medias = medias))
}
P71 <- 71
cat("--- Simulación con", P71, "características ---\n")
## --- Simulación con 71 características ---
# Medición del tiempo de simulación
tiempo_sim71 <- system.time({
  sim71 <- simular_datos(P71, N)
})
cat("Tiempo de simulación (71 vars):\n")
## Tiempo de simulación (71 vars):
print(tiempo_sim71)
##    user  system elapsed 
##    4.61    0.31    5.07
# Extraer respuesta (primera característica) y predictores (resto)
X71 <- sim71$datos[, -1]   # columnas 2 a 71
y71 <- sim71$datos[, 1]

# Medición del tiempo de entrenamiento del modelo lineal
tiempo_lm71 <- system.time({
  modelo71 <- lm(y71 ~ ., data = as.data.frame(X71))
})
cat("\nTiempo de regresión lineal (70 predictores):\n")
## 
## Tiempo de regresión lineal (70 predictores):
print(tiempo_lm71)
##    user  system elapsed 
##   10.28    1.00   11.94
P51 <- 51
cat("\n--- Simulación con", P51, "características ---\n")
## 
## --- Simulación con 51 características ---
tiempo_sim51 <- system.time({
  sim51 <- simular_datos(P51, N)
})
cat("Tiempo de simulación (51 vars):\n")
## Tiempo de simulación (51 vars):
print(tiempo_sim51)
##    user  system elapsed 
##    3.43    0.30    3.79
X51 <- sim51$datos[, -1]   # columnas 2 a 51
y51 <- sim51$datos[, 1]

tiempo_lm51 <- system.time({
  modelo51 <- lm(y51 ~ ., data = as.data.frame(X51))
})
cat("\nTiempo de regresión lineal (50 predictores):\n")
## 
## Tiempo de regresión lineal (50 predictores):
print(tiempo_lm51)
##    user  system elapsed 
##    7.48    1.28    9.17
P21 <- 21
cat("\n--- Simulación con", P21, "características ---\n")
## 
## --- Simulación con 21 características ---
tiempo_sim21 <- system.time({
  sim21 <- simular_datos(P21, N)
})
cat("Tiempo de simulación (21 vars):\n")
## Tiempo de simulación (21 vars):
print(tiempo_sim21)
##    user  system elapsed 
##    1.41    0.08    1.53
X21 <- sim21$datos[, -1]   # columnas 2 a 21
y21 <- sim21$datos[, 1]

tiempo_lm21 <- system.time({
  modelo21 <- lm(y21 ~ ., data = as.data.frame(X21))
})
cat("\nTiempo de regresión lineal (20 predictores):\n")
## 
## Tiempo de regresión lineal (20 predictores):
print(tiempo_lm21)
##    user  system elapsed 
##    1.22    0.31    1.65
library(knitr)

tabla_tiempos <- data.frame(
  Características = c(71, 51, 21),
  Predictores = c(70, 50, 20),
  Tiempo_simulación_seg = c(tiempo_sim71[3], tiempo_sim51[3], tiempo_sim21[3]),
  Tiempo_regresión_seg = c(tiempo_lm71[3], tiempo_lm51[3], tiempo_lm21[3])
)

kable(tabla_tiempos, digits = 2, caption = "Comparación de tiempos (usuario + sistema)")
Comparación de tiempos (usuario + sistema)
Características Predictores Tiempo_simulación_seg Tiempo_regresión_seg
71 70 5.07 11.94
51 50 3.79 9.17
21 20 1.53 1.65

La simulación genera \(N \times P\) valores normales. La regresión lineal con 1M de filas y 70 predictores es computacionalmente intensa. Si el equipo tiene poca RAM, reducir \(N\) a \(5\times10^5\) o menos.