Introducción.

En esta práctica vamos a trabajar con la tabla de datos robles que ya conoces de la primera práctica.

Objetivos de la práctica:

  • Aprender a seleccionar subconjuntos de datos.
    • En un vector, seleccionar elementos
      • Por su posición
      • De acuerdo a una condición
    • En un data.frame (tabla), seleccionar filas y columnas
      • Por posición
      • De acuerdo a condición
    • Con boxplots:
      • Localizar valores atípicos
      • Si se miden dos variables (cualitativa y cuantitativa) para cada individuo, representar un boxplot por cada nivel de la variable cualitativa.
  • Limpieza de datos: detectar y gestionar valores ausentes (filas incompletas).
  • Reforzar lo aprendido sobre exploración de datos practicando con subconjuntos de la muestra.

Descarga y lectura de datos.

Para ello:

  • Selecciona la carpeta de trabajo adecuada para esta sesión con R. Usa el menú Session-> Set Working Directory.
    Indicación: Si tienes dudas de cómo hacer esto mira la Sección 3, pág. 12, del Tutorial02.
  • Explora el fichero con un editor de texto como el Bloc de Notas.
  • Lee los catos con el comando read.table y guárdalo en un data.frame (una tabla) con el nombre robles. Asegúrate de usar correctamente las opciones header, dec y sep al leer el fichero.
  • Comprueba que la lectura ha sido correcta.
robles = read.table(file = "p2-robles.csv", header = TRUE, sep = ";", dec = ".")

Ejercicio 1

  • Calcula la media y la cuasidesviación típica muestral de la variable Nitrogeno. Usaremos las funcioens mean y sd
mean(robles$Nitrogeno)
## [1] 3.293737
sd(robles$Nitrogeno)
## [1] 0.6415097
  • Repite el cálculo para los primeros 14 individuos de la tabla. Recuerda que 1:10 genera la sucesiçon 1, 2, 3,…, 10, y que los corchetes [] sirven para referirse a los elementos de un vector/tabla
mean(robles$Nitrogeno[1:14])
## [1] 3.506857
sd(robles$Nitrogeno[1:14])
## [1] 0.6564765
  • ¿Cuántas observaciones corresponden a robles con una concentración de Potasio mayor o igual que 2? Puedes recuperar los valores del Potasio de los robles que tienen más de 2 de Potasio
robles$Potasio[robles$Potasio >= 2]

y, a continuación, calcular la longitud de dicho vector

length(robles$Potasio[robles$Potasio >= 2])
## [1] 15

Otra alternativa es comparar cada elemento del vector robles$Potasio con 2

robles$Potasio >= 2
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
## [34]  TRUE FALSE  TRUE FALSE  TRUE

para obtener TRUEs y FALSEs según se cumpla o no esa condición. Recuerda que TRUE vale 1 y FALSE cero, con lo que sumas todos esos unos y ceros obtienes la cantidad deseada

sum(robles$Potasio >= 2)
## [1] 15
  • Ahora calcula la media de la variable Nitrogeno para aquellas observaciones en las que Potasio es mayor o igual que 2. Compárala con la media que has calculado en el anterior apartado. Haz lo mismo con la cuasidesviación típica. Basta con calcular ambas medias
mean(robles$Nitrogeno)
## [1] 3.293737
mean(robles$Nitrogeno[robles$Potasio >= 2])
## [1] 3.570467

en el segundo caso la media es ligeramente superior, y las cuasidesviaciones típicas

sd(robles$Nitrogeno)
## [1] 0.6415097
sd(robles$Nitrogeno[robles$Potasio >= 2])
## [1] 0.5133733
  • Calcula la media de la variable Nitrogeno para los individuos que tuvieron angina de pecho (es decir, Variedad == "A") Recicla el código ya escrito para obtener
mean(robles$Nitrogeno[robles$Variedad == "A"])
## [1] 3.206143
  • Visualiza la subtabla que contiene las 11 primeras filas y las columnas de las variables Hierro, Calcio, Zona, Tratamiento.
robles[1:11, c("Hierro", "Calcio", "Zona", "Tratamiento")] 
##    Hierro Calcio Zona Tratamiento
## 1   0.058  2.365    1           0
## 2   0.060  2.745    1           0
## 3   0.058  2.513    1           0
## 4   0.059  2.361    1           0
## 5   0.061  2.330    1           0
## 6   0.027  2.450    1           1
## 7   0.059  2.750    1           1
## 8   0.062  2.467    1           1
## 9   0.057  2.666    1           1
## 10  0.059  2.666    1           1
## 11  0.011  2.599    2           0

Ejercicio 2

  • Crea la variable lnHierro (logaritmo neperiano de la concentración de hierro) y añadela a la tabla. Tal y como se indica en el enunciado, puedes calcular primero el logaritmo
lnHierro = log(robles$Hierro)

a continuación, añadirlos a la tabla

robles$lnHierro = lnHierro

O bien hacerlo todo en un solo paso con

robles$lnHierro = log(robles$Hierro)
  • Dibuja un diagrama de caja (boxplot) de la variable Calcio. ¿Hay valores atípicos? ¿Cuáles son? ¿Y qué filas ocupan en la tabla? La orden es
boxplot(robles$Calcio)

R ha calculado varias cosas (cuartiles, valores atípicos,…) para representar ese diagrama. Para acceder a dicha información, hay que guardar el boxplot en una variable

bp.Calcio = boxplot(robles$Calcio)

Y buscar los valores atípicos (en inglés outliers)

bp.Calcio$out
## [1] 0.9

Con esto obtenemos su valor, pero no la posición que ocupan en la tabla. Usa la función which para determinar en qué fila están

# traduccion simultanea
# que posicion ocupan en robles$bmi los valores que estan en bp.bmi$out (atipicos)
  • A continuación dibuja un gráfico que muestre los dos diagramas de caja (boxplot) de la variable Calcio correspondientes a los dos posibles niveles (valores) del factor Variedad. Recuerda la notación de fórmula con la tilde ~
boxplot(Calcio ~ Variedad, data= robles)

Ejercicio 3

  • Calcula la media de la variable Manganeso.
mean(robles$Manganeso)
## [1] NA
  • ¿Qué ha pasado? El resultado se debe a que esa columna contiene valores ausentes. En inglés missing values, también llamados Non-Available (de ahí la respuesta de R). Prueba a utilizar la función mean con la opción na.rm = TRUE (NA remove, eliminar los NA) para pedirle a R que ignore esos valores ausentes al calcular la media.
mean(robles$Manganeso, na.rm = TRUE)
## [1] 0.01483333
  • La ausencia de algunos valores es uno de los quebraderos de cabeza más frecuentes en Análisis de Datos. Lo primero es aprender a detectarlos. Usa la función complete.cases así:
complete.cases(robles)
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [12]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [23]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [34]  TRUE  TRUE FALSE  TRUE FALSE

para identificar las filas de la tabla en las que hay valores ausentes (en alguna de las columnas).

  • Pídele a R (usando selección por filas) que te enseñe solo las filas de la tabla en las que faltan valores. El signo ! sirve para negar, y which indica el número de fila
which(!complete.cases(robles))
## [1] 36 38

literalmente, se pregunta qué filas están incompletas en la tabla (busca los FALSE en la lista de arriba).

  • Combina complete.cases con which para averiguar el número de filas en las que faltan valores. Con la siguiente orden
robles = robles[complete.cases(robles), ]

conservamos sólo las filas que están completas (en las que complete.cases(robles) vale TRUE) y todas las columnas de la tabla.

  • También puedes analizar una columna concreta, en este caso con la función is.na. Por ejemplo, prueba con:
is.na(robles$Manganeso)
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [34] FALSE FALSE FALSE

esta función se aplica a vectores y vale TRUE cuando un elemento del vector está ausente

  • De nuevo, combínalo con which para ver qué números de fila corresponden a valores ausentes de Manganeso.
which(is.na(robles$Manganeso))
## integer(0)

es dcir, no hay ninguno, el vector está completo.

Ejercicio 4

Antes de hacer este ejercicio debes visto el vídeo (o leído la introducción) sobre los documentos reproducibles.

Crea un documento reproducible en RMarkdown a partir del código que has escrito para responder al ejercicio 1 de la práctica 2. El código debe ir en los chunks del documento reproducible y además debes añadir comentarios fuera de esos chunks explicando los pasos que das para resolver el ejercicio. A partir de ese documento reproducible debes generar documentos HTMl y docx.