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)")
| 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.