Teoría

1

Inferencia Estadística: Fundamentos y Aplicaciones con Simulación en R

2

Valor Esperado Condicional en Ciencia de Datos

3

Poblaciones y Muestras: Conceptos y Generalización Estadística

4

Muestreo Probabilístico y No Probabilístico: Métodos y Aplicaciones

5

Estimadores y Parámetros en Ciencia de Datos

6

Estimación Paramétrica y No Paramétrica en Ciencia de Datos

7

Gráficos y Espacio de Parámetros en Modelos Estadísticos

8

Estimadores Puntuales y su Comportamiento Aleatorio

9

Intervalos de Confianza: Cálculo y Significado en Estadística

10

Tamaño Muestral y su Impacto en la Precisión Estadística

11

Sesgo y Varianza en Ciencia de Datos: Precisión y Exactitud

12

Teoría No Paramétrica: Estimación y Modelos Aplicados

13

Estimación Funcional: Kernel y Funciones de Densidad Acumulada

14

Estimación Funcional del Valor Esperado Condicional

15

Inferencia Estadística con Bootstrapping para Modelos Paramétricos

16

Validación Cruzada y Generalización de Modelos Estadísticos

17

Pruebas de Hipótesis: Conceptos y Aplicaciones Estadísticas

18

Pruebas de Hipótesis: P Valor y Significancia Estadística

Simulación

19

Simulación de Datos con R: Teoría a la Práctica

20

Instalación de R y RStudio en Windows, macOS y Ubuntu

21

Simulación de Datos en R: Distribuciones y Modelos Lineales

22

Simulación de Estimación de Parámetros usando R

23

Simulación de Intervalos de Confianza para Poblaciones Normales

24

Simulación de Convergencia de Estimadores con Diferentes Tamaños Muestrales

25

Estimación Kernel y Distribución Acumulada Empírica

26

Estimación Condicional con Redes Neuronales en R

27

Estimación Kernel: Aplicación en Distribución Uniforme y Normal

28

Boostrapping en R para Regresión Lineal: Implementación y Análisis

29

Validación cruzada en redes neuronales usando R

30

Simulación de Potencia en Pruebas de Hipótesis con R

Proyecto

31

Análisis Estadístico del Examen Saber Once con R

32

Estimación de Intervalos de Confianza para Comparar Poblaciones con y sin Internet

33

Pronóstico de Puntaje en Matemáticas con Redes Neuronales

34

Generalización de Redes Neuronales a Poblaciones Completas

35

Análisis de Tamaño Muestral Óptimo para Redes Neuronales

36

Interpretación de Redes Neuronales en Predicción Educativa

Conclusiones

37

Programación Dinámica y Estocástica en Simulación

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Estimación Condicional con Redes Neuronales en R

26/37
Recursos

¿Cómo estimar el valor esperado condicional con redes neuronales en R?

Las redes neuronales son una herramienta poderosa para estimar el valor esperado condicional, especialmente en problemas multivariados. Utilizando la librería nnet en R, podemos implementar y simular fácilmente modelos que nos ayuden en esta tarea. Aquí te mostraremos cómo realizar este procedimiento paso a paso.

¿Qué librerías de R son útiles para redes neuronales?

Para nuestra simulación, utilizaremos la librería nnet en R, aunque TensorFlow y Keras son otras opciones populares. Para comenzar, debes asegurarte de tener la librería instalada y cargarla:

install.packages("nnet") # si no está instalada
library(nnet)

¿Cómo configurar la simulación de datos?

Para simular el proceso de estimación, necesitamos establecer parámetros para el número de iteraciones y tamaño muestral. Aquí se sugieren 50 iteraciones y un tamaño muestral de 23:

iteraciones <- 50
tamaño_muestral <- 23

Luego, definimos una función que genera una respuesta aleatoria y dado un x:

genera_y <- function(x) {
  y <- cos(x) + rnorm(length(x), mean = 0, sd = 0.5)
  return(y)
}

Para generar nuestra variable x, creamos una secuencia de valores entre 0 y 3π:

x <- seq(0, 3 * pi, length.out = tamaño_muestral)

Y a partir de ahí, generamos y:

y <- genera_y(x)

¿Cómo construir una red neuronal simple en R?

Una vez que tenemos nuestros datos, podemos crear una red neuronal usando la función nnet:

modelo_nn <- nnet(x, y, size = 6, linout = TRUE, skip = FALSE)
  • size = 6 indica que estamos usando seis neuronas en una sola capa.
  • linout = TRUE aclara que la salida es una variable numérica continua.

¿Cómo visualizar los resultados de la red neuronal?

Podemos graficar nuestros datos y la predicción de la red neuronal para ver cómo se ajustan al modelo esperado:

plot(x, y, main = "Datos y modelo", col = "black")
lines(x, predict(modelo_nn, data.frame(x)), col = "blue", lwd = 2)

¿Cómo realizar múltiples iteraciones para mejorar el modelo?

Para evaluar la robustez de nuestro modelo, podemos ejecutar múltiples iteraciones con un bucle for:

for (i in 1:iteraciones) {
  y_nueva <- genera_y(x)
  modelo_nn <- nnet(x, y_nueva, size = 6, linout = TRUE, skip = FALSE)
  lines(x, predict(modelo_nn, data.frame(x)), col = "green", lwd = 0.5)
}

¿Cómo mejorar la estimación del modelo?

Al aumentar el número de iteraciones y el tamaño muestral, se reduce la variabilidad de las predicciones. Prueba aumentar ambos parámetros y observa el cambio:

iteraciones <- 150
tamaño_muestral <- 200

Luego, repite todo el proceso para ver cómo las predicciones se acercan más al modelo verdadero con menos variabilidad.


El uso de redes neuronales proporciona una forma eficaz de realizar estimaciones funcionales complejas. A medida que practiques y ajustes estos modelos, desarrollarás una comprensión más profunda sobre su impacto y precisión. ¡Sigue experimentando, incluyendo otros enfoques como las regresiones lineales, para ver cómo se comportan! El código completo lo puedes encontrar en tu sistema de archivos. En la próxima clase, abordaremos temas cruciales como el sesgo y la varianza. ¡Te esperamos!

Aportes 8

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?



# Red neuronal vs regresión lineal. ¿Cuál es el mejor estimador? ----------


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

library("nnet")

# Regresión lineal --------------------------------------------------------


iteraciones <- 100
tamano_muestral <- 30
beta_0 <- 1
beta_1 <- -0.3


x <- seq(-3, 3, length.out = tamano_muestral)

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

y <- genera_y(x, beta_0, beta_1)

modelo_lineal <- lm(y~x)

plot(x, y)
abline(beta_0, beta_1, col = 2, lwd = 2)
lines(x, modelo_lineal$fitted.values, col = 4, lwd = 2)


plot(x, modelo_lineal$fitted.values, type = "l")

for(i in seq_len(iteraciones)){
  y <- genera_y(x, beta_0, beta_1)
  
  modelo_lineal <- lm(y~x)
  
  lines(x, modelo_lineal$fitted.values)
  
}
abline(beta_0, beta_1, col = 2, lwd = 2)

# Red neuronal ------------------------------------------------------------

iteraciones <- 50
tamano_muestral <- 23

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


X <- seq(0, 3*pi, length.out = tamano_muestral)
Y <- genera_y(X)

plot(Y~X)
lines(cos(X) ~ X, col = 2, lwd = 2)


red_neuronal <- nnet(X, Y, size = 8, linout = TRUE, trace = FALSE)

YY <- predict(red_neuronal)
lines(YY ~ X, col = 4, lwd = 2)


plot(Y~X, col = "white")

for(i in seq_len(iteraciones)){
  
  Y <- genera_y(X)
  red_neuronal <- nnet(X, Y, size = 8, linout = TRUE, trace = FALSE)
  YY <- predict(red_neuronal)
  lines(YY ~ X, col = 4)
  
}

lines(cos(X) ~ X, col = 2, lwd = 2)



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


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

library("dplyr")
library("magrittr")
library("ggplot2")
library("LaCroixColoR")

color_setup <- lacroix_palette("PassionFruit", n = 5, type = "discrete")[c(1, 4, 5)]

# Regresión lineal --------------------------------------------------------

iteraciones <- 100
tamano_muestral <- 30
beta_0 <- 1
beta_1 <- -0.3

x <- seq(-3, 3, length.out = tamano_muestral)

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

nombre_iter <- paste("I", seq_len(iteraciones))

tibble(
  iter = rep(nombre_iter, each=tamano_muestral),
  datos_x = rep(x, iteraciones),
  datos_y = genera_y(datos_x, beta_0, beta_1)
) -> simulaciones

ggplot(simulaciones) +
  # geom_point(aes(x = datos_x, y = datos_y), colour = color_setup[3], size = 0.2) +
  geom_smooth(aes(x = datos_x, y = datos_y, group = iter), method = "lm", colour = color_setup[3], size = 0.2, se = FALSE) +
  geom_abline(intercept = beta_0, slope = beta_1, colour = color_setup[1], size = 1) +
  theme_minimal()


# Red neuronal ------------------------------------------------------------

iteraciones <- 50
tamano_muestral <- 23

X <- seq(0, 3*pi, length.out = tamano_muestral)

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


nombre_iter <- paste("I", seq_len(iteraciones))

tibble(
  iter = rep(nombre_iter, each=tamano_muestral),
  datos_x = rep(X, iteraciones),
  datos_y = genera_y(datos_x, beta_0, beta_1)
) -> simulaciones

my_nnet <- function(form, data, weights) nnet(form, data = data, size = 8, linout = TRUE, trace = FALSE)

ggplot(simulaciones) +
  # geom_point(aes(x = datos_x, y = datos_y), colour = color_setup[3], size = 0.2) +
  geom_smooth(aes(x = datos_x, y = datos_y, group = iter), method = "my_nnet", colour = color_setup[3], size = 0.2, se = FALSE) +
  geom_line(aes(x = datos_x, y = cos(datos_x)), colour = color_setup[1], size = 1) +
  theme_minimal()```

Para los que no tienen claro que es una red neuronal. Aquí dejo un abrebocas de lo que trata.

La idea es sencilla, ya que se trata de imitar a las neuronas biológicas, conectadas entre sí y trabajando en conjunto, aprendiendo sobre el proceso. Dados unos parámetros hay una forma de combinarlos para predecir un cierto resultado. El problema estará en saber cómo combinarlos. Las redes neuronales son un modelo para encontrar esa combinación de parámetros y aplicarla al mismo tiempo. El objetivo es encontrar la combinación que mejor se ajusta entrenando a la red neuronal. Este entrenamiento, aprendizaje, es la parte crucial de la RNA, ya que nos marcará la precisión del algoritmo. Consiste en encontrar esa relación de pesos a través de un proceso iterativo en el que, secuencialmente, se va analizando cada uno de los patrones de entrada a la red, reajustando en cada iteración la relación de pesos. Es en este punto cuando se introducirá una función de error que irá midiendo el rendimiento de la red en un momento dado, donde el objetivo será, obviamente, minimizar dicha función de error. El algoritmo se detendrá cuando se alcance la cota de error establecida por el usuario (o en caso de ciclo corto, cuando el error no decrezca sensiblemente).

En la cuestión de la convergencia además de las gráficas y ejemplos que hemos hecho deben de existir algunas demostraciones, si alguien sabe de algún recurso o PDF donde ver estos teoremas y demostraciones se lo agradecería
😃

#Paquetes
library('nnet')

# Red neuronal
iteraciones <- 150
tamano_muestral <- 200

genera_y <- function(x){
  cos(x) + rnorm(length(x), 0, 0.5)
}
X <- seq(0, 3 * pi, length.out = tamano_muestral )
Y <- genera_y(X)

plot(Y  ~ X)
lines(cos(X) ~ X, col = 2, lwd = 2)

red_neuronal <- nnet(X, Y, size = 6, linout = TRUE, trace = FALSE)

YY <- predict(red_neuronal)

lines(YY ~ X, col = 4, lwd = 2)

plot(Y ~ X)

for (i in seq_len(iteraciones)){
  Y <- genera_y(X)
  red_neuronal <- nnet(X, Y, size = 6, linout = TRUE, trace = FALSE)
  YY <- predict(red_neuronal)
  lines(YY ~ X, col = 4, lwd = 2)
}

lines(cos(X) ~ X, col = 2, lwd = 2)

# Regresion lineal
iteraciones <- 500
tamano_muestral <- 200
beta_0 <- 1
beta_1 <- 2 

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

X <- seq(0, 3 * pi, length.out = tamano_muestral )
Y <- genera_y(X, beta_0, beta_1)

regresion_lineal <- lm(Y ~ X)

plot(X ~ Y)


lines(X ~ regresion_lineal$fitted.values, col = 4, lwd = 2)
YY <- beta_1*X + beta_0
lines(X ~ YY, col = 2, lwd = 2)

plot(Y ~ X)

for (i in seq_len(iteraciones)){
  Y <- genera_y(X, beta_0, beta_1)
  regresion_lineal <- lm(Y ~ X)
  lines(regresion_lineal$fitted.values ~ X, col = 4, lwd = 2)
  
}
YY <- beta_1*X + beta_0
lines(YY ~ X, col = 2, lwd = 2)

Aplicación con la regresión lineal:

Presenta resultados aparentemente insesgados y a medida en que aumentamos el tamaño de muestra e iteraciones, parece que el modelo está dentro de los resultados posibles de la nube de datos.

Código

# Regresion lineal
iteraciones <- 500
tamano_muestral <- 200
beta_0 <- 1
beta_1 <- 2 

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

X <- seq(0, 3 * pi, length.out = tamano_muestral )
Y <- genera_y(X, beta_0, beta_1)

regresion_lineal <- lm(Y ~ X)

plot(X ~ Y)


lines(X ~ regresion_lineal$fitted.values, col = 4, lwd = 2)
YY <- beta_1*X + beta_0
lines(X ~ YY, col = 2, lwd = 2)

plot(Y ~ X)

for (i in seq_len(iteraciones)){
  Y <- genera_y(X, beta_0, beta_1)
  regresion_lineal <- lm(Y ~ X)
  lines(regresion_lineal$fitted.values ~ X, col = 4, lwd = 2)
  
}
YY <- beta_1*X + beta_0
lines(YY ~ X, col = 2, lwd = 2) 


Gráficos

![](https://static.platzi.com/media/user_upload/image-5f30cf57-1165-4d13-8a1a-5a8230a50ebf.jpg) * Se comparan las predicciones de ambos modelos gráficamente. * La regresión lineal aparece como una línea roja discontinua. * La red neuronal aparece como una línea verde continua.

Yo hice así el de regresión lineal, no sé si está correcto

#Regresion lineal

genera_y <- function(x){
  cos(x) + rnorm(length(x), 0, 0.5)
}

X <- seq(0,3*pi, length.out = tamano_muestral)
Y <- genera_y(X)
plot(Y~X)
lines(cos(X)~X, col=2, lwd=2)

x_est <- cos(X) #Transformación
regr_cos <- lm(Y~x_est)
coeficientes <- regr_cos$coefficients
y_est <- coeficientes[1] + coeficientes[2]*cos(X)
lines(y_est~X)

plot(Y~X)

for(i in seq_len(iteraciones)){
  Y <- genera_y(X)
  x_est <- cos(X) #Transformación
  regr_cos <- lm(Y~x_est)
  coeficientes <- regr_cos$coefficients
  y_est <- coeficientes[1] + coeficientes[2]*cos(X)
  lines(y_est~X, col=4, lwd=2)
}
lines(cos(X)~X, col=2, lwd=2)