Mostrando entradas con la etiqueta geom_smooth. Mostrar todas las entradas
Mostrando entradas con la etiqueta geom_smooth. Mostrar todas las entradas

2018-12-17

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 3.1.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos el gráfico de la figura 3.1. Utiliza el conjunto de datos Advertising.Los puntos rojos representan los valores observados de ventas (sales) y los presupuestos de televisión (TV). La línea azul representa la recta de regresión. Las líneas grises verticales representan el error asociado con cada observación. Hay errores positivos (si la observación se sitúa por encima de la líneaazul) y negativos (si la observación se sitúa por debajo de la curva).

Solución

Con la función theme personalizamos el formato: rotamos las etiquetas del eje y, eliminamos el color de fondo, y añadimos el borde.

library(tidyverse)
ggplot(ad_fitted, aes(x = budgets, y = sales)) +
  geom_point(colour = "red") +
  geom_smooth(se = FALSE, method = lm) +
  geom_segment(aes(
    x = budgets,
    y = sales,
    xend = budgets,
    yend = fitted
  )) +
  scale_x_continuous(breaks = seq(0, 300, by = 50)) +
  scale_y_continuous(breaks = seq(0, 25, by = 5)) +
  theme(
    axis.text.y = element_text(angle = 90, hjust = 1),
    panel.background = element_blank(),
    panel.border = element_rect(fill = NA)
  )
Si deseamos mantener la cuadrícula, pero eliminar el color de fondo (theme_bw) y modificar el título del eje x (labs):

ggplot(ad_fitted, aes(x = budgets, y = sales)) +
  geom_point(colour = "red") +
  geom_smooth(se = FALSE, method = lm) +
  geom_segment(aes(
    x = budgets,
    y = sales,
    xend = budgets,
    yend = fitted
  )) +
  labs(x = "TV")+
  scale_x_continuous(breaks = seq(0, 300, by = 50)) +
  scale_y_continuous(breaks = seq(0, 25, by = 5)) +
  theme_bw()+
  theme(axis.text.y = element_text(angle = 90, hjust = 1))

Entradas relacionadas

Referencias

2018-09-04

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 2.2.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 2.2. Utiliza el conjunto de datos Income (renta). A la izquierda los puntos rojos representan los valores observados de renta (en miles de dólares) y los años de educación de 30 individuos. A la derecha la curva azul representa la verdadera relación subyacente entre la renta y los años de educación, que es generalmente desconocida (pero es conocida en este caso porque los datos fueron simulados). Las líneas negras representan el error asociado con cada observación. Hay errores positivos (si la observación se sitúa por encima de la curva azul) y negativos (si la observación se sitúa por debajo de la curva). En total, la media de estos errores es aproximadamente cero.

Solución

Necesitamos crear un nuevo data frame, en el que añadimos una nueva columna con los valores ajustados calculado por el modelo usado por ggplot2 (el método loess es usado para menos de 1.000 observaciones)

library(ggplot2)
library(cowplot)
income_1 <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Income1.csv")

# Gráfico A
p1 <- ggplot(income_1, aes(x= Education, y = Income)) + 
  geom_point()+
  geom_smooth()

# Gráfico B
mod <- loess(Income ~ Education, data = income_1)
income <- transform(income_1, fitted = fitted(mod))
p2 <- ggplot(income, aes(x= Education, y = Income)) + 
  geom_point(colour = "red")+
  geom_smooth(se = FALSE)+
  geom_segment(aes(x = Education, y = Income,
                   xend = Education, yend = fitted))

# Ambos gráficos
theme_set(theme_grey()) # Mantiene theme_grey
plot_grid(p1, p2 , labels = "AUTO")

Entradas relacionadas

Referencias

2018-09-02

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 2.1.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 2.1. Utilizan el conjunto de datos Advertising. El gráfico representa las ventas en unidades de mil como una función de los presupuestos de televisión, radio o prensa, para 200 mercados. En cada gráfico se muestra la recta de regresión lineal que mejor se ajusta para las ventas y cada variable, descrito en el capítulo 3 del libro. En otras palabras, cada línea azul representa un modelo simple que puede ser usado para predecir las ventas usando la televisión, radio o prensa respectivamente.

Solución

library(tidyr)
library(ggplot2)
ad <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
ad_long <-  gather(ad, media, budgets,  TV:newspaper, factor_key = TRUE)
ggplot(ad_long, aes(x = budgets, y = sales, colour = media)) +
  geom_point()
ggplot(ad_long, aes(x = budgets, y = sales)) +
  geom_point() +
  facet_grid( ~ media, scales = "free") +
  geom_smooth(method = "lm")

Entradas relacionadas

2018-08-30

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.4.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 1.4. Se trata de dos diagramas de dispersión del conjunto de datos NCI-60 y cada observación representa una de las 64 líneas celulares (cell lines) correspondientes a un tipo de cáncer. A la izquierda, representados dos vectores de análisis de componentes principales. Parece haber 4 grupos de observaciones que separamos por colores. A la derecha, el mismo gráfico de la izquierda pero representados cada tipo de cáncer con un color y símbolo diferente. Las observaciones que corresponden al mismo tipo de cáncer tienden a estar cerca en este espacio bidimensional.

Solución con ggplot2

# Librerías y datos NCI60 
library(ISLR)
library(tidyverse)
nci.labs <- NCI60$labs
nci.data <- NCI60$data

# Análisis de componentes principales (ACP o PCA) con NCI60 
pr.out <- prcomp(nci.data, scale=TRUE)

# Gráfico 1
df1 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'group1', ifelse(
  PC1 > -42 & PC2 > 1, 'group2', ifelse(
  PC1 > 25 & PC2 < 1, 'group3', 'group4'))))
p1 <- ggplot(df1, aes(x = PC1, y = PC2, colour = groups)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  scale_color_manual(values = c("group1" = "red", "group2" = "blue", "group3" = "green4", "group4" = "cyan4" ))+
  theme_bw()+
  theme(legend.position="none")

# Gráfico 2
df2 <- data.frame(pr.out$x[, 1:2], nci.labs)
p2 <- ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  theme_bw()+
  theme(legend.position="none")

# Gráficos lado a lado: dos alternativas
library(gridExtra)
grid.arrange(p1, p2, ncol = 2)

library(cowplot)
plot_grid(p1, p2, labels = "AUTO")

# Con leyenda modificando su título
ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2", colour = "Types of cancer")+
  theme_bw()

Gráficos con ggplot2

Alternativa con el paquete Graphics

Con el paquete graghics de la configuración base de R.

# Asigno colores manualmente para el primer gráfico
df3 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'red', ifelse(
  PC1 > -42 & PC2 > 1, 'blue', ifelse(
  PC1 > 25 & PC2 < 1, 'green4', 'cyan4'))))

# Función para asignar colores del segundo gráfico
Cols <- function(vec){
  cols=rainbow(length(unique(vec)))
  return(cols[as.numeric(as.factor(vec))])
}
# Gráficos
par(mfrow = c(1,2))
plot(df1[, 1:2], col = df3$groups, pch = 19, xlab = "Z1", ylab = "Z3")
plot(df1[, 1:2], col = Cols(nci.labs), pch = 19, xlab = "Z1", ylab = "Z2")

Entradas relacionadas

2018-08-10

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.1.

Introducción

Uno de los libros más populares para aprender estadística repleto de ejemplos en R es An Introduction to Statistical Learning. En esta y tal vez sucesivas entradas, vamos a recrear con ggplot2 algunos de los gráficos mostrados en el libro. En este caso los 3 primeros gráficos de la figura 1.1.

Solución

 # Cargamos paquetes y datos necesarios
library(ISLR)
attach(Wage)
library(ggplot2)

  1. Diagrama de dispersión: edad y salarios
  2. Los salarios como una función de la edad. En media, los salarios se incrementan con la edad hasta llegar a los 60 años, a partir de entonces empiezan a declinar.

    A diferencia del gráfico original, mostramos un intervalo de confianza alrededor de la línea que se traza siguiendo el método de suavizado (smoothing method) de gam (generalized additive models) al tener más de 1.000 observaciones. Es un típico ejemplo de overplotting, la representación de las observaciones es tan densa que dificulta la lectura del gráfico. Trataremos este problema en otra entrada.

    ggplot(Wage, aes(x= age, y = wage)) + 
      geom_point()+
      geom_smooth() # se = FALSE sin intervalo de confianza
    
  3. Diagrama de dispersión: años y salarios.
  4. Representamos los salarios como una función del año. Hay un incremento ligero pero constante de aproximadamente 10.000 dólares de 2003 a 2009.

    Si tratamos de aplicar la función anterior geom_smooth, nos aparecerá el siguiente mensaje 'Warning message: Computation failed in `stat_smooth()`: x has insufficient unique values to support 10 knots: reduce k.' Para resolverlo usamos stat_summary para representar la media.

    ggplot(Wage, aes(x= year, y = wage)) + 
      geom_point() + stat_summary(
        fun.y = mean,
        colour = "blue",
        geom = "line",
        size = 1.5
      )
    
  5. Diagrama de caja: educación y salarios
  6. Los diagramas de caja representan los salarios como una función de la educación con 1 indicando el nivel más bajo (sin diploma de bachillerato) y 5 el nivel más alto (nivel de postgrado avanzado). En media, lo salarios se incrementan con el nivel de educación.

    Utilizamos la función geom_boxplot con los argumentos por defecto e indicamos fill para colorear el interior de las mismas.

    ggplot(Wage, aes(x= education, y = wage, fill = education)) + 
      geom_boxplot()
    

Entradas relacionadas

Nube de datos