No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Haciendo un bootstrapping a un modelo

28/37
Recursos

Aportes 6

Preguntas 0

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Agrego mi c贸digo con comentarios, espero sea de utilidad,


# Hacemos un bootstrapping para nuestra regresi贸n lineal. -----------------


# Bootstrapping -----------------------------------------------------------


tamano_muestral <- 23
iteraciones <- 1000
beta_0 <- 1
beta_1 <- -0.3
desv_est_error <- 0.5

genera_x <- function(n) seq(-3, 3, length.out = n)

genera_y <- function(x, beta_0, beta_1){
  beta_1*x + beta_0 + rnorm(length(x), 0, desv_est_error)
}

#los datos se vuelven fijos para el ejercicio
datos_x <- geno_muestral)
datos_y <- genera_y(datos_x, beta_0, beta_1)

#hacemos la regresion con lm (linear model)
lm(datos_y ~ datos_x) -> modelo
coefficients(modelo) -> coeficientes_muestrales

# obtenemos intervalos de confianza con confint
confint(modelo)


#inicializamos vectores
beta_0_estimado <- beta_1_estimado <- vector()


for(i in seq_len(iteraciones)){
  # Tomamos una muesta con sample(numeros, tama帽o, reemplazo(datos repetidos)
  muestra <- sample(seq_along(datos_x), length(datos_x), replace = TRUE)
  
  # Usando los valores aleatorios y repetitivos de la variable "muestra" 
  # como indices tomamos una muestra datos de la variable "datos_x"
  muestra_x <- datos_x[muestra]

  # Repetimos el procedimiento para muestra_y
  muestra_y <- datos_y[muestra]
  
  # Hacemos un modelo lineal de con las submuestras
  lm(muestra_y ~ muestra_x) -> modelo
  
  # Obtenemos sus coeficientes
  coeficientes <- coefficients(modelo)
  
  # Guardamos los coeficientes estimados
  beta_0_estimado[i] <- coeficientes[1]
  beta_1_estimado[i] <- coeficientes[2]
}


# Creamos un DataFrame con los datos

data.frame(
  limite = c("inferior", "superior"),
  beta_0 = quantile(beta_0_estimado, c(0.025, 0.975)),
  beta_1 = quantile(beta_1_estimado, c(0.025, 0.975))
) -> intervalo_bootstrapping

intervalo_bootstrapping

# Hacemos el plot
plot(beta_0, beta_1)

points(beta_0_estimado, beta_1_estimado)
points(coeficientes_muestrales[1], coeficientes_muestrales[2], pch = 20, col = 4, cex = 3)
points(beta_0, beta_1, pch = 20, col = 2, cex = 3)
# Graficamos un rectangolo (nuestro intervalo de confianza)
rect(
  intervalo_bootstrapping$beta_0[1], 
  intervalo_bootstrapping$beta_1[1],
  intervalo_bootstrapping$beta_0[2],
  intervalo_bootstrapping$beta_1[2],
  border = 4, lwd = 2)

Dejo esta lectura complementaria sobre el metodo de minimos cuadrados donde se toca el tema de regresion lineal y porque agregamos el error normal a la funcion genera_y

https://grisalazar.wordpress.com/2014/05/01/regresion-lineal/



# Hacemos un bootstrapping para nuestra regresi贸n lineal. -----------------


# Bootstrapping -----------------------------------------------------------


tamano_muestral <- 23
iteraciones <- 1000
beta_0 <- 1
beta_1 <- -0.3
desv_est_error <- 0.5

genera_x <- function(n) seq(-3, 3, length.out = n)

genera_y <- function(x, beta_0, beta_1){
  beta_1*x + beta_0 + rnorm(length(x), 0, desv_est_error)
}

datos_x <- genera_x(tamano_muestral)
datos_y <- genera_y(datos_x, beta_0, beta_1)


lm(datos_y ~ datos_x) -> modelo
coefficients(modelo) -> coeficientes_muestrales
summary(modelo)
confint(modelo)

beta_0_estimado <- beta_1_estimado <- vector()

for(i in seq_len(iteraciones)){
  muestra <- sample(seq_along(datos_x), length(datos_x), replace = TRUE)
  muestra_x <- datos_x[muestra]
  muestra_y <- datos_y[muestra]
  lm(muestra_y ~ muestra_x) -> modelo
  coeficientes <- coefficients(modelo)
  beta_0_estimado[i] <- coeficientes[1]
  beta_1_estimado[i] <- coeficientes[2]
}


data.frame(
  limite = c("LI", "LS"),
  beta_0 = quantile(beta_0_estimado, c(0.025, 0.975)),
  beta_1 = quantile(beta_1_estimado, c(0.025, 0.975))
) -> intervalo_bootstrapping

intervalo_bootstrapping



plot(beta_0, beta_1)

points(beta_0_estimado, beta_1_estimado)
points(coeficientes_muestrales[1], coeficientes_muestrales[2], pch = 20, col = 4, cex = 3)
points(beta_0, beta_1, pch = 20, col = 2, cex = 3)
rect(
  intervalo_bootstrapping$beta_0[1], 
  intervalo_bootstrapping$beta_1[1],
  intervalo_bootstrapping$beta_0[2],
  intervalo_bootstrapping$beta_1[2],
  border = 4, lwd = 2)


# Tidy approach -----------------------------------------------------------

# Paquetes ----------------------------------------------------------------


library("dplyr")
library("purrr")
library("tidyr", exclude = c("extract"))
library("ggplot2")
library("magrittr")

colores_platzi <- c("#78D92A", "#002E4E", "#058ECD", "#ED2B05", "#F4F7F4")

tamano_muestral <- 23
iteraciones <- 1000
beta_0 <- 1
beta_1 <- -0.3
desv_est_error <- 0.5

genera_x <- function(n) seq(-3, 3, length.out = n)

genera_y <- function(x, beta_0, beta_1){
  beta_1*x + beta_0 + rnorm(length(x), 0, desv_est_error)
}

datos_simulados <- tibble(
  x = genera_x(tamano_muestral),
  y = genera_y(datos_x, beta_0, beta_1)
)


lm(y ~ x, data = datos_simulados) -> modelo
coefficients(modelo) -> coeficientes_muestrales
summary(modelo)
confint(modelo)

tibble(
  muestras = replicate(iteraciones, sample_n(datos_simulados, nrow(datos_simulados), replace = TRUE), simplify = FALSE),
  modelos = map(muestras, function(muestra){lm(y~x, data = muestra)}),
  beta_0_estimado = map(modelos, coef) %>% map_dbl(extract, 1),
  beta_1_estimado = map(modelos, coef) %>% map_dbl(extract, 2)
) -> coeficientes

coeficientes %>% 
  select(beta_0_estimado, beta_1_estimado) %>% 
    gather(key = coeficiente, value = valor) %>%
    group_by(coeficiente) %>%
    summarise(
      LI = quantile(valor, 0.025),
      LS = quantile(valor, 0.975)
    ) -> intervalo_bootstrap

coeficientes %>% 
  select(beta_0_estimado, beta_1_estimado) %>% 
  gather(key = coeficiente, value = valor) %>% 
  ggplot +
  aes(x = valor) + 
  geom_density(fill = "#78D92A", alpha = 0.5, colour = "#78D92A") +
  facet_wrap(~coeficiente, nrow = 4,  scales = "free") + 
  theme_minimal()

ggplot() +
  geom_point(
    data = coeficientes, 
    mapping = aes(x = beta_0_estimado, y = beta_1_estimado)
    ) +
  geom_rect(
    data = intervalo_bootstrap, 
    mapping = aes(xmin = LI[[1]], ymin = LI[[2]], xmax = LS[[1]], ymax = LS[[2]]),
    fill = colores_platzi[1],
    alpha = 0.2
    ) +
  annotate("point",x = beta_0, y = beta_1, colour = colores_platzi[4], size = 5) +
  annotate("point",x = coeficientes_muestrales[1], y = coeficientes_muestrales[2], colour = colores_platzi[3], size = 5) +
  theme_minimal()```

Agrego mi c贸digo pero el plot no me sale igual, talvez alguien se da cuenta del error鈥

tamano_muestral <- 23
iteraciones <- 1000
beta_0 <- 1
beta_1 <- -0.3
desv_est_error <- 0.5
genera_x <- function(n) seq(-3, 3, length.out = n)

genera_y <- function(x, beta_0, beta_1){
beta_1*x + beta_0 + rnorm(length(x), 0, desv_est_error)}

datos_x <- genera_x(tamano_muestral)

datos_y <- genera_y(datos_x, beta_0, beta_1)

lm(datos_y ~ datos_x) -> modelo
coefficients(modelo) -> coeficientes_muestrales
confint(modelo)

beta_0_estimado <- beta_1_estimado <- vector()

for(i in seq_len(iteraciones)){
muestra <- sample(seq_along(datos_x), length(datos_x), replace = TRUE)
muestra_x <- datos_x[muestra]
muestra_y <- datos_y[muestra]
lm(muestra_y ~ muestra_x) -> modelo
coeficientes <- coefficients(modelo)
beta_0_estimado[i] <- coeficientes[1]
beta_1_estimado[i] <- coeficientes[2]

}

data.frame(
limite = c(鈥淟I鈥, 鈥淟S鈥),
beta_0 = quantile(beta_0_estimado, c(0.025, 0.975)),
beta_1 = quantile(beta_1_estimado, c(0.025, 0.975))
) -> intervalo_bootstrapping

intervalo_bootstrapping

plot(beta_0, beta_1)

points(coeficientes_muestrales[1], coeficientes_muestrales[2])
points(beta_0_estimado, beta_1_estimado)
points(beta_0, beta_1, pch = 20, col = 2, cex = 3)
rect(
intervalo_bootstrapping$beta_0[1],
intervalo_bootstrapping$beta_1[1],
intervalo_bootstrapping$beta_0[2],
intervalo_bootstrapping$beta_1[2],
border = 4,
lwd = 4
)

驴Qu茅 es Bootstrapping?

El bootstrapping (o bootstrap) es un m茅todo de remuestreo propuesto por Bradley Efron en 1979. Se utiliza para aproximar la distribuci贸n en el muestreo de un estad铆stico. Se usa frecuentemente para aproximar el sesgo o la varianza de un an谩lisis estad铆stico, as铆 como para construir intervalos de confianza o realizar contrastes de hip贸tesis sobre par谩metros de inter茅s. En la mayor parte de los casos no pueden obtenerse expresiones cerradas para las aproximaciones bootstrap y por lo tanto es necesario obtener remuestras en un ordenador para poner a prueba el m茅todo. La enorme potencia de c谩lculo de los ordenadores actuales facilita considerablemente la aplicabilidad de este m茅todo tan costoso computacionalmente.

驴Para que sirve?

La idea b谩sica de bootstrap es que la inferencia sobre una poblaci贸n a partir de datos de muestra, (muestra 鈫 poblaci贸n), puede ser modelada mediante un nuevo muestreo de los datos de la muestra y realizando la inferencia sobre una muestra a partir de datos remuestreados. Como la poblaci贸n es desconocida, el verdadero error en una muestra estad铆stica contra su valor poblacional es desconocido. En las re-muestras de bootstrap, la 鈥榩oblaci贸n鈥 es de hecho la muestra, y esto se conoce; por lo tanto, se puede medir la calidad de la inferencia de la muestra 鈥渧erdadera鈥 a partir de datos remuestreados, (muestra re-muestreada).


Bibliograf铆a: