Guía de R para Estadística y Probabilidad
Guía de R para Estadística y Probabilidad
Índice General
1 La ayuda de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
4 Leer datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
6 Matrices y vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
6.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
6.2 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1
9 Funciones de distribución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9.1 Variables aleatorias discretas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9.2 Variables aleatorias continuas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
10 Intervalos de confianza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
10.1 Una muestra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
10.2 Dos muestras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
10.3 Intervalos de confianza para una proporción . . . . . . . . . . . . . . . . . . . . . . . 31
11 Test de hipótesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
12 ANOVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
13 Regresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2
Instalación de R y RStudio
Para comenzar a utilizar R, el primer paso es descargarlo de la página http://www.r-project.org/
y luego proceder a su instalación.
Una vez instalado R se podrá instalar RStudio, un entorno de desarrollo integrado para el lenguaje
R que lo vuelve más fácil de utilizar. Se lo debe descargar de la página https://www.rstudio.com/.
1. La ayuda de R
Dentro de RStudio, una de las ventanas contiene la pestaña "Help", en la que se podrá ingresar el
nombre de cualquier comando que se quiera utilizar. Es muy recomendable acostumbrarse a usarla,
ya que cada explicación viene acompañada de ejemplos de uso.
En las ventanas de Consola y Fuente, también se podrá utilizar la ayuda, con los comandos help()
o ?. Por ejemplo si queremos buscar la ayuda para instalar paquetes, podremos hacerlo con los
comandos
help(install.packages)
ó
?install.packages
> getwd()
[1] "C:/Documents and Settings/R"
Para cambiar el directorio de trabajo a través de la barra de menú podemos hacerlo en Session > > Set Wor
e ir a la carpeta deseada.
También podemos hacerlo desde la ventana de comando utilizando el comando setwd especificando
el directorio donde deseamos trabajar. Por ejemplo,
> setwd(C:/Usuario/PyE)
3
La primera vez que se lo quiera utilizar, será necesario instalarlo. Para hacerlo en RStudio debemos
ir a: 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.
Si queremos instalarlo desde las ventanas de Consola y Fuente, se puede utilizar el comando
install.packages, con el ejemplo anterior podemos hacerlo escribiendo install.packages(’’Sleuth2’’)
La lista de paquetes que será necesario instalar para el desarrollo de esta materia es:
4. Leer datos
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 3. y luego leemos los datos como sigue:
library(Sleuth2)
datos = case0801
Importar archivos: En RStudio se puede ir a Files > > Import Dataset y elegir el tipo de
archivo. Hay que tener en cuenta
4
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
identifican cada variable. Este comando se utiliza siempre y cuando los datos tengan
encabezado, si no los tiene se debe poner header = FALSE.
• Archivos de valores separados por comas (.csv), utilizar el siguiente comando:
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 cambio, 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’.
• Archivos de Excel (.xls, .xlsx), utilizando el paquete readxl y el comando read_excel().
• 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,
> data1
CALORIAS SODIO TIPO
1 186 495 A
2 181 477 A
3 176 425 A
4 149 322 A
......................
> names(data1)
[1] "CALORIAS" "SODIO" "TIPO"
5
Para poder trabajar con una columna específica se utiliza:
> data1$CALORIAS
[1] 186 181 176 149 184 190 158 139 175 148 152 111 141 153 190 157 131 149 135 132
[21] 173 191 182 190 172 147 146 139 175 136 179 153 107 195 135 140 138 129 132 102
[41] 106 94 102 87 99 170 113 135 142 86 143 152 146 144
pero si queremos directamente utilizar el nombre de la variable luego de leer los datos debemos hacer:
> attach(data1)
y entonces ya podemos llamar a cada variable directamente por su nombre, por ejemplo:
> CALORIAS
[1] 186 181 176 149 184 190 158 139 175 148 152 111 141 153 190 157 131 149 135 132
[21] 173 191 182 190 172 147 146 139 175 136 179 153 107 195 135 140 138 129 132 102
[41] 106 94 102 87 99 170 113 135 142 86 143 152 146 144
> 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
> 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:
> a = c(1,2,NA,4,5,NA)
> a
[1] 1 2 NA 4 5 NA
6
> is.na(a)
[1] FALSE FALSE TRUE FALSE FALSE TRUE
Si directamente queremos saber si una variable tiene algún dato faltante podemos hacer:
> a = c(-1,2,4,-5)
> which(a>0)
[1] 2 3
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:
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:
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:
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:
7
6. Matrices y vectores
6.1. Vectores
Vamos a ver algunas formas de generar vectores. Se puede construir un vector de tipo numérico, lógico o
caracter. Algunos ejemplos:
> vector1 = c(74, 122, 235, 111, 292, 111, 211, 133, 156, 79)
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 incrementos
de c.
Para acceder a alguna posición del vector utilizamos la expresión vector[]. Por ejemplo, si queremos acceder
a la posición 3 del vector1 hacemos:
> vector1[3]
[1] 235
Para saber la longitud que tiene un vector utilizamos el comando length como sigue:
> length(vector1)
[1] 10
6.2. Matrices
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:
8
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):
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
Naranjas Platanos Melon
Supermercado 1 2 3
Tienda 4 5 6
Para acceder a alguna posición de la matriz utilizamos la expresión M[,]. Por ejemplo, si queremos acceder
a la posición (2,3) de M hacemos:
> M[2,3]
[1] 6
Importante: Observar la diferencia entre [] y (). Los primeros sirven para acceder a un elemento del vector
(o de una matriz) y los segundos sirven sólo para funciones, como por ejemplo para crear vectores utilizamos
la función concatenar c() o para crear una matriz matrix().
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.
> M[1,]
Naranjas Platanos Melon
1 2 3
> M[,1:2]
Naranjas Platanos
Supermercado 1 2
Tienda 4 5
Una ventaja que posee este software es que podemos extraer de manera muy sencilla filas o columnas que
no son contiguas. Por ejemplo, si queremos extraer las columnas 1 y 3 de M hacemos:
> M[,c(1,3)]
Naranjas Melon
Supermercado 1 3
Tienda 4 6
10
O si queremos todas las columnas menos la 1, hacemos:
> M[,-1]
Platanos Melon
Supermercado 2 3
Tienda 5 6
> 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,].
Las funciones min(x) y max(x) calculan el mínimo y el máximo, respectivamente, del elemento x. En
caso de existir datos faltantes o perdidos es necesario agregar la opción na.rm = TRUE.
La función sum(x) devuelve la suma de todos los elementos de x. En caso de existir datos perdidos es
necesario agregar la opción na.rm = TRUE como antes.
La función IQR(x) el rango intercuartílico de x, es decir, la diferencia entre el tercer y primer cuantil.
Obervarción: Para las funciones estadísticas, en caso de existir datos perdidos es necesario agregar la opción
na.rm = TRUE como antes.
11
8. Resumen numérico y gráfico de los datos
8.1. Una variable cualitativa
Resumen numérico: Tabla de frecuencias absolutas y relativas. Utilizamos la función table y prop.table
respectivamente. 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
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’)
12
Tipo de Salchichas
20
15
10
5
0
A B C
Tipo de Salchichas
0.30
0.20
0.10
0.00
A B C
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
13
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
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(Sexo,NumeroAleatorio),1)
> barplot(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(Sexo,NumeroAleatorio),1)
> barplot(a, beside = TRUE)
14
0.30
0.20
0.10
0.00
1 2 3 4 5 6 7 8 9 10
Observar que para realizar un barplot es importante el orden en que se ponen las variables al armar la
tabla: en segundo lugar debemos poner la variable que queremos que esté en el eje horizontal, teniendo
mucho cuidado al agregar la condición para que las proporciones se calculen por filas o columnas según
corresponda (recordar que deben sumar 1 las proporciones para cada nivel de la variable predictora).
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:
15
• Histograma: Veamos un ejemplo con la variable CALORIAS:
> par(mfrow = c(2,2))
> hist(CALORIAS, main = ’Histograma’) ] Histograma en escala de frecuencias absolutas
> hist(CALORIAS, main = ’Histograma’, freq = FALSE) ] Histograma en escala de densi-
dad
> 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
Histograma Histograma
Frequency
0.010
Density
5 10
0.000
0
CALORIAS CALORIAS
Histograma Histograma
Frequency
0.010
Density
8
4
0.000
0
CALORIAS CALORIAS
16
Boxplot para la variable CALORIAS
180
160
140
120
100
• Frecuencias acumuladas: Veamos un ejemplo con la variable Velmax:
> plot.ecdf(Velmax)
ecdf(x)
1.0
●●●
●●
●●
●
0.8
●●
●●
●
●●
0.6
Fn(x)
●●●
0.4
●
●●
0.2
●
●●
●
●
●●●
0.0
Medidas Resúmenes: El resumen numérico es dar una medida de centro y de variabilidad de la varia-
ble respuesta por cada nivel de la variable preditora. La función “favstats” (abreviatura de “favorite
statistic”) proporcionas las medidas resúmenes más comunes para variables numéricas (i.e. la medias,
desviación estándar, mediana, etc).
Por ejemplo, si queremos comparar las calorías contenidas en cada tipo de salchichas, podemos
utilizar el siguiente comando:
17
library(mosaic)
favstats(CALORIAS~TIPO)
Si sólo nos interesan algunas medidas resúmenes de los que nos proporciona favstats(), podemos
indecarlo de la siguiente manera:
favstats(CALORIAS~TIPO)[c(’TIPO’,’mean’,’sd’)]
TIPO mean sd
1 A 156.8500 22.64201
2 B 158.7059 25.23580
3 C 122.4706 25.48313
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:
18
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
A B C
> bwplot(CALORIAS~TIPO)
19
A
B
C
0.015
0.010
Density
0.005
0.000
CALORIAS
• Diagrama de dispersión: Veamos un ejemplo donde comparamos las velocidades máximas (Vel-
Max) 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
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:
20
Histograma de CALORIAS
8
6
4
2
0
plot(CALORIAS, SODIO)
600
500
SODIO
400
300
200
CALORIAS
Si queremos discriminar por categorías, cambiar colores, etc., se puede ver en la Ayuda de RStudio cómo
hacerlo
Otra forma más directa de hacerlo es utilizando el paquete car:
21
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
CALORIAS
> library(mosaic)
> favstats(Contraccion~Velocidad+Temperatura)
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
22
Temperatura
Alta
90
Bajo
mean of Contraccion
85
80
75
Alta Baja
Velocidad
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 agre-
gando 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, de-
bemos agregar axis(side = 1, at = c(1,2,3)).
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
23
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 argumen-
to #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’)
Antes Despues
200
180
160
CALORIAS
Calorias
100
140
120
100
SODIO Sodio
24
9. Funciones de distribución
9.1. Variables aleatorias discretas
En esta sección veremos como graficar funciones de probabilidad y funciones de distribución acumulada 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)
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:
La función cumsum(x) devuelve un vector con las sumas acumuladas de los elementos de x.
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
25
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).
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
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
26
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 aleatoria X),
size = m (el número de ensayos Bernoulli) y prob = p (la probabilidad de éxito).
par(mfrow = c(1,2))
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)
par(mfrow = c(1,2))
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:
En general, cuando trabajamos con una variable aleatoria discreta (excepto para la uniforme que difiere
levemente) realizamos los gráficos anteriores de manera análoga, teniendo en cuenta la siguiente tabla:
28
9.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 σ. Defi-
nimos los elementos que necesitaremos:
mu = 2
sigma = 2
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)’)
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)
29
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))
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 ma-
nera análoga, teniendo en cuenta la siguiente tabla:
30
10.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:
Intervalo de confianza para µ1 − µ2 con varianza desconocidas, pero iguales: En la función t.test
ingresamos lo siguiente
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:
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
σ12
Intervalo de confianza para : Lo realizamos mediante la función var.test
σ22
Dos muestras: Para calcular el intervalo de confianza para la diferencia de proporciones utilizamos
prop.test como se explica a continuación
> t.test(muestra,alternative="greater",mu=500,conf.level=0.99)
Si, en cambio, queremos testear la hipótesis nula H0 : µ = 500 contra la altenativa H1 : µ < 500, con un
nivel de significancia α = 0,05, en este caso usamos
> t.test(muestra,alternative="less",mu=500,conf.level=0.95)
> t.test(muestra,alternative="two.sided",mu=500,conf.level=0.95)
R también proporciona funciones para el cálculo directo de la potencia de un t-test, a través de la función
power.t.test(). Para su uso debemos recordar que la potencia (power) de un t-test es función del tamaño
muestral (n), del nivel de significancia (sig.level), del desvío estándar de la población de la cual se obtuvo
la muestra (sd), de la diferencia entre la media verdadera y la postulada por la hipótesis nula (delta) y del
tipo de hipótesis alternativa (alternative); es decir, si se trata de un test unilateral o bilateral. También
32
debemos precisar si se trata de un test para una sola muestra o para dos muestras. La función power.t.test
espera que especifiquemos todos excepto uno de esos datos y con ello computa el aspecto restante. Por ejem-
plo, si nos interesa calcular la potencia del test para la media dado por la hipótesis nula H0 : µ = 500 contra
la altenativa H1 : µ < 500, con un nivel de significancia α = 0,01, usando una muestra de tamaño n = 20,
cuando la media verdadera es µ = 480 y la varianza de la población es σ 2 = 202 , usamos
> power.t.test(type="one.sample",n=20,delta=20,sig.level=0.01,sd=20,alternative="one.sided")
Obtenemos
n = 20
delta = 20
sd = 20
sig.level = 0.01
power = 0.9653099
alternative = one.sided
de donde vemos que la potencia del test especificado es 0,9653099. Si para las mismas hipótesis quisiéramos
saber cuál es el n que deberíamos usar para tener una potencia de 0,90, entonces usamos
> power.t.test(power=0.9,delta=20,sig.level=0.01,sd=20,alternative="one.sided")
n = 15.85579
delta = 20
sd = 20
sig.level = 0.01
power = 0.9
alternative = one.sided
El resultado nos muestra que el tamaño de muestra más chico que nos asegura esa potencia es n = 16.
Cuando tenemos un test para la diferencia de las medias de dos poblaciones, también usamos t.test() y
especificamos si consideraremos que las varianzas (poblacionales) son iguales o no del mismo modo que lo
hicimos cuando discutimos la construcción de intervalos de confianza. Para los cálculos de potencia utilizan-
do la función power.t.test() es necesario especificar que se trata de un test para dos muestras a través
de la opción type="two.sample". Es necesario notar también que esta función solamente realiza
33
cómputos relacionados con la potencia para un test en el que las dos muestras tienen el mismo
tamaño y se supone además que la varianza de ambas poblaciones es la misma.
Un último comentario sobre test para dos muestras refiere al uso de formas del tipo
> t.test(CALIFICACIONA~SEXO,alternative="greater")
En este caso estamos queriendo testear si las calificaciones (medias) obtenidas en Matemática A por las mu-
jeres son superiores a las obtenidas por los varones. La orden suministrada a R realiza ese test, en este caso
suponiendo que las varianzas poblacionales son iguales (lo que no implica que sea la opción más adecuada
en este caso). Sin embargo, no es obvio que el test realizado realmente emplea la hipótesis alternativa que
queremos. ?ťCómo nos damos cuenta que la alternativa usada es que la media de las mujeres es mayor que
la de los hombres y no al revés? La respuesta es que el nivel femenino del factor SEXO se considera antes
que el nivel masculino, por el orden alfabético de sus letras iniciales. Para evitar confusiones, se sugiere usar
una forma explícita del tipo
> t.test(CALIFICACIONA[SEXO=="femenino"],CALIFICACIONA[SEXO=="masculino"],
alternative="greater")
12. ANOVA
Para realizar un anális ANOVA en R vamos a necesitar instalar los siguientes paquetes: car, multcomp y
lawstat.
Mediante un gráfico boxplot por niveles del factor podemos elaborar algunas conjeturas.
> boxplot(Respuesta~Factor)
Podemos realizar un resumen numérico por niveles del factor de la siguiente forma:
34
> factor = as.factor(factor)
• Tukey
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
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
confint(T)
• Bonferroni
Utilizamos lo que ya guardamos en T como sigue:
35
Nos devolverá una tabla similar a la anterior pero con los p-valores correspondientes a este
método.
Si ahora queremos los intervalos de confianza, hacemos:
k = 6
alfa = 0.05
tt = qt(1-alfa/(2*k))
confint(T, calpha = tt)
Contamos con los siguientes test y gráficos para analizar los residuos:
Son los dos primeros gráficos que se obtienen mediante el comando > plot(modelo).
> outlierTest(modelo)
rstudent unadjusted p-value Bonferonni p
21 -3.71598 0.00023648 0.002294
> influenceIndexPlot(modelo)
36
PASO 5: Si en el paso 4 no encontramos problemas con los residuos, el análisis terminó. En caso con-
trario, 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:
> boxcox(modelo)
13. Regresión
En lo que sigue llamaremos Y donde guardamos los datos de la variable respuesta y X para los datos predic-
tores.
> 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.
37
Los estimadores de β0 (ordenada al origen) y β1 (pendiente) en la columna Estimate. En este ejemplo
βb0 = 1,769 y βb1 = −0,001
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.
> plot(X, Y)
> lines(X, modelo$fitted)
> 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:
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:
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:
38
> Xnuevo = X[-c(2,23)]
> Ynuevo = Y[-c(2,23)]
Otra forma es utilizar directamente la sentencia subset dentro de la función lm como sigue:
En caso de realizar una transformación, recordemos de la Sección anterior que podemos ver que transforma-
ció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:
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:
Es decir, debemos aplicar la función inversa del logaritmo (exponencial) para obtener los intervalos para los
valores originales.
39