TAREA 1: INSESGADEZ

Los Loops en R

En R, un loop (o bucle) es una estructura que permite repetir un bloque de código varias veces. Se usa principalmente para automatizar tareas repetitivas, como ejecutar el mismo modelo muchas veces con diferentes muestras, semillas o tamaños muestrales.

¿Para qué sirve un Loop?

  • Repetir cálculos muchas veces (por ejemplo, ejecutar un modelo estadístico varias veces).

  • Procesar datos en serie, como recorrer filas o columnas de una base de datos.

  • Realizar simulaciones estadísticas o experimentos computacionales.

  • Automatizar tareas repetitivas, como generar gráficos, guardar resultados o calcular indicadores.

En el contexto del experimento realizado:

Sirve para simular múltiples estimaciones del coeficiente β₁ en distintos escenarios.

  • Permite evaluar el comportamiento del estimador, es decir:

  • Su sesgo (qué tan cerca está del valor verdadero).

  • Su eficiencia (qué tan variable es entre distintas muestras).

¿Cómo se realiza un Loop en R?

El bucle más común es for(). Su estructura general es:

for (i in 1:N) {
  # Código a repetir
}
  • i es el contador que cambia en cada repetición (de 1 hasta N).

  • Dentro del bloque { }, se coloca el código que queremos repetir.

Ejemplo aplicado al experimento

for (i in 1:100) {
  set.seed(i)
  muestra <- datos[sample(nrow(datos), 20), ]
  modelo <- lm(y ~ x, data = muestra)
  betas[i] <- coef(modelo)[2]
}

Este loop repite 100 veces el muestreo y cálculo del coeficiente β₁. Luego se usa la media y varianza de esos betas para estudiar su sesgo y eficiencia.

SIMULACIÓN CON 100 MUESTRAS ALEATORIAS

set.seed(1)
x <- round(rnorm(1000, 20, 2), 1)
error <- round(rnorm(1000, 0, 0.2), 1)
y <- 50 - (2 * x) + error
datos <- data.frame(y, x)

# Se crea un vector para guardar los betas
betas <- numeric(100)

# Bucle: cambia la semilla de 1 a 100
for (i in 1:100) {
  set.seed(i)
  muestra <- datos[sample(nrow(datos), 20), ] # toma muestra aleatoria
  modelo <- lm(y ~ x, data = muestra)
  betas[i] <- coef(modelo)[2]  # guarda la pendiente (beta1)
}

Insesgadez

Calcular el valor esperado (promedio de los betas)

media_betas<-mean(betas)
media_betas
## [1] -1.999236

El estimador de \(\beta_1\) es insesgado porque, en promedio, los valores estimados se acercan al verdadero valor del parámetro.

Gráfico de dispersión de los betas

Eficiencia

La propiedad eficiente de cualquier estimador indica que es el estimador insesgado con mínima varianza

Calcular la varianza de los betas

varianza_betas<- var(betas)
varianza_betas
## [1] 0.0006047676

La varianza mide la dispersión de las estimaciones de \(\beta_1\) en las distintas muestras.

Cuanto más pequeña sea esta varianza, más eficiente es el estimador, porque sus resultados varían poco de muestra a muestra.

Consistencia

Demostración de consistencia

Se dice que un estimador es consistente si su valor se aproxima al valor real del parámetro (población) a medida que aumenta el tamaño de la muestra.

Es decir, su varianza converge a 0 a medida que aumenta el tamaño de la muestra.

set.seed(1)

# Verdadero valor de los parámetros
beta0_real <- 50
beta1_real <- -2

# Tamaños de muestra
tamaños <- c(10, 20, 50, 100, 200, 500, 700, 1000)
sesgos <- numeric(length(tamaños))

# Bucle para calcular el sesgo en cada tamaño
for (i in seq_along(tamaños)) {
  n <- tamaños[i]
  betas <- numeric(100)  # 100 repeticiones
  
  for (j in 1:100) {
    # Simulamos nuevos datos cada vez (población conceptual)
    x <- rnorm(n, 20, 2)
    error <- rnorm(n, 0, 0.2)
    y <- beta0_real + beta1_real * x + error
    
    modelo <- lm(y ~ x)
    betas[j] <- coef(modelo)[2]  # Guardamos la pendiente estimada
  }
  
  # Sesgo promedio
  sesgos[i] <- mean(betas) - beta1_real
}

# Mostrar tabla
data.frame(Tamaño = tamaños, Sesgo = round(sesgos, 5))
##   Tamaño    Sesgo
## 1     10  0.00308
## 2     20  0.00127
## 3     50 -0.00105
## 4    100  0.00014
## 5    200 -0.00036
## 6    500 -0.00050
## 7    700 -0.00023
## 8   1000  0.00042

Demostración gráfica de consistencia