2018-09-27

Celda de esquina con etiqueta doble en Excel

Problema

Deseamos crear una celda de esquina con etiqueta doble, tal como la celda A1 en el siguiente ejemplo.

Solución

  1. En la celda deseada insertamos varios espacios antes de la primera palabra de la etiqueta, presionamos ALT+ENTRAR para insertar el salto de línea y escribimos la siguiente etiqueta
  2. Seleccionamos la celda y abrimos el cuadro de diálogo Formato de celdas presionando Ctrl+1. En Borde clic en la línea diagonal descendente.
  3. Cambiamos el color de relleno y de la fuente si fuera necesario.

Entradas relacionadas

2018-09-25

Encabezados de columna en diagonal con Excel

Problema

Deseamos formatear los encabezados de las columnas de manera que aparezcan en diagonal, tal como en el siguiente ejemplo.

Solución

  1. Partimos de una tabla sin formatear
  2. Seleccionamos los encabezados y abrimos el cuadro de diálogo Formato de celdas presionando Ctrl+1. En orientación seleccionamos 45 grados
  3. Alternativamente podemos hacer clic en Orientación, y seleccionar Ángulo ascendente.
  4. Cambiamos el estilo de los bordes y ajustamos el ancho de la columna
  5. Cambiamos el color del relleno y de la fuente

Entradas relacionadas

2018-09-23

Gráficos de An Introduction to Statistical Learning - Figura 2.6.

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.6. Utiliza el conjunto de datos Income2 (renta). El gráfico representa los valores observados de renta (en miles de dólares) en función de los años de educación y la antigüedad de 30 individuos. Los puntos rojos representan los valores observados para esas tres variables. La superficie amarilla representa un modelo de suavizado con thin-plate spline. En este caso no hay líneas verticales negras que representaban el error asociado con cada observación, pues la superficie thin-plate spline se adapta perfectamente a los datos.

Solución

Como utilizamos el paquete mgcv que se utiliza para regresión no para interpolación por lo que tenemos que ajustarlo para que la superficie thin plate spline pase por todos los puntos.

  1. Desactivamos la aproximación de bajo rango que utiliza bs = 'tp' estableciendo el parámetro k con el número exacto de datos de la muestra.
  2. xt <- unique(income_2[c("Education", "Seniority")]) 
    nrow(xt)
    
    [1] 30
    
  3. Empleamos sp = 0 para desactivar la penalización de la spline.

  • Primera aproximación
  • model <- gam(Income ~ s(Education, Seniority, k = 30, sp = 0),
                               data = income_2)
    x <- range(income_2$Education)
    x <- seq(x[1], x[2], length.out=30)
    y <- range(income_2$Seniority)
    y <- seq(y[1], y[2], length.out=30)
    z <- outer(x, y, 
               function(Education,Seniority)
                         predict(model, data.frame(Education,Seniority)))
    p <- persp(x, y, z, theta = 30, phi = 30, 
               col = "yellow", expand = 0.5, shade = 0.2, 
               xlab = "Education", ylab = "Seniority", zlab = "Income")
    obs <-  trans3d(income_2$Education, income_2$Seniority, income_2$Income, p)
    pred <-  trans3d(income_2$Education, income_2$Seniority, fitted(model), p)
    points(obs, col = "red", pch = 16)
    segments(obs$x, obs$y, pred$x, pred$y)
    
    Como se puede apreciar en el gráfico, hemos eliminado los errores y se adapta perfectamente a los puntos. Sin embargo, se puede apreciar que la superficie es muy ondulada pues spline es isotrópica o radial. Como dos variables difieren considerablemente en escala, necesitaremos estandarizarlas.

    with(income_2, plot(Education, Seniority, asp = 1))
    
    Las estandarizamos y representamos nuevamente:

    xt_scaled <- scale(xt)
    dat <- data.frame(xt_scaled, Income = income_2$Income)
    with(dat, plot(Education, Seniority, asp = 1))
    
    # Ajustamos el modelo a los datos escalados
    interpolation_model <- gam(Income ~ s(Education, Seniority, k = 30, sp = 0),
                               data = dat)
    # Creamos las coordenadas para el gráfico
    x <- range(dat$Education)
    x <- seq(x[1], x[2], length.out=30)
    y <- range(dat$Seniority)
    y <- seq(y[1], y[2], length.out=30)
    z <- outer(x, y, 
               function(Education,Seniority)
                         predict(interpolation_model, data.frame(Education,Seniority)))
    
    # Volvemos a transformar las coordenadas x e y a su escala original.
    # No es necesario transformar los valores esperados (predicted values, pred)
    scaled_center <- attr(xt_scaled, "scaled:center")
    scaled_scale <- attr(xt_scaled, "scaled:scale")
    xx <- x * scaled_scale[1] + scaled_center[1]
    yy <- y * scaled_scale[2] + scaled_center[2]
    
    # Usamos `xx`, `yy` y `z`
    p <- persp(xx, yy, z, theta = 30, phi = 30,
               col = "yellow",expand = 0.5, shade = 0.2,
               xlab = "Education", ylab = "Seniority", zlab = "Income")
    obs <-  trans3d(income_2$Education, income_2$Seniority, income_2$Income, p)
    pred <-  trans3d(income_2$Education, income_2$Seniority, fitted(interpolation_model), p)
    points(obs, col = "red", pch = 16)
    segments(obs$x, obs$y, pred$x, pred$y)
    

    Entradas relacionadas

    Referencias

    2018-09-15

    Gráficos de An Introduction to Statistical Learning - Figura 2.5.

    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.5. Utiliza el conjunto de datos Income2 (renta). El gráfico representa los valores observados de renta (en miles de dólares) en función de los años de educación y la antigüedad de 30 individuos. Los puntos rojos representan los valores observados para esas tres variables. La superficie amarilla representa un modelo de suavizado con thin-plate spline. En este caso . Las líneas verticales negras representan el error asociado con cada observación.

    Solución

    Prácticamente idéntica a las dos entradas anteriores, con la diferencia de que en lugar de la función loess o lm para ajustar un modelo lineal, empleamos otros modelos de suavizado con splines, con diferentes parámetros (tensor product, o bivariate).

  • Tensor product
  • Bivariate
  • income_2 <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Income2.csv")
    library(mgcv)
    model1 <- gam(Income ~ te(Education, Seniority, bs = "tp"), data = income_2) # tensor product
    model1 <- gam(Income ~ s(Education, Seniority, bs = "tp"), data = income_2) # bivariate
    x <- range(income_2$Education)
    x <- seq(x[1], x[2], length.out=30)
    y <- range(income_2$Seniority)
    y <- seq(y[1], y[2], length.out=30)
    z <- outer(x,y,
               function(Education,Seniority)
                         predict(model1, data.frame(Education,Seniority)))
    p <- persp(x,y,z, theta=30, phi=30,
               col="yellow",expand = 0.5,shade = 0.2,
               xlab="Education", ylab="Seniority", zlab="Income")
    obs <- trans3d(income_2$Education, income_2$Seniority,income_2$Income,p)
    pred <- trans3d(income_2$Education, income_2$Seniority,fitted(model1),p)
    points(obs, col="red",pch=16)
    segments(obs$x, obs$y, pred$x, pred$y)
    

    Entradas relacionadas

    Referencias

    2018-09-09

    Gráficos de An Introduction to Statistical Learning - Figura 2.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 2.4. Utiliza el conjunto de datos Income2 (renta). El gráfico representa los valores observados de renta (en miles de dólares) en función de los años de educación y la antigüedad de 30 individuos. Los puntos rojos representan los valores observados para esas tres variables. La superficie amarilla representa el modelo de ajuste de mínimos cuadrados. Las líneas verticales negras representan el error asociado con cada observación.

    Solución

    Prácticamente idéntica a la entrada anterior, con la diferencia de que en lugar de la función loess empleamos lm para ajustar un modelo lineal.

    income_2 <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Income2.csv")
    # Ajustamos el modelo
    model <- lm(Income ~ Education + Seniority, data = income_2)
    # Creamos las x e y
    x <- range(income_2$Education)
    x <- seq(x[1], x[2], length.out = 30)
    y <- range(income_2$Seniority)
    y <- seq(y[1], y[2], length.out = 30)
    # Creamos las z con las combinaciones de x e y
    z <- outer(x, y, 
               function(Education, Seniority)
                         predict(model, data.frame(Education,Seniority)))
    # Creamos el gráfico con la superficie
    p <- persp(x, y, z, theta = 30, phi = 30, 
               col = "yellow", expand = 0.5, shade = 0.2, 
               xlab="Education", ylab = "Seniority", zlab = "Income")
    # Proyección de puntos 3d a 2d para usar puntos y segmentos
    obs <-  trans3d(income_2$Education, income_2$Seniority, income_2$Income, p)
    pred <-  trans3d(income_2$Education, income_2$Seniority, fitted(model), p)
    points(obs, col = "red", pch = 16)
    segments(obs$x, obs$y, pred$x, pred$y)
    
    

    Entradas relacionadas

    Referencias

    2018-09-08

    Gráficos de An Introduction to Statistical Learning - Figura 2.3.

    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.3. Utiliza el conjunto de datos Income2 (renta). El gráfico representa los valores observados de renta (en miles de dólares) en función de los años de educación y la antigüedad de 30 individuos. Los puntos rojos representan los valores observados para esas tres variables. La superficie azul representa la verdadera relación subyacente entre la renta, los años de educación, y la antigüedad, conocida en este caso porque los datos fueron simulados. Las líneas verticales negras representan el error asociado con cada observación.

    Solución

    income_2 <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Income2.csv")
    # Ajustamos el modelo
    model <- loess(Income ~ Education + Seniority, data = income_2)
    # Creamos las x e y
    x <- range(income_2$Education)
    x <- seq(x[1], x[2], length.out = 30)
    y <- range(income_2$Seniority)
    y <- seq(y[1], y[2], length.out = 30)
    # Creamos las z con las combinaciones de x e y
    z <- outer(x, y, 
               function(Education, Seniority)
                         predict(model, data.frame(Education,Seniority)))
    # Creamos el gráfico con la superficie
    p <- persp(x, y, z, theta = 30, phi = 30, 
               col = "lightblue", expand = 0.5, shade = 0.2, 
               xlab="Education", ylab = "Seniority", zlab = "Income")
    # Proyección de puntos 3d a 2d para usar puntos y segmentos
    obs <-  trans3d(income_2$Education, income_2$Seniority, income_2$Income, p)
    pred <-  trans3d(income_2$Education, income_2$Seniority, fitted(model), p)
    points(obs, col = "red", pch = 16)
    segments(obs$x, obs$y, pred$x, pred$y)
    
    

    Entradas relacionadas

    Referencias

    Nube de datos