################################# ## DISTRIBUCIONES DE VARIABLES ## ################################# ## Luis M. Carrascal ## https://lmcarrascal.eu ## revisión 08/05/2021 ## corrido bajo R-3.6.3 ## para ver qué tenemos y borrar datos rm(list=ls()) ## para limpiar la consola cat("\014") ## para limpiar todos los plots en el panel gráfico dev.off() ## para generar una variable al azar según una distribución CONTINUA determinada var.uniforme <- runif(n=1000, min=0.3, max=4.7) ## distribución uniforme var.normal <- rnorm(n=1000, mean=2.5, sd=1.26) ## distribución gausiana var.gamma <- rgamma(n=1000, shape=2.5, scale=0.8) ## distribución gamma var.poisson <- rpois(n=1000, lambda=2.5) ## distribución Poisson var.negbin <- rnbinom(n=1000, size=1, mu=2.5) ## distribución Binomial Negativa ## para generar una variable al azar según una distribución NOMINAL determinada var.binomial2 <- rbinom(n=1000, prob=0.5, size=1) ## distrib. binomial con 0-1 var.binomial3 <- rbinom(n=1000, prob=0.333, size=2) ## distrib. binomial con 0-2 ## valores medios y desviacion tipica (sd) que.variable <- var.uniforme mean(que.variable) ## media sd(que.variable) ## sd sd(que.variable)^2 ## varianza (sd^2) ## formas de las distribuciones de datos hist(que.variable, density=5, freq=FALSE, main="distribución UNIFORME", xlim=c(0,6), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(que.variable), sd=sd(que.variable)), col="red", lwd=2, add=TRUE, yaxt="n") qqnorm(que.variable) qqline(que.variable, col="red", lwd=2) ## identidad de las variables class(var.normal) class(var.uniforme) class(var.poisson) class(var.gamma) class(var.binomial2) class(var.binomial3) ## hacemos nuestra matriz de datos (DATAFRAME) ## deben tener la misma longitud TODOS los vectores datos <- data.frame(var.uniforme, var.normal, var.poisson, var.gamma, var.negbin, var.binomial2, var.binomial3) ## repasemos algunas cosas de los dataframes names(datos) str(datos) dim(datos) ## ordeno mi matriz de datos por las filas de una variable, creando otra nueva matriz ## primero añado un vector al dataframe datos datos$orden.azar <- runif(n=dim(datos)[1], min=0, max=1) ## ordenamos el dataframe por ese vector nuevo, creando otra matriz datos.orden_azar <- datos[order(datos$orden.azar),] ## cambio los nombres de las variables names(datos.orden_azar) names(datos.orden_azar) <- c("uniforme", "normal", "poisson", "gamma", "binomial_negativa", "binomial_01", "trinomial_012", "azar") names(datos.orden_azar) ## renombramos los dataframes datos.originales <- datos datos <- datos.orden_azar ## elimino una variable del dataframe names(datos) datos$azar <- NULL names(datos) ## para seleccionar-extraer una parte de mis casos-observaciones y variables datos2 <- datos[c(1:15, 22:30),] datos3 <- datos[,c(1:6)] ## más complejo: igual; mayor o igual O (|, AltGr+1) menor o igual; que cumplan las dos condiciones unidas por & datos4 <- subset(datos, binomial_01 == 0) datos5 <- subset(datos, normal >= 3 | normal <= 1.5) datos6 <- subset(datos, normal > 2 & poisson <= 2) ## vemos qué tenemos en el entorno de trabajo ls() ## borramos objetos que no queremos ya rm(datos2, datos3, datos4, datos5, datos6) ## gráficas y comparación de distribuciones par(mfrow=c(3,2)) ## fija los paneles según 3 filas y 2 columnas hist(var.uniforme, density=5, freq=FALSE, main="distribución UNIFORME", xlim=c(0,10), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.uniforme), sd=sd(var.uniforme)), col="red", lwd=2, add=TRUE, yaxt="n") hist(var.normal, density=5, freq=FALSE, main="distribución NORMAL", xlim=c(0,10), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.normal), sd=sd(var.normal)), col="red", lwd=2, add=TRUE, yaxt="n") hist(var.poisson, density=5, freq=FALSE, main="distribución POISSON", xlim=c(0,10), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.poisson), sd=sd(var.poisson)), col="red", lwd=2, add=TRUE, yaxt="n") hist(var.gamma, density=5, freq=FALSE, main="distribución GAMMA", xlim=c(0,10), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.gamma), sd=sd(var.gamma)), col="red", lwd=2, add=TRUE, yaxt="n") hist(var.negbin, density=5, freq=FALSE, main="distribución BINOMIAL NEGATIVA", xlim=c(0,10), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.negbin), sd=sd(var.negbin)), col="red", lwd=2, add=TRUE, yaxt="n") hist(var.binomial2, density=5, freq=FALSE, main="distribución BINOMIAL 0-1", xlim=c(0,1), ylim=c(0,0.8)) curve(dnorm(x, mean=mean(var.binomial2), sd=sd(var.binomial2)), col="red", lwd=2, add=TRUE, yaxt="n") par(mfcol=c(1,1)) ## borramos el contenido de la ventana de gráficos dev.off() ## nuestro primer BUCLE ... para calcular pi para_pi <- 0 for (i in 1:10000000) { para_pi <- para_pi + 1/(i^2) } mi_pi <- (6*para_pi)^0.5 mi_pi pi ## vamos a practicar viendo la variabilidad "normal" de una distribución Normal ## con un BUCLE para repetir el proceso con un N deseado mi_N <- 30 mi_media <- 2.5 mi_sd <- 1 for (i in 1:10) { var.simul.mia <- rnorm(n=mi_N, mean=mi_media, sd=mi_sd) par(mfcol=c(1,1)) par(mfcol=c(1,2)) hist(var.simul.mia, density=5, freq=FALSE, main="distribución simulada", ylim=c(0,0.8)) curve(dnorm(x, mean=mi_media, sd=mi_sd), col="red", lwd=2, add=TRUE, yaxt="n") qqnorm(var.simul.mia) qqline(var.simul.mia, col="red", lwd=2) par(mfcol=c(1,1)) }