Simulación de Datos en R: Distribuciones y Modelos Lineales
Resumen
¿Cómo simular datos en R?
Simular datos es esencial para estadísticas, machine learning y análisis avanzados. Con R, puedes hacerlo eficientemente, gracias a su robusta base de funciones. Aprenderemos a simular datos de distribuciones normales, uniformes y modelos (lineales y no lineales), utilizando solo las funciones básicas de R.
¿Cómo generar datos con distribución normal y uniforme?
Simular datos a partir de distribuciones conocidas nos permite modelar situaciones reales y comprender mejor el comportamiento de diferentes variables.
Distribución normal
Para simular datos de una distribución normal estándar, R ofrece la función rnorm. A continuación, un ejemplo que genera 100 valores de una distribución normal con media cero y desviación estándar uno:
valores_normales <- rnorm(100)
Para observar la distribución, puedes usar una gráfica básica del paquete base de R:
plot(density(valores_normales), main ="Densidad de la distribución normal")
Si deseas modificar los parámetros, puedes especificar una media diferente y una desviación estándar distinta:
valores_normales_modificados <- rnorm(100, mean =5, sd =3)
Distribución uniforme
Simular datos de una distribución uniforme es igualmente sencillo con la función runif. Por ejemplo, para generar 100 observaciones entre cero y uno:
valores_uniformes <- runif(100)plot(density(valores_uniformes), main ="Densidad de la distribución uniforme")
Para establecer un rango diferente, simplemente ajusta los parámetros de mínimo y máximo:
valores_uniformes_modificados <- runif(100, min =3, max =8)
¿Cómo crear y visualizar tablas de datos simulados?
Para simular datos más complejos en un contexto específico, consideremos un ejemplo con diferentes grupos (escuela, preparatoria, universidad) y sus respectivas edades:
# Simulación de datos para diferentes gruposescuela <- data.frame(edad = rnorm(50, mean =10, sd =1.2), lugar ="escuela")prepa <- data.frame(edad = rnorm(45, mean =15, sd =1.9), lugar ="preparatoria")universidad <- data.frame(edad = rnorm(80, mean =21, sd =2.5), lugar ="universidad")# Combinar tablas en una solaedad_lugar <- rbind(escuela, prepa, universidad)# Visualización con boxplotboxplot(edad_lugar$edad ~ edad_lugar$lugar, main ="Distribución de edades por lugar")
¿Cómo simular modelos lineales y no lineales?
Crear modelos simulados permite analizar cómo varían las variables y predecir resultados potenciales.
Modelo lineal
Un ejemplo de modelo lineal puede estructurarse como sigue:
x <- seq(0,3*pi, length.out =100)z <--0.3*x +1y <- z + rnorm(100, mean =0, sd =0.5)datos_lineal <- data.frame(x, y)plot(y ~ x, data = datos_lineal, main ="Modelo lineal")lines(z ~ x, data = datos_lineal, col =2, lwd =2)
Modelo no lineal
La práctica para un modelo no lineal es similar, excepto que la relación entre variables cambia:
z_nl <- cos(x)y_nl <- z_nl + rnorm(100, mean =0, sd =0.5)datos_nolineal <- data.frame(x, y_nl)plot(y_nl ~ x, data = datos_nolineal, main ="Modelo no lineal")lines(z_nl ~ x, data = datos_nolineal, col =2, lwd =2)
Esto solo es el principio del potencial de simulación con R, y te permite analizar diversas situaciones hipotéticas de manera ordenada y eficiente. ¡Sigue explorando y perfeccionando tus habilidades en R! En la próxima clase, profundizaremos más en cómo estimar parámetros efectivos usando R. ¡Nos vemos allí!
Yo que vengo de Python uso =, se me hace mas comodo
El script de la clase
# Vamos a jugar con datos simulados.Escojan sus
# Distribucion normal estandar
y <-rnorm(100)plot(density(y))# Distribucion normal de media cinco y desviacion estandar 3y <-rnorm(100,5,3)plot(density(y))# Distribucion uniforme 0,1y <-runif(100)plot(density(y))# Distribucion uniforme a=3, b=8y <-runif(100,3,8)plot(density(y))# Ejemplo de la edad y el lugar
data.frame(Edad=rnorm(50,10,1.2),Lugar="Escuela")-> escuela
data.frame(Edad=rnorm(45,15,1.9),Lugar="Preparatoria")-> prepa
data.frame(Edad=rnorm(80,21,2.5),Lugar="Universidad")-> universidad
rbind(escuela, prepa, universidad)-> edad_lugar
boxplot(Edad~Lugar, data = edad_lugar)# Modelo lineal
X<-seq(0,3*pi, length.out=100)Y<--0.3*X+1+rnorm(100,0,0.5)Z<--0.3*X+1data.frame(X,Y,Z)-> datos_lineal
plot(Y~X, data = datos_lineal )lines(Z~X, data = datos_lineal, col =2, lwd =2)# Modelo no lineal
X<-seq(0,3*pi, length.out=100)Y<-cos(x)+rnorm(100,0,0.5)Z<-cos(x)data.frame(X,Y,Z)-> datos_no_lineal
plot(Y~X, data = datos_no_lineal )lines(Z~X, data = datos_no_lineal, col =2, lwd =2)```
# Distribución normal estandar
Y<-rnorm(100)plot(density(Y))# Distribucion normal de media cino y desviacion 3Y<-rnorm(100,5,3)plot(density(Y))#Distribucion uniforme 0,1Y<-runif(100)plot(density(Y))#Distribucion uniforme 3 a 8Y<-runif(100,3,8)plot(density(Y))# Ejemplo de la edad y el lugar
data.frame(Edad=rnorm(50,10,1.2),Lugar='Escuela')-> escuela
data.frame(Edad=rnorm(45,15,1.9),Lugar='Preparatoria')-> prepa
data.frame(Edad=rnorm(83,21,2.5),Lugar='Universidad')-> universidad
rbind(escuela, prepa, universidad)-> edad_lugar
boxplot(Edad~Lugar, edad_lugar)# ModeloLinealX<-seq(0,3* pi, length.out=100)Y<--0.3*X+1+rnorm(100,0,0.5)Z<--0.3*X+1rbind(X,Y,Z)-> datos_lineal
plot(Y~X, datos_lineal)lines(Z~X, datos_lineal, col =2, lwd =2)# ModeloNoLinealX<-seq(0,3* pi, length.out=100)Y<-cos(X)+rnorm(100,0,0.5)Z<-cos(X)rbind(X,Y,Z)-> datos_Nolineal
plot(Y~X, datos_Nolineal)lines(Z~X, datos_Nolineal, col =2, lwd =2)
Para los que quieran tener la interfaz como la del profesor, la pueden editar haciendo click en Tools y luego en Global options. Les dejo el enlace para que descarguen Temas de RStudio .
Para poner títulos en el Source ( # Explorando datos simulados -----------------------), solo tienen que presionar CRTL + SHIFT + R, les saldrá una ventana, ingresan el titulo que deseen y quedará tal como en el ejemplo.
En la parte final del video el profesor no cambio las variables de datos_lineal pero de igual manera esta bien la grafica, ya que antes de cambiarla, el ejecuto esa linea y los datos de los dos dataframe son los mismo, pero para ejecutarlo todo seguido, debes cambiar el nombre.
El código que está en "archivos y enlaces" ya tiene eso solucionado. lo descargué solo para mirar eso xD
La exploración de datos simulados es un paso esencial en la ciencia de datos, ya que permite entender mejor el comportamiento de las variables y evaluar modelos sin depender de conjuntos de datos reales, lo que es especialmente útil cuando se están aprendiendo conceptos o se prueban enfoques experimentales.
En caso de querer simular una No normalidad de tendencia logaritmica.
x = seq(0, 300, length = 600)
y = log(x) + 1 + rnorm(600, 0 , 0.1)
z = log(x) + 1
plot(y ~ x)
lines(z ~ x, col = 10 , lwd = 2)
Codigo con el paquete ggplot2:
ggplot() + geom_boxplot(data=edad_lugar,aes(x=Lugar,y=Edad , fill = Lugar), alpha = 0.4) + labs(x="Lugares de procedencia", y="Edad de lops estudiantes",title = " Grafica de cajas según edad") + theme( panel.background = element_blank())
Es algo muy simple pero para poner la tilde ~ en MacOs usen option + Ñ,
Si queremos las mismas graficas , debemos usar un valor semilla, no ? set.seed(123)
Sí, justo así se puede controlar la parte aleatoria