Los datos que aparecen en el fichero p1-robles.csv
se refieren a un estudio realizado sobre un robledal cercano a una planta industrial, parte de los cuales se visualizan en la tabla. Se han seleccionado robles
Sobre cada árbol se han medido las concentraciones (mg/kg) de ocho elementos químicos en sus hojas:
Puedes descargarlos desde aquí
mi_url = "http://www3.uah.es/marcos_marva/CursoAmbientales/practicas/datos/p1-robles2019.csv"
robles = read.table(file = mi_url, sep = ";", header = TRUE, dec ="," )
# quantile(robles$Hierro)
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ón 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
Repite el cálculo para los individuos que recibieron tratamiento. Ahora seleccionamos los individuos tales que Tratamiento == TRUE
mean(robles$Nitrogeno[robles$Tratamiento == TRUE])
## [1] 3.256263
sd(robles$Nitrogeno[1:14])
## [1] 0.6564765
Repite el cálculo anterior en función
de la variable Zona
. Comenta los resultados. Indicación: usa la función aggregate()
Para no tener que repetir el cálculo 4 veces, usamos la función `aggregate()``:
aggregate(robles$Nitrogeno ~ robles$Zona, FUN = mean)
## robles$Zona robles$Nitrogeno
## 1 1 3.675000
## 2 2 3.300833
## 3 3 2.549857
## 4 4 3.482091
Se aprecia que en las zonas 1, 2 y 4 las concentraciones medias son similares, y en la zona 3 es inferior.
En el caso de la desviación típica muestral
aggregate(robles$Nitrogeno ~ robles$Zona, FUN = sd)
## robles$Zona robles$Nitrogeno
## 1 1 0.8000555
## 2 2 0.2664613
## 3 3 0.4316231
## 4 4 0.5848168
La dispersión es dispar; de menor a mayor, zona 2, 3, 4 y 1.
A todo esto, ¿crees que la media es una buena medida de centralización para describir los datos?.
Indicación: usa dos herramientas complementarias: una visual (boxplots) y otra numérica (el coeficiente de asimetría). Para este último hay que
install.packages("EnvStats")
.library(EnvStats)
skewness()
para calcular el coeficiente de asimetríaQueremos asegurarnos de que las submuestras son unimodales y simétricas. Podemos usar sendos boxplots para visualizar este hecho
boxplot(robles$Nitrogeno ~ robles$Zona)
stripchart(robles$Nitrogeno ~ robles$Zona, add = T, vertical = T)
Su forma corrobora grosso modo que los datos sigen una campana de Gauss. Recuerda que para muestras elegidas al azar no podemos esperar observas simetrías perfectas.
Si queda duda de la simetría, podemos calcular los coeficientes de simetría
# Ejecuta esto sólo una vez
# install.packages("EnvStats")
library(EnvStats)
## Warning: package 'EnvStats' was built under R version 4.0.5
##
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:stats':
##
## predict, predict.lm
## The following object is masked from 'package:base':
##
## print.default
aggregate(robles$Nitrogeno ~ robles$Zona, FUN = skewness)
## robles$Zona robles$Nitrogeno
## 1 1 0.7681653
## 2 2 -1.6421193
## 3 3 0.1711374
## 4 4 -0.4269967
Puede que R de algunos avisos (warnings); no les hagas caso.
Se observa que todos los coeficientes están entre -2 y 2, que son los valores de referencia, lo que corrobora la primera conclusión (obtenida a partir de la inspección visual).
¿Cuál es el valor mínimo que alcanza la variable Magnesio
? ¿En qué individuo se observa? Indicación: usa la función which()
min(robles$Magnesio)
## [1] 0.267
which(robles$Magnesio == min(robles$Magnesio))
## [1] 34 35
¿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]
## [1] 2.632 2.495 2.396 2.197 2.233 2.533 2.667 2.416 2.333 2.267 2.611 2.982
## [13] 2.833 2.050 2.566
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 FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE
## [37] FALSE TRUE
para obtener TRUE
s y FALSE
s 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
¿Qué porcentaje de robles tiene una concentración de Potasio
mayor o igual que 2
Basta con dividir el número anterior entre el número total de robles y multiplicar por 100
(sum(robles$Potasio >= 2)/nrow(robles)) * 100
## [1] 39.47368
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
A partir del boxplot de la variable Magnesio
, ¿observas algún dato atípico? ¿Qué posición ocupa en la tabla?
boxplot(robles$Magnesio)
Sí, hay uno. Para calcular la posición que ocupa
pb = boxplot(robles$Magnesio)
which(robles$Magnesio == pb$out)
## [1] 17
Representa los boxplots de la variable Magnesio
para cada una de las zonas, ¿observas algún patrón?
boxplot(robles$Magnesio ~ robles$Zona)
stripchart(robles$Magnesio ~ robles$Zona, method = "jitter", col="blue", add=TRUE, pch = 21, vertical = T)
No olvides representar los puntos sobre los boxplots. Y sí, se observan ciertas tendencias:
Magnesio
.