Este taller de R esta dirigido a estudiantes de la materia de Introducción a la Probabilidad y Estadística de la Escuela de Computación de la UCV. Se resolverán problemas de descripción de una muestra y la inferencia estadística a través de modelos lineales en el entorno de RStudio.
El software estadístico utilizado es el R, y trabajaremos sobre una muestra estadística específicamente creada para este taller.
Pueden descargar a través de los siguientes enlaces todos los recursos necesarios para la realización de este taller:
Uno de los instrumentos más utilizados por los pediatras para el monitoreo del crecimiento de los niños en sus primeros años de vida son los gráficos de percentiles de peso talla y diámetro craneal emitidos por la Organización Mundial de la Salud (OMS) como el de ejemplo anexado a este taller. Estos gráficos permiten a los doctores comparar el desarrollo de los niños al identificar entre que percentiles se encuentra un niño en particular dadas su medidas de talla, peso y circunferencia craneal, así como también, pueden saber si su peso está acorde con su talla. Estas gráficas se generan a partir del análisis de datos estadísticos muestrales recolectados en varios países del mundo.
R es un paquete estadístico de software libre, distribuido bajo licencia GPL. Más específicamente se trata de un lenguaje y un entorno de programación para el análisis estadístico. Este programa esta instalado en el la imagen docker que hemos preparado para la realización de este taller en los laboratorios docentes da la Facultad. Las versiones de otros sistemas operativos pueden descargase desde la pagina oficial r-project.org
Es recomendable definir el directorio de trabajo, que es donde se deben encontrar los archivos de entrada y donde se guardaran los archivos de salida. Seguidamente cargaremos en un marco de datos la muestra llamada “Muestra.txt”. Esta muestra esta compuesta por un listado de mediciones del peso, largo y circunferencia craneal de niños de ambos sexos entre 0 y tres años de edad (medidos en meses)
muestra <- read.csv("../../files/stats/taller-regresion/Muestra.txt")
Graficar la nube de datos que representa la relación del peso niños varones con respecto a su edad. Para esto crearemos sol listados, uno para contener las edades y el otro para los pesos.
y <- muestra$Pesos[muestra$Sexo==1]
x <- muestra$Edades[muestra$Sexo==1]
plot(x,y, pch=".", main="Muestra de pesos de niños entre 0 3 años")
Grafíque el histograma de los pesos de los niños varones de 10 meses de edad. Diga el tamaño de la muestra para esta población y determine su media, desviación estándar y rango muestrales.
lPeso <- muestra$Pesos[muestra$Sexo==1 & muestra$Edades==10]
l <- length(lPeso)
m <- mean(lPeso)
s <- sqrt(var(lPeso))
clases <- seq(min(lPeso), max(lPeso), length.out=15)
h <- hist(lPeso, prob=T,labels=F, breaks=clases, main="Histograma de Pesos de niños de 10 meses")
normal <- function(x) dnorm(x, m, s)
curve(normal, add=T)
text(h$mids,h$density+0.01,h$counts)
text(min(lPeso)+1,0.22,as.expression(substitute(sigma==des,list(des=s))))
text(min(lPeso)+1,0.21,as.expression(substitute(mu==prom,list(prom=m))))
text(min(lPeso)+1,0.20,as.expression(substitute(n==tam,list(tam=l))))
Repita luego esta operación para los niños varones de 25 meses, compare y comente.
Generé un archivo de salida con el listado de medias, desviaciones estándar y percentiles de 5%, 10%, 25%, 50%, 75%, 90% y 95% para cada una de las edades y sexo.
Nombres <- c("Sexo", "Edad", "mPeso", "sPeso", "p05Peso", "p10Peso", "p25Peso", "p50Peso", "p75Peso", "p90Peso", "p95Peso")
write.table(t(Nombres), file = "../../files/stats/taller-regresion/Salida.txt", append = TRUE, row.names = FALSE, col.names = FALSE, sep = ",")
for (sexo in 1:2) {
lEdades <- unique(muestra$Edades[muestra$Sexo==sexo])
for (edad in lEdades) {
lPesos <- muestra$Pesos[muestra$Sexo==sexo & muestra$Edades==edad]
mPeso <- mean(lPesos)
sPeso <- sqrt(var(lPesos))
p05Peso <- quantile(lPesos, 0.05)
p10Peso <- quantile(lPesos, 0.1)
p25Peso <- quantile(lPesos, 0.25)
p50Peso <- quantile(lPesos, 0.50)
p75Peso <- quantile(lPesos, 0.75)
p90Peso <- quantile(lPesos, 0.90)
p95Peso <- quantile(lPesos, 0.95)
Salidas <- c(sexo, edad, mPeso, sPeso,p05Peso,p10Peso, p25Peso, p50Peso, p75Peso, p90Peso, p95Peso)
write.table(t(Salidas), file = "../../files/stats/taller-regresion/Salida.txt", append = TRUE, row.names = FALSE, col.names = FALSE, sep = ",")
}
}
Cargue el archivo generado para crear modelo lineal que relacione en peso de los niños varones en función de las edades. Haremos esto con el percentil muestral 50.
muestra <- read.csv("../../files/stats/taller-regresion/Salida.txt")
lp50Peso <- muestra$p50Peso[muestra$Sexo==1]
lEdad <- muestra$Edad[muestra$Sexo==1]
Datos <- data.frame(lEdad, lp50Peso)
plot(Datos$lEdad, Datos$lp50Peso, main="Gráfico del Percentil muestral 50 de niños entre 0-3 años")
mlAjuste <- lm(lp50Peso~lEdad, data=Datos)
abline(coef(mlAjuste))
r <- cor(Datos$lEdad, Datos$lp50Peso)
text(min(Datos$lEdad)+4,max(Datos$lp50Peso)-3,as.expression(substitute(R==correl,list(correl=r))))
Comente sus observaciones. Repita la operación sobre una espacio transformado mediante el cálculo de los logaritmos, es decir manejando las coordenadas (Log(x),Log(y))
e <- exp(1)
loglEdad <- log(lEdad[-1],e) #Suprimiendo el primer elemento para evitar el log(0)
loglp50Peso <- log(lp50Peso[-1],e) #Suprimiendo el primer elemento para evitar el log(0)
logDatos <- data.frame(loglEdad, loglp50Peso)
mlAjuste <- lm(loglp50Peso~loglEdad, data=logDatos)
plot(loglEdad, loglp50Peso, main="Gráfico del Percentil muestral 50 de niños entre 0-3 años")
abline(coef(mlAjuste))
r <- cor(loglEdad, loglp50Peso)
text(0.5,2.5,as.expression(substitute(R==correl,list(correl=r))))
Comente sus observaciones. Ahora grafiquemos estos resultados en el espacio no transformado (x,y) y calculemos el error promedio obtenido con este modelo.
param <- coef(mlAjuste)
x <- lEdad
y <- exp(log(x)*param[2]+param[1])
plot(lEdad, lp50Peso, main="Gráfico del Percentil muestral 50 para niños varones")
lines(lEdad,y)
Consideremos un caso particular de un niño con peso y Edad dados (8 meses, 10.2 Kg). Escriba un función que reciba estos parámetros y determine si dicho niño se encuentra por encima del percentil 50 o no. Grafíque el resultado.
SobrePercentil <- function(edad, peso) {
peso >= exp(log(edad)*param[2]+param[1])
}
Medidas <- c(8, 10.2)
plot(lEdad,exp(log(x)*param[2]+param[1]),type="l")
points(Medidas[1], Medidas[2], col="red")
SobrePercentil(8, 10.2)
loglEdad
TRUE
If you see mistakes or want to suggest changes, please create an issue on the source repository.
For attribution, please cite this work as
Sosa (2011, July 24). Blog de José R Sosa: Taller de Estadística Descriptiva y Regresión Lineal con R. Retrieved from https://josersosa.github.io/personalweb/posts/2021-06-29-taller-de-estadistica-descriptiva-y-regresion-lineal-con-r/
BibTeX citation
@misc{sosa2011taller, author = {Sosa, José R}, title = {Blog de José R Sosa: Taller de Estadística Descriptiva y Regresión Lineal con R}, url = {https://josersosa.github.io/personalweb/posts/2021-06-29-taller-de-estadistica-descriptiva-y-regresion-lineal-con-r/}, year = {2011} }