Análisis de Datos con R: Guía Introductoria
Análisis de Datos con R: Guía Introductoria
2022-05-19
2
Índice general
Prólogo 7
1 Introducción 9
1.1 El lenguaje y entorno estadístico R . . . . . . . . . . . . . . . . . 9
1.2 Entorno de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3 Librerías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 Una primera sesión . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5 Objetos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.6 Área de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Estructuras de datos 23
2.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 Matrices y arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.4 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3 Gráficos 37
3.1 El comando plot . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2 Funciones gráficas de bajo nivel . . . . . . . . . . . . . . . . . . . 39
3.3 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4 Parámetros gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5 Múltiples gráficos por ventana . . . . . . . . . . . . . . . . . . . . 41
3.6 Exportar gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.7 Otras librerías gráficas . . . . . . . . . . . . . . . . . . . . . . . . 43
6 Inferencia estadística 81
3
4 ÍNDICE GENERAL
6.1 Normalidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.2 Contrastes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.3 Regresión y correlación . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4 Análisis de la varianza . . . . . . . . . . . . . . . . . . . . . . . . 96
7 Modelado de datos 99
7.1 Modelos de regresión . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.2 Fórmulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.3 Ejemplo: regresión lineal simple . . . . . . . . . . . . . . . . . . . 101
11 Programación 159
11.1 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
11.2 Ejecución condicional . . . . . . . . . . . . . . . . . . . . . . . . 169
11.3 Bucles y vectorización . . . . . . . . . . . . . . . . . . . . . . . . 170
11.4 Aplicación: validación cruzada . . . . . . . . . . . . . . . . . . . . 175
Referencias 189
Bibliografía complementaria . . . . . . . . . . . . . . . . . . . . . . . . 189
A Enlaces 191
A.1 RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
ÍNDICE GENERAL 5
B Instalación de R 195
B.1 Instalación de R en Windows . . . . . . . . . . . . . . . . . . . . 196
7
8 ÍNDICE GENERAL
Capítulo 1
Introducción
9
10 CAPÍTULO 1. INTRODUCCIÓN
obteniéndose el resultado
## [1] 1 2 3 4 5 6 7 8 9 10
En el Apéndice B se detallan los pasos para la instalación de R, y en el Apéndice
C los de otras interfaces gráficas.
## [1] 4
1+2*4
## [1] 9
• Se pueden escribir varias instrucción en una misma línea separándolas por
“;”
2+2;1+2*4
## [1] 4
## [1] 9
• Se pueden recuperar líneas de instrucciones introducidas anteriormente
pulsando la tecla con la flecha ascendente del teclado, a fin de re-ejecutarlas
o modificarlas.
Para guardar este tipo de fichero se utiliza directamente el menú Archivo >
Guardar como… y se elige a continuación la ubicación en el disco duro del orde-
nador.
De igual modo para abrir un script existente se hace a través del menú Archivo
> Abrir script….
En el Apéndice A se incluyen enlaces a numerosos recursos para el aprendizaje
de R, incluyendo manuales y libros, además de otros recursos para la obtención
de ayuda.
1.3 Librerías
1.3.1 Paquetes
Al iniciar el programa R se cargan por defecto una serie de librerías básicas
con las que se pueden realizar una gran cantidad de operaciones básicas. Estas
librerías conforman el llamado paquete base.
En otras ocasiones es necesario cargar otras librerías distintas a las anterio-
res. Esto se hace a través de los llamados paquetes (packages) que pueden ser
descargados directamente de la web
[Link]
o directamente a través del menú Paquetes.
1.3.2 Instalación
La instalación de un paquete, bajo el sistema operativo Windows, se puede hacer
de varias formas:
• Desde el menú Paquetes > Instalar paquete(s)…
• Desde la ventana de consola utilizando la instrucción
[Link]("nombre del paquete")
Este proceso sólo es necesario realizarlo la primera vez que se utilice el paquete.
1.3.3 Carga
Para utilizar un paquete ya instalado será necesario cargarlo, lo cual se puede
hacer de varias formas:
• Desde el menú Paquetes > Cargar paquete(s)...
• Por consola, utilizando library(nombre del paquete)
Esta operación será necesario realizarla cada vez que se inicie una sesión de R.
Finalmente, la ayuda de un paquete se puede obtener con la sentencia
1.4. UNA PRIMERA SESIÓN 15
## [1] 8
sqrt(16) # raiz cuadrada de 16
## [1] 4
pi # R reconoce el número pi
## [1] 3.141593
Nótese que en los comandos se pueden hacer comentarios utilizando el símbolo
#.
Los resultados obtenidos pueden guardarse en objetos. Por ejemplo, al escribir
a <- 3 + 5
## [1] 8
La asignación anterior se puede hacer del siguiente modo ejemplo, al escribir
a <- 3 + 5; a
## [1] 8
Nota: Habitualmente no habrá diferencia entre la utilización de las asignaciones
hechas con = y <- (aunque nosotros emplearemos el segundo). Las diferencias
aparecen a nivel de programación y se tratarán en el Capítulo 11.
Veamos ahora un ejemplo un poco más avanzado. Con el siguiente código
• Se obtienen 200 datos simulados siguiendo una distribución gaussiana de
media 105 y desviación típica 2
• Se hace un resumen estadístico de los valores obtenidos
16 CAPÍTULO 1. INTRODUCCIÓN
Histogram of x
40
30
Frequency
20
10
0
## [1] 1 2 3 4 5 6 7 8 9 10
A
## [1] "casa"
## [1] 3.141593
1e3
## [1] 1000
Con este tipo de objetos se pueden hacer operaciones aritméticas utilizando el
operador correspondiente.
a <- 3.4
b <- 4.5
a * b
## [1] 15.3
a / b
## [1] 0.7555556
a + b
## [1] 7.9
18 CAPÍTULO 1. INTRODUCCIÓN
min(a, b)
## [1] 3.4
## [1] TRUE
B
## [1] FALSE
# valores numéricos
[Link](A)
## [1] 1
[Link](B)
## [1] 0
a <- 2
b <- 3
a == b # compara a y b
## [1] FALSE
a == a # compara a y a
## [1] TRUE
a < b
## [1] TRUE
b < a
## [1] FALSE
! (b < a) # ! niega la condición
## [1] TRUE
2**2 == 2^2
## [1] TRUE
3*2 == 3^2
## [1] FALSE
Nótese la diferencia entre = (asignación) y == (operador lógico)
2 == 3
## [1] FALSE
# 2 = 3 # produce un error:
# Error en 2 = 3 : lado izquierdo de la asignación inválida (do_set)
## [1] TRUE
TRUE | TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
TRUE | FALSE
## [1] TRUE
20 CAPÍTULO 1. INTRODUCCIÓN
## [1] FALSE
2 < 3 | 3 < 1
## [1] TRUE
## [1] "a"
Para borrar todos los objetos en memoria se puede utilizar rm(list=ls())
rm(list = ls())
## character(0)
character(0) (lista vacía) significa que no hay objetos en memoria.
[Link](nombre archivo).
rm(list = ls()) # primero borramos toda la mamoria
x <- 20
y <- 34
z <- "casa"
[Link](file = "[Link]") # guarda area de trabajo en [Link]
## [1] "d:/"
El directorio de trabajo se puede cambiar utilizando setwd(carpeta). Por ejem-
plo, para cambiar el directorio de trabajo a c:\datos, se utiliza el comando
setwd("c:/datos")
# Importante la barra utilizada
# NO funciona setwd("c:\datos")
22 CAPÍTULO 1. INTRODUCCIÓN
Capítulo 2
Estructuras de datos
En los ejemplos que hemos visto hasta ahora los objetos de R almacenaban un
único valor cada uno. Sin embargo, las estructuras de datos que proporciona R
permiten almacenar en un mismo objeto varios valores. Las principales estruc-
turas son:
• Vectores
• Matrices y Arrays
• Data Frames
• Listas
2.1 Vectores
Un vector es un conjunto de valores básicos del mismo tipo. La forma más
sencilla de crear vectores es a través de la función c() que se usa para combinar
(concatenar) valores.
x <- c(3, 5, 7)
x
## [1] 3 5 7
y <- c(8, 9)
y
## [1] 8 9
c(x, y)
## [1] 3 5 7 8 9
23
24 CAPÍTULO 2. ESTRUCTURAS DE DATOS
## [1] 1 2 3 4 5
seq(1, 5, 0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(from=1, to=5, length=9)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
rep(1, 5)
## [1] 1 1 1 1 1
## [1] 1 6 1 6 6 3 3 1 1 6
Para simular el lanzamiento de una moneda podemos escribir
resultado <- c(cara=1,cruz=0) # se le han asignado nombres al objeto
print(resultado)
## cara cruz
## 1 0
class(resultado)
## [1] "numeric"
attributes(resultado)
## $names
## [1] "cara" "cruz"
names(resultado)
2.1. VECTORES 25
## cara cara cara cruz cruz cruz cara cruz cara cruz
## 1 1 1 0 0 0 1 0 1 0
table(lanz)
## lanz
## 0 1
## 5 5
Otros ejemplos
rnorm(10) # rnorm(10, mean = 0, sd = 1)
## [1] -3 -2 -1 0 1 2 3
x[1] # primer elemento
## [1] -3
ii <- c(1, 5, 7)
x[ii] #posiciones 1, 5 y 7
## [1] -3 1 3
ii <- x>0; ii
## [1] 1 2 3
ii <- 1:3
x[-ii] # elementos de x salvo los 3 primeros
## [1] 0 1 2 3
## [1] 6 18 18 26 59 65 94
sort(x, decreasing = T)
## [1] 94 65 59 26 18 18 6
Otra posibilidad es utilizar un índice de ordenación.
ii <- order(x)
ii # índice de ordenación
## [1] 5 2 4 7 3 1 6
x[ii] # valores ordenados
## [1] 6 18 18 26 59 65 94
La función rev() devuelve los valores del vector en orden inverso.
rev(x)
## [1] 26 94 6 18 59 18 65
mean(altura)
## [1] NA
Para forzar a R a que ignore los valores perdidos se utliza la opción [Link] =
TRUE.
mean(altura, [Link] = TRUE)
## [1] 175.5
5/0 # Infinito
## [1] Inf
log(0) # -Infinito
## [1] -Inf
0/0 # Not a Number
## [1] NaN
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
LETTERS[1:10] # lo mismo en mayúscula
## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
[Link][1:6] # primeros 6 meses del año en inglés
2.1.7 Factores
Los factores se utilizan para representar datos categóricos. Se puede pensar en
ellos como vectores de enteros en los que cada entero tiene asociada una etiqueta
(label). Los factores son muy importantes en la modelización estadística ya que
Rlos trata de forma especial.
Utilizar factores con etiquetas es preferible a utilizar enteros porque las etiquetas
son auto-descriptivas.
Veamos un ejemplo. Supongamos que el vector sexo indica el sexo de un persona
codificado como 0 si hombre y 1 si mujer
sexo <- c(0, 1, 1, 1, 0, 0, 1, 0, 1)
sexo
## [1] 0 1 1 1 0 0 1 0 1
table(sexo)
## sexo
## 0 1
## 4 5
El problema de introducir así los datos es que no queda reflejado la etiquetación
de los mismos. Para ello guardaremos los datos en una estructura tipo factor:
sexo2 <- factor(sexo, labels = c("hombre", "mujer")); sexo2
## [1] hombre mujer mujer mujer hombre hombre mujer hombre mujer
## Levels: hombre mujer
levels(sexo2) # devuelve los niveles de un factor
## [1] 1 2 2 2 1 1 2 1 2
## attr(,"levels")
## [1] "hombre" "mujer"
table(sexo2)
## sexo2
## hombre mujer
## 4 5
Veamos otro ejemplo, en el que inicialmente tenemos datos categóricos. Los
niveles se toman automáticamente por orden alfabético
respuestas <- factor(c('si', 'si', 'no', 'si', 'si', 'no', 'no'))
respuestas
2.2. MATRICES Y ARRAYS 29
## [1] si si no si si no no
## Levels: no si
Si deseásemos otro orden (lo cual puede ser importante en algunos casos, por
ejemplo para representaciones gráficas), habría que indicarlo expresamente
respuestas <- factor(c('si', 'si', 'no', 'si', 'si', 'no', 'no'), levels = c('si', 'no'))
respuestas
## [1] si si no si si no no
## Levels: si no
Las matrices se pueden crear concatenando vectores con las funciones cbind o
rbind:
x <- c(3, 7, 1, 8, 4)
y <- c(7, 5, 2, 1, 0)
cbind(x, y) # por columnas
## x y
## [1,] 3 7
## [2,] 7 5
## [3,] 1 2
## [4,] 8 1
## [5,] 4 0
rbind(x, y) # por filas
Una matriz se puede crear con la función matrix donde el parámetro nrow
indica el número de filas y ncol el número de columnas. Por defecto, los valores
se colocan por columnas.
matrix(1:8, nrow = 2, ncol = 4) # equivalente a matrix(1:8, nrow=2)
## [1] 2 3
attributes(x)
## $dim
## [1] 2 3
##
## $dimnames
2.2. MATRICES Y ARRAYS 31
## $dimnames[[1]]
## [1] "fila 1" "fila 2"
##
## $dimnames[[2]]
## [1] "col 1" "col 2" "col 3"
## [1] 1
x[2, 2]
## [1] 4
x[2, ] # segunda fila
## [1] 2 4 6
x[ ,2] # segunda columna
## [1] 3 4
x[1, 1:2] # primera fila, columnas 1ª y 2ª
## [1] 1 3
La matriz ordenada por los valores de la primera columna viene dada por
ii <- order(x[ ,1])
x[ii, ] # ordenación columna 1
Función Descripción
dim(),nrow(),ncol() número de filas y/o columnas
diag() diagonal de una matrix
* multiplicación elemento a elemento
%*% multiplicación matricial de matrices
cbind(),rbind() encadenamiento de columnas o filas
t() transpuesta
solve(A) inversa de la matriz A
solve(A,b) solución del sistema de ecuaciones 𝐴𝑥 = 𝑏
qr() descomposición de Cholesky
eigen() autovalores y autovectores
svd() descomposición singular
2.2.6 Ejemplos
x <- matrix(1:6, ncol = 3)
x
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
dim(x) # dimensiones de la matriz
## [1] 2 3
## [,1] [,2]
## [1,] 2 0
## [2,] 4 2
B <- solve(A)
B # inversa
## [,1] [,2]
## [1,] 0.5 0.0
## [2,] -1.0 0.5
A %*% B # comprobamos que está bien
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
## [1] "[Link]"
[Link]
## [1] 2 1 10
[Link][ ,3] # de manera equivalente
## [1] 2 1 10
[Link]$Seccion
## [1] 2 1
[Link][2,] # segunda fila
2.4 Listas
Las listas son colecciones ordenadas de cualquier tipo de objetos (en R las listas
son un tipo especial de vectores). Así, mientras que los elementos de los vectores,
matrices y arrays deben ser del mismo tipo, en el caso de las listas se pueden
tener elementos de tipos distintos.
x <- c(1, 2, 3, 4)
y <- c("Hombre", "Mujer")
z <- matrix(1:12, ncol = 4)
datos <- list(A=x, B=y, C=z)
datos
## $A
## [1] 1 2 3 4
##
## $B
## [1] "Hombre" "Mujer"
##
## $C
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
36 CAPÍTULO 2. ESTRUCTURAS DE DATOS
Capítulo 3
Gráficos
[Figura 3.1]
El comando plot incluye por defecto una elección automáticas de títulos, ejes,
37
38 CAPÍTULO 3. GRÁFICOS
120
100
80
cars$dist
60
40
20
0
5 10 15 20 25
cars$speed
escalas, etiquetas, etc., que pueden ser modificados añadiendo parámetros gráfi-
cos al comando:
Parámetro Descripción
type tipo de gráfico:
Título
120
100
80
distancia
60
40
20
0
5 10 15 20 25
velocidad
3.3. EJEMPLOS 39
pch=16
120
100
80
dist
60
40
20
0
5 10 15 20 25
speed
Función Descripción
points y lines agregan puntos y líneas
text agrega un texto
mtext agrega texto en los márgenes
segments dibuja línea desde el punto inicial al final
abline dibuja líneas
rect dibuja rectángulos
polygon dibuja polígonos
legend agrega una leyenda
axis agrega ejes
locator devuelve coordenadas de puntos
identify similar a locator
3.3 Ejemplos
plot(cars)
abline(h = c(20, 40), lty = 2) # líneas horizontales discontinuas (lty=2)
# selecciona puntos y los dibuja en azul sólido
points(subset(cars, dist > 20 & dist < 40), pch = 16, col = 'blue')
120
100
80
ist
0
40 CAPÍTULO 3. GRÁFICOS
y2 <- sin(x)
plot( x, y1, type = "l", col = 2, lwd = 3, xlab = "[0,2pi]", ylab = "", main = "Seno y
lines(x, y2, col = 3, lwd = 3, lty = 2)
points(pi, 0, pch = 17, col = 4)
legend(0, -0.5, c("Coseno", "Seno"), col = 2:3, lty = 1:2, lwd = 3)
Seno y Coseno
1.0
0.5
(pi,0)
0.0
−0.5
Coseno
Seno
−1.0
0 1 2 3 4 5 6
[0,2pi]
Seno y Coseno
1.0
0.5
0.0
−0.5
−1.0
0 1 2 3 4 5 6
[0,2pi]
Parámetro Descripción
adj justificación del texto
axes si es FALSE no dibuja los ejes ni la caja
bg color del fondo
bty tipo de caja alrededor del gráfico
font estilo del texto
\ (1: normal, 2: cursiva, 3:negrita, 4: negrita cursiva)
las orientación de los caracteres en los ejes
mar márgenes
mfcol divide la pantalla gráfica por columnas
mfrow lo mismo que mfcol pero por filas
Los gráficos se irán mostrando en pantalla por filas. En caso de que se quieran
mostrar por columnas en la función anterior se sustituye mfrow por mfcol.
100 120
100 120
80
80
80
dist
dist
dist
60
60
60
40
40
40
20
20
20
0
5 10 15 20 25 5 10 15 20 25 5 10 15 20 25
100 120
100 120
80
80
80
dist
dist
dist
60
60
60
40
40
40
20
20
20
0
5 10 15 20 25 5 10 15 20 25 5 10 15 20 25
Otros formatos disponibles son bmp, png y tiff. Para más detalles ejecutar:
help(Devices)
– ggplot2
– rgl
– rggobi
3.7.1 Ejemplos
load("datos/[Link]")
library(lattice)
xyplot(log(salario) ~ log(salini) | sexoraza, data = empleados)
44 CAPÍTULO 3. GRÁFICOS
11.5
11.0
10.5
10.0
log(salario)
Blanca varón Minoría varón
11.5
11.0
10.5
10.0
log(salini)
library(ggplot2)
ggplot(empleados, aes(log(salini), log(salario), col = sexo)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE)
12.0
11.5
11.0
log(salario)
sexo
Hombre
Mujer
10.5
10.0
8e−05
6e−05
sexo
density
Hombre
4e−05
Mujer
2e−05
0e+00
5e+04 1e+05
salario
46 CAPÍTULO 3. GRÁFICOS
Capítulo 4
## [1] "empleados"
47
48 CAPÍTULO 4. MANIPULACIÓN DE DATOS CON R
ls()
# head(datos)
str(datos)
Por lo tanto, la lectura del fichero [Link] se puede hacer de modo más directo
con:
4.2. MANIPULACIÓN DE DATOS 51
Veamos un ejemplo:
tipo <- c("A", "B", "C")
longitud <- c(120.34, 99.45, 115.67)
datos <- [Link](tipo, longitud)
datos
## tipo longitud
## 1 A 120.34
## 2 B 99.45
## 3 C 115.67
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
Utilizando el comando help(cars) se obtiene que cars es un [Link] con
50 observaciones y dos variables:
• speed: Velocidad (millas por hora)
• dist: tiempo hasta detenerse (pies)
Recordemos que, para acceder a la variable speed se puede hacer directamente
con su nombre o bien utilizando notación “matricial”.
cars$speed
## [1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15
## [26] 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24 24 24 24 25
cars[, 1] # Equivalente
## [1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15
## [26] 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24 24 24 24 25
Supongamos ahora que queremos transformar la variable original speed (millas
por hora) en una nueva variable velocidad (kilómetros por hora) y añadir esta
nueva variable al [Link] cars. La transformación que permite pasar millas
a kilómetros es kilómetros=millas/0.62137 que en R se hace directamente
con:
cars$speed/0.62137
## 2 4 10 6.437388
## 3 7 4 11.265430
## 4 7 22 11.265430
## 5 8 16 12.874777
## 6 9 10 14.484124
También transformaremos la variable dist (en pies) en una nueva va-
riable distancia (en metros). Ahora la transformación deseada es
metros=pies/3.2808:
cars$distancia <- cars$dis / 3.2808
head(cars)
ordenación utilizando los valores de dist. Para ello utilizaremos el conocido co-
mo vector de índices de ordenación. Este vector establece el orden en que tienen
que ser elegidos los elementos para obtener la ordenación deseada. Veamos un
ejemplo sencillo:
x <- c(2.5, 4.3, 1.2, 3.1, 5.0) # valores originales
ii <- order(x)
ii # vector de ordenación
## [1] 3 1 4 2 5
x[ii] # valores ordenados
Sin embargo, para ordenar [Link] será necesario la utilización del vector
de índices de ordenación. A continuación, los datos de cars ordenados por dist:
ii <- order(cars$dist) # Vector de índices de ordenación
cars2 <- cars[ii, ] # Datos ordenados por dist
head(cars2)
[Link] Filtrado
El filtrado de datos consiste en elegir una submuestra que cumpla determinadas
condiciones. Para ello se puede utilizar la función subset() (que además permite
seleccionar variables).
A continuación se muestran un par de ejemplos:
subset(cars, dist > 85) # datos con dis>85
## int [1:3] 19 22 23
cars[it, 1:2]
## speed dist
## 19 13 46
## 22 14 60
## 23 14 80
# rownames(cars[it, 1:2])
id <- which(!ii)
str(cars[id, 1:2])
Análisis exploratorio de
datos
## Etiquetas
## id Código de empleado
## sexo Sexo
## fechnac Fecha de nacimiento
## educ Nivel educativo (años)
## catlab Categoría Laboral
## salario Salario actual
## salini Salario inicial
## tiempemp Meses desde el contrato
## expprev Experiencia previa (meses)
57
58 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
## sexo
## Hombre Mujer
## 258 216
[Link](table(sexo))
## sexo
## Hombre Mujer
## 0.5443038 0.4556962
table(sexo,catlab)
## catlab
## sexo Administrativo Seguridad Directivo
## Hombre 157 27 74
## Mujer 206 0 10
[Link](table(sexo,catlab))
## catlab
## sexo Administrativo Seguridad Directivo
## Hombre 0.33122363 0.05696203 0.15611814
## Mujer 0.43459916 0.00000000 0.02109705
[Link](table(sexo,catlab), 1)
## catlab
## sexo Administrativo Seguridad Directivo
## Hombre 0.6085271 0.1046512 0.2868217
## Mujer 0.9537037 0.0000000 0.0462963
[Link](table(sexo,catlab), 2)
## catlab
## sexo Administrativo Seguridad Directivo
## Hombre 0.4325069 1.0000000 0.8809524
## Mujer 0.5674931 0.0000000 0.1190476
5.1. MEDIDAS RESUMEN 59
table(catlab,educ,sexo)
## , , sexo = Hombre
##
## educ
## catlab 8 12 14 15 16 17 18 19 20 21
## Administrativo 10 48 6 78 10 2 2 1 0 0
## Seguridad 13 13 0 1 0 0 0 0 0 0
## Directivo 0 1 0 4 25 8 7 26 2 1
##
## , , sexo = Mujer
##
## educ
## catlab 8 12 14 15 16 17 18 19 20 21
## Administrativo 30 128 0 33 14 1 0 0 0 0
## Seguridad 0 0 0 0 0 0 0 0 0 0
## Directivo 0 0 0 0 10 0 0 0 0 0
round([Link](table(catlab,educ,sexo)),2)
## , , sexo = Hombre
##
## educ
## catlab 8 12 14 15 16 17 18 19 20 21
## Administrativo 0.02 0.10 0.01 0.16 0.02 0.00 0.00 0.00 0.00 0.00
## Seguridad 0.03 0.03 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## Directivo 0.00 0.00 0.00 0.01 0.05 0.02 0.01 0.05 0.00 0.00
##
## , , sexo = Mujer
##
## educ
## catlab 8 12 14 15 16 17 18 19 20 21
## Administrativo 0.06 0.27 0.00 0.07 0.03 0.00 0.00 0.00 0.00 0.00
## Seguridad 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## Directivo 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00
Si la variable es ordinal, entonces también son de interés las frecuencias acumu-
ladas
table(educ)
## educ
## 8 12 14 15 16 17 18 19 20 21
## 53 190 6 116 59 11 9 27 2 1
[Link](table(educ))
## educ
60 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
## 8 12 14 15 16 17
## 0.111814346 0.400843882 0.012658228 0.244725738 0.124472574 0.023206751
## 18 19 20 21
## 0.018987342 0.056962025 0.004219409 0.002109705
cumsum(table(educ))
## 8 12 14 15 16 17 18 19 20 21
## 53 243 249 365 424 435 444 471 473 474
cumsum([Link](table(educ)))
## 8 12 14 15 16 17 18 19
## 0.1118143 0.5126582 0.5253165 0.7700422 0.8945148 0.9177215 0.9367089 0.9936709
## 20 21
## 0.9978903 1.0000000
## [1] 6.528571
dotchart(consumo,pch=16)
text(mean(consumo),2.5, pos=3,expression(bar(X)==6.53))
arrows(mean(consumo),0,mean(consumo),2.5,length = 0.15,col='red')
X = 6.53
mean(salario)
## [1] 34419.57
mean(subset(empleados,catlab=='Directivo')$salario)
## [1] 63977.8
También se puede utilizar la función tapply, que se estudiará con detalle más
adelante
tapply(salario, catlab, mean)
## [1] 0.06571429
var(salario)
## [1] 291578214
La cuasi-desviación típica se calcula
sd(consumo)
## [1] 0.256348
sd(salario)
## [1] 17075.66
o, equivalentemente,
sqrt(var(consumo))
## [1] 0.256348
sqrt(var(salario))
## [1] 17075.66
La media de dispersión adimensional (relativa) más utilizada es el coeficiente de
variación (de Pearson)
sd(consumo)/abs(mean(consumo))
## [1] 0.03926555
que también podemos expresar en tanto por cien
62 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
100*sd(consumo)/abs(mean(consumo))
## [1] 3.926555
El coeficiente de variación nos permite, entre otras cosas, comparar dispersiones
de variables medidas en diferentes unidades
100*sd(salini)/abs(mean(salini))
## [1] 46.2541
100*sd(salario)/abs(mean(salario))
## [1] 49.61033
100*sd(expprev)/abs(mean(expprev))
## [1] 109.1022
media
mediana
diámetro
5.1. MEDIDAS RESUMEN 63
## [1] 34419.57
## [1] 28875
## [1] 0.6940928
paste('El ', round(100*mean(salario < mean(salario)),0), '%',
' de los empleados tienen un salario inferior al salario medio', sep='')
## [1] "El 69% de los empleados tienen un salario inferior al salario medio"
## [1] 0.5
## [1] 2.5
quantile(c(1,2,3,4),0.5)
## 50%
## 2.5
quantile(c(1,2,3,4),0.5,type=1)
## 50%
## 2
## Rango RI
## 1 119250 12937.5
5.1.5 Summary
summary(empleados)
5.2 Gráficos
table(catlab)
5.2.1 Diagrama de barras y gráfico de sectores
## catlab
## Administrativo Seguridad Directivo
## 363 27 84
par(mfrow = c(1, 3))
barplot(table(catlab),main="frecuencia absoluta")
barplot(100*[Link](table(catlab)),main="frecuencia relativa (%)")
pie(table(catlab))
66 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
350
70
300
60
250
50
Administrativo
200
40
Directivo
150
30
Seguridad
100
20
50
10
0
nj <- table(educ)
fj <- [Link](nj)
Nj <- cumsum(nj)
Fj <- cumsum(fj)
layout(matrix(c(1,2,5,3,4,5), 2, 3, byrow=TRUE), respect=TRUE)
barplot(nj,main="frecuencia absolutas",xlab='años de estudio')
barplot(fj,main="frecuencia relativas",xlab='años de estudio')
barplot(Nj,main="frecuencia absolutas acumuladas",xlab='años de estudio')
barplot(Fj,main="frecuencia relativas acumuladas",xlab='años de estudio')
pie(nj,col=rainbow(6),main='años de estudio')
5.2. GRÁFICOS 67
0.4
100 150
0.3
0.2
0.1
50
0.0
0
12
8 14 16 18 20 8 14 16 18 20
8
años de estudio años de estudio
21
20
14
19
18
frecuencia absolutas acumuladas frecuencia relativas acumuladas 17
15 16
0.8
300
0.4
0 100
0.0
8 14 16 18 20 8 14 16 18 20
Con datos continuos, podemos hacer uso de la función cut (más adelante veremos
como se representa el histograma)
table(cut(expprev, breaks=5))
##
## (-0.476,95.2] (95.2,190] (190,286] (286,381] (381,476]
## 312 81 46 22 13
barplot(table(cut(expprev,breaks=5)),xlab="Experiencia previa",
main="Categorización en 5 clases")
68 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
Categorización en 5 clases
300
250
200
150
100
50
0
Experiencia previa
Categorización en 5 clases
150
100
50
0
Experiencia previa
salarios
stripchart(salario~sexo, method='jitter')
Mujer
Hombre
salario
##
## The decimal point is 4 digit(s) to the right of the |
##
70 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
## 1 | 666666777777777778888999
## 2 | 00000000000000111111111111111111122222222222222222222222233333333333+148
## 3 | 00000000000000000001111111111111111111111111122222222222223333333333+36
## 4 | 0000000001112222334445555666778899
## 5 | 0111123344555556677778999
## 6 | 0001122355566777888999
## 7 | 00134455889
## 8 | 01346
## 9 | 1127
## 10 | 044
## 11 | 1
## 12 |
## 13 | 5
stem(tiempemp)
##
## The decimal point is at the |
##
## 62 | 000
## 64 | 00000000000000000000000
## 66 | 000000000000000000000000000000000
## 68 | 0000000000000000000000000000000
## 70 | 0000000000000000
## 72 | 00000000000000000000000000
## 74 | 000000000000000
## 76 | 00000000000000000000000
## 78 | 000000000000000000000000000000000000
## 80 | 00000000000000000000000000000000000000
## 82 | 0000000000000000000000000000000000
## 84 | 000000000000000000000000
## 86 | 000000000000000000000000
## 88 | 00000000000000000000
## 90 | 00000000000000000000000000000
## 92 | 00000000000000000000000000000000000000
## 94 | 00000000000000000000
## 96 | 000000000000000000000000000
## 98 | 00000000000000
5.2.4 Histograma
Este gráfico es uno de los más habituales para representar datos continuos
5.2. GRÁFICOS 71
100
50
0
salario
3 intervalos de clase
400
300
Frequency
200
100
0
salario
30
25
20
Frequency
15
10
5
0
salario
2e−05
1e−05
0e+00
salario
plot(density(salario))
[Link](x = salario)
5e−05
4e−05
3e−05
Density
2e−05
1e−05
0e+00
2e−05
1e−05
0e+00
salario
sexo
Hombre
8e−05
Mujer
6e−05
Density
4e−05
2e−05
0e+00
salario
par(mfrow=c(1,2))
boxplot(salario~catlab)
boxplot(salario~sexo)
5.2. GRÁFICOS 75
120000
120000
80000
80000
salario
salario
60000
60000
40000
40000
20000
20000
Administrativo Directivo Hombre Mujer
catlab sexo
par(mfrow=c(1,1))
boxplot(salario~sexo*catlab)
120000
80000
salario
60000
40000
20000
sexo : catlab
boxplot(salini, salario)
76 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
120000
20000 40000 60000 80000
1 2
hist(salario,probability=T,ylab="",col='grey',axes=F,main=""); axis(1)
lines(density(salario),col='red',lwd=2)
par(new=T)
boxplot(salario,horizontal=T,axes=F,lwd=2)
salario
plot(educ,salario)
120000
80000
salario
60000
40000
20000
8 10 12 14 16 18 20
educ
plot(tiempemp,salario)
120000
80000
salario
60000
40000
20000
65 70 75 80 85 90 95
tiempemp
plot(salini,salario)
78 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
120000
80000
salario
60000
40000
20000
salini
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432
plot(AirPassengers)
5.2. GRÁFICOS 79
600
500
AirPassengers
400
300
200
100
Time
1.5
1.0
0.5
1 2 3 4 5 6 7
Longitud de pétalo
[Link]<-c("red","green","blue")[iris$Species]
plot(iris[,3],iris[,4],col=[Link],main="Longitud y anchura
de pétalo según especies",xlab="Longitud de pétalo",
ylab="Anchura de pétalo")
legend("topleft",c("Setosa","Versicolor","Virginica"),pch=1,
80 CAPÍTULO 5. ANÁLISIS EXPLORATORIO DE DATOS
col=c("red","green","blue"),[Link]=0)
Longitud y anchura
de pétalo según especies
2.5
Setosa
Versicolor
Virginica
2.0
Anchura de pétalo
1.5
1.0
0.5
1 2 3 4 5 6 7
Longitud de pétalo
pairs(iris[,1:4],col=[Link])
2.0 2.5 3.0 3.5 4.0 0.5 1.0 1.5 2.0 2.5
7.5
6.5
[Link]
5.5
4.5
4.0
[Link]
3.0
2.0
7
6
5
[Link]
4
3
2
1
2.5
1.5
[Link]
0.5
Inferencia estadística
Listado de etiquetas
[Link](attr(hatco, "[Link]"))
## attr(hatco, "[Link]")
## empresa Empresa
## tamano Tamaño de la empresa
## adquisic Estructura de adquisición
## tindustr Tipo de industria
## tsitcomp Tipo de situación de compra
## velocida Velocidad de entrega
## precio Nivel de precios
## flexprec Flexibilidad de precios
## imgfabri Imagen del fabricante
## servconj Servicio conjunto
## imgfvent Imagen de fuerza de ventas
## calidadp Calidad de producto
## fidelida Porcentaje de compra a HATCO
## satisfac Satisfacción global
81
82 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
6.1 Normalidad
Histogram of hatco$satisfac
20
15
Frequency
10
5
0
3 4 5 6 7
hatco$satisfac
qqnorm(hatco$satisfac)
6.2. CONTRASTES 83
6.5
6.0
Sample Quantiles
5.5
5.0
4.5
4.0
3.5
−2 −1 0 1 2
Theoretical Quantiles
[Link](hatco$satisfac)
##
## Shapiro-Wilk normality test
##
## data: hatco$satisfac
## W = 0.97608, p-value = 0.06813
6.2 Contrastes
6.2.1 Una muestra
Obtenemos un intervalo de confianza de satisfac
[Link](hatco$satisfac) # with(hatco, [Link](satisfac))
##
## One Sample t-test
##
## data: hatco$satisfac
## t = 55.301, df = 98, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 4.603406 4.946089
## sample estimates:
## mean of x
## 4.774747
Contrastamos si es razonable suponer que la media es 5
84 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
[Link](hatco$satisfac, mu=5)
##
## One Sample t-test
##
## data: hatco$satisfac
## t = -2.6089, df = 98, p-value = 0.01051
## alternative hypothesis: true mean is not equal to 5
## 95 percent confidence interval:
## 4.603406 4.946089
## sample estimates:
## mean of x
## 4.774747
##
## One Sample t-test
##
## data: hatco$satisfac
## t = -2.6089, df = 98, p-value = 0.01051
## alternative hypothesis: true mean is not equal to 5
## 99 percent confidence interval:
## 4.547935 5.001560
## sample estimates:
## mean of x
## 4.774747
##
## One Sample t-test
##
## data: hatco$satisfac
## t = -2.6089, df = 98, p-value = 0.005253
## alternative hypothesis: true mean is less than 5
## 95 percent confidence interval:
## -Inf 4.918122
## sample estimates:
## mean of x
## 4.774747
##
## One Sample t-test
##
## data: hatco$satisfac
## t = 1.4448, df = 98, p-value = 0.07585
## alternative hypothesis: true mean is greater than 4.65
## 95 percent confidence interval:
## 4.631373 Inf
## sample estimates:
## mean of x
## 4.774747
El test de los rangos con signo de Wilcoxon es un contraste no paramétrico
(exige que la distribución sea simétrica) que se puede utilizar como alternativa
al contraste t de Student
with(hatco, [Link](satisfac, mu=5))
##
## Wilcoxon signed rank test with continuity correction
##
## data: satisfac
## V = 1574, p-value = 0.01303
## alternative hypothesis: true location is not equal to 5
##
## Two Sample t-test
##
## data: fidelida by nsatisfa
## t = -6.5833, df = 97, p-value = 2.363e-09
## alternative hypothesis: true difference in means between group bajo and group alto is not equa
## 95 percent confidence interval:
## -12.915013 -6.931653
## sample estimates:
## mean in group bajo mean in group alto
## 41.72778 51.65111
Si no se asume igualdad de varianzas, se calcula la variante Welch del test t
86 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
##
## Welch Two Sample t-test
##
## data: fidelida by nsatisfa
## t = -6.6901, df = 96.995, p-value = 1.437e-09
## alternative hypothesis: true difference in means between group bajo and group alto i
## 95 percent confidence interval:
## -12.86727 -6.97940
## sample estimates:
## mean in group bajo mean in group alto
## 41.72778 51.65111
Comparemos visualmente las varianzas
boxplot(fidelida ~ nsatisfa, data = hatco)
60
50
fidelida
40
30
bajo alto
nsatisfa
##
## F test to compare two variances
##
## data: fidelida by nsatisfa
## F = 1.4248, num df = 53, denom df = 44, p-value = 0.2292
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.797925 2.505462
6.2. CONTRASTES 87
## sample estimates:
## ratio of variances
## 1.424804
Una alternativa no paramétrica
[Link](fidelida ~ nsatisfa, data = hatco)
##
## Bartlett test of homogeneity of variances
##
## data: fidelida by nsatisfa
## Bartlett's K-squared = 1.4675, df = 1, p-value = 0.2257
También puede utilizarse el test de Wilcoxon como alternativa al test t
[Link](fidelida ~ nsatisfa, data = hatco)
##
## Wilcoxon rank sum test with continuity correction
##
## data: fidelida by nsatisfa
## W = 430.5, p-value = 3.504e-08
## alternative hypothesis: true location shift is not equal to 0
Si disponemos de datos apareados, por ejemplo nivel de precios e imagen de
fuerza de ventas
with(hatco, [Link](precio, imgfvent, paired = TRUE))
##
## Paired t-test
##
## data: precio and imgfvent
## t = -2.2347, df = 98, p-value = 0.02771
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.55114759 -0.03269079
## sample estimates:
## mean of the differences
## -0.2919192
Y la correspondiente alternativa no paramétrica
with(hatco, [Link](precio, imgfvent, paired = TRUE))
##
## Wilcoxon signed rank test with continuity correction
##
## data: precio and imgfvent
## V = 1789.5, p-value = 0.02431
88 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
##
## Call:
## lm(formula = satisfac ~ fidelida, data = hatco)
##
## Coefficients:
## (Intercept) fidelida
## 1.6074 0.0685
modelo <- lm(satisfac ~ fidelida, data = hatco, [Link]=[Link])
summary(modelo)
##
## Call:
## lm(formula = satisfac ~ fidelida, data = hatco, [Link] = [Link])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.47492 -0.37341 0.09358 0.38258 1.25258
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.607399 0.322436 4.985 2.71e-06 ***
## fidelida 0.068500 0.006848 10.003 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6058 on 97 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.5078, Adjusted R-squared: 0.5027
## F-statistic: 100.1 on 1 and 97 DF, p-value: < 2.2e-16
plot(hatco$fidelida, hatco$satisfac) # Cuidado con el orden de las variables
# with(hatco, plot(fidelida, satisfac)) # Alternativa empleando with
# plot(satisfac ~ fidelida, data = hatco) # Alternativa empleando fórmulas
abline(modelo)
6.3. REGRESIÓN Y CORRELACIÓN 89
6.5
6.0
5.5
hatco$satisfac
5.0
4.5
4.0
3.5
30 40 50 60
hatco$fidelida
Valores ajustados
fitted(modelo)
## 1 2 3 4 5 6 7 8
## 3.799412 4.552917 4.895419 3.799412 5.580423 4.689918 4.758418 4.621417
## 9 10 11 12 13 14 15 16
## 5.922925 5.306421 3.799412 4.826919 4.278915 4.210415 5.306421 4.963919
## 17 18 19 20 21 22 23 24
## 4.210415 4.347416 5.306421 5.374922 4.415916 4.004913 5.374922 4.073414
## 25 26 27 28 29 30 31 32
## 4.963919 4.963919 4.073414 5.306421 4.963919 4.758418 4.552917 5.237921
## 33 34 35 36 37 38 39 40
## 5.717424 4.847469 4.004913 4.278915 4.621417 4.758418 3.593911 3.525410
## 41 42 43 44 45 46 47 48
## 4.347416 5.580423 5.237921 4.895419 4.210415 5.306421 5.374922 4.552917
## 49 50 51 52 53 54 55 56
## 5.511923 5.237921 4.415916 5.237921 5.032420 3.799412 4.278915 4.826919
## 57 58 59 60 61 62 63 64
## 5.854425 6.059926 4.758418 5.032420 5.306421 5.717424 4.826919 4.073414
## 65 66 67 68 69 70 71 72
## 4.347416 4.689918 5.648924 4.758418 5.580423 4.963919 5.032420 5.374922
## 73 74 75 76 77 78 79 80
## 5.100920 5.717424 4.415916 4.963919 4.484416 4.826919 4.278915 5.443422
## 81 82 83 84 85 86 87 88
## 5.648924 4.847469 4.415916 4.141914 5.237921 4.552917 5.100920 4.073414
## 89 90 91 92 93 94 95 96
## 3.936413 5.717424 4.963919 4.278915 4.552917 4.073414 3.730912 3.319909
90 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
## 97 98 99 100
## 5.717424 4.210415 4.484416 NA
Residuos
head(resid(modelo))
## 1 2 3 4 5 6
## 0.4005878 -0.2529168 0.3045811 0.1005878 1.2195769 -0.2899177
qqnorm(resid(modelo))
0.0
−0.5
−1.0
−1.5
−2 −1 0 1 2
Theoretical Quantiles
[Link](resid(modelo))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo)
## W = 0.98515, p-value = 0.3325
plot(hatco$fidelida, hatco$satisfac)
abline(modelo)
# segments(hatco$fidelida, fitted(modelo), hatco$fidelida, hatco$satisfac)
with(hatco, segments(fidelida, fitted(modelo), fidelida, satisfac))
6.3. REGRESIÓN Y CORRELACIÓN 91
6.5
6.0
5.5
hatco$satisfac
5.0
4.5
4.0
3.5
30 40 50 60
hatco$fidelida
plot(fitted(modelo), resid(modelo))
1.0
0.5
resid(modelo)
0.0
−0.5
−1.0
−1.5
fitted(modelo)
Banda de confianza
predict(modelo, interval='confidence')
Banda de predicción
head(predict(modelo, interval='prediction'))
5
4
3
2
30 40 50 60
hatco$fidelida
6.3.2 Correlación
Coeficiente de correlación de Pearson
6.3. REGRESIÓN Y CORRELACIÓN 95
## [1] 0.712581
cor(hatco[,6:14], use='[Link]')
##
## Pearson's product-moment correlation
##
## data: hatco$fidelida and hatco$satisfac
## t = 10.003, df = 97, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.5995024 0.7977691
## sample estimates:
## cor
## 0.712581
El coeficiente de correlación de Spearman es una variante no paramétrica
[Link](hatco$fidelida, hatco$satisfac, method='spearman')
##
## Spearman's rank correlation rho
##
96 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
##
## bajo medio alto
## 3 64 33
tapply(hatco$satisfac, hatco$nfidelid, mean, [Link] = TRUE)
## Call:
## aov(formula = satisfac ~ nfidelid, data = hatco)
##
6.4. ANÁLISIS DE LA VARIANZA 97
## Terms:
## nfidelid Residuals
## Sum of Squares 23.83161 48.49526
## Deg. of Freedom 2 96
##
## Residual standard error: 0.7107454
## Estimated effects may be unbalanced
## 1 observation deleted due to missingness
summary(aov(satisfac~nfidelid, data = hatco))
##
## Pairwise comparisons using t tests with pooled SD
##
## data: hatco$satisfac and hatco$nfidelid
##
## bajo medio
## medio 0.024 -
## alto 4.6e-05 5.5e-08
##
## P value adjustment method: holm
Relajamos la hipótesis de varianzas iguales
[Link](satisfac~nfidelid, data = hatco)
##
## One-way analysis of means (not assuming equal variances)
##
## data: satisfac and nfidelid
## F = 35.013, num df = 2.0000, denom df = 6.7661, p-value = 0.0002697
Podemos utilizar el test de Bartlett para contrastar la igualdad de varianzas
[Link](satisfac~nfidelid, data = hatco)
##
## Bartlett test of homogeneity of variances
##
98 CAPÍTULO 6. INFERENCIA ESTADÍSTICA
5.0
4.5
4.0
3.5
##
## Kruskal-Wallis rank sum test
##
## data: satisfac by nfidelid
## Kruskal-Wallis chi-squared = 31.073, df = 2, p-value = 1.789e-07
Capítulo 7
Modelado de datos
La realidad puede ser muy compleja por lo que es habitual emplear un modelo
para tratar de explicarla.
• Modelos estocásticos (con componente aleatoria).
– Tienen en cuenta la incertidumbre debida a no disponer de la sufi-
ciente información sobre las variables que influyen en el fenómeno en
estudio.
– La inferencia estadística proporciona herramientas para ajustar y con-
trastar la validez del modelo a partir de los datos observados.
Sin embargo resultaría muy extraño que la realidad coincida exactamente con
un modelo concreto.
• George Box afirmó en su famoso aforismo:
En esencia, todos los modelos son falsos, pero algunos son útiles.
• El objetivo de un modelo es disponer de una aproximación simple de la
realidad que sea útil.
𝑌 = 𝑓(𝑋1 , ⋯ , 𝑋𝑝 ) + 𝜀
donde:
• 𝑌 ≡ variable respuesta (o dependiente).
• (𝑋1 , ⋯ , 𝑋𝑝 ) ≡ variables explicativas (independientes, o covariables).
99
100 CAPÍTULO 7. MODELADO DE DATOS
• 𝜀 ≡ error aleatorio.
7.2 Fórmulas
En R para especificar un modelo estadístico (realmente una familia) se suelen
emplear fórmulas (también para generar gráficos). Son de la forma:
respuesta ~ modelo
Operador Descripción
a+b incluye a y b (efectos principales)
-b excluye b del modelo
a:b interacción de a y b
\ b %in% a efectos de b anidados en a (a:b)
\ a/b = a + b %in% a = a + a:b
7.3. EJEMPLO: REGRESIÓN LINEAL SIMPLE 101
Operador Descripción
a*b = a+b+a:b efectos principales más interacciones
^n interacciones hasta nivel n ((a+b)^2 = a+b+a:b)
poly(a, n) polinomios de a hasta grado n
1 término constante
. todas las variables disponibles o modelo actual en actualizaciones
Modelos lineales
𝑌 = 𝛽0 + 𝛽1 𝑋1 + 𝛽2 𝑋2 + ⋯ + 𝛽𝑝 𝑋𝑝 + 𝜀
8.1 Ejemplo
El fichero [Link] contiene observaciones de clientes de la compañía de
distribución industrial (Compañía Hair, Anderson y Tatham). Las variables se
pueden clasificar en tres grupos:
load('datos/[Link]')
[Link](attr(hatco, "[Link]"))
## attr(hatco, "[Link]")
## empresa Empresa
## tamano Tamaño de la empresa
## adquisic Estructura de adquisición
## tindustr Tipo de industria
## tsitcomp Tipo de situación de compra
## velocida Velocidad de entrega
## precio Nivel de precios
## flexprec Flexibilidad de precios
## imgfabri Imagen del fabricante
## servconj Servicio conjunto
## imgfvent Imagen de fuerza de ventas
## calidadp Calidad de producto
103
104 CAPÍTULO 8. MODELOS LINEALES
0 2 4 3 5 7 1.0 3.0 30 50
4
velocida
0
precio
0 3
5 8
flexprec
7
imgfabri
3
4
servconj
1
4.5
imgfvent
1.0
8
calidadp
4
fidelida
30
0 2 4 6 5 7 9 1 3 4 6 8
##
## Call:
## lm(formula = fidelida ~ servconj, data = datos)
##
## Coefficients:
## (Intercept) servconj
## 21.98 8.30
Al imprimir el ajuste resultante se muestra un pequeño resumen del ajuste
(aunque el objeto que contiene los resultados es una lista).
Para obtener un resumen más completo se puede utilizar la función summary().
summary(modelo)
##
## Call:
## lm(formula = fidelida ~ servconj, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.1956 -4.0655 0.2944 4.5945 11.9744
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 21.9754 2.6086 8.424 3.34e-13 ***
## servconj 8.3000 0.8645 9.601 9.76e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.432 on 97 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.4872, Adjusted R-squared: 0.482
106 CAPÍTULO 8. MODELOS LINEALES
60
50
fidelida
40
30
1 2 3 4
servconj
Función Descripción
fitted valores ajustados
coef coeficientes estimados (y errores estándar)
confint intervalos de confianza para los coeficientes
residuals residuos
plot gráficos de diagnóstico
termplot gráfico de efectos parciales
anova calcula tablas de análisis de varianza (también permite comparar
modelos)
predict calcula predicciones para nuevos datos
Ejemplo:
8.2. AJUSTE: FUNCIÓN LM 107
##
## Call:
## lm(formula = fidelida ~ servconj + flexprec, data = hatco)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.2549 -2.2850 0.3411 3.3260 7.0853
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.4617 2.9734 -1.164 0.247
## servconj 7.8287 0.5897 13.276 <2e-16 ***
## flexprec 3.4017 0.3191 10.661 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.375 on 96 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.7652, Adjusted R-squared: 0.7603
## F-statistic: 156.4 on 2 and 96 DF, p-value: < 2.2e-16
confint(modelo2)
## 2.5 % 97.5 %
## (Intercept) -9.363813 2.440344
## servconj 6.658219 8.999274
## flexprec 2.768333 4.035030
anova(modelo2)
Muchas de estas funciones genéricas son válidas para otros tipos de modelos
(glm, …).
108 CAPÍTULO 8. MODELOS LINEALES
## [1] 4.375074
res$[Link]
## [1] 0.7603292
8.3 Predicción
Para calcular predicciones (estimaciones de la media condicionada) se puede
emplear la función predict() (ejecutar help([Link]) para ver todas las
opciones disponibles). Por defecto obtiene las predicciones correspondientes a
las observaciones (modelo$[Link]). Para otros casos hay que emplear
el argumento newdata:
• [Link] con los valores de (todas) las covariables, sus nombres deben
coincidir con los originales.
Ejemplo:
valores <- 0:5
pred <- predict(modelo, newdata = [Link](servconj = valores))
pred
## 1 2 3 4 5 6
## 21.97544 30.27548 38.57552 46.87556 55.17560 63.47564
plot(fidelida ~ servconj, datos)
lines(valores, pred)
8.3. PREDICCIÓN 109
60
50
fidelida
40
30
1 2 3 4
servconj
Ajuste
60 Int. confianza
Int. predicción
50
fidelida
40
30
1 2 3 4
servconj
##
## Call:
## lm(formula = fidelida ~ ., data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.3351 -2.0733 0.5224 2.9218 6.7106
##
## Coefficients:
8.4. SELECCIÓN DE VARIABLES EXPLICATIVAS 111
##
## Call:
## lm(formula = fidelida ~ velocida + precio + flexprec + servconj +
## imgfvent + calidadp, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.2195 -2.0022 0.4724 2.9514 6.8328
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.9900 4.5656 -2.188 0.0312 *
## velocida -0.5207 1.9254 -0.270 0.7874
## precio -1.0017 1.9986 -0.501 0.6174
## flexprec 3.4709 0.3962 8.761 9.23e-14 ***
## servconj 8.9111 3.7230 2.394 0.0187 *
## imgfvent 1.3699 0.5883 2.329 0.0221 *
## calidadp 0.4844 0.3432 1.411 0.1615
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.26 on 92 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.7867, Adjusted R-squared: 0.7728
## F-statistic: 56.56 on 6 and 92 DF, p-value: < 2.2e-16
Para obtener el modelo “óptimo” lo ideal sería evaluar todos los modelos posi-
112 CAPÍTULO 8. MODELOS LINEALES
bles.
0.78
0.78
0.77
adjr2
0.77
0.77
0.76
0.48
(Intercept)
velocida
precio
flexprec
imgfabri
servconj
imgfvent
calidadp
En este caso (considerando que una mejora del 2% no es significativa), el modelo
resultante sería:
lm(fidelida ~ servconj + flexprec, data = hatco)
##
## Call:
## lm(formula = fidelida ~ servconj + flexprec, data = hatco)
##
## Coefficients:
## (Intercept) servconj flexprec
## -3.462 7.829 3.402
Notas:
##
## Direction: forward/backward
## Criterion: BIC
##
## Start: AIC=437.24
## fidelida ~ 1
##
## Df Sum of Sq RSS AIC
## + servconj 1 3813.6 4013.2 375.71
## + velocida 1 3558.5 4268.2 381.81
## + flexprec 1 2615.5 5211.3 401.57
## + imgfvent 1 556.9 7269.9 434.53
## + imgfabri 1 394.2 7432.5 436.72
## <none> 7826.8 437.24
## + calidadp 1 325.8 7501.0 437.63
## + precio 1 46.2 7780.6 441.25
##
## Step: AIC=375.71
8.4. SELECCIÓN DE VARIABLES EXPLICATIVAS 115
## fidelida ~ servconj
##
## Df Sum of Sq RSS AIC
## + flexprec 1 2175.6 1837.6 302.97
## + precio 1 831.5 3181.7 357.32
## + velocida 1 772.3 3240.9 359.15
## + calidadp 1 203.8 3809.4 375.15
## <none> 4013.2 375.71
## + imgfvent 1 74.8 3938.4 378.44
## + imgfabri 1 2.3 4010.9 380.25
## - servconj 1 3813.6 7826.8 437.24
##
## Step: AIC=302.97
## fidelida ~ servconj + flexprec
##
## Df Sum of Sq RSS AIC
## + imgfvent 1 129.8 1707.7 300.31
## <none> 1837.6 302.97
## + imgfabri 1 69.3 1768.3 303.76
## + calidadp 1 50.7 1786.9 304.80
## + precio 1 0.2 1837.4 307.56
## + velocida 1 0.0 1837.5 307.57
## - flexprec 1 2175.6 4013.2 375.71
## - servconj 1 3373.7 5211.3 401.57
##
## Step: AIC=300.31
## fidelida ~ servconj + flexprec + imgfvent
##
## Df Sum of Sq RSS AIC
## <none> 1707.7 300.31
## - imgfvent 1 129.82 1837.6 302.97
## + calidadp 1 24.70 1683.0 303.47
## + precio 1 0.96 1706.8 304.85
## + imgfabri 1 0.66 1707.1 304.87
## + velocida 1 0.41 1707.3 304.88
## - flexprec 1 2230.67 3938.4 378.44
## - servconj 1 2850.14 4557.9 392.91
summary(modelo)
##
## Call:
## lm(formula = fidelida ~ servconj + flexprec + imgfvent, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
116 CAPÍTULO 8. MODELOS LINEALES
Y = 𝑋� + �
## 2 1 0 0
## 3 1 0 0
## 4 1 0 0
## 5 1 0 0
## 6 1 0 0
En el correspondiente ajuste (análisis de la varianza de un factor):
modelo <- lm(lnsal ~ catlab, datos)
summary(modelo)
##
## Call:
## lm(formula = lnsal ~ catlab, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.58352 -0.15983 -0.01012 0.13277 1.08725
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.20254 0.01280 797.245 < 2e-16 ***
## catlabSeguridad 0.13492 0.04864 2.774 0.00576 **
## catlabDirectivo 0.82709 0.02952 28.017 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2438 on 471 degrees of freedom
## Multiple R-squared: 0.625, Adjusted R-squared: 0.6234
## F-statistic: 392.6 on 2 and 471 DF, p-value: < 2.2e-16
el nivel de referencia no tiene asociado un coeficiente (su efecto se corresponde
con (Intercept)). Los coeficientes del resto de niveles miden el cambio que se
produce en la media al cambiar desde la categoría de referencia (diferencias de
efectos respecto al nivel de referencia).
Para contrastar el efecto de los factores, es preferible emplear la función anova:
modelo <- lm(lnsal ~ catlab + sexo, datos)
anova(modelo)
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Notas:
8.6 Interacciones
11.5
11.0
lnsal
10.5
Administrativo
10.0
Seguridad
Directivo
lnsalini
##
## Call:
## lm(formula = lnsal ~ lnsalini * catlab, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.37440 -0.11335 -0.00524 0.10459 0.97018
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.66865 0.43820 3.808 0.000159 ***
## lnsalini 0.89512 0.04595 19.479 < 2e-16 ***
## catlabSeguridad 8.31808 3.01827 2.756 0.006081 **
## catlabDirectivo 3.01268 0.79509 3.789 0.000171 ***
## lnsalini:catlabSeguridad -0.85864 0.31392 -2.735 0.006470 **
## lnsalini:catlabDirectivo -0.27713 0.07924 -3.497 0.000515 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1727 on 468 degrees of freedom
120 CAPÍTULO 8. MODELOS LINEALES
10.5
Administrativo
10.0
Seguridad
Directivo
lnsalini
##
## Call:
## lm(formula = salario ~ salini + expprev, data = empleados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -32263 -4219 -1332 2673 48571
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3850.71760 900.63287 4.276 2.31e-05 ***
## salini 1.92291 0.04548 42.283 < 2e-16 ***
## expprev -22.44482 3.42240 -6.558 1.44e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7777 on 471 degrees of freedom
## Multiple R-squared: 0.7935, Adjusted R-squared: 0.7926
## F-statistic: 904.8 on 2 and 471 DF, p-value: < 2.2e-16
Standardized residuals
Residuals vs Fitted Normal Q−Q
40000
21818 18218
Residuals
274 274
4
−4 0
−40000
Standardized residuals
Scale−Location Residuals vs Leverage
21818
6
274
1.5
0.5
2
Cook's distance 29
−4
160
0.0
205 1
par(oldpar)
Por defecto se muestran cuatro gráficos (ver help([Link]) para más detalles).
El primero (residuos frente a predicciones) permite detectar falta de linealidad
o heterocedasticidad (o el efecto de un factor omitido: mala especificación del
modelo), lo ideal sería no observar ningún patrón.
El segundo gráfico (gráfico QQ), permite diagnosticar la normalidad, los puntos
del deberían estar cerca de la diagonal.
El tercer gráfico de dispersión-nivel permite detectar heterocedasticidad y ayu-
dar a seleccionar una transformación para corregirla (más adelante, en la sección
Alternativas, se tratará este tema), la pendiente de los datos debería ser nula.
El último gráfico permite detectar valores atípicos o influyentes. Representa los
residuos estandarizados en función del valor de influencia (a priori) o leverage
(ℎ𝑖𝑖 que depende de los valores de las variables explicativas, debería ser < 2(𝑝 +
1)/2) y señala las observaciones atípicas (residuos fuera de [-2,2]) e influyentes
a posteriori (estadístico de Cook >0.5 y >1).
Si las conclusiones obtenidas dependen en gran medida de una observación (nor-
malmente atípica), esta se denomina influyente (a posteriori) y debe ser exami-
nada con cuidado por el experimentador. Para recalcular el modelo sin una de
las observaciones puede ser útil la función update:
8.7. DIAGNOSIS DEL MODELO 123
# [Link]([Link](modelo))
modelo2 <- update(modelo, data = empleados[-29, ])
Aunque puede ser preferible emplear las funciones crPlots ó avPlots del pa-
quete car:
library(car)
crPlots(modelo)
40000
Component+Residual(salario)
Component+Residual(salario)
20000
60000
0
20000
−20000
−20000
salini expprev
# avPlots(modelo)
124 CAPÍTULO 8. MODELOS LINEALES
8.7.3 Estadísticos
Para obtener medidas de diagnosis o resúmenes numéricos de interés se pueden
emplear las siguientes funciones:
Función Descripción
rstandard residuos estandarizados
rstudent residuos estudentizados (eliminados)
[Link]
valores del estadístico de Cook
influence valores de influencia, cambios en coeficientes y varianza residual al
eliminar cada dato.
## salini expprev
## 1.002041 1.002041
Valores grandes, por ejemplo > 10, indican la posible presencia de multicolinea-
lidad.
Nota: Las tolerancias (proporciones de variabilidad no explicada por las demás
covariables) se pueden calcular con 1/vif(modelo).
8.7.4 Contrastes
[Link] Normalidad
Para realizar el contraste de normalidad de Shapiro-Wilk se puede emplear:
[Link](residuals(modelo))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.85533, p-value < 2.2e-16
8.7. DIAGNOSIS DEL MODELO 125
hist(residuals(modelo))
Histogram of residuals(modelo)
250
200
Frequency
150
100
50
0
residuals(modelo)
[Link] Homocedasticidad
La librería lmtest proporciona herramientas adicionales para la diagnosis de
modelos lineales, por ejemplo el test de Breusch-Pagan para heterocedasticidad:
library(lmtest)
bptest(modelo, studentize = FALSE)
##
## Breusch-Pagan test
##
## data: modelo
## BP = 290.37, df = 2, p-value < 2.2e-16
Si el p-valor es grande aceptaríamos que hay igualdad de varianzas.
[Link] Autocorrelación
Contraste de Durbin-Watson para detectar si hay correlación serial entre los
errores:
dwtest(modelo, alternative= "[Link]")
##
## Durbin-Watson test
126 CAPÍTULO 8. MODELOS LINEALES
##
## data: modelo
## DW = 1.8331, p-value = 0.06702
## alternative hypothesis: true autocorrelation is not 0
Si el p-valor es pequeño rechazaríamos la hipótesis de independencia.
𝑌 = 𝛽0 + 𝛽1 𝑋1 + 𝛽2 𝑋2 + ⋯ + 𝛽𝑝 𝑋𝑝 + 𝜀
8.8.1 Datos
El fichero [Link] contiene observaciones de clientes de la compañía de
distribución industrial (Compañía Hair, Anderson y Tatham). Las variables se
pueden clasificar en tres grupos:
load('datos/[Link]')
[Link](attr(hatco, "[Link]"))
8.8. MÉTODOS DE REGULARIZACIÓN 127
## attr(hatco, "[Link]")
## empresa Empresa
## tamano Tamaño de la empresa
## adquisic Estructura de adquisición
## tindustr Tipo de industria
## tsitcomp Tipo de situación de compra
## velocida Velocidad de entrega
## precio Nivel de precios
## flexprec Flexibilidad de precios
## imgfabri Imagen del fabricante
## servconj Servicio conjunto
## imgfvent Imagen de fuerza de ventas
## calidadp Calidad de producto
## fidelida Porcentaje de compra a HATCO
## satisfac Satisfacción global
## nfidelid Nivel de compra a HATCO
## nsatisfa Nivel de satisfacción
7 7 7 7 7
5
5
4
Coefficients
3
3
2
1
6
1
7
4
0
0 2 4 6 8
Log Lambda
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
80
Mean−Squared Error
60
40
20
0 2 4 6 8
Log(λ)
8.8. MÉTODOS DE REGULARIZACIÓN 129
## [1] 2.749868
8.8.3 Lasso
Ajustamos un modelo lasso también con la función glmnet (con la opción por
defecto alpha=1, lasso penalty).
[Link] <- glmnet(x,y)
plot([Link], xvar = "lambda", label = TRUE)
130 CAPÍTULO 8. MODELOS LINEALES
6 5 5 5 4 3 0
8
5
6
Coefficients
3
2
7
0
1
4
2
−4 −3 −2 −1 0 1 2
Log Lambda
6 6 7 5 5 5 5 5 5 5 4 4 4 3 3 3 3
80
Mean−Squared Error
60
40
20
−4 −3 −2 −1 0 1 2
Log(λ)
8.9. ALTERNATIVAS 131
8.9 Alternativas
⎧ 𝑌𝜆 −1
(𝜆) { si 𝜆 ≠ 0
𝑌 =⎨ 𝜆
{
⎩ln (𝑌 ) si 𝜆 = 0
# library(MASS)
boxcox(modelo)
132 CAPÍTULO 8. MODELOS LINEALES
−700
95%
−800
log−Likelihood
−900
−1000
−1100
−2 −1 0 1 2
[Link] Ejemplo:
# Ajuste lineal
abline(lm(salario ~ salini, data = empleados))
# Modelo exponencial
modelo1 <- lm(log(salario) ~ salini, data = empleados)
parest <- coef(modelo1)
curve(exp(parest[1] + parest[2]*x), lty = 2, add = TRUE)
8.9. ALTERNATIVAS 133
# Modelo logarítmico
modelo2 <- lm(log(salario) ~ log(salini), data = empleados)
parest <- coef(modelo2)
curve(exp(parest[1]) * x^parest[2], lty = 3, add = TRUE)
60000
Lineal
Exponencial
20000
Logarítmico
salini
11.5
11.0
log(salario)
10.5
10.0
log(salini)
80
60
prestige
40
Lineal
20
Cuadrático
income
80
60
prestige
40
20
income
80
60
prestige
40
20
income
Modelos lineales
generalizados
Los modelos lineales generalizados son una extensión de los modelos lineales
para el caso de que la distribución condicional de la variable respuesta no sea
normal (por ejemplo discreta: Bernouilli, Binomial, Poisson, …)
En los modelo lineales se supone que:
𝐸(𝑌 |X) = 𝛽0 + 𝛽1 𝑋1 + 𝛽2 𝑋2 + ⋯ + 𝛽𝑝 𝑋𝑝
𝑔 (𝐸(𝑌 |X)) = 𝛽0 + 𝛽1 𝑋1 + 𝛽2 𝑋2 + ⋯ + 𝛽𝑝 𝑋𝑝
139
140 CAPÍTULO 9. MODELOS LINEALES GENERALIZADOS
Para cada distribución se toma por defecto una función link (mostrada en primer
lugar; ver help(family) para más detalles).
## attr(hatco, "[Link]")
## empresa Empresa
## tamano Tamaño de la empresa
## adquisic Estructura de adquisición
## tindustr Tipo de industria
## tsitcomp Tipo de situación de compra
## velocida Velocidad de entrega
## precio Nivel de precios
## flexprec Flexibilidad de precios
## imgfabri Imagen del fabricante
## servconj Servicio conjunto
## imgfvent Imagen de fuerza de ventas
## calidadp Calidad de producto
## fidelida Porcentaje de compra a HATCO
## satisfac Satisfacción global
## nfidelid Nivel de compra a HATCO
## nsatisfa Nivel de satisfacción
4
velocida
0
precio
0 3
5 8
flexprec
7
imgfabri
3
4
servconj
1
4.5
imgfvent
1.0
8
calidadp
4
2.0
nsatisfa
1.0
0 2 4 6 5 7 9 1 3 4 6 8
##
## Call: glm(formula = nsatisfa ~ velocida + imgfabri, family = binomial,
## data = datos)
##
## Coefficients:
## (Intercept) velocida imgfabri
## -10.127 1.203 1.058
##
## Degrees of Freedom: 98 Total (i.e. Null); 96 Residual
## Null Deviance: 136.4
## Residual Deviance: 88.64 AIC: 94.64
La razón de ventajas (OR) permite cuantificar el efecto de las variables explica-
tivas en la respuesta (Incremento proporcional en la ventaja o probabilidad de
éxito, al aumentar una unidad la variable manteniendo las demás fijas):
exp(coef(modelo)) # Razones de ventajas ("odds ratios")
##
## Call:
## glm(formula = nsatisfa ~ velocida + imgfabri, family = binomial,
## data = datos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.8941 -0.6697 -0.2098 0.7865 2.3378
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -10.1274 2.1062 -4.808 1.52e-06 ***
## velocida 1.2029 0.2685 4.479 7.49e-06 ***
## imgfabri 1.0584 0.2792 3.790 0.000151 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.42 on 98 degrees of freedom
## Residual deviance: 88.64 on 96 degrees of freedom
## AIC: 94.64
##
## Number of Fisher Scoring iterations: 5
La desvianza (deviance) es una medida de la bondad del ajuste de un modelo
lineal generalizado (sería equivalente a la suma de cuadrados residual de un
modelo lineal; valores más altos indican peor ajuste). La Null deviance se co-
rrespondería con un modelo solo con la constante y la Residual deviance con el
modelo ajustado. En este caso hay una reducción de 47.78 con una pérdida de
2 grados de libertad (una reducción significativa).
Para contrastar globalmente el efecto de las covariables también podemos em-
plear:
9.3. PREDICCIÓN 143
9.3 Predicción
Las predicciones se obtienen también con la función predict:
[Link] <- predict(modelo, type = "response")
## [Link]
## 0 1
## bajo 44 10
## alto 7 38
print(100*[Link](tabla), digits = 2)
## [Link]
## 0 1
## bajo 44.4 10.1
## alto 7.1 38.4
Por defecto predict obtiene las predicciones correspondientes a las observacio-
nes (modelo$[Link]). Para otros casos hay que emplear el argumento
newdata.
##
## Call:
## glm(formula = nsatisfa ~ ., family = binomial, data = datos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.01370 -0.31260 -0.02826 0.35423 1.74741
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -32.6317 7.7121 -4.231 2.32e-05 ***
## velocida 3.9980 2.3362 1.711 0.087019 .
## precio 3.6042 2.3184 1.555 0.120044
## flexprec 1.5769 0.4433 3.557 0.000375 ***
## imgfabri 2.1669 0.6857 3.160 0.001576 **
## servconj -4.2655 4.3526 -0.980 0.327096
## imgfvent -1.1496 0.8937 -1.286 0.198318
## calidadp 0.1506 0.2495 0.604 0.546147
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.424 on 98 degrees of freedom
## Residual deviance: 60.807 on 91 degrees of freedom
## AIC: 76.807
##
## Number of Fisher Scoring iterations: 7
[Link] <- update([Link], . ~ . - calidadp)
summary([Link])
##
## Call:
## glm(formula = nsatisfa ~ velocida + precio + flexprec + imgfabri +
## servconj + imgfvent, family = binomial, data = datos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0920 -0.3518 -0.0280 0.3876 1.7885
##
9.4. SELECCIÓN DE VARIABLES EXPLICATIVAS 145
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -31.6022 7.3962 -4.273 1.93e-05 ***
## velocida 4.1831 2.2077 1.895 0.058121 .
## precio 3.8872 2.1685 1.793 0.073044 .
## flexprec 1.5452 0.4361 3.543 0.000396 ***
## imgfabri 2.1984 0.6746 3.259 0.001119 **
## servconj -4.6985 4.0597 -1.157 0.247125
## imgfvent -1.1387 0.8784 -1.296 0.194849
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.424 on 98 degrees of freedom
## Residual deviance: 61.171 on 92 degrees of freedom
## AIC: 75.171
##
## Number of Fisher Scoring iterations: 7
Para obtener el modelo “óptimo” lo ideal sería evaluar todos los modelos posibles.
En este caso no se puede emplear la función regsubsets del paquete leaps (sólo
para modelos lineales), pero por ejemplo el paquete bestglm proporciona una
herramienta equivalente (bestglm()).
##
## Direction: backward/forward
## Criterion: BIC
##
## Start: AIC=97.57
## nsatisfa ~ velocida + precio + flexprec + imgfabri + servconj +
## imgfvent + calidadp
##
## Df Deviance AIC
## - calidadp 1 61.171 93.337
## - servconj 1 61.565 93.730
146 CAPÍTULO 9. MODELOS LINEALES GENERALIZADOS
summary(modelo)
##
## Call:
## glm(formula = nsatisfa ~ velocida + precio + flexprec + imgfabri,
## family = binomial, data = datos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.99422 -0.36209 -0.03932 0.44249 1.80432
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -28.0825 6.4767 -4.336 1.45e-05 ***
## velocida 1.6268 0.4268 3.812 0.000138 ***
## precio 1.3749 0.4231 3.250 0.001155 **
## flexprec 1.3364 0.3785 3.530 0.000415 ***
## imgfabri 1.5168 0.4252 3.567 0.000361 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.424 on 98 degrees of freedom
## Residual deviance: 64.646 on 94 degrees of freedom
## AIC: 74.646
##
## Number of Fisher Scoring iterations: 6
Con la función plot se pueden generar gráficos de interés para la diagnosis del
modelo:
oldpar <- par( mfrow=c(2,2))
plot(modelo)
148 CAPÍTULO 9. MODELOS LINEALES GENERALIZADOS
2
Residuals
0
−2
73 73
−3
91 91
−5 0 5 −2 −1 0 1 2
2
92 73 78
51
1.0
0
Cook's distance
0.0
−3
91
par(oldpar)
Component+Residual(nsatisfa)
5 Component + Residual Plots
2
0
−2
−5
−6
0 1 2 3 4 5 6 0 1 2 3 4 5
velocida precio
Component+Residual(nsatisfa)
Component+Residual(nsatisfa)
6
4
2
0
−6 −2
−4
5 6 7 8 9 10 3 4 5 6 7 8
flexprec imgfabri
9.5.3 Estadísticos
Se pueden emplear las mismas funciones vistas en los modelos lineales para
obtener medidas de diagnosis de interés (ver help([Link])). Por
ejemplo:
residuals(model, type = "deviance")
9.6 Alternativas
Además de considerar ajustes polinómicos, pueden ser de interés emplear méto-
dos no paramétricos. Por ejemplo, puede ser recomendable la función gam del
paquete mgcv.
150 CAPÍTULO 9. MODELOS LINEALES GENERALIZADOS
Capítulo 10
Regresión no paramétrica
𝑌 = 𝑓 (X) + 𝜀,
151
152 CAPÍTULO 10. REGRESIÓN NO PARAMÉTRICA
10.1.2 Ejemplo
En esta sección utilizaremos como ejemplo el conjunto de datos Prestige de
la librería car. Se tratará de explicar prestige (puntuación de ocupaciones
obtenidas a partir de una encuesta ) a partir de income (media de ingresos en
la ocupación) y education (media de los años de educación).
library(mgcv)
library(car)
modelo <- gam(prestige ~ s(income) + s(education), data = Prestige)
summary(modelo)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## prestige ~ s(income) + s(education)
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 46.8333 0.6889 67.98 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
10.1. MODELOS ADITIVOS 153
##
## Approximate significance of smooth terms:
## edf [Link] F p-value
## s(income) 3.118 3.877 14.61 <2e-16 ***
## s(education) 3.177 3.952 38.78 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.836 Deviance explained = 84.7%
## GCV = 52.143 Scale est. = 48.414 n = 102
En este caso la función plot representa los efectos (parciales) estimados de cada
covariable:
[Link] <- par(mfrow = c(1, 2))
plot(modelo, shade = TRUE) #
20
20
s(education,3.18)
s(income,3.12)
10
10
0
0
−10
−10
−20
−20
0 10000 20000 6 8 10 12 14 16
income education
par([Link])
newdata.
5000
0
6 8 10 12 14 16
education
pred
inc
ed
Prestige
90
80
14
70
Education
12 60
50
10
40
8 30
20
Income
156 CAPÍTULO 10. REGRESIÓN NO PARAMÉTRICA
Puede ser más cómodo emplear el paquete modelr junto a los gráficos ggplot2
para trabajar con modelos y predicciones.
##
## Family: gaussian
## Link function: identity
##
## Formula:
## prestige ~ s(income) + education
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.2240 3.7323 1.132 0.261
## education 3.9681 0.3412 11.630 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf [Link] F p-value
## s(income) 3.58 4.441 13.6 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.825 Deviance explained = 83.3%
## GCV = 54.798 Scale est. = 51.8 n = 102
anova(modelo0, modelo, test="F")
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Family: gaussian
## Link function: identity
##
## Formula:
## prestige ~ s(income, education)
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 46.8333 0.7138 65.61 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf [Link] F p-value
## s(income,education) 4.94 6.303 75.41 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.824 Deviance explained = 83.3%
## GCV = 55.188 Scale est. = 51.974 n = 102
# plot(modelo2, se = FALSE)
deviance residuals
15
15
residuals
0
0
−15
−15
−15 −5 0 5 10 15 30 40 50 60 70 80
Response
60
20
20
0
−20 −10 0 10 20 30 40 50 60 70 80
##
## Method: GCV Optimizer: magic
## Smoothing parameter selection converged after 4 iterations.
## The RMS GCV score gradient at convergence was 9.783945e-05 .
## The Hessian was positive definite.
## Model rank = 19 / 19
##
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
##
## k' edf k-index p-value
## s(income) 9.00 3.12 0.98 0.34
## s(education) 9.00 3.18 1.03 0.54
Lo ideal sería observar normalidad en los dos gráficos de la izquierda, falta de
patrón en el superior derecho, y ajuste a una recta en el inferior derecho. En
este caso parece que el modelo se comporta adecuadamente.
Capítulo 11
Programación
11.1 Funciones
El lenguaje R permite al usuario definir sus propias funciones. El esquema de
una función es el que sigue:
nombre <- function(arg1, arg2, ... ) {expresión}
159
160 CAPÍTULO 11. PROGRAMACIÓN
𝑎2 = 𝑎1 ⋅ 𝑟; 𝑎3 = 𝑎2 ⋅ 𝑟 = 𝑎1 ⋅ 𝑟 2 ; ...
𝑎𝑛 = 𝑎1 ⋅ 𝑟𝑛−1
𝑎1 (𝑟𝑛 − 1)
𝑆𝑛 = 𝑎1 + …+ 𝑎𝑛 =
𝑟−1
## [1] 16
an(a1 = 4, r = -2, n = 6)
## [1] -128
an(a1 = -50, r = 4, n = 6)
## [1] -51200
Con la función anterior se pueden obtener, con una sola llamada, varios valores
de la progresión:
an(a1 = 1, r = 2, n = 1:5) # a1, ..., a5
## [1] 1 2 4 8 16
an(a1 = 1, r = 2, n = 10:15) # a10, ..., a15
Sn <- function(a1, r, n) {
a1 * (r^n - 1) / (r - 1)
}
Sn(a1 = 1, r = 2, n = 5)
## [1] 31
an(a1 = 1, r = 2, n = 1:5) # Valores de la progresión
## [1] 1 2 4 8 16
Sn(a1 = 1, r = 2, n = 1:5) # Suma de los valores
## [1] 1 3 7 15 31
# cumsum(an(a1 = 1, r = 2, n = 1:5))
## [1] 16
an(a1 = 1, r = 2, n = 5)
## [1] 16
• Si se nombran los argumentos, se pueden pasar en cualquier orden:
an(r = 2, n = 5, a1 = 1)
## [1] 16
an(n = 5, r = 2, a1 = 1)
## [1] 16
162 CAPÍTULO 11. PROGRAMACIÓN
En muchas ocasiones resulta muy interesante que las funciones tengan argumen-
tos por defecto.
los argumento arg2 y arg3 tomen por defecto los valores a y b respectivamen-
tebastaría con escribir:
nombre <- function(arg1, arg2 = a, arg3 = b, arg4, ...) { expresión }
## [1] 18
xy2(x = 1, y = 4)
## [1] 16
xy2(y = 4)
## [1] 32
a partir del primer argumento, los argumentos se incluirán en ... y serán utili-
zados por la función plot.
data(cars)
[Link](cars$speed)
11.1. FUNCIONES 163
[Link](x = datos)
0.06
0.05
0.04
Density
0.03
0.02
0.01
0.00
0 5 10 15 20 25 30
N = 50 Bandwidth = 2.15
[Link](x = datos)
0.06
0.05
0.04
distancia
0.03
0.02
0.01
0.00
0 5 10 15 20 25 30
velocidad
## function (a1, r, n)
## NULL
164 CAPÍTULO 11. PROGRAMACIÓN
args(xy2)
## function (x = 2, y = 3)
## NULL
str(args([Link]))
## function(a1, r, n) {
## a1 * r^(n - 1)
## }
## <bytecode: 0x000000001e2160d0>
11.1.3 Salida
El valor que devolverá una función será:
• el último objeto evaluado dentro de ella, o
• lo indicado dentro de la sentencia return.
Como las funciones pueden devolver objetos de varios tipos es hatibual que la
salida sea una lista.
an <- function(a1, r, n) { a1 * r^(n - 1) }
Sn <- function(a1, r, n) { a1 * (r^n - 1) / (r - 1) }
asn()
## $an
## [1] 16
##
## $Sn
## [1] 31
##
## $salida
## valores suma
## 1 1 1
## 2 2 3
## 3 4 7
## 4 8 15
## 5 16 31
La salida de la función anterior es una lista y se puede acceder a los elementos
de la misma:
res <- asn()
res$an
## [1] 16
res$Sn
## [1] 31
res$salida
## valores suma
## 1 1 1
## 2 2 3
## 3 4 7
## 4 8 15
## 5 16 31
DNI(50247828)
## [1] "G"
0.20
0.15
0.10
0.05
0.00
1 2 3 4 5 6
## lanzamientos
## 1 2 3 4 5 6
## 0.09 0.17 0.23 0.18 0.14 0.19
dado(500)
1 2 3 4 5 6
## lanzamientos
## 1 2 3 4 5 6
## 0.150 0.162 0.164 0.174 0.196 0.154
168 CAPÍTULO 11. PROGRAMACIÓN
dado(10000)
0.15
0.10
0.05
0.00
1 2 3 4 5 6
## lanzamientos
## 1 2 3 4 5 6
## 0.1677 0.1648 0.1708 0.1550 0.1702 0.1715
Se puede comprobar que al aumentar el valor de 𝑛 las frecuencias se aproximan
al valor teórico 1/6 = 0.1667.
## [1] 1
La variable x no está definida dentro de fun, así que R busca x en el entorno en
el que se llamó a la función e imprimirá su valor.
Si x es utilizado como el nombre de un objeto dentro de la función, el valor de
x en el ambiente global (fuera de la función) no cambia.
x <- 1
fun2 <- function() {
11.2. EJECUCIÓN CONDICIONAL 169
x <- 2
print(x)
}
fun2()
## [1] 2
x
## [1] 1
Para que el valor “global” de una variable pueda ser cambidado dentro de una
función se utiliza la doble asignación <<-.
x <- 1
y <- 3
fun2 <- function() {
x <- 2
y <<- 5
print(x)
print(y)
}
fun2()
## [1] 2
## [1] 5
x # No cambió su valor
## [1] 1
y # Cambió su valor
## [1] 5
}
}
multiplo2(5)
## [1] -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0
y
## [1] 4.00 2.25 1.00 0.25 0.00 0.25 1.00 2.25 4.00
x^2
## [1] 4.00 2.25 1.00 0.25 0.00 0.25 1.00 2.25 4.00
Otro ejemplo:
for(i in 1:5) print(i)
## [1] 1
## [1] 2
11.3. BUCLES Y VECTORIZACIÓN 171
## [1] 3
## [1] 4
## [1] 5
El siguiente código simula gráficamente el segundero de un reloj:
angulo <- seq(0, 360, by = 6)
radianes <- angulo * pi / 180
x <- sin(radianes)
y <- cos(radianes)
Por ejemplo, si queremos calcular el primer número entero positivo cuyo cua-
drado no excede de 5000, podemos hacer:
cuadrado <- 0
n <- 0
while (cuadrado <= 5000) {
n <- n + 1
cuadrado <- n^2
}
cuadrado
## [1] 5041
n
## [1] 71
n^2
## [1] 5041
Nota: Dentro de un bucle se puede emplear el comando break para terminarlo
y el comando next para saltar a la siguiente iteración.
172 CAPÍTULO 11. PROGRAMACIÓN
11.3.2 Vectorización
Como hemos visto en R se pueden hacer bucles. Sin embargo, es preferible evitar
este tipo de estructuras y tratar de utilizar operaciones vectorizadas que son
mucho más eficientes desde el punto de vista computacional.
Por ejemplo para sumar dos vectores se puede hacer con un for:
x <- c(1, 2, 3, 4)
y <- c(0, 0, 5, 1)
n <- length(x)
z <- numeric(n)
for (i in 1:n) {
z[i] <- x[i] + y[i]
}
z
## [1] 1 2 8 5
Sin embargo, la operación anterior se podría hacer de modo más eficiente en
modo vectorial:
z <- x + y
z
## [1] 1 2 8 5
• X: matriz (o array)
• MARGIN: Un vector indicando las dimensiones donde se aplicará la función.
1 indica filas, 2 indica columnas, y c(1,2) indica filas y columnas.
• FUN: función que será aplicada.
• ...: argumentos opcionales que serán usados por FUN.
Veamos la utilización de la función apply con un ejemplo:
x <- matrix(1:9, nrow = 3)
x
## [2,] 2 5 8
## [3,] 3 6 9
apply(x, 1, sum) # Suma por filas
## [1] 12 15 18
apply(x, 2, sum) # Suma por columnas
## [1] 6 15 24
apply(x, 2, min) # Mínimo de las columnas
## [1] 1 4 7
apply(x, 2, range) # Rango (mínimo y máximo) de las columnas
• X: matriz (o array).
• INDEX: factor indicando los grupos (niveles).
• FUN: función que será aplicada.
• ...: argumentos opcionales .
Consideremos, por ejemplo, el [Link] ChickWeight con datos de un experi-
mento relacionado con la repercusión de varias dietas en el peso de pollos.
data(ChickWeight)
head(ChickWeight)
levels(dieta) <- c("Dieta 1", "Dieta 2", "Dieta 3", "Dieta 4")
tapply(peso, dieta, mean) # Peso medio por dieta
## $`Dieta 1`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 35.00 57.75 88.00 102.65 136.50 305.00
##
## $`Dieta 2`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.0 65.5 104.5 122.6 163.0 331.0
##
## $`Dieta 3`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.0 67.5 125.5 142.9 198.8 373.0
##
## $`Dieta 4`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.00 71.25 129.50 135.26 184.75 322.00
Otro ejemplo:
provincia <- [Link](c(1, 3, 4, 2, 4, 3, 2, 1, 4, 3, 2))
levels(provincia) = c("A Coruña", "Lugo", "Orense", "Pontevedra")
hijos <- c(1, 2, 0, 3, 4, 1, 0, 0, 2, 3, 1)
[Link](provincia, hijos)
## provincia hijos
## 1 A Coruña 1
## 2 Orense 2
## 3 Pontevedra 0
## 4 Lugo 3
## 5 Pontevedra 4
## 6 Orense 1
## 7 Lugo 0
## 8 A Coruña 0
## 9 Pontevedra 2
## 10 Orense 3
## 11 Lugo 1
tapply(hijos, provincia, mean) # Número medio de hijos por provincia
• se utilizan todos los datos menos uno para realizar el ajuste, y se mide su
error de predicción en el único dato no utilizado;
80
60
prestige
40
20
income
80
60
prestige
40
Lineal
20
Cuadrático
Cúbico
income
Vamos a escribir una función que nos devuelva, para cada dato (fila) de Prestige,
la predicción en ese punto ajustando el modelo con todos los demás puntos.
[Link] <- function(formula, datos) {
n <- nrow(datos)
[Link] <- numeric(n)
for (i in 1:n) {
modelo <- lm(formula, datos[-i, ])
[Link][i] <- predict(modelo, newdata = datos[i, ])
}
return([Link])
}
Por último, calculamos el error de predicción (en este caso el error cuadrático
medio) en los datos de validación. Repetimos el proceso para cada valor del
parámetro (grado del ajuste polinómico) y minimizamos.
grado <- 1:5
[Link] <- numeric(5)
for(p in grado){
[Link] <- [Link](prestige ~ poly(income, p), Prestige)
[Link][p] <- mean(([Link] - Prestige$prestige)^2)
}
plot(grado, [Link], pch=16)
178 CAPÍTULO 11. PROGRAMACIÓN
155
150
145
[Link]
140
135
130
125
1 2 3 4 5
grado
grado[[Link]([Link])]
## [1] 2
80
60
prestige
40
20
income
Si utilizamos span=0.5:
plot(prestige ~ income, Prestige, col = 'darkgray')
fit <- loess(prestige ~ income, Prestige, span = 0.5)
valores <- seq(0, 25000, 100)
pred <- predict(fit, newdata = [Link](income = valores))
lines(valores, pred)
80
60
prestige
40
20
income
plot(ventanas, [Link])
150
145
[Link]
140
135
130
ventanas
## [1] 1
y la correspondiente estimación:
plot(prestige ~ income, Prestige, col = 'darkgray')
fit <- loess(prestige ~ income, Prestige, span = span)
valores <- seq(0, 25000, 100)
pred <- predict(fit, newdata = [Link](income = valores))
lines(valores, pred)
80
60
prestige
40
20
income
182 CAPÍTULO 11. PROGRAMACIÓN
Capítulo 12
Generación de informes
Una versión más completa de este capítulo está disponible en el apéndice del
libro Escritura de libros con bookdown
12.1 R Markdown
R-Markdown es recomendable para difundir análisis realizados con R en formato
HTML, PDF y DOCX (Word), entre otros.
12.1.1 Introducción
R-Markdown permite combinar Markdown con R. Markdown se diseñó inicial-
mente para la creación de páginas web a partir de documentos de texto de forma
muy sencilla y rápida (tiene unas reglas sintácticas muy simples). Actualmente
gracias a múltiples herramientas como pandoc permite generar múltiples tipos
de documentos (incluido LaTeX; ver Pandoc Markdown)
Para más detalles ver [Link]
También se dispone de información en la ayuda de RStudio:
• Help > Markdown Quick Reference
• Help > Cheatsheets > R Markdown Cheat Sheet
• Help > Cheatsheets > R Markdown Reference Guide
Al renderizar un fichero rmarkdown se generará un documento que incluye el
código R y los resultados incrustados en el documento. En RStudio basta con
hacer clic en el botón Knit HTML. En R se puede emplear la funcion render
del paquete rmarkdown (por ejemplo: render("[Link]")). También
se puede abrir directamente el informe generado:
183
184 CAPÍTULO 12. GENERACIÓN DE INFORMES
library(rmarkdown)
browseURL(url = render("[Link]"))
Se puede incluir código R entre los delimitadores ```{r} y ```. Por defecto, se
mostrará el código, se evaluará y se mostrarán los resultados justo a continua-
ción:
head(mtcars[1:3])
Histogram of mtcars$mpg
12
10
8
Frequency
6
4
2
0
10 15 20 25 30 35
mtcars$mpg
Variable Descripción
mpg Millas / galón ([Link].)
cyl Número de cilindros
disp Desplazamiento (pulgadas cúbicas)
hp Caballos de fuerza bruta
drat Relación del eje trasero
wt Peso (miles de libras)
qsec Tiempo de 1/4 de milla
vs Cilindros en V/Straight (0 = cilindros en V, 1 = cilindros en línea)
am Tipo de transmisión (0 = automático, 1 = manual)
186 CAPÍTULO 12. GENERACIÓN DE INFORMES
Variable Descripción
gear Número de marchas (hacia adelante)
carb Número de carburadores
12.2 Spin
Una forma rápida de crear este tipo de informes a partir de un fichero de código
R es emplear la funcion spin del paquete knitr (ver p.e. [Link]
tr/demo/stitch).
Para ello se debe comentar todo lo que no sea código R de una forma especial:
12.2. SPIN 187
Ver Apéndice A.
Bibliografía complementaria
Beeley (2015). Web Application Development with R Using Shiny. Packt Publis-
hing.
Bivand et al. (2008). Applied Spatial Data Analysis with R. Springer.
James et al. (2008). An Introduction to Statistical Learning: with Aplications in
R. Springer.
Kolaczyk y Csárdi (2014). Statistical analysis of network data with R. Springer.
Munzert et al. (2014). Automated Data Collection with R: A Practical Guide to
Web Scraping and Text Mining. Wiley.
Ramsay et al. (2009). Functional Data Analysis with R and MATLAB. Springer.
Van der Loo y de Jonge (2012). Learning RStudio for R Statistical Computing.
Packt Publishing.
Williams (2011). Data Mining with Rattle and R. Springer.
Wood (2006). Generalized Additive Models: An Introduction with R. Chapman.
Yihui Xie (2015). Dynamic Documents with R and knitr. Chapman.
189
190 CAPÍTULO 12. GENERACIÓN DE INFORMES
Apéndice A
Enlaces
191
192 APÉNDICE A. ENLACES
– [Link]
– [Link]
– [Link]
• Listas de correo:
– Listas de distribución de [Link]: [Link]
an/listinfo
– Búsqueda en R-help: [Link]
[Link]
– Búsqueda en R-help-es: [Link]
[Link]
– Archivos de R-help-es: [Link]
A.1 RStudio
RStudio:
• Online learning
• Webinars
• sparklyr
• shiny
tidyverse:
• dplyr
• tibble
• tidyr
• stringr
• readr
• Databases using R, dplyr as a database interface
CheatSheets:
• rmarkdown
• shiny
• dplyr
• tidyr
• stringr
194 APÉNDICE A. ENLACES
Apéndice B
Instalación de R
R-project CRAN
195
196 APÉNDICE B. INSTALACIÓN DE R
(puede que haya que seleccionar el repositorio de descarga, e.g. Spain (Madrid)).
La forma tradicional es esta:
198 APÉNDICE B. INSTALACIÓN DE R
Interfaces gráficas
En los últimos años han surgido interfaces gráficas que permiten realizar las
operaciones más comunes a través de periféricos como el ratón. Una lista de de
estas interfaces puede ser encontrada en [Link]/SciViews-R
C.1 RStudio
Un entorno de R muy recomendable es el RStudio, [Link]
199
200 APÉNDICE C. INTERFACES GRÁFICAS
C.2 RCommander
RCommander es una de las interfaces más populares para R. Algunas de sus
ventajas son:
• Fácil instalación
> [Link]("Rcmdr")
A continuación se abrirá una nueva ventana con todos los posibles espejos, donde
conviene seleccionar el espejo de Madrid.
>library(Rcmdr)
En lugar de operar sobre vectores como las funciones base, opera sobre objetos
de este tipo (solo nos centraremos en [Link]).
205
206 APÉNDICE D. MANIPULACIÓN DE DATOS CON DPLYR
## Etiquetas
## id Código de empleado
## sexo Sexo
## fechnac Fecha de nacimiento
## educ Nivel educativo (años)
## catlab Categoría Laboral
## salario Salario actual
## salini Salario inicial
## tiempemp Meses desde el contrato
## expprev Experiencia previa (meses)
## minoria Clasificación étnica
## sexoraza Clasificación por sexo y raza
attr(empleados, "[Link]") <- NULL # Eliminamos las etiquetas
## 5 Hombre No 45000
## 6 Hombre No 32100
Se pueden emplear los nombres de variables como índices:
head(select(empleados, sexo:salario))
## [Link] n
## 1 34419.57 474
D.5. AGRUPAR CASOS CON GROUP_BY() 209
## # A tibble: 4 x 4
## # Groups: sexo [2]
## sexo minoria [Link] n
## <fct> <fct> <dbl> <int>
## 1 Hombre No 44475. 194
## 2 Hombre Sí 32246. 64
## 3 Mujer No 26707. 176
## 4 Mujer Sí 23062. 40
Ejemplos:
empleados %>% filter(catlab == "Directivo") %>%
group_by(sexo, minoria) %>%
summarise([Link] = mean(salario), n = n())
## # A tibble: 3 x 4
## # Groups: sexo [2]
## sexo minoria [Link] n
## <fct> <fct> <dbl> <int>
## 1 Hombre No 65684. 70
## 2 Hombre Sí 76038. 4
## 3 Mujer No 47214. 10
empleados %>% select(sexo, catlab, salario) %>%
filter(catlab != "Seguridad") %>%
group_by(catlab) %>%
mutate(saldif = salario - mean(salario)) %>%
ungroup() %>%
boxplot(saldif ~ sexo*droplevels(catlab), data = .)
abline(h = 0, lty = 2)
210 APÉNDICE D. MANIPULACIÓN DE DATOS CON DPLYR
60000
40000
20000
saldif
0
−20000
sexo : droplevels(catlab)
Para mas información sobre dplyr ver por ejemplo la ‘vignette’ del paquete:
Introduction to dplyr.
Apéndice E
• Otras compañías:
– Facebook, Twitter, Bank of America, Monsanto, …
E.1 Microsoft
211
212 APÉNDICE E. COMPAÑÍAS QUE USAN R
E.2 RStudio