Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
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.
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).
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"))
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'
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.
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")
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'
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)