Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)


Tenemos que “dibujar” nuestros datos antes de aplicar un análisis estadístico


1 Objetivo

Queremos representar dos variables cuantitativas. Una de las variables situada en el eje x y la otra en el eje y. Un gráfico de dispersión es adecuado cuando queremos analizar por medio de una correlación o una regresión la relación que existe entre las dos variables. Se trata de poder hacer un primer análisis visual de nuestros datos y de la posible relación entre las dos variables que estamos estudiando.

2 Nuestros datos

Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:

setwd(dir = "F:/R/MARKDOWN-ggplot2/dispersion")
datos<-read.table("graphs.csv", sep = ";", header = TRUE, dec = ".")
datos
##    Treatment Var1 Var2
## 1          1  2.2 0.20
## 2          1  2.3 0.30
## 3          1  2.4 0.40
## 4          1  4.5 0.50
## 5          1  5.4 0.20
## 6          1  5.4 0.40
## 7          1  5.4 0.40
## 8          1  4.0 1.00
## 9          1  4.0 0.90
## 10         1  4.4 0.80
## 11         2  0.0 0.90
## 12         2  0.0 0.80
## 13         2  4.0 0.90
## 14         2  5.0 1.20
## 15         2  6.0 1.30
## 16         2  8.0 1.30
## 17         2  9.0 1.20
## 18         2  8.0 1.40
## 19         2  0.0 2.00
## 20         2  9.0 2.00
## 21         3  9.0 3.20
## 22         3  8.0 3.40
## 23         3  7.8 4.50
## 24         3  8.9 5.60
## 25         3 12.0 6.50
## 26         3  2.0 5.40
## 27         3 12.0 4.50
## 28         3 11.0 6.40
## 29         3 14.0 6.70
## 30         3  3.0 6.90
## 31         4 45.0 9.00
## 32         4 54.0 9.80
## 33         4 46.0 9.80
## 34         4 56.0 9.80
## 35         4 76.0 9.90
## 36         4 54.0 9.00
## 37         4 54.0 7.00
## 38         4 34.0 8.00
## 39         4 45.0 9.00
## 40         4 44.0 6.00
## 41         5 22.0 6.80
## 42         5 33.0 9.00
## 43         5 33.0 9.00
## 44         5 33.0 9.90
## 45         5 33.0 9.89
## 46         5 33.0 9.90
## 47         5 32.0 6.90
## 48         5 32.0 9.90
## 49         5 43.0 9.99
## 50         5 55.0 9.80
str(datos)
## 'data.frame':    50 obs. of  3 variables:
##  $ Treatment: int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Var1     : num  2.2 2.3 2.4 4.5 5.4 5.4 5.4 4 4 4.4 ...
##  $ Var2     : num  0.2 0.3 0.4 0.5 0.2 0.4 0.4 1 0.9 0.8 ...

En este caso tenemos cinco grupos (Treatment) y dos variables dependientes (Var1 y Var2).

3 Gráfico de dispersión

Vamos a realizar un gráfico de dispersión para la Var1 y Var2.

with(datos, plot(Var2, Var1))

Para incluir el tratamiento añadimos col=Treatment con ello R aplicará un color diferente a cada uno de los cinco tratamientos.

with(datos, plot(Var2, Var1, col=Treatment))

Un gráfico de dispersión de Var1 frente a Var2 para cada uno de los Treatment:

par(mfrow = c(1, 2), mar = c(5, 4, 2, 1))
with(subset(datos, Treatment == "1"), plot(Var2, Var1, main = "Tratamiento 1"))
with(subset(datos, Treatment == "2"), plot(Var2, Var1, main = "Tratamiento 2"))

with(subset(datos, Treatment == "3"), plot(Var2, Var1, main = "Tratamiento 3"))
with(subset(datos, Treatment == "4"), plot(Var2, Var1, main = "Tratamiento 4"))

with(subset(datos, Treatment == "5"), plot(Var2, Var1, main = "Tratamiento 5"))

4 Gráfico de dispersión con ajuste modelo

Vamos a representar figuras para modelos ajustados a dos variables cuantitativas. Continuamos con los datos anteriores.

Representamos nuestros datos. Ojo que el orden en que metamos las variables cambia la figura. Ajustamos a un modelo líneal por medio de lm y lo representamos por medio de una línea de color rojo col="red"

plot(Var1~Var2,data=datos,pch=16)
abline(lm(Var1~Var2,data=datos),col="red")

Podemos ver los parámetros del lm para nuestros datos:

model<-lm(Var2~Var1,data=datos)
summary(model)
## 
## Call:
## lm(formula = Var2 ~ Var1, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7857 -1.6257 -0.5071  1.5829  4.6857 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.74284    0.42244   4.126 0.000146 ***
## Var1         0.15714    0.01471  10.680 2.82e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.073 on 48 degrees of freedom
## Multiple R-squared:  0.7038, Adjusted R-squared:  0.6976 
## F-statistic: 114.1 on 1 and 48 DF,  p-value: 2.815e-14

Parece que si existe una relación significativa entre las dos variables.

Vamos a utilizar ggplot2 para representar un gráfico de dispersión de nuestros datos:

library(ggplot2)
qplot(datos$Var2,datos$Var1)

Unimos por líneas todos los puntos:

qplot(Var2,Var1,data=datos,geom=c("point", "line"))

Ahora representamos un modelo libre sobre nuestra nube de puntos:

qplot(Var2,Var1,data=datos,geom = c("point", "smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Con ggplot se puede representar lo anterior de otra forma con el mismo resultado:

ggplot(datos,aes(Var2,Var1))+geom_point()+geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

5 Representación por categorías

Representamos los cinco tratamientos en nuestra figura, para ello se utiliza color=factor(Treatment):

qplot(Var2,Var1,data=datos, color=factor(Treatment), geom=c("point"))

Ahora incluimos modelo libre de ajuste para cada zona con smooth:

qplot(Var2,Var1,data=datos, color=factor(Treatment), geom=c("point","smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : pseudoinverse used at 9.9195
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : neighborhood radius 0.9195
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : There are other near singularities as well. 0.81
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 9.9195
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 0.9195
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 0.81

Los mensajes de error se deben al bajo número de observaciones de cada uno de los tratamientos. Fijaros que cuando hemos hecho el ajuste del modelo libre con todos los puntos no nos ha aparecido ningún error.

6 Mejorar el aspecto de los gráficos

6.1 En R base

Vamos a poner nombres a nuestras variables de los ejes.

with(datos, plot(Var2, Var1, col=Treatment))

Para ello:

with(datos, plot(Var2, Var1, col=Treatment, xlab="Altura (m)", ylab="Tasa de erosión"))

Y ahora vamos a incluir una leyenda con los cinco tratamientos:

with(datos, plot(Var2, Var1, col=Treatment, xlab="Altura (m)", ylab="Tasa de erosión"))
legend(x = "topleft", legend = c("muy bajo", "bajo", "medio", "alto", "muy alto"),
       fill = c("Black", "Red", "Green", "Lightblue", "Blue"), title = "Alturas")

6.2 En ggplot2

Vamos a poner nombres a nuestras variables de los ejes.

gr<-qplot(Var2,Var1,data=datos,geom = c("point", "smooth"))
gr
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Para ello:

gr + xlab("Altura (m)") + ylab("Tasa de erosión")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'


Con paciencia y ensayo iremos mejorando nuestras representaciones gráficas

7 CRÉDITOS

Álvaro Alonso Fernández

Departamento de Ciencias de la Vida

Universidad de Alcalá (España)