Sei sulla pagina 1di 46

Guía R

Cátedra de Probabilidad y Estadística

R es un lenguaje de programación libre para el análisis estadístico y gráfico de datos. R Está


disponible para todos los sistemas operativos y puede descargarse libremente desde el sitio web
http://www.r-project.org/.

Índice General
1 Definir el directorio de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 Cargar y leer paquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

3 Leer y visualizar datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

4 Matrices y vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

5 Seleccionar variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

6 Funciones básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

7 Funciones estadísticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

8 Tablas y gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
8.1 Una variable cualitativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
8.2 Dos variables cualitativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
8.3 Una variable cuantitativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
8.4 Una variable cuantitativa vs. una cualitativa . . . . . . . . . . . . . . . . . . . . . . . 18
8.5 Dos variables cuantitativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8.6 Una variable cuantitativa vs. dos cualitativas (factores) . . . . . . . . . . . . . . . . . 23
8.7 Más sobre gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

9 Probabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
9.1 Eventos y espacios muestrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
9.2 Complementación, unión e intersección de eventos . . . . . . . . . . . . . . . . . . . . 29
1
9.3 Probabilidad y probabilidad condicional . . . . . . . . . . . . . . . . . . . . . . . . . 31

10 Funciones de distribución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
10.1 Variables aleatorias discretas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
10.2 Variables aleatorias continuas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

11 Intervalos de confianza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11.1 Una muestra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11.2 Dos muestras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11.3 Intervalos de confianza para una proporción . . . . . . . . . . . . . . . . . . . . . . . 39

12 ANOVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

13 Regresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

2
1. Definir el directorio de trabajo
Por defecto R trabaja en un directorio específico que se crea al instalar el programa y podemos saber
cuál es a través del comando getwd(). Por ejemplo,

> getwd()
[1] "C:/Documents and Settings/R"

Para cambiar el directorio de trabajo desde la ventana de comando utilizamos el comando setwd
especificando el directorio donde deseamos trabajar. Por ejemplo,

> setwd(C:/Usuario/PyE)

También podemos cambiar el directorio de trabajo a través de la barra de menú como sigue:

Utilizando la plataforma RStudio: Session > > Set Working Directory > > Choose
Directory e ir a la carpeta deseada.

Windows: Archivo > > Cambiar dir... e ir a la carpeta deseada.

2. Cargar y leer paquetes


Antes de poder leer un paquete debemos cargarlo de la siguiente manera:

Utilizando la plataforma RStudio: Tools > > Install Packages... allí seleccionar si se lo
desea instalar desde internet o desde un archivo (en general lo hacemos desde internet a través
de un repositorio (CRAN)), escribir el nombre del paquete, por ejemplo, Sleuth2 e instalarlo
presionando Install.

Windows: Para instalar desde internet ir a Paquetes > > Instalar paquetes(s). Seleccionar
un repositorio (CRAN) y luego el paquete en las ventanas que se abrirán sucesivamente. Para
hacerlo a través de un archivo elegir la opción Instalar paquetes a partir de archivos
zip locales

Para leer un paquete utilizamos el comando library. Por ejemplo, para leer el paquete que cargamos
anteriormente utilizamos: library(Sleuth2).

Para este curso será necesario instalar y leer los paquetes: car, descr, lawstat, MASS, MindOnStats,
mosaic, multcomp, prob, Sleuth2, stats, agricolae, combinat, tseries.

3
3. Leer y visualizar datos
Para empezar a trabajar con un determinado archivo primero debemos especificar en que directorio
se encuentra el mismo. Esto lo realizamos en Archivo > > Cambiar directorio. Para leer y cargar
los datos tenemos que fijarnos que tipo de extensión tiene el archivo. De acuerdo a la extensión es la
función que usamos.

Archivos desde librerías de R: Algunas librerías de R contienen varios conjuntos de datos. Por
ejemplo, la librería Sleuth2 contiene, además de otros, un conjunto de datos llamado case0801,
para leer estos datos primero leemos la librería como en 2. y luego leemos los datos como sigue:

library(Sleuth2)
library(help = "Sleuth2")
datos = case0801
attach(datos)

Archivos de extensión .R o .txt:

> data1 = read.table(’salchichas.txt’, header = TRUE)

> data2 = read.table(’dieta.R’, header = TRUE)

lee los archivos .R y .txt y los guarda en data1 y data2 respectivamente. Con el argumento
header estamos indicando que queremos que también se lean y guarden los títulos que iden-
tifican cada variable. Si no tiene titulos se debe poner header = F. Para ver como funciona el
comando read.table escribir en R help(read.table)

Archivos de excel: en el caso de archivos de excel, la forma más sencilla de cargarlos es primero
guardandolos con extensión .CSV y luego utilizando el siguiente comando:

> data3 = read.csv(’alumnos.csv’, header = TRUE, sep = ’;’)

> data4 = read.csv(’animales.csv’, header = TRUE, sep = ’,’)

> data5 = read.csv(’pennstate.csv’, header = TRUE, sep = ’,’)

Cuando los datos están ordenados usando las columnas de excel, como en el caso de alumnos.csv,
debemos declarar sep = ’;’ para que [R] entienda que cada columna es una variable. En cam-
bio, si solamente se separan utilizando las comas, como en el archivo pennstate.csv, declaramos
sep = ’,’. Si los datos están separados por una tabulación debemos usar sep = ’\t’.
4
Datos faltantes: Hay veces en que los datos tienen “datos faltantes” por lo que en ese caso
debemos usar sep = ’\t’. Además si el dato faltante corresponde a una variable cualitativa,
debemos agregar la instrucción na.string = ’’ como sigue,

> data3 = read.csv(’alumnos.csv’, header = TRUE, sep = ’\t’, na.string = ’’

Para poder visualizar los datos, una vez cargados sólo escribimos en [R] su nombre.

> data1
CALORIAS SODIO TIPO
1 186 495 A
2 181 477 A
3 176 425 A
4 149 322 A
......................

Para poder saber el nombre de las columnas hacemos:

> names(data1)
[1] "CALORIAS" "SODIO" "TIPO"

Para ver el comienzo de los datos (títulos y primeras filas):

> head(data1)
CALORIAS SODIO TIPO
1 186 495 A
2 181 477 A
3 176 425 A
4 149 322 A
5 184 482 A
6 190 587 A

Para ver la descripción de los mismos:

> str(data1)
’data.frame’: 54 obs. of 3 variables:
$ CALORIAS: int 186 181 176 149 184 190 158 139 175 148 ...
$ SODIO : int 495 477 425 322 482 587 370 322 479 375 ...
$ TIPO : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...

Para saber si una variable tiene datos faltantes usamos la función is.na que es una función lógica
que devuelve TRUE en la posición donde falta el dato y FALSE en las restantes. Por ejemplo:
5
> a = c(1,2,NA,4,5,NA)
> a
[1] 1 2 NA 4 5 NA

> is.na(a)
[1] FALSE FALSE TRUE FALSE FALSE TRUE

Si directamente queremos saber si una variable tiene algún dato faltante podemos hacer:

> sum(is.na(a) == FALSE)


[1] 4

Para saber el índice de un elemento utilizamos el comando which como sigue:

> a = c(-1,2,4,-5)
> which(a>0)
[1] 2 3

4. Matrices y vectores
Vamos a ver algunas formas de generar vectores. Se puede construir un vector de tipo numérico,
lógico o carácter. Algunos ejemplos:

> vector1 = c(74, 122, 235, 111, 292, 111, 211, 133, 156, 79)

> vector2 = c(’Siempre’, ’casi siempre’, ’a veces’, ’raramente’,’Nunca’)

con la expresión c() concatenamos los valores que le ingresamos para crear el vector. Otras funciones
para la generación de vectores:

seq(from = a,to = b,by = c): genera una secuencia de números desde a hasta b con incre-
mentos de c.

a:b: lo mismo que antes con incremento 1.

rev(a:b): genera una secuencia de números desde b hasta a.

rep(x,v): repite el elemento x un número v de veces.

Para saber la longitud que tiene un vector utilizamos el comando length como sigue:

> length(vector1)
[1] 10
6
Para crear una matriz la forma más simple en R, es mediante la función matrix(). A continuación,
se muestra como crear una matriz llamada M de dimensión 3x2:

> M = matrix(nrow = 2, ncol = 3)


> M
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA

Ya que no se ha definido ningún elemento, R nos lo informa con NA, para crear una matriz con
elementos, por ejemplo, mediante columnas: (1, 2, 3, 4, 5, 6):

> M = matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3)


> M
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

En caso que queramos crearlo por filas:

> M = matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3, byrow = TRUE)


> M
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6

Y por último, si queremos añadirles nombres a los índices de columnas: Naranjas, Platanos y Melon,
y en las filas: Supermercado y Tienda, se muestra a continuación:

> M = matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3, byrow = TRUE,


+dimnames = list(c(’Supermercado’, ’Tienda’),
+c(’Naranjas’,’Platanos’, ’Melon’)))

> M
Naranjas Platanos Melon
Supermercado 1 2 3
Tienda 4 5 6

Veamos algunas funciones sobre las matrices:

dim(M): devuelve las dimensiones de la matriz M.


7
colnames(M): devuelve el nombre de las columnas de la matriz M.

rownames(M): devuelve el nombre de las filas de la matriz M.

M[ , ]: accede a elementos dentro de la matriz M.

t(M): devuelve la matriz M transpuesta.

apply: aplica una función sobre las filas o columnas de una matriz.

cbind(a,b,...): crea una matriz con los vectores o matrices a, b, ... como columnas.

rbind(a,b,...): crea una matriz con los vectores o matrices a, b, ... como filas.

Veamos algunos ejemplos, utilizando la matriz M creada antes:

> M[1,]
Naranjas Platanos Melon
1 2 3

> M[,1:2]
Naranjas Platanos
Supermercado 1 2
Tienda 4 5

> cbind(M, c(0,0))


Naranjas Platanos Melon
Supermercado 1 2 3 0
Tienda 4 5 6 0

> a = c(5, 27, 32)


> b = 4:6
> c = c(15, 95, 4)
> S = rbind(a,b,c)
> S
[,1] [,2] [,3]
a 5 27 32
b 4 5 6
c 15 95 4

Una ventaja que posee este software es que podemos extraer de manera muy senciall filas o columnas
que no son contiguas. Por ejemplo, si queremos extraer las columnas 1 y 3 de M hacemos:
8
> M[,c(1,3)]
Naranjas Melon
Supermercado 1 3
Tienda 4 6

O si queremos todas las columnas menos la 1, hacemos:

> M[,-1]
Platanos Melon
Supermercado 2 3
Tienda 5 6

O mejor aún, si queremos todas las filas de M menos la 2 y 3 hacemos:

> M[-c(2,3),]
Naranjas Platanos Melon
1 2 3

por supuesto que en este caso sencillo esto es lo mismo que hacer M[1,].

5. Seleccionar variables
Recordemos que para ver los nombres de las variables (el nombre de las columnas de data1) podemos
utilizar el comando names:

> names(data1)
[1] "CALORIAS" "SODIO" "TIPO"

Utilizando los nombres podemos extraer los datos que están en cada columna de la matriz de datos
utilizando un signo $. Por ejemplo, si queremos los datos de CALORIAS debemos hacer:

> data1$CALORIAS
[1] 186 181 176 149 184 190 158 139 175 148 152 111 141 153 190 157 131 149 135
[20] 132 173 191 182 190 172 147 146 139 175 136 179 153 107 195 135 140 138 129
[39] 132 102 106 94 102 87 99 170 113 135 142 86 143 152 146 144

Otra forma mas práctica de trabajar, es utilizando la función attach que permite acceder a los
objetos a través de sus nombres.

9
> attach(data1)
> CALORIAS
[1] 186 181 176 149 184 190 158 139 175 148 152 111 141 153 190 157 131 149 135
[20] 132 173 191 182 190 172 147 146 139 175 136 179 153 107 195 135 140 138 129
[39] 132 102 106 94 102 87 99 170 113 135 142 86 143 152 146 144

Si por ejemplo nos interesa quedarnos con aquellos valores del sodio que corresponde a las salchichas
tipo A, lo podemos hacer como sigue y lo guardamos en la nueva variable SOA:

> SOA = SODIO[TIPO == ’A’]


> SOA
[1] 495 477 425 322 482 587 370 322 479 375 330 300 386 401 645 440 317 319 298
[20] 253

Otro ejemplo más,

> CALA = CALORIAS[SODIO >= 400]

Si nos interesa quedarnos con aquellos valores del sodio que corresponde a las salchichas que no son
de tipo A, lo podemos hacer como sigue:

> SOA = SODIO[TIPO != ’A’]

Si nos interesa quedarnos con aquellos valores de calorías correspondientes a las salchichas de tipo A
con un nivel de sodio mayor o igual a 400, lo podemos hacer como sigue:

> CALORIAS[SODIO > = 400 & TIPO == ’A’]

Si deseamos quedarnos con aquellos valores de calorías correspondientes a las salchichas de tipo C o
con un nivel de sodio menor a 400, lo podemos hacer como sigue:

> CALORIAS[SODIO < 400 | TIPO == ’C’]

10
6. Funciones básicas
Las funciones min(x) y max(x) calculan el mínimo y el máximo, respectivamente, del elemento
x.

> M
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> min(M)
[1] 1
> max(M)
[1] 6

> x
[1] 1 3 6 -8 15 21 3 5
> min(x)
[1] -8
> max(x)
[1] 21

En caso de existir datos faltantes o perdidos es necesario agregar la opción na.rm = TRUE.
Veamos algunos ejemplos.

> M
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 NA

> min(M) > max(M)


[1] NA [1] NA

> min(M, na.rm = TRUE) > max(M, na.rm = TRUE)


[1] 1 [1] 5

La función range(x) devuelve un vector que contiene el mínimo y el máximo de x:

> a

11
[1] 5 27 32 45 -2
> range(a)
[1] -2 45

La función sum(x) devuelve la suma de todos los elementos de x:

> a
[1] 5 27 32 45 -2
> sum(a)
[1] 107

Obervarción: En caso de existir datos perdidos es necesario agregar la opción na.rm = TRUE como
antes.

7. Funciones estadísticas
Consideremos el vector

> x = c(1,3,6,-8,15,21,3,5)
[1] 1 3 6 -8 15 21 3 5

La función mean(x) devuelve el promedio de todos los elementos de x:

> mean(x)
[1] 5.75

Si en lugar de la media deseamos calcular la media podada debemos hacer:

> mean(x, trim = 0.2)


[1] 5.5

La función median(x) devuelve la mediana de x:

> median(x)
[1] 4

La función var(x) devuelve la varianza de x:

12
> var(x)
77.92857

La función sd(x) devuelve el desvío estándar de x:

> sd(x)
[1] 8.827716

La función quantile(x) devuelve el mínimo, el primer, segundo y tercer cuantil, y el máximo


de x:

> quantile(x)
0% 25% 50% 75% 100%
-8.00 2.50 4.00 8.25 21.00

La función IQR(x) el rango intercuartílico de x, es decir, la diferencia entre el tercer y primer


cuantil:

> IQR(x)
[1] 5.75

Obervarción: En caso de existir datos perdidos es necesario agregar la opción na.rm = TRUE como
antes.

8. Tablas y gráficos
8.1. Una variable cualitativa
Tabla de frecuencias absolutas y relativas: Utilizamos la función table y prop.table respecti-
vamente. Por ejemplo,

> table(TIPO)
TIPO
A B C
20 17 17

> prop.table(table(TIPO))
TIPO
A B C
0.3703704 0.3148148 0.3148148
13
Gráfico de tortas y barras:

Para realizar un graáfico de torta utilizamos la función pie como sigue:


> pie(table(TIPO), clockwise = T, main = ’Tipo de Salchichas’)

Tipo de Salchichas

C
A

Para realizar un graáfico de barra de frecuencias absolutas utilizamos la función barplot: como
sigue: y . Veamos ejemplos,
> barplot(table(TIPO), main = ’Tipo de Salchichas’, col = ’blue’)

Tipo de Salchichas
20
15
10
5
0

A B C

Si en lugar del gráfico de barras de frecuencias absolutas estamos interesados en el de frecuencias


relativas, debemos utilizar la función prop.table en el primer argumento de la función barplot
como sigue:
> barplot(prop.table(table(TIPO)), main = ’Tipo de Salchichas’, col = ’blue’)

14
Tipo de Salchichas

0.30
0.20
0.10
0.00
A B C

8.2. Dos variables cualitativas


Tabla de contigencia: Para realizar una tabla de contingencia utilizamos la función table como
sigue:

> table(NumeroAleatorio, Sexo)

Sexo
NumeroAleatorio Female Male
1 1 1
2 5 4
3 11 11
4 15 6
5 10 8
6 13 10
7 28 28
8 11 8
9 8 6
10 1 5

Si en lugar de las frecuencias absolutas queremos calcular las relativas anteponemos a table
la función prop.table especificando con un 1 si queremos calcular las proporciones por fila o
con un 2 si queremos las proporciones por columna (sin esa especificación calcula el porcentaje
sobre el total de la tabla). Veamos un ejemplo:

> prop.table(table(NumeroAleatorio,Sexo),2)

Sexo
NumeroAleatorio Female Male
15
1 0.009708738 0.011494253
2 0.048543689 0.045977011
3 0.106796117 0.126436782
4 0.145631068 0.068965517
5 0.097087379 0.091954023
6 0.126213592 0.114942529
7 0.271844660 0.321839080
8 0.106796117 0.091954023
9 0.077669903 0.068965517
10 0.009708738 0.057471264

Gráfico de barras: Para realizar un gráfico de barras apilado utilizamos la función barplot:
> a = prop.table(table(NumeroAleatorio,Sexo),2)
> barplot(t(a))
0.4
0.2
0.0

1 2 3 4 5 6 7 8 9 10

Para realizar un gráfico de barras adosado es necesario agregar la opción beside = TRUE:
> a = prop.table(table(NumeroAleatorio,Sexo),2)
> barplot(t(a), beside = TRUE)
0.30
0.20
0.10
0.00

1 2 3 4 5 6 7 8 9 10

16
Observar que para realizar un barpot es necesario transponer la matriz de datos.

8.3. Una variable cuantitativa


Medidas Resúmenes:

• mean(x) devuelve el promedio del argumento x


• mean(x,trim = a) devuelve la media recortada del elemento x al a % de cada lado (a
∈ [0, 0,5])
• median(x) devuelve la mediana del argumento x
• sd(x) devuelve el desvío estandar del argumento x
• var(x) devuelve la varianza del vector o matriz x
• IQR(x) devuelve el rango intercuartil del argumento x
• range(x) devuelve el valor mínimo y el valor máximo en x
• quantile(x) devuelve el mínimo, el primer, segundo y tercer quantil, y el máximo de x
• quantile(x, a) devuelve el quantil a de x (a ∈ [0, 1])
• fivenum(x) devuelve el mínimo, el primer, segundo y tercer quantil, y el máximo de x
• summary(x) devuelve el mínimo, el primer quantil, la mediana (o segundo quantil), la
media, el tercer quantil, y el máximo.

En todos los casos es necesario agregar el argumento na.rm = TRUE si x contiene datos perdidos,
para que la función los ignore.

Gráficos:

• Histograma: Veamos un ejemplo con la variable CALORIAS:


> par(mfrow = c(2,2))
> hist(CALORIAS, main = ’Histograma’) ] Histograma en escala de frecuencias ab-
solutas
> hist(CALORIAS, main = ’Histograma’, freq = FALSE) ] Histograma en escala de
densidad
> hist(CALORIAS, br = seq(80,200,10), main = ’Histograma’) ] Con los puntos
de corte deseados
> hist(CALORIAS, br = c(86,100,125,140,160,180,200),
+ main = ’Histograma’, freq = FALSE)] Con otros puntos de corte

17
Histograma Histograma

Frequency

0.010
Density
5 10

0.000
0
80 120 160 200 80 120 160 200

CALORIAS CALORIAS

Frequency
Histograma Histograma

0.010
Density
8
4

0.000
0

80 120 160 200 100 140 180

CALORIAS CALORIAS

• Boxplot: Veamos un ejemplo con la variable CALORIAS:


> boxplot(CALORIAS, main = ’Boxplot para la variable CALORIAS’)

Boxplot para la variable CALORIAS


180
160
140
120
100

• Frecuencias acumuladas: Veamos un ejemplo con la variable Velmax:


> plot.ecdf(Velmax)

18
ecdf(x)

1.0
●●●
●●
●●

0.8
●●

●●

●●

0.6
Fn(x)

●●●

0.4

●●

0.2

●●



●●●
0.0

20 40 60 80 100 120 140 160

8.4. Una variable cuantitativa vs. una cualitativa


Medidas Resúmenes: Con la función tapply podemos calcular cualquiera de las funciones vistas
antes en cada categoría de la variable cualitativa. Por ejemplo:

> tapply(CALORIAS, TIPO, mean)


A B C
156.8500 158.7059 122.4706

> tapply(CALORIAS, TIPO, range)


$A
[1] 111 190
$B
[1] 107 195
$C
[1] 86 170

Gráficos

• Histograma por categoría: Cuando realizamos histogramas para comparar la variable para
cada categoría, es importante que escalas vertical y horizantal sean las mismas para cada
gráfico:

19
> par(mfrow = c(1,3))
> hist(CALORIAS[TIPO == ’A’], br = seq(80,200,20))
> hist(CALORIAS[TIPO == ’B’], br = seq(80,200,20))
> hist(CALORIAS[TIPO == ’C’], br = seq(80,200,20))

Histogram of CALORIAS[TIPO
Histogram
== "A"]
of CALORIAS[TIPO
Histogram
== "B"]
of CALORIAS[TIPO == "C"]

5
4

4
6

3
Frequency

Frequency

Frequency
4

2
2

1
0

0
80 140 200 80 140 200 80 140 200

CALORIAS[TIPO == "A"] CALORIAS[TIPO == "B"] CALORIAS[TIPO == "C"]

• Boxplot por categoría: Veamos un ejemplo:


> boxplot(CALORIAS~TIPO, main = ’Boxplot de CALORIAS para cada TIPO’)

Boxplot de CALORIAS para cada TIPO


180
160
140
120
100

A B C

Otra forma de realizar este gráfico es utilizando la librería lattice:

> bwplot(CALORIAS~TIPO)

20
También puede observarse la distribución de la variable cuantitativa por categoría de la
cualitativa graficando las densidades como sigue:

> densityplot(~CALORIAS, groups = TIPO, auto.key = TRUE)

A
B
C

0.015

Density 0.010

0.005

0.000

50 100 150 200

CALORIAS

• Diagrama de dispersión: Veamos un ejemplo donde comparamos las velocidades máximas


(VelMax) para cada sexo (Sexo). La función as.numeric transforma la variable Sexo en
un vector de 1 y 2 (pues son dos categorías) asignandole 1 a Female y 2 a Male.
> plot(as.numeric(Sexo), Velmax, xlab = ’Sexo’, xlim = c(0.5,2.5))



100 120 140

● ●


● ●

● ●


● ●
● ●

Velmax

● ●
● ●

● ●




● ●
80


● ●


60




40

0.5 1.0 1.5 2.0 2.5

Sexo

Dos o más gráficos superpuestos: Para superponer gráficos es necesario agregar la opción
add = TRUE al partir del segundo gráfico. Por ejemplo, si queremos superponer dos histogramas
hacemos lo siguiente:

> hist(CALORIAS[TIPO == ’A’], br = seq(80,200,20), main = ’Histograma


21
+ de CALORIAS’, xlab = ’’, ylab = ’’)
> hist(CALORIAS[TIPO == ’B’], br = seq(80,200,20), add = TRUE,
+col = rgb(1, 0, 0, 1/5))
> hist(CALORIAS[TIPO == ’C’], br = seq(80,200,20), add = TRUE,
+col = rgb(0, 1, 0, 1/5))

Histograma de CALORIAS

8
6
4
2
0

80 100 120 140 160 180 200

8.5. Dos variables cuantitativas


Podemos realizar un gráfico de dispersión para observar la relación que existe entre dos variables
cuantitativas. Existen varias formas de realizar esto, la más común es utilizar la función plot, pero
existen otras alternativas que se muestran a continuación:

plot(CALORIAS, SODIO)

22
600
500
SODIO

400
300
200

100 120 140 160 180

CALORIAS

Si queremos discriminar por categoría de una tercera variable cualitativa podemos utilizar diferentes
colores y formas para los puntos del gráfico:

> plot(CALORIAS[TIPO == ’A’], SODIO[TIPO == ’A’], pch = 1, col = 1,


xlab = ’calorias’, ylab = ’tipo’)
> points(CALORIAS[TIPO == ’B’], SODIO[TIPO == ’B’], pch = 3, col = 2)
> points(CALORIAS[TIPO == ’C’], SODIO[TIPO == ’C’], pch = 4, col = 3)
legend(’bottomright’, legend=c(’A’, ’B’, ’C’), pch = c(1,3,4), col = c(1,2,3), title = ’S
600
500
tipo

400

Sexo
300

A
B
C

120 140 160 180

calorias

Otra forma más directa:

23
library(car)
scatterplot(Calorias, Sodio, groups = Tipo, legend.title = ’Tipo’,
legend.coords = ’bottomright’, smooth = FALSE, reg.line = FALSE, boxplots = FALSE)

600
500
SODIO

400
300

Tipo
200

A
B
C

100 120 140 160 180

CALORIAS

8.6. Una variable cuantitativa vs. dos cualitativas (factores)


Un resúmen numérico de la variable cuantitativa para las diferentes combinaciones de categorías
(niveles) de las dos variables cualitativas (factores) se puede obtener de la siguiente manera:

> datos = read.table(’Contraccion.txt’, header = TRUE)


> attach(datos)

> library(mosaic)
> favstats(Contraccion~Velocidad+Temperatura)

min Q1 median Q3 max mean sd n missing


Alta.Alta 91.62 93.0325 93.270 93.4450 93.89 93.168 0.62668085 10 0
Baja.Alta 75.82 76.0075 76.135 76.1775 76.25 76.090 0.13507200 10 0
Alta.Bajo 71.48 71.5275 71.590 71.6950 71.74 71.606 0.09605554 10 0
Baja.Bajo 72.42 72.5575 72.600 72.8000 73.07 72.674 0.20630075 10 0

Para realizar el gráfico de las medias de una variable cuantitativa para dos combinaciones de factores
y así poder visualizar si existen interacciones entre los diferentes factores hacemos

> interaction.plot(Velocidad, Temperatura, Contraccion)


24
Temperatura

Alta

90
Bajo

mean of Contraccion

85
80
75

Alta Baja

Velocidad

8.7. Más sobre gráficos


Para realizar más de un gráfico en una misma página, antes de graficar debemos agregar la
opción par(mfrow = c(#1,#2)) con #1 la cantidad de gráficos que queremos por fila y #2 la
cantidad que queremos por columna.

Para realizar un nuevo gráfico sin borrar el anterior, antes del nuevo gráfico debemos agregar
la opción dev.new().

Para agregar una leyenda al gráfico, dentro de la función gráfica (plot, barplot, etc.) debemos
agregar la opción legend indicando en un vector los nombres de las variables. Por ejemplo,
legend = c(’Hombres’, ’Mujeres’).

Para agregar/modificar las etiquetas de los ejes del gráfico, dentro de la función gráfica (plot,
barplot, etc.) debemos agregar la opción xlab o ylab con el nombre que deseamos ponerle al
eje. Por ejemplo, xlab = ’Peso en kg.’, ylab = ’Altura en cm.’.

Para modificar los ejes del gráfico, dentro de la función gráfica (plot, barplot, etc.) debemos
agregar la opción xlim o ylim indicando en un vector los limites queremos que tengan los ejes.
Por ejemplo, xlim = c(0,100) o ylim = c(0,200).

Si deseamos cambiar las marcas de los ejes, primero debemos borrar las que hace por defecto
agregando la opción xaxt = ’n’ o yaxt = ’n’ dentro de la función gráfica y luego agregando
la sentencia axis(side = eje, at = marcas). Por ejemplo, si queremos poner marcas en 1,
2 y 3 del eje x, debemos agregar axis(side = 1, at = c(1,2,3)).

25
Para cambiar el tipo de gráfico, dentro de la función gráfica (plot, barplot, etc.) debemos agregar
la opción type indicando el tipo que gráfico que deseamos realizar. Por ejemplo, si deseamos
que grafique líneas, debemos escribir type = ’l’, si deseamos que grafique puntos, debemos
escribir type = ’p’, etc. Recurrir a la ayuda de R para ver más tipos de gráficos (help(plot)).

Para cambiar el caracter del gráfico, dentro de la función gráfica (plot, barplot, etc.) debemos
agregar la opción pch indicando el tipo de caracter que deseamos realizar. Por ejemplo, si
deseamos que grafique cuadraditos, debemos escribir pch = 0, si deseamos círculos, debemos
escribir pch = 1, triángulos debemos escribir pch = 2, etc. Recurrir a la ayuda de R para ver
más tipos de gráficos (help(points)).

Para cambiar el color del gráfico, dentro de la función gráfica (plot, barplot, etc.) debemos
agregar la opción col indicando el color que deseamos. Por ejemplo, si deseamos que el gráfico
sea rojo, debemos escribir col = ’red’ o col = 2. Recurrir a la ayuda de R para ver más
tipos de gráficos (help(plot)). Para poner colores personalizados, podemos utilizar la opción
col = rgb(#1, #2, #3, #4) con #1 la cantidad de rojo que deseamos, #2 la cantidad de verde
y #3 la cantidad de azul. El argumento #4 es para especificar la transparencia de los colores.
Por ejemplo, para graficar en rojo escribimos col = rgb(1, 0, 0, 1), para graficar en rojo
pero más transparente escribimos col = rgb(1, 0, 0, 1/5).

Ejemplo:

par(mfrow = c(1,2))
plot(SODIO, CALORIAS, main = ’Antes’)

plot(SODIO, CALORIAS, col = rgb(0.6, 0, 0.5, 1), pch = 6, xaxt = ’n’,


+ yaxt = ’n’, xlim = c(100,700), ylim = c(0,200), xlab = ’Sodio’,
+ ylab = ’Calorias’, main = ’Despues’)
axis(side = 1, at = c(100,300,500,700))
axis(side = 2, at = c(0,100,200))

26
Antes Despues

200
180
160
CALORIAS

Calorias

100
140
120
100

0
200 400 600 100 300 500 700

SODIO Sodio

Otras maneras de realizar estos gráficos es

9. Probabilidad
En esta sección veremos com utilizar la librería library(prob) para resolver ejercicios de probabil-
dad.

9.1. Eventos y espacios muestrales


Veremos como generar espacios muestrales de diferentes experimentos: tirar un dado, una moneda,
jugar a la ruleta, a las cartas, extraer un elemento de una urna.

1. Lanzar una Moneda: la función tosscoin establece el espacio muestral asociado al experimento
de lanzar una moneda al aire "n"veces.

> n.veces = 3
> S = tosscoin(n.veces)
> S
toss1 toss2 toss3
1 H H H
2 T H H
3 H T H

27
4 T T H
5 H H T
6 T H T
7 H T T
8 T T T

Si deseamos saber la probabilidad de cada evento es necesario agregar la opción makespace = TRUE
como sigue:

> S = tosscoin(n.veces, makespace = TRUE)


> S
toss1 toss2 toss3 probs
1 H H H 0.125
2 T H H 0.125
3 H T H 0.125
4 T T H 0.125
5 H H T 0.125
6 T H T 0.125
7 H T T 0.125
8 T T T 0.125

2. Dado: la función rolldie establece el espacio muestral asociado al experimento de lanzar un


dado equilibrado "n"veces.

> n.veces = 1
> S = rolldie(n.veces)
> S
X1
1 1
2 2
3 3
4 4
5 5
6 6

Para cambiar el número de caras del dado (por defecto usa 6) es necesario agregar la op-
ción nsides indicando el número de lados deseado y para que además para que muestre las
probabilidades debemos agregar makespace = TRUE como antes.

28
3. Ruleta: la función roulette establece el espacio muestral asociado a experimento de hacer
girar la ruleta UNA VEZ.

> S = roulette(european = FALSE)


> S
num color
1 27 Red
2 10 Black
3 25 Red
4 29 Black
.
.
.
35 36 Red
36 13 Black
37 1 Red
38 00 Green

Si deseamos saber la probabilidad de cada evento es necesario agregar la opción


makespace = TRUE. Si european = TRUE, usa la ruleta tradicional con 37 números
(00, 1–36), si european = FALSE usa la ruleta tradicional norteamericana con 38
números (00, 0–36).

> S = roulette(european = FALSE)


> S
num color
1 27 Red
2 10 Black
3 25 Red
4 29 Black
.
.
.
35 36 Red
36 13 Black
37 1 Red
38 00 Green

29
4. Cartas: a función cards establece el espacio muestral para una baraja de 52 cartas.

> S = cards()
> S
rank suit
1 2 Club
2 3 Club
.
.
14 2 Diamond
15 3 Diamond
.
.
27 2 Heart
28 3 Heart
.
.
51 K Spade
52 A Spade

Si deseamos incluir los comodines debemos agregar la opción jokers = TRUE (por defecto uti-
liza jokers = FALSE). Para que además para que muestre las probabilidades debemos agregar
makespace = TRUE como antes.

5. Urna: la función urnsamples establece el espacio muestral asociado con el experimento de


muestrear objetos distinguibles de una urna.

> E = urnsamples(1:10, size = 5)


> S = probspace(E)

Si el muestreo es con reemplazo, es necesario agregar la opción replace = TRUE y si el orden


es importante ordered = TRUE.

9.2. Complementación, unión e intersección de eventos

Para las operaciones de complementación, unión e intersección de eventos, utilizamos las fun-
ciones setdiff, union e intersect, respectivamente como sigue:

30
> S = cards()
> A = subset(S, suit == "Heart")
> B = subset(S, rank == "A" )
> C = subset(S, rank == "2" )

> A
> B
rank suit
rank suit
27 2 Heart
13 A Club
28 3 Heart
26 A Diamond
29 4 Heart
39 A Heart
30 5 Heart
52 A Spade
31 6 Heart
32 7 Heart
> C
33 8 Heart
rank suit
34 9 Heart
1 2 Club
35 10 Heart
14 2 Diamond
36 J Heart
27 2 Heart
37 Q Heart
40 2 Spade
38 K Heart
39 A Heart
> union(A,B)
rank suit
13 A Club
26 A Diamond
27 2 Heart > intersect(A, B)
28 3 Heart rank suit
29 4 Heart 39 A Heart
30 5 Heart
31 6 Heart Acomplemento = setdiff(S,A)
32 7 Heart Bcomplemento = setdiff(S,B)
33 8 Heart
34 9 Heart
35 10 Heart
36 J Heart
37 Q Heart
38 K Heart
39 A Heart
52 A Spade

31
9.3. Probabilidad y probabilidad condicional

Para calcular una probabilidad usamos la función prob con argumentos, el espacio muestral S
y función de las variables a la que queremos calcularle la probabilidad. Si ademmás queremos
condicionar a otro evento, debemos agregar la opción given como sigue:

> n.veces = 2
> S = rolldie(n.veces, makespace = TRUE)
> prob(S, X1+X2 > 9)
[1] 0.1666667
> prob(S, X1+X2 > 9, given = X1 > 4)
[1] 0.4166667

Observar que X1 y X2 son las columas del espacio muestral S.

Cuando realizamos una probabilidad condicional con given dado por una expresion lógica,
event también tiene que ser una expresión lógica. Veamos un ejemplo,

> prob(S, event = (X1 == 6 | X2 == 6), given = X1+X2 == 10)


[1] 0.6666667

10. Funciones de distribución


10.1. Variables aleatorias discretas
En esta sección veremos como graficar funciones de probabilidad y funciones de distribución acumu-
lada tanto empíricas como teóricas.

1. Comencemos con un ejemplo de una variable aleatoria discreta: sea X una variable aleatoria
que toma valores 1, 3 y 4 con probabilidades 0.5, 0.2 y 0.3, respectivamente. Definimos los
elementos que necesitaremos:

x = c(1, 3, 4)
p = c(0.5, 0.2, 0.3)

a) Distribución teórica: Para graficar la función de probabilidad puntual de X utilizamos la


opción type = ’h’ dentro de la función plot como sigue:

32
plot(x, p, type = ’h’, xaxt = "n", ylim = c(0,max(p)),
+ main = ’Funcion de probabilidad puntual’)
points(x, p , pch = 16)
axis(side = 1, at = c(1,3,4))

Para calcular la función de distribución acumulada utilizamos la función stepfun y para


graficarla utilizamos la función plot.stepfun como sigue:

f = stepfun(x, c(0, cumsum(p)))


plot.stepfun(f, vertical = FALSE, pch = 16,
+ ylab = ’F(X)’, main = ’Funcion de distribucion acumulada’)

La función cumsum(x) devuelve un vector con las sumas acumuladas de los elementos de
x.
Funcion de probabilidad puntual Funcion de distribucion acumulada
0.5

1.0
0.4

0.8
0.3

0.6
F(X)
p

0.2

0.4
0.1

0.2
0.0

0.0

1 3 4 0 1 2 3 4 5

x x

b) Distribución empírica: Para obtener una muestra de tamaño 1000 de la variable aleatoria
X, utilizamos la función sample como sigue:

n = 1000
muestra = sample(x, prob = p, size = n, replace = TRUE)

Para graficar el histograma con estos datos utilizamos la función hist (ver sección 8.3).

hist(muestra, br = seq(0.5, 4.5), prob = TRUE, xlab = ’x’,


+ ylab = ’frecuencias relativas’, main = ’Histograma muestral’ )

Para graficar la función de distribución acumulada empírica utilizamos la función plot.ecdf


como sigue:

plot.ecdf(muestra, main = ’Funcion de distribucion acumulada de X’)


33
Histograma muestral Funcion de distribucion acumulada de X

0.5

1.0
0.4

0.8
frecuencias relativas

0.3

0.6
Fn(x)
0.2

0.4
0.1

0.2
0.0

0.0
1 2 3 4 0 1 2 3 4 5

x x

Observación: La distribución uniforme discreta se realiza de igual manera simplemente cam-


biando el vector de valores y de probabilidades como sigue:

k = 10
x = 1:10
p = rep(1/k, k)

2. Distribución Binomial: sea X una variable aleatoria con distribución Binomial de parámetros
m y p. Definimos los elementos que necesitaremos:

m = 6
p = 0.5
x = 0:m

a) Distribución teórica: Para obtener la función de probabilidad puntual y la función de distri-


bución acumulada de X utilizamos, respectivamente, las funciones dbinom(x, size, prob)
y pbinom(x, size, prob) con argumentos x = 0:m (posibles valores de la variable alea-
toria X), size = m (el número de ensayos Bernoulli) y prob = p (la probabilidad de
éxito).

par(mfrow = c(1,2))

plot(x, dbinom(x,m,p), type = ’h’, xaxt = "n", ylim = c(0,1),


+ ylab = ’frecuencias relativas’,
+ main = ’Funcion de probabilidad puntual’)
points(x, dbinom(x,m,p) , pch = 16)
axis(side = 1, at = x)
34
f = stepfun(x, c(0, pbinom(x,m,p)))
plot.stepfun(f, vertical = FALSE, pch = 16, ylab = ’F(X)’,
+ main = ’Funcion de distribucion acumulada’)

Funcion de probabilidad puntual Funcion de distribucion acumulada

1.0

1.0
0.8

0.8
frecuencias relativas

0.6

0.6
F(X)
0.4

0.4
0.2

0.2
0.0

0.0
0 1 2 3 4 5 6 0 2 4 6

x x

b) Distribución empírica: Para obtener una muestra de tamaño 1000 de la variable aleatoria
X, utilizamos la función rbinom como sigue:

n = 1000
muestra = rbinom(n, m, p)

Para graficar el histograma y la función de distribución acumulada empírica de X lo


hacemos como antes:

par(mfrow = c(1,2))

hist(muestra, br = seq(-0.5,m+.5), xaxt = "n",


+ ylim = c(0,1), prob = TRUE, xlab = ’x’, ylab = ’frecuencias relativas’,
+ main = ’Histograma muestral’)
axis(side = 1, at = x)

plot.ecdf(muestra, xaxt = "n",


+ main = ’Funcion de distribucion acumulada de X’)
axis(side = 1, at = x)

35
Histograma muestral Funcion de distribucion acumulada de X

1.0

1.0
0.8

0.8
frecuencias relativas

0.6

0.6
Fn(x)
0.4

0.4
0.2

0.2
0.0

0.0
0 1 2 3 4 5 6 0 1 2 3 4 5 6

x x

Observaciones:

El gráfico de probabilidad puntual (teórico) de X

plot(x, p, type = ’h’)


points(x, p , pch = 16)

puede reemplazarse por un histograma: barplot(prop.table(table(x))).

El histograma muestral hist(muestra) puede reemplazarse por:


barplot(prop.table(table(muestra)))

En general, cuando trabajamos con una variable aleatoria discreta (excepto para la uniforme que di-
fiere levemente) realizamos los gráficos anteriores de manera análoga, teniendo en cuenta la siguiente
tabla:

Generación de Función de Función de


Distribución números aleatorios probabilidad puntual distribución acumulada Cuantiles
Bernoulli rbinom dbinom pbinom qbinom
Binomial rbinom dbinom pbinom qbinom
Poisson rpois dpois ppois qpois
Hipergeométrica rhyper dhyper phyper qhyper

36
10.2. Variables aleatorias continuas
En esta sección veremos como graficar funciones de densidad y funciones de distribución acumulada
tanto empíricas como teóricas.

1. Distribución Normal: sea X una variable aleatoria con distribución normal de parámetro µ y
σ. Definimos los elementos que necesitaremos:

mu = 2
sigma = 2

a) Distribucion teórica: Para obtener la función de densidad y la función de distribución


acumulada de X utilizamos, las funciones dnorm(x,mu,sigma) y pnorm(x,mu,sigma),
respectivamente. Para graficarlas utilizamos el comando curve como sigue:

par(mfrow = c(1,2))

x1 = mu-3*sigma
x2 = mu+3*sigma
curve(dnorm(x, mu, sigma), xlim = c(x1,x2), main = ’Funcion de densidad’,
+ylab = ’f(x)’)

curve(pnorm(x, mu, sigma), xlim = c(-10,15), ylab = ’F(X)’,


+main = ’Funcion de distribucion acumulada’)

Funcion de densidad Funcion de distribucion acumulada


0.20

0.0 0.2 0.4 0.6 0.8 1.0


0.15

F(X)
0.10
f(x)

0.05
0.00

-4 -2 0 2 4 6 8 -10 -5 0 5 10 15

x x

b) Distribución empírica: Para obtener una muestra de tamaño 1000 de la variable aleatoria
X, utilizamos la función rnorm de la siguiente forma:

n = 1000
muestra = rnorm(n, mu, sigma)
37
Para graficar el histograma y la función de distribución acumulada empírica de X lo
hacemos como sigue:

par(mfrow = c(1,2))

hist(muestra, prob = TRUE, ylab = ’frecuencias relativas’,


+main = ’Histograma muestral’)

plot.ecdf(muestra, xaxt = "n", main = ’Funcion de distribucion


+acumulada de X’)

Histograma muestral Funcion de distribucion acumulada de X

1.0
0.20

0.8
frecuencias relativas

0.15

0.6
Fn(X)
0.10

0.4
0.05

0.2
0.00

0.0

-5 0 5 -5 0 5 10

x x

En general, cuando trabajamos con una variable aleatoria continua realizamos los gráficos anteriores
de manera análoga, teniendo en cuenta la siguiente tabla:

Generación de Función de Función de


Distribución números aleatorios probabilidad puntual distribución acumulada Cuantiles
Normal rnorm dnorm pnorm qnorm
Uniforme runif dunif punif qunif
Chi-cuadrada rchisq dchisq pchisq qchisq
F rf df pf qf
T-student rt dt pt qt
Lognormal rlnorm dlnorm plnorm qlnorm
Exponencial rexp dexp pexp qexp

38
11. Intervalos de confianza
En esta sección encontrarán un resumen de como costruir en R todos los intervalos de confianza que
vimos en clase.

11.1. Una muestra


Intervalo de confianza para µ con varianza conocida: No podemos hacerlo con la compu, lo
debemos calcular a mano.

Intervalo de confinza para µ con varianza desconocida: Vamos a utilizar la función de R t.test
de la siguiente forma:

> t.test(x, alternative = "two.sided", conf.level = 0.95)

• El vector x contiene la muestra.


• En la opción alternative indicamos si queremos un intervalo a bilateral ("two.sided"),
unilateral superior ("less") o unilateral inferior ("greater").
• En conf.level indicamos el nivel de confianza con el que queremos construir el intervalo.

11.2. Dos muestras


Intervalo de confianza para µ1 − µ2 con varianza conocidas: No podemos realizarlo en la compu,
tenemos que calcularlo a mano.

Intervalo de confianza para µ1 − µ2 con varianza desconocidas, pero iguales: En la función


t.test ingresamos lo siguiente

> t.test(x, y, alternative = "two.sided", conf.level = 0.95, var.equal = T)

• En los vectores x e y ingresamos las dos muestras


• En var.equal indicamos que queremos que el intervalo se construya considerando varian-
zas iguales.
• Los demás argumentos son como en el caso de una muestra.

Intervalo de confianza para µ1 − µ2 con varianza desconocidas, pero distintas: Realizamos lo


mismo que en el item anterior, pero ingresando en var.equal el valor lógico False:

> t.test(x, y, alternative = "greater", conf.level = 0.99, var.equal = F)

39
Por ejemplo, en este caso construimos el intervalo unilateral inferior con 99 % de confianza.

Intervalo de confianza para muestras apareadas: Aclaramos esta condición en t.test por medio
del argumento paired = T

> t.test(x, y, alternative = "two.sided", conf.level = 0.95, paired = T)

σ12
Intervalo de confianza para : Lo realizamos mediante la función var.test
σ22

> var.test(x, y, alternative = "two.sided", conf.level = 0.95)

11.3. Intervalos de confianza para una proporción


Una muestra: Vamos a utilizar la funcion prop.test de la siguiente forma

> prop.test(X, n, conf.level = 0.95, alternative = "two.sided")

• X es el número de éxitos en n experimentos.


• Los demás argumetos son análogos a lo visto antes.

Dos muestras: Para calcular el intervalo de confianza para la diferencia de proporciones utili-
zamos prop.test como se explica a continuación

> prop.test(x, n, conf.level = 0.95, alternative = "two.sided")

• x es un vector de longitud 2, que contiene la cantidad de éxitos para cada muestra.


• n es un vector de longitud 2 que contiene el número de experimentos para cada muestra
• Los demás argumetos son análogos a lo visto antes.

12. ANOVA
Para realizar un anális ANOVA en R vamos a necesitar instalar los siguientes paquetes: car, multcomp
y lawstat.

PASO 1: Resumen numérico y gráfico de los datos.

Mediante un gráfico boxplot por niveles del factor podemos elaborar algunas conjeturas.

> boxplot(Respuesta~Factor)
40
Podemos realizar un resumen numérico por niveles del factor de la siguiente forma:

> ns = tapply(Respuesta, factor, length)


> Promedio = tapply(Respuestas ,factor, mean)
> Desvio = tapply(Respuestas, factor, sd)
> print(cbind(ns, Promedio, Desvio), digits = 3)

PASO 2: Realizar el test ANOVA.

Es muy importante primero declarar la variable Factor de la siguiente manera:

> factor = as.factor(factor)

Por medio de la función aov realizamos la tabla anova

> modelo = aov(Respuesta ~ factor)


> summary(modelo)

Df Sum Sq Mean Sq F value Pr(> F)


factor 5 12734 2546.8 57.10 <2.2e-16
Residuals 343 15297 44.6
---
El valor que nos indica si rechazamos o no la hipótesis nula (p-value) esta marcado en color
rojo.

PASO 3: Si en el paso 2 rechazamos H0 realizamos comparaciones múltiples. En caso contrario,


pasar al paso siguiente.

Mediante la función glht de R, aplicamos los métodos que estudiamos en clase

• Tukey

> T = glht(modelo, linfct = mcp(Factor = "Tukey"))


> summary(T)

La tabla mostrará todas las comparaciones posibles entre los niveles del factor, y en la
última columna los p-valores. Por ejemplo, para los datos serum.txt se obtuvo lo siguiente

41
Linear Hypotheses:
Estimate Std. Error t value Pr(> |t|)
G2 - G1 == 0 -24.084 14.483 -1.663 0.3522
G3 - G1 == 0 20.593 14.483 1.422 0.4891
G4 - G1 == 0 28.046 15.845 1.770 0.2986
G3 - G2 == 0 44.677 17.009 2.627 0.0552 .
G4 - G2 == 0 52.130 18.183 2.867 0.0312 *
G4 - G3 == 0 7.453 18.183 0.410 0.9761

• Bonferroni
Utilizamos lo que ya guardamos en T como sigue:

summary(T, test = adjusted("bonferroni"))

Nos devolverá una tabla similar a la anterior pero con los p-valores correspondientes a
este método.
• Dunnet: Este método lo usamos cuando queremos comparar los niveles del factor con un
control. Es importante reordenar los niveles del factor, de modo que el primero corresponda
al nivel control.

> factor1 = relevel(Factor,’control’)


> modelo1 = aov(Respuesta ËIJ factor1)
> dunnett = glht(modelo1, linfct = mcp(factor1 = ’Dunnett’))
> summary(dunnett)

PASO 4: Análisis de los residuos.

Contamos con los siguientes test y gráficos para analizar los residuos:

• Gráfico de residuos vs valores ajustados y gráfico de normalidad de los residuos.

Son los dos primeros gráficos que se obtienen mediante el comando > plot(modelo).

• Test de igualdad de varianzas.

> levene.test(Respuesta, Factor, location = ’median’)

Recordad que este test no es robusto a la no normalidad.


• Test de presencia de outliers.

42
> outlierTest(modelo)
rstudent unadjusted p-value Bonferonni p
21 -3.71598 0.00023648 0.002294

• Gráfico de la distancia de Cook y outliers

> influenceIndexPlot(modelo)

PASO 5: Si en el paso 4 no encontramos problemas con los residuos, el análisis terminó. En caso
contrario, realizamos las modificaciones o transformacines necesarias y retomamos al PASO 1.

Si queremos quitar un dato que resultó atípico según el test de outliers, como por ejemplo el
dato 21 en el item anterior, recordar que lo hacemos definiendo nuevas variables sin ese dato:

> Respuesta2 = Respuesta[-21]


> factor2 = factor[-21]

Un gráfico que es útil para analizar si es necesario una tranformación es el siguiente:

> boxcox(modelo)

13. Regresión
En lo que sigue llamaremos Y donde guardamos los datos de la variable respuesta y X para los datos
predictores.

Un diagrama de dispersión de las variables lo realizamos mediante

> plot(X,Y)

Este gráfico es muy importante para observar como se relacionan los datos y elaborar hipótesis. Para
ajustar el modelo de regresión lineal utilizamos la función lm.

> modelo = lm(Y ~ X)


> summary(modelo)

Estimate Std. Error t value Pr(> |t|)

43
(Intercept) 1.769135 0.078664 22.490 <2e-16 ***
X -0.001965 0.003493 -0.563 0.576

Residual standard error: 0.09258 on 49 degrees


of freedom Multiple R-squared: 0.006416,
Adjusted R-squared: -0.01386
F-statistic: 0.3164 on 1 and 49 DF, p-value: 0.5763

Veamos cual es la información que me da esta tabla:

Los estimadores de β0 (ordenada al origen) y β1 (pendiente) en la columna Estimate. En este


ejemplo βb0 = 1,769 y βb1 = −0,001

Un estimador de σ, que en este caso es σ


b = 0,092

En la última linea del summary, el F-test compara: H0: modelo con solamente la media vs
H1: modelo más completo que estoy ajustando. En este caso, el p-value da 0.57 por lo que
aceptamos H0.

Si queremos agregrar al gráfico de dispersión la recta ajustada, lo hacemos como sigue:

> plot(X, Y)
> lines(X, modelo$fitted)

También podemos hacer:

> plot(X, Y)
> abline(modelo)

Como en ANOVA, tenemos que estudiar los residuos. Las funciones que utilizaremos son similares:

> plot(modelo)
> influenceIndexPlot(modelo, id.n = 3)
> outlierTest(modelo)

El outlierTest devuelve el p-valor correspondiente al test H0 : No existen outliers vs. H1 : Existen


outilies. Además, en el caso de existir outliers nos dice en que posición se encuentran los mismos.
Para obtener los intervalos de confianza utilizamos la función predic. Si queremos intervalo de
confianza para el valor medio lo aclaramos en el argumento:

> predict(modelo, interval = "confidence")

En cambio, si queremos un intervalo de predicción:


44
> predict(modelo, interval = "predict")

Estas funciones nos devuelve 3 columnas. En la primera se da el valor ajustado, en la segunda el


límite inferior y luego el límite superior del intervalo para cada valor de la variable predictora que
está en el conjunto de datos. Si en cambio, nos interesa un intervalo para un valor en particular a
(que puede no estar en el conjunto de datos X) procedemos como sigue:

> nuevox = data.frame(X = a)


> predict(modelo, nuevox, interval = "confidence")
> predict(modelo, nuevox, interval = "predict")

En el caso de existir outliers y querer eliminarlos podemos proceder de varias maneras, una de ellas
es eliminar a mano los datos atípicos (como se mostró en la Sección anterior). Supongamos que el
outlierTest nos dice que los datos atípicos se encuentran en las posiciones 2 y 23 de los datos. Por
lo tanto hacemos:

> Xnuevo = X[-c(2,23)]


> Ynuevo = Y[-c(2,23)]

y volvemos a ajustar el modelo:

> modelo1 = lm(Ynuevo ~ Xnuevo)

Otra forma es utilizar directamente la sentencia subset dentro de la función lm como sigue:

> modelo1 = lm(Y ~ X, subset = -c(2,23))

En caso de realizar una transformación, recordemos de la Sección anterior que podemos ver que
transformación aplicarle a la variable respuesta mediante boxcox(modelo). Por ejemplo, si éste
gráfico resulta como el que sigue:
95%
-500
log-Likelihood

-700
-900

-2 -1 0 1 2

Al estar el intervalo de confianza centrado en cero, esto nos indicaría que debemos aplicar una
transformación logarítmica. Por el contrario, el índice indicará la potencia a la cual deberá ser
elevada la variable respuesta para ser transformada. En este caso procedemos de la siguiente manera:
45
> modelo = lm(log(Y) ~ X)

Y si, por ejemplo, queremos obtener intervalos de confianza y predicción para un valor en particular
a, en este caso debemos proceder de la siguiente manera:

> nuevox = data.frame(X = a)


> exp(predict(modelo, nuevox, interval = "confidence"))
> exp(predict(modelo, nuevox, interval = "predict"))

Es decir, debemos aplicar la función inversa del logaritmo (exponencial) para obtener los intervalos
para los valores originales.

46

Potrebbero piacerti anche