12/07/21
Abstract
La teoría mencionada puede revisarse en el capítulo 1 de mis notas de clase que aparecen en el siguiente documento: 1.1. Estadística básica. En Rpubs:: toc se pueden ver otros documentos de posible interés.
Primero, debemos instalar y descargar las librerías que vamos a utilizar.
library(dplyr)
Recuerde que el data frame (básicamente una tabla) es en realidad solo un tipo específico de otra estructura de datos (la lista). Actualmente, es el formato de entrada de nuestros datos más frecuente para los análisis estadísticos (dentro de R, pero también para otros programas estadísticos y, por supuesto, para softwares de hojas de cálculo). Por esta razón, primero, es importante importar/cargar los datos antes de iniciar nuestro análisis. Esto ya se explicó en el documento Rpubs :: Importar datasets.
En los documentos Rpubs :: Examinar data frames y Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames de las variables que contenidads en él. En Rpubs :: Recodificar variables describimos como recodificar las variables. Para más detalles relacionados con los data frames, se puede consultar el documento Rpubs :: data frames (generalidades).
Vamos a utilizar un conjunto de datos, que fueron recogidos aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 400 observaciones y 46 variables, las cuales se describen en este enlace (click aquí). En este documento, se importará la base de datos desde una dirección web (dos opciones):
Opción A (web, desde github): Para esta opción, se necesita cargar la librería “repmis”:
library(repmis)
source_data("https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false")
datosCompleto <- Estudiantes
Opción B (web, desde Google Drive):
url.dat<- "http://bit.ly/Database-Estudiantes"
datosCompleto <- read.delim(url.dat)
Recuérdense las otras opciones, si tienen las bases de datos descargadas en su sesión de trabajo (ya sea en extensiones en Rdata, en excel o en otros formatos). Para más detalles, véase el documento RPubs :: Importar datasets básico. A manera de ejemplo:
Opción C (local, con archivo en Rdata):
load(file="Estudiantes.Rdata")
datosCompleto <- Estudiantes
Opción D (local, con archivo en excel):
datosCompleto <- read.delim('clipboard')
Definimos las variables que se utilizarán en este documento:
Edad <- as.numeric(datosCompleto$Edad)
La función hist crea un histograma con barras horizontales o verticales. Al dar click aquí, se pueden encontrar diferentes opciones gráficas. Por ejemplo:
Con border = “blue” y col = “orange”, puede cambiar los colores de las barras y de los bordes.
Cuando hay múltiples diagramas, puede utilizar la opción col=c(“darkblue”,“red”, “yellow”, “green”, “orange”, “violet”).
Con las = c(0, 1,2,3), se seleccionan las orientaciones de los textos: las=0 (paralelo a los ejes, por defecto), las=1 (horizontal), las=2 (perpendicular) y las=3 (vertical).
La opción horiz=TRUE crea un diagrama horizontal.
Los títulos de las etiquetas se pueden escribir así: xlab = expression(‘X’[2]), main = ’’, ylab="“, names.arg=c(”Primer nombre“,”Segundo nombre").
Los límites de los ejes se pueden modificar, por ejemplo, así: xlim = c(0, 1), ylim = c(0, 100).
Con la opción breaks se da un valor con el cual se indica el número aproximado de intervalos de clases o un vector cuyos elementos indican los puntos límites entre las clases o intervalos.
Con las opciones prob=TRUE, freq= F, freq=FALSE o freq=cumsum(F), el gráfico se construye con frecuencias relativas.
La función hist() retorna una lista con 6 valores, como se indica a continuación:
breaks muestra los puntos donde ocurren los puntos de corte de los intervalos.
counts son las correspondientes frecuencia absolutas.
density entrega las frecuencias relativas.
mids son las marcas de clase (los puntos medios de los intervalos).
xname es el nombre la variable.
equidist es un valor lógico que indica si los breaks están o no igualmente espaciados.
Ejemplo 1 (valores de retorno)
En el siguiente ejemplo se muestran los valores de retorno de hist cuando se tiene en cuenta la variable Edad.
h <- hist(Edad)
h$breaks #1) Sale: 12 14 16 18 20 22 24 26 28 30
h$counts #2) Sale: 1 1 145 135 114 0 1 1 2
h$density #3) Sale: 0.00125 0.00125 0.18125 0.16875 0.14250 0.0 0.00125 0.00125 0.00250
h$mids #4) Sale: 13 15 17 19 21 23 25 27 29
h$xname #5) Sale: "Edad"
h$equidist #6) Sale: TRUE
Una forma de construir polígonos de frecuencias absolutas y consiste en seguir los siguientes pasos:
h1 <- hist(Variable) #A) Histograma de frecuencias absolutas
h2 <- hist(Variable, freq=FALSE) #A) Histograma de frecuencias relativas
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$counts,0), type="l") #B) Frecuencias absolutas
lines(c(min(h2$breaks), h2$mids, max(h2$breaks)), c(0,h2$density,0), type="l") #C) Frecuencias relativas
En los siguientes ejemplos se han generado varios polígonos con la función lines.
Ejemplo 2 (con lines, frecuencias asolutas y relativas)
Este ejemplo se muestra la primera forma de construir polígonos. El A es de frecuencias absolutas y el B, de frecuencias relativas.
h <- hist(Edad, col="darkkhaki", ylim=c(0,200), main="Absolutas") #A) Absolutas
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$counts,0), type="l")
h <- hist(Edad, col="red", ylim=c(0,0.25), freq = FALSE, main="Relativas") #B) Relativas
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$density,0), type="l")
Ejemplo 3 (con lines, solo frecuencias relativas)
Se muestran cuatro polígonos de frecuencias relativas. Observa que hay cuatro maneras de generarlos: freq=c(FALSE, F, cusum(F) y prob=TRUE). Todas estas opciones nos entregan los mismos resultados.
h <- hist(Edad, col="darkorange", freq = FALSE, ylim=c(0,0.25), main="Con freq=FALSE") #A)
h <- hist(Edad, col="darkslategray2", freq = F, ylim=c(0,0.25), main="Con freq=F") #B)
h <- hist(Edad, col="lightpink", prob=TRUE, ylim=c(0,0.25), main="Con prob=TRUE") #C)
h <- hist(Edad, col="lawngreen", freq=cumsum(F), ylim=c(0,0.25), main="Con freq=cususm(F)") #D)
lines(c(min(h$breaks),h$mids,max(h$breaks)),c(0,h$density,0),type="l")
Ejemplo 4 (lines, frecuencias absolutas, las)
Este ejemplo muestra ejemplo de polígonos con rotación de los ejes.
h <- hist(Edad, col="darkkhaki", ylim=c(0,200), las=2, main="")
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$counts,0), type="l")
Ejemplo 5 (lines, frecuencias relativas)
Se muestran cuatro polígonos de frecuencias relativas. Observa que hay cuatro maneras de generarlos: freq=c(FALSE, F, cusum(F) y prob=TRUE). Todas estas opciones nos entregan los mismos resultados.
h0 <- hist(Edad, col="darkorange", freq = FALSE, ylim=c(0,0.25), main="A) Con freq=FALSE") #A)
lines(c(min(h0$breaks), h0$mids, max(h1$breaks)), c(0,h0$density,0), type="l")
h1 <- hist(Edad, col="darkslategray2", freq = F, ylim=c(0,0.25), main="B) Con freq=F") #B)
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$density,0), type="l")
h2 <- hist(Edad, col="lightpink", prob=TRUE, ylim=c(0,0.25), main="C) Con prob=TRUE") #C)
lines(c(min(h2$breaks), h2$mids, max(h2$breaks)), c(0,h2$density,0), type="l")
h3 <- hist(Edad, col="lawngreen", freq=cumsum(F), ylim=c(0,0.25), main="D) Con freq=cususm(F)") #D)
lines(c(min(h3$breaks), h3$mids, max(h3$breaks)), c(0,h3$density,0), type="l")
En este caso se utiliza la opción breaks. Presentaremos dos polígonos. El primero es uno con 3 intervalos de clase y con la misma amplitud y el segundo es otro con intervalos de clase que tienen diferentes amplitudes.
Ejemplo 6 (con amplitudes iguales y diferentes)
El siguiente diagrama ilustra la situación mencionada anteriormente.
h0 <- hist(Edad, breaks = 3, ylim=c(0,300), main="Amplitudes iguales", col="darkblue")
lines(c(min(h0$breaks), h0$mids, max(h1$breaks)), c(0,h0$counts,0), type="l")
h1 <- hist(Edad, breaks=c(1,18,23,45), ylim=c(0,300), main="Amplitudes diferentes", col="orange")
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$counts,0), type="l")
Para ello, se pueden utilizar la función text y modificando la opción adj=c(x,y). Se explicará esto con dos ejemplos.
Ejemplo 7 (utilizando la función text)
En el siguiente ejemplo usamos los valores de retorno para ubicar los conteos en la parte superior de cada celda, aplicando la función text().
h <- hist(Edad, xlim=c(10,35), ylim=c(0,200), col="darkseagreen2")
text(h$mids, h$counts, labels=h$counts, adj=c(0.5, -0.5))
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$counts,0), type="l")
La opción adj permite la posición del texto con respecto a (x,y), donde tanto x como y toman valores enteros. Los valores de 0, 0.5 y 1 especifican que (x,y) deben alinearse con el lado izquierdo/inferior, medio y derecho/superior del texto, respectivamente. El valor predeterminado es para el texto centrado, es decir, adj = c(0.5, NA).
Ejemplo 8 (utilizando la función text y modificando adj=c(x,y))
Observe lo que sucede cuando se cambia los valores en la opción adj=c(x,y).
h <- hist(Edad, xlim=c(10,35), ylim=c(0,200), col="red")
text(h$mids, h$counts, labels=h$counts, adj=c(-1.5, -0.5))
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$counts,0), type="l")
h <- hist(Edad, xlim=c(10,35), ylim=c(0,200), col="dodgerblue")
text(h$mids, h$counts, labels=h$counts, adj=c(-0.5, 0.5))
lines(c(min(h$breaks), h$mids, max(h$breaks)), c(0,h$counts,0), type="l")
R permite unir varios polígonos en una sola gráfica. Para ellos se pueden utilizar las funciones par() o layout().
Esta función tiene 72 parámetros y son:
par(xlog, ylog, adj, ann, ask, bg, bty, cex, cex.axis, cex.lab,
cex.main, cex.sub, cin, col, col.axis, col.lab, col.main,
col.sub, cra, crt, csi, cxy, din, err, family, fg, fig, fin,
font, font.axis, font.lab, font.main, font.sub, lab, las,
lend, lheight, ljoin, lmitre, lty, lwd, mai, mar, mex, mfcol,
mfg, mfrow, mgp, mkh, new, oma, omd, omi, page, pch, pin,
plt, ps, pty, smo, srt, tck, tcl, usr, xaxp, xaxs, xaxt, xpd,
yaxp, yaxs, yaxt, ylbias)
Para conocer los valores que tienen por defecto cada uno de estos parámetros se puede utilizar el siguiente código:
par()
Explicaremos, brevemente, solo dos de ellos:
La opción mfrow=c(i,j) se incluye con el fin de crear una matriz de gráficos de ixj que se completan por fila.
La opción mfcol=c(i,j) que completa la matriz por columnas.
Más detalles al respecto, se pueden encontrar en el documento Función par.
Ejemplo 9 (con par)
Por ejemplo, dos figuras en la primera fila y dos, en la segunda fila es:
par(mfrow=c(2,2), oma=c(0, 0, 4, 0))
h0 <- hist(Edad, col="darkkhaki", freq = FALSE, ylim=c(0,0.25), main="A) Con freq=FALSE") #A)
lines(c(min(h0$breaks), h0$mids, max(h1$breaks)), c(0,h0$density,0), type="l")
h1 <- hist(Edad, col="deepskyblue", freq = F, ylim=c(0,0.25), main="B) Con freq=F") #B)
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$density,0), type="l")
h2 <- hist(Edad, col="darkorange", prob=TRUE, ylim=c(0,0.25), main="C) Con prob=TRUE") #C)
lines(c(min(h2$breaks), h2$mids, max(h2$breaks)), c(0,h2$density,0), type="l")
h3 <- hist(Edad, col="darkslategray2", freq=cumsum(F), ylim=c(0,0.25), main="D) Con freq=cususm(F)") #D)
lines(c(min(h3$breaks), h3$mids, max(h3$breaks)), c(0,h3$density,0), type="l")
# Añadir el título a la gráfica
mtext(side=3, line=0, cex=1.2, outer=T,"Unión de polígonos con par")
También se puede utilizar la función layout() para unir gráficas. Esta función tiene la forma layout(A,i,j), siendo A=c(1,2,3,…,N) un objeto matricial que especifica la ubicación de todas las N figuras que se van a unir.
Ejemplo 10 (con layout: gráfica sin título)
Por ejemplo, \(i=2\) figuras en la primera fila y \(j=2\), en la segunda fila es:
H <- layout(matrix(c(1,2,3,4), 2, 2, byrow = TRUE))
#layout.show(H)
h0 <- hist(Edad, col="darkkhaki", freq = FALSE, ylim=c(0,0.25), main="A) Con freq=FALSE") #A)
lines(c(min(h0$breaks), h0$mids, max(h1$breaks)), c(0,h0$density,0), type="l")
h1 <- hist(Edad, col="deepskyblue", freq = F, ylim=c(0,0.25), main="B) Con freq=F") #B)
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$density,0), type="l")
h2 <- hist(Edad, col="darkorange", prob=TRUE, ylim=c(0,0.25), main="C) Con prob=TRUE") #C)
lines(c(min(h2$breaks), h2$mids, max(h2$breaks)), c(0,h2$density,0), type="l")
h3 <- hist(Edad, col="darkslategray2", freq=cumsum(F), ylim=c(0,0.25), main="D) Con freq=cususm(F)") #D)
lines(c(min(h3$breaks), h3$mids, max(h3$breaks)), c(0,h3$density,0), type="l")
Con layout.show(H) se obtiene una vista previa del diseño resultante.
Ejemplo 11 (con layout: gráfica con título)
def.par <- par(no.readonly = TRUE)
par(oma = c(0, 0, 3, 0))
H<- layout(matrix(c(1,2,3,4), 2, 2, byrow = TRUE))
#layout.show(H)
h0 <- hist(Edad, col="darkkhaki", freq = FALSE, ylim=c(0,0.25), main="A) Con freq=FALSE") #A)
lines(c(min(h0$breaks), h0$mids, max(h1$breaks)), c(0,h0$density,0), type="l")
h1 <- hist(Edad, col="deepskyblue", freq = F, ylim=c(0,0.25), main="B) Con freq=F") #B)
lines(c(min(h1$breaks), h1$mids, max(h1$breaks)), c(0,h1$density,0), type="l")
h2 <- hist(Edad, col="darkorange", prob=TRUE, ylim=c(0,0.25), main="C) Con prob=TRUE") #C)
lines(c(min(h2$breaks), h2$mids, max(h2$breaks)), c(0,h2$density,0), type="l")
h3 <- hist(Edad, col="darkslategray2", freq=cumsum(F), ylim=c(0,0.25), main="D) Con freq=cususm(F)") #D)
lines(c(min(h3$breaks), h3$mids, max(h3$breaks)), c(0,h3$density,0), type="l")
mtext(side=3, line=0, cex=1.2, outer=T,"Unión de polígonos con layout()")
par(def.par)
Otra forma de construir polígonos con frecuencias absolutas es con ayuda de la función simple.freqpoly del paquete UsingR. Para ello, no es necesario saber cómo agregar líneas a un histograma y/o extraer valores. En general, esta función actua sobre un vector de datos. Sus argumentos son muy parecidos a los utilizado con hist. Véase el documento RPubs :: Polígonos y ojivas con la librería UsingR
Este paquete contiene funciones que nos permiten complementar la función hist, facilitando la recopilación de estadísticas y tablas de frecuencia, así como la construcción de diferentes gráficos como el histograma, polígono de frecuencia u ojiva, entre otros. Esto se desarrollará en mi documento RPubs :: Polígonos con la librería agricolae.
Con la librería ggplot2 es posible obtener poligonos a partir de un proceso de acumulación de capas o layers. Tiene un cierto nivel de complejidad pero se obtienen resultados muy profesionales. Estos procedimientos no se explicarán en este documento, pero en RPubs :: Polígonos con ggplot2 (general), RPubs :: Polígonos con ggplot2 (univariado) y RPubs :: Polígonos con ggplot2 (por grupos) se pueden encontrar documentos relacionados.
Crear un nuevo documento R Markdown, realizando las siguientes actividades:
Crear polígonos y “jugar” con las opciones gráficas.
Crear polígonos especificando el número de intervalos de clase (opción breaks).
Crear polígonos con intervalos de clase que tienen diferentes amplitudes.
Calcular los valores de retorno de un histograma y utilizarlos para crear un polígono con etiquetas generadas con la función text.
Cambiar los valores de la opción adj=c(x,y) y explique lo que sucede. Utilizar combinación de valores positivos y negativos tanto para \(X\) como para \(Y\).
Unir algunos gráficos con la función par.
Unir algunos gráficos con la función layout.
En todos los casos, interprete los resultados y polígonos resultantes.
LLinás, H., Rojas, C. (2005); Estadística descriptiva y distribuciones de probabilidad. Barranquilla: Editorial Universidad del Norte.
Consultar el documento RPubs :: Enlace y materiales de ayuda.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.