Selección de casos

Vamos a trabajar con el conjunto de datos iris

head( iris ); str( iris )
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Representamos las dos primeras variables, Sepal.Length y Sepal.Width, coloreadas según la especie a la que pertenecen.

plot( iris[ , 1:2 ], col = iris$Species, pch = 20 )  # todas las especies

Vamos a llevar a cabo una serie de modificaciones sobre este gráfico.

1. Imaginemos que solo queremos que aparezca representada la especie virginica

Seleccionamos los datos:

iris[ iris$Species == "virginica" , ] # todas las variables de la especie virginica
iris[ iris$Species == "virginica" , 1:2 ] # longitud y anchura del sepalo
##     Sepal.Length Sepal.Width
## 101          6.3         3.3
## 102          5.8         2.7
## 103          7.1         3.0
## 104          6.3         2.9
## 105          6.5         3.0
## 106          7.6         3.0

Hacemos su representación gráfica:

plot( iris[ iris$Species == "virginica" , 1:2 ], col = 3, pch = 20 )

Observamos que no es el mismo gráfico que el anterior eliminando las observaciones de setosa y versicolor, si no que los ejes cambian.

R por defecto centra el gráfico en la media y busca representar la máxima dispersión a la hora de representarlos.

Para comparar las especies necesitamos tener la misma escala, por lo que hay que hacer el gráfico por pasos:

# Puntos de la especie virginica solamente
plot( iris[ , 1:2], type = "n" ) 
points( iris[ iris$Species == "virginica" , 1:2 ],
        col = 3, pch = 20 )

Al usar la función plot() con todos los datos, el device gráfico que lanza tiene las dimensiones que abarcan todo el gráfico. Al especificar type = "n" no se pintan los puntos, lo que permite añadir con la función points() sólo aquellos que queramos.

Como veremos en la próxima sesión, está es la forma automática que tiene de trabajar la librería de gráficos ggplot2.

2. Añadir al gráfico anterior los puntos medios correspondientes a la especie.

Primero calculamos los puntos medios:

m1 <- mean( iris[ iris$Species == "virginica", 1 ] )  # media longitud 
m2 <- mean( iris[ iris$Species == "virginica", 2 ] )  # media anchura

Una vez calculados los podemos añadirlos al gráfico con el siguiente código:

# rectas de los puntos medios
abline( v = m1,
        h = m2 ,
        col = c( "blue", "red" ) )

# el punto medio
points( m1, m2,
        col = c( "red" ),
        pch = 20,
        cex = 2 )  

Lo juntamos todo:

# gráfico vacío
plot( iris[, 1:2],
     type = "n",
     xlab = "logitud (mm)",
     ylab = "anchura (mm)")
     
# añado las obsevaciones de la especie virginica
points( iris[iris$Species == "virginica" , 1:2],
     col = "green", 
     pch = 20 )
     
# trazamos las rectas de los puntos medios
abline( v = m1,
        h = m2 ,
        col = c( "blue", "red" ) )

# representamos el punto medio
points( m1, m2,
        col = c( "red" ),
        pch = 20,
        cex = 2 ) 

3. ¿Se te ocurre cómo añadir al gráfico anterior las medias para todas las especies?

Calculamos las medias para cada una de las especies:

aggregate( iris[, 1:4], list( iris$Species ), mean )
##      Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026
# las guardamos en una variable
mediasIris <- aggregate( iris[, 1:4], list(iris$Species), mean )

Las añadimos al gráfico:

# representamos las medias
points( mediasIris[, 2:3],
        pch = 20,
        col = 2:4,
        cex = 3 )
# las etiquetamos con el nombre de la especie
text( mediasIris[, 2:3], 
      as.character( mediasIris[, 1] ), # especies asociada a cada valor
      pos = 1 )

Dejamos traza de la sesión:

sessionInfo()
## R version 3.4.3 (2017-11-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 17.10
## 
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
## 
## locale:
##  [1] LC_CTYPE=es_ES.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_ES.UTF-8        LC_COLLATE=es_ES.UTF-8    
##  [5] LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=es_ES.UTF-8   
##  [7] LC_PAPER=es_ES.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] compiler_3.4.3  backports_1.1.1 magrittr_1.5    rprojroot_1.2  
##  [5] tools_3.4.3     htmltools_0.3.6 yaml_2.1.14     Rcpp_0.12.13   
##  [9] stringi_1.1.5   rmarkdown_1.7   knitr_1.17      stringr_1.2.0  
## [13] digest_0.6.12   evaluate_0.10.1