Queremos realizar diferentes gráficos en R para comprender como son nuestros datos. Dependiendo de la naturaleza de nuestras variables debemos optar por uno u otro. Se trata de poder hacer un primer análisis visual de nuestros datos, y a partir de ellos empezar a sacar las primeras conclusiones preliminares.
Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:
setwd(dir = "C:/R/MARKDOWN/graphs")
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 (=tratamientos) y dos variables dependientes (Var1 y Var2).
Gráfico de barras. Es adecuado para variables dependientes agrupadas por tratamientos (por ejemplo la altura media de los ciudadanos de tres ciudades). No se puede hacer directamente, se requiere el cálculo de la media y la desviación de nuestras variables dependientes en función del tratamiento.
Primero hay que calcular la media y la desviación de nuestros datos en función del tratamiento y para cada variable:
mediasvar1<-aggregate(datos$Var1~datos$Treatment, FUN=mean)
sdvar1<-aggregate(datos$Var1~datos$Treatment, FUN=sd)
mediasvar1
## datos$Treatment datos$Var1
## 1 1 4.00
## 2 2 4.90
## 3 3 8.77
## 4 4 50.80
## 5 5 34.90
library(plyr)
## Warning: package 'plyr' was built under R version 3.5.3
medvar1<-ddply(datos,.(Treatment), summarize, mean=mean(Var1))
sdvar1<-ddply(datos,.(Treatment), summarize, sd=sd(Var1))
str(medvar1)
## 'data.frame': 5 obs. of 2 variables:
## $ Treatment: int 1 2 3 4 5
## $ mean : num 4 4.9 8.77 50.8 34.9
Ahora representamos esas medias en función de cada tratamiento:
BARRAS<-barplot(medvar1$mean, axes=FALSE,axisname=FALSE, ylim=c(0,100),
col=c('white', 'gray','azure4','dimgray','black'),main="Título Var1",
xlab="Treatments", ylab="Var1")
axis(1,labels=c("control", "T1","T2","T3","T4"), at=BARRAS)
axis(2,at=seq(0,100,by=10))
Ponemos las barras de error:
BARRAS<-barplot(medvar1$mean, axes=FALSE,axisname=FALSE, ylim=c(0,100),
col=c('white', 'gray','azure4','dimgray','black'),main="Título Var1",
xlab="Treatments", ylab="Var1")
axis(1,labels=c("control", "T1","T2","T3","T4"), at=BARRAS)
axis(2,at=seq(0,100,by=10))
segments(BARRAS-0.1,medvar1$mean-sdvar1$sd,BARRAS+0.1,medvar1$mean-sdvar1$sd,lwd=2)
segments(BARRAS-0.1,medvar1$mean+sdvar1$sd,BARRAS+0.1,medvar1$mean+sdvar1$sd,lwd=2)
segments(BARRAS,medvar1$mean-sdvar1$sd,BARRAS,medvar1$mean+sdvar1$sd,lwd=2)
Hacemos un Boxplot con nuestros datos. el Boxplot aporta mucha información sobre nuestros datos, la caja representa
boxplot(Var1 ~ Treatment, data=datos, col="green", cex.axis=0.7,las = 2, ylab="var1", xlab="Treatments", cex.lab=0.75)
boxplot(Var2 ~ Treatment, data=datos, col="red", cex.axis=0.7,las = 2, ylab="var2", xlab="Treatments", cex.lab=0.75)
Estos gráficos se interpretan de la siguiente manera: LA LÍNEA que separa el rectángulo en dos es la MEDIANA (varible en posición central de un conjunto de datos). LOS EXTREMOS DEL RECTÁNGULO son los cuartiles extremos, es decir en el recuadro están el 75% de nuestros datos.
Variante en dos dimensiones del Boxplot:
library(aplpack)
## Loading required package: tcltk
bagplot(datos$Var1,datos$Var2,xlab="Var1", ylab="Var2", main="Bagplot Example")
La zona sombreada recoge el 50% de los datos, los puntos con líneas son outlayers.
Gráfico de dispersión de las dos variables enfrentadas coloreadas en función del tratamiento:
with(datos, plot(Var1, Var2, col=Treatment))
abline(h = 12, lwd = 2, lty = 2)
Un gráfico de dispersión de var1 frente a var2 para cada uno de los tratamientos:
par(mfrow = c(1, 2), mar = c(5, 4, 2, 1))
with(subset(datos, Treatment == "1"), plot(Var1, Var2, main = "Tratamiento 1"))
with(subset(datos, Treatment == "2"), plot(Var1, Var2, main = "Tratamiento 2"))
with(subset(datos, Treatment == "3"), plot(Var1, Var2, main = "Tratamiento 3"))
with(subset(datos, Treatment == "4"), plot(Var1, Var2, main = "Tratamiento 4"))
with(subset(datos, Treatment == "5"), plot(Var1, Var2, main = "Tratamiento 5"))
Hacemos un Histograma de frecuencias para cada variable:
hist(datos$Var1, col = "green")
hist(datos$Var2, col = "red")
Se pueden mostrar los datos en la figura:
hist(datos$Var1, col = "green")
rug(datos$Var1)
Podemos romper en más columnas el histograma:
hist(datos$Var1, col = "green", breaks = 100)
par(mfrow = c(2, 1), mar = c(4, 4, 2, 1))
hist(datos$Var1, col = "green")
hist(datos$Var2, col = "red")
Una forma alternativa de ver la distribución de nuestros datos. Visualmente es más fácil ver si los datos siguen una distribución normal.
density1 <- density(datos$Var1)
plot(density1)
polygon(density1, col="green", border="black")
density2 <- density(datos$Var2)
plot(density2)
polygon(density2, col="red", border="black")
Vamos a representar figuras para modelos ajustados a dos variables cuantitativas, por ejemplo la cobertura de plantas y la altura sobre el nivel del mar.
setwd(dir = "C:/R/MARKDOWN/graphs")
datoss<-read.table("alturacobertura.csv", sep = ";", header = TRUE, dec = ".")
datoss
## altura cobertura Zona
## 1 10 0 A
## 2 25 1 A
## 3 65 3 A
## 4 89 10 A
## 5 152 10 A
## 6 521 20 C
## 7 462 20 C
## 8 321 65 C
## 9 357 55 C
## 10 451 50 C
## 11 210 65 C
## 12 89 10 A
## 13 99 21 A
## 14 68 15 A
## 15 79 12 A
## 16 99 19 A
## 17 98 12 A
## 18 96 9 A
## 19 93 16 A
## 20 91 13 A
## 21 102 21 B
## 22 165 29 B
## 23 186 23 B
## 24 102 24 B
## 25 177 22 B
## 26 145 23 B
## 27 196 31 B
## 28 215 26 C
## 29 568 5 C
## 30 265 59 C
## 31 289 49 C
## 32 457 45 C
## 33 566 2 C
## 34 65 15 A
## 35 200 39 C
## 36 201 38 C
## 37 198 39 C
## 38 199 39 C
## 39 298 41 C
## 40 289 42 C
## 41 458 51 C
str(datoss)
## 'data.frame': 41 obs. of 3 variables:
## $ altura : int 10 25 65 89 152 521 462 321 357 451 ...
## $ cobertura: int 0 1 3 10 10 20 20 65 55 50 ...
## $ Zona : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 3 3 3 3 3 ...
Representamos nuestros datos.
plot(cobertura~altura,data=datoss,pch=16)
abline(lm(cobertura~altura,data=datoss),col="red")
Podemos ver los parámetros del lm para nuestros datos:
model<-lm(cobertura~altura,data=datoss)
summary(model)
##
## Call:
## lm(formula = cobertura ~ altura, data = datoss)
##
## Residuals:
## Min 1Q Median 3Q Max
## -40.42 -10.87 -0.56 12.10 38.67
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.84268 4.60315 3.659 0.000748 ***
## altura 0.04520 0.01748 2.586 0.013566 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.02 on 39 degrees of freedom
## Multiple R-squared: 0.1464, Adjusted R-squared: 0.1245
## F-statistic: 6.686 on 1 and 39 DF, p-value: 0.01357
Vamos a utilizar ggplot2 para representar nuestros datos:
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.3
qplot(datoss$altura,datoss$cobertura)
Unimos por líneas todos los puntos:
qplot(altura,cobertura,data=datoss,geom=c("point", "line"))
Ahora representamos un modelo sobre la nube de puntos:
qplot(altura,cobertura,data=datoss,geom = c("point", "smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Con ggplotse puede representar lo mismo:
ggplot(datoss,aes(altura,cobertura))+geom_point()+geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Representamos las tres zonas en nuestra figura:
qplot(altura,cobertura,data=datoss, color=factor(Zona), geom=c("point"))
Ahora incluimos modelo para cada zona:
qplot(altura,cobertura,data=datoss, color=factor(Zona), geom=c("point","smooth"))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Vamos a representar la altura por cada una de nuestras zonas:
qplot(Zona, altura, data=datoss, geom="boxplot")
Vamos a representar la cobertura por cada una de nuestras zonas:
qplot(Zona, cobertura, data=datoss, geom="boxplot")
Vamos a representar la cobertura por cada una de nuestras zonas con las observaciones:
qplot(Zona, cobertura, data=datoss, geom=c("boxplot","jitter"))
Representamos solamente las observaciones para las coberturas por zonas:
qplot(Zona, cobertura, data = datoss,
geom=c("dotplot"),
stackdir = "center", binaxis = "y")
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.
Podemos representar como un violín para las coberturas por zonas (nos informa de lo dispersos o agrupados que se encuentran los datos):
qplot(Zona, cobertura, data = datoss,
geom=c("violin"), trim = FALSE)
Vamos a poner a cada zona un color:
qplot(Zona, cobertura, data = datoss,
geom=c("boxplot","jitter"), fill=Zona)
Un histograma para todos los datos de cobertura:
qplot(cobertura, data = datoss, geom = "histogram",bins=30)
Histograma por zonas:
qplot(cobertura, data = datoss, geom = "histogram", fill=Zona,bins=30)
Un gráfico de densidad para todos los datos de cobertura:
qplot(cobertura, data = datoss, geom = "density")
Densidad de la cobertura en función de la zona:
qplot(cobertura, data = datoss, geom = "density", color=Zona,linetype=Zona)
Qué no se nos olvide poner los nombres a nuestras figuras:
qplot(cobertura, data = datoss, geom = "density",
xlab = "Cobertura (%)", ylab = "Densidad",
main = "Densidad en función de la cobertura")
Calculo los valores medios y Sd para la figura de la cobertura en cada una de las zonas:
meancob<-aggregate(datoss$cobertura~datoss$Zona, FUN=mean)
sdcob<-aggregate(datoss$cobertura~datoss$Zona, FUN=sd)
meancob
## datoss$Zona datoss$cobertura
## 1 A 11.06667
## 2 B 24.71429
## 3 C 39.47368
sdcob
## datoss$Zona datoss$cobertura
## 1 A 6.08824
## 2 B 3.77334
## 3 C 18.00422
Ahora hacemos un data.frame con las zonas y sus correspondientes medias y lo representamos:
df<-data.frame(zona=c("A","B","C"), outcome=c(11.07,24.71,39.47))
ggplot(df,aes(zona,outcome))+geom_col()