100% encontró este documento útil (1 voto)
251 vistas81 páginas

Curso R PDF

Cargado por

pcorsan
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
251 vistas81 páginas

Curso R PDF

Cargado por

pcorsan
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Captulo 1

Introducci
on
1.1.

Qu
e es R?

R es un lenguaje de programaci
on estadstica y para la realizacion de graficos. Sin embargo R tiene
una larga curva de aprendizaje. A diferencia con la mayora del software que solemos utilizar no tiene
una interfaz de ventana. En R se utiliza una consola donde se va escribiendo y ejecutando el codigo.
R fue dise
nado en un principio por Robert Gentleman y Ross Ihaka del departamento de estadstica
de la Universidad de Auckland, en Nueva Zelanda. Hoy en da colaboran miles de personas en su
desarrollo, y hay m
as de 2000 paquetes que a
naden funcionalidades

1.2.

Por qu
e usar R?

Si ya conoces SAS, SPSS , STATA u otro software , por que aprender R?


1. Es gratis y de c
odigo libre.
2. Es multiplataforma. Se puede instalar en Windows, Linux y Mac.
3. Permite, mediante su lenguaje programar nuevos metodos estadsticos.
4. Hay tecnicas avanzadas que no est
an implementadas en otros paquetes (analisis geoestadsticos,
etc)
5. Sus capacidades gr
aficas superan ampliamente a las de otros paquetes.

1.3.

Instalaci
on de R.

La forma m
as sencilla de instalar R es ir a la pagina web R-project http://www.r-project.org/ y
pinchar en la secci
on Downloads, Packages. All se explica como instalar R para los diferentes sistemas
operativos. Una vez instalado se pueden a
nadir mas funcionalidades instalando paquetes especficos.


CAPITULO 1. INTRODUCCION

1.4.

Una sesi
on inicial de R.

Una vez instalado, vamos a ejecutar algunas ordenes sencillas. ( el # se utiliza para comentarios)
> #Peso de ni~
nos en su primer a~
no de vida, (edad en meses)
> edad <- c(1,3,5,2,11,9,3,9,12,3)
> peso <- c(4.4,5.3,7.2,5.2,8.5,7.3,6,10.4,10.2,6.1)
> #Desviaci
on t
pica de peso
> sd(peso)
> # correlaci
on lineal entre peso y edad
> cor(peso,edad)
> # gr
afico de edad frente a peso.
> plot(edad,peso)
Otro ejemplo. Sacado del manual R-intro.
> x <- rnorm(50)
> y <- rnorm(x) # generar dos vectores aleatorios de una normal 0, 1
> plot(x,y)
> ls() # Ver los objetos en el espacio de trabajo
> rm(x,y) # Borrar los objetos x e y
> x <- 1:20 # Crear un vector x=(1,2,...,20)
> w <- 1+sqrt(x)/2 # Crear un vector a partir de x
> # Crear un data frame\emph{ }con dos columnas, x e y.
> datos <- data.frame(x=x , y = x+rnorm(x)*w)
> datos
> fm <- lm(y~x,data=datos)
> summary(fm)#resumen del modelo
> # Ajustamos otro modelo lineal pero con ponderaciones
> fm1 <- lm(y~x,data=datos,weight=1/w^2)
> summary(fm1)#resumen del modelo
> attach(datos)
> lrf <- lowess(x,y) # calcula una regresi
on local no param
etrica
> plot(x,y)# gr
afico simple
> lines(x,lrf$y) #dibuja la regresi
on local
> abline(0,1,lty=3) # a~
nade la recta y=x
> abline(coef(fm))# regresi
on lineal no ponderada
> abline(coef(fm1),col="red")# regresi
on lineal con ponderaciones
Para hacerse una idea de las capacidades graficas de R, podemos ejecutar algunas demos .
> demo(graphics)
> demo(image)
> demo(persp)
> # para ver la lista de las demos
> demo()

Captulo 2

El entorno de R (interfaz)
R es un lenguaje interpretado ( no hace falta compilar el codigo para que se ejecute). Es un lenguaje
case-sensitive (sensible a may
usculas y min
usculas). Para introducir las ordenes se puede utilizar
tanto el command prompt (<) que sale al inicio , como tener los comandos guardados en un archivo
de texto, preferiblemente con la extensi
on .R, y ejecutarlos con la orden source(). En R existen varias
estructuras de datos: vectores, matrices, data.frames y listas. La mayora de las funcionalidades de R
est
an disponibles por defecto, y siempre queda la opcion de que otras funciones esten en un paquete
que puede ser instalado y cargado durante la sesion.

2.1.

Ayuda y documentaci
on.

Veamos algunas formas de buscar ayuda en R.


> # ejemplo de b
usqueda de ayuda sobre lm
> help(lm) # ayuda sobre la funci
on lm
> ?lm # igual que el anterior
> apropos("lm") # lista todas las funciones d
onde aparezca el texto lm
> example(lm) #Muestra y ejecuta un ejemplo de la funci
on
> help.start() # Abre la ayuda en un navegador web
> RsiteSearch("lm") # Busca en los manuales de ayuda y en listas de correo.
Tambien est
an disponibles algunos documentos en pdf sobre temas especficos. Se puede acceder a
ellos con la orden vignette.
> vignette()# muestra d
onde existen esos documentos en pdf
Durante el trabajo con R es usual acceder a la ayuda mediante help() o R

M
as recursos de ayuda. Es recomendable suscribirse a la lista de ayuda de R, (r-help) y tambien a
la lista de ayuda en espa
nol r-help-es https://stat.ethz.ch/mailman/listinfo/r-help-es. En la
web principal de R existe una secci
on de documentacion, donde se pueden bajar multitud de manuales
casi todos en ingles. En cualquiera de los mirrors de CRAN ( sitio donde descargar el programa) ,
existe una secci
on de Task Views, donde podemos ver que paquetes se utilizan para algunas tareas.
3

CAPITULO 2. EL ENTORNO DE R (INTERFAZ)

Un recurso particularmente u
til es utilizar el buscador Rseek http://www.rseek.org/ y a
nadirlo al
navegador, Rseek busca en los Task views, listas de correo, libros y blogs, por ejemplo.
Otros recursos
Canal en youtube, creado por una usuaria chilena http://www.youtube.com/user/bebilda
Grupo en facebook (R project en espa
nol) http://www.facebook.com/group.php?gid=349833178127
Galera de gr
aficos. http://addictedtor.free.fr/graphiques/
Recursos de la universidad de california UCLA. http://www.ats.ucla.edu/stat/R/
Estupenda recopilaci
on de documentacion realizada por el projecto R-UCA de la universidad de
C
adiz. http://knuth.uca.es/R/doku.php?id=documentacion
R-bloguers, recopilaci
on de post sobre R (ingles) http://www.r-bloggers.com/

2.2.

El espacio de trabajo

El espacio o entorno de trabajo (workspace) es el entorno actual que incluye cualquier objeto que haya
definido el usuario (vectores,matrices, funciones, data frames, listas). Al finalizar la sesion de R , se
puede salvar una imagen del espacio de trabajo actual, la cual se carga la siguiente vez que se inicie
R. Cuando estamos introduciendo las
ordenes directamente en el programa ( en vez de escribirlas en
un fichero aparte), se puede consultar el historial utilizando las teclas de flecha. Otra utilidad es el
autocompletado, que se activa pulsando la tecla TAB.
El directorio de trabajo de R es el directorio donde se leen ficheros y se salva el espacio de trabajo por
defecto. Para saber cu
al es el directorio de trabajo se ejecuta la funcion getwd() . Para cambiar el
directorio de trabajo se utiliza la funci
on setwd()1 . Veamos algunas funciones del espacio de trabajo.
> getwd() # Muestra el directorio actual
> ls()
> setwd("c:/docs/proyecto") # Cambiar el directorio actual
> help(options) # Ver las opciones disponibles
> options() # ver la configuraci
on actual
> history() # mostrar los 25
ultimos comandos
> history(max.show=Inf) # mostrar todos los comandos utilizados
> save.image() # Salva el espacio de trabajo en el directorio actual en el fichero .Rdata
> save.image("c:/docs/proyecto2/nombre.Rdata")# salvar el espacio de trabajo en el fichero
> #nombre.Rdata en el directorio proyecto2
> save(x,y,file="prueba.Rdata") # salvar los objetos x e y en prueba.Rdata
> load("prueba.Rdata") # cargar el espacio de trabajo prueba.Rdata
> q() # Salir del progama, pregunta si queremos guardar el espacio de trabajo.
1 En sistemas operativos windows la ruta se especifica con la barra \ , mientras que R utiliza / , as
cuando estemos
utilizando R en windows y se haga referencia a un directorio hay que cambiar \ por \\ o por /.

CAPITULO 2. EL ENTORNO DE R (INTERFAZ)

2.3.

Paquetes

Los paquetes son conjuntos de funciones, datos y codigo compilado en un formato accesible para R.
Por defecto R viene con un conjunto de paquetes estandar pero hay miles (alrededor de 2800) que
est
an disponibles para su descarga e instalacion. Una vez instalados se pueden cargar desde la sesion.
> .libPaths() # muestra la ruta de las carpetas d
onde est
an los paquetes
> library() # muestra todos los paquetes instalados
> search() # muestra qu
e paquetes est
an actualmente cargados

A
nadiendo paquetes Se pueden a
nadir mas funcionalidades y tipos de analisis a R a
nadiendo paquetes, en http://cran.r-project.org/web/packages/ esta la lista con todos paquetes disponibles.
Los pasos para utilizar nuevos paquetes son:
1. Descargar e instalar el paquete (s
olo la primera vez)
2. Para usar el paquete se invoca con library(nombre_del_paquete), esto se debe hacer cada vez
que se inicie R.
En MS Windows.
1. Elegir instalar Paquetes desde el men
u Paquetes.
2. Seleccionar un CRAN mirror.
3. Elegir el paquete a instalar
4. Utilizar library(paquete)
En linux (tambien vale para windows o mac)
1. Dentro del programa ejecutar la orden install.packages("nombre_del_paquete",dep=T)
2. Seleccionar un CRAN mirror.
3. Tambien se pueden actualizar los paquetes con update.packages()
Para crear un paquete propio consultar el documento Writing R extensions disponible en la pagina
web del proyecto.
Cuando se carga un paquete, se habilitan nuevas funciones y conjuntos de datos. El sistema de ayuda permite obtener informaci
on sobre las funciones en cada paquete, (por ejemplo con help.start() ).

Tambien se puede obtener una breve descripcion de las funciones de un paquete con help(package="nombre_del_paquete"
En R tambien tenemos varios datos de ejemplo que vienen con los paquetes, para obtener una lista
de los mismos se puede utilizar data()

CAPITULO 2. EL ENTORNO DE R (INTERFAZ)

Algunos errores comunes


Mezclar may
usculas y min
usculas: help(), Help() y HELP() son funciones distintas , solo
la primera es correcta.
Olvidar el uso de comillas cuando es necesario: install.packages("foreign) funciona
mientras que install.packages(foreign) dara un error.
Olvidar incluir los parentesis al llamar a una funcion . Es preferible usar help() que help,
incluso cuando no hay opciones hay que incluir ()
Usar \ en un nombre de ruta en Windows en vez de / . Por ejemplo setwd("c:\datos")
da error, hay que cambiarlo por setwd("c:/datos") o setwd("c:\\datos")

2.4.

Interfaces gr
aficas de usuarios y editores.

La instalaci
on de R incluye por defecto un editor donde ir escribiendo las ordenes, pero existen otras
alternativas. Vamos a enumerar algunas de ellas.
TinnR y extensi
on para komodo edit http://www.sciviews.org/Tinn-R/. Se trata de un peque
no editor con resaltado de sintaxis y autocompletado. (Windows)
Extensiones para Notepad++, textpad que permiten conectar el editor con el programa.(Windows)
JGR (Java Gui for R). Este editor es muy similar al que viene con R, pero con las herramientas
de resaltado de sintaxis, autocompletado y ayuda sobre las funciones.
WinEdt. Con la extensi
on Rwinedt. (Windows)
Vim, Gvim: Es un editor bastante com
un en linux, que viene con resaltado de sintaxis para
varios lenguajes. (linux)
Gedit. Editor por defecto del entorno GNOME. Con la extension Rgedit, permite resaltado de
sintaxis y conexi
on con el programa. (linux)
Rkward: Programa que adem
as de editor de codigo de R , tiene algunas otras funcionalidades
para importar ficheros desde otros formatos y men
us para realizar algunos analisis sencillos.
(linux)
Eclipse con StatEt plugin. Eclipse es un entorno de desarrollo para programar basado en Java,
que con la extensi
on StatEt nos sirve como editor para R.
Rstudio http://rstudio.org/. De reciente aparicion (febrero 2011) , software libre multiplataforma.
La forma usual de trabajar con R, a diferencia de SPSS, es a traves de la lnea de comandos o
escribiendo el c
odigo en un editor. No obstante se han desarrollado algunas interfaces graficas sencillas.

CAPITULO 2. EL ENTORNO DE R (INTERFAZ)


R Commander.

Es un GUI desarrollado por el profesor John Fox del Departamento de So-

ciologa de la McMaster University en Ontario. La instalacion de R Commander se hace con install.packages("Rcmdr",dep=TRUE) , y luego se ejecuta sin mas que cargar el paquete con library(Rcmdr).

Figura 2.1: R Commander

Rattle para minera de datos. Rattle es una interface para el entorno Gnome, cuyo proposito es el
data mining http://rattle.togaware.com/. Rattle depende de otros muchos programas y paquetes
de R y a veces no funciona del todo bien. Una vez instalado la forma usual de utilizarlo es:
> library(rattle)
Rattle: A free graphical interface for data mining with R.
Versi
on 2.6.2 Copyright (c) 2006-2010 Togaware Pty Ltd.
Escriba 'rattle()' para agitar, sacudir y
Y luego llamar a la funci
on rattle sin argumentos.
> rattle()

rotar sus datos.

CAPITULO 2. EL ENTORNO DE R (INTERFAZ)

Figura 2.2: RATTLE data mining interface para R

Captulo 3

Entrada de datos
R tiene diferentes estructuras de datos (vectores, matrices,arrays, data frames y listas). Para operar con
estas estructuras se utilizan los comandos o funciones para obtener los diferentes analisis estadsticos
y gr
aficos.

3.1.

Tipos de datos.

Tenemos que tener en cuenta que R es un lenguaje orientado a objetos, esto quiere decir que todo
es un objeto. Las constantes, las estructuras de datos, las funciones etc. Los objetos tienen un modo
(mode) que describe que almacena el objeto y una clase (class) que determina que funciones se pueden
aplicar a ese objeto.
Los data frames es una estructura de R que podramos asimilar a los archivos de datos en SPSS, las
columnas de un data.frame son variables y las filas son observaciones.

Vectores Los vectores en R pueden ser de tipo numerico, de caracteres o logicos.


> a <- c(1,2,3,2,4,21) # vector num
erico.La funci
on c es para concatenar valores
> a
[1]

4 21

> (b <- c("H","M","M","H","H","H")) # vector de caracteres.


[1] "H" "M" "M" "H" "H" "H"
> e

<- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE)

> e
[1]

TRUE FALSE FALSE

TRUE FALSE FALSE

Para seleccionar los elementos de un vector se utiliza lo siguiente


> a[5] # muestra el elemento 5 del vector a
9

CAPITULO 3. ENTRADA DE DATOS

10

[1] 4
> a[2:6] # elementos del 2 al 6, ver ?colon para ver como funcion :
[1]

4 21

> b[c(3,6)] # elementos 3 y 6 del vector b


[1] "M" "H"

Matrices Todas las columnas de una matriz tienen que ser del mismo modo (numericas, caracteres)
y de la misma longitud.
La forma general en que se crea una matriz es
mimatriz <- matrix(vector, nrow=r, ncol=c, byrow=FALSE, dimnames=list(char_vector_rownames,
char_vector_colnames))
Veamos un ejemplo
> Y <- matrix(1:12,nrow=3,ncol=4)
> Y
[,1] [,2] [,3] [,4]
[1,]

10

[2,]

11

[3,]

12

> #otro ejemplo


> celdas<-c(2,5,10,34)
> filas.nombre <- c("A","B")
> col.nombre <- c("C1","C2")
> A <- matrix(celdas,nrow=2,byrow=TRUE,dimnames=list(filas.nombre,col.nombre))
> A
C1 C2
A

B 10 34
> # tambi
en se puede cambiar el nombre de las filas o de las columnas con las funciones
> # rownames(A) <- vector de nombres de fila y colnames(A)<- vector de nombres de columna.
Para seleccionar los elementos de una matriz se recurre de nuevo al sistema de indexacion.
> Y[2,3] # elemento en la fila 2, columna 3
[1] 8

CAPITULO 3. ENTRADA DE DATOS

11

> Y[3,] # tercera fila de la matriz


[1]

9 12

> Y[,4] # cuarta columna


[1] 10 11 12
> Yred<- Y[1:2,2:4]
> Yred
[,1] [,2] [,3]
[1,]

10

[2,]

11

En R est
an disponibles las operaciones usuales con matrices, tales como la traspuesta de una matriz
A con t(A), multiplicaci
on de la matriz A por B con A %* %B , obtencion de autovalores y autovectores
con eigen(A)
> #Traspuesta de una matriz
> t(Y)
> # Multiplicaci
on de matrices
> A%*%Yred
> #extraer la diagonal de una matriz
> diag(A)
> #Autovalores y autovectores de una matriz
> ev <- eigen(A)
> ev # Devuelve una lista con los autovalores y autovectorest
> #Descomposici
on en valores singulares
> svd(A)

Arrays Es una estructura similar a las matrices que puede tener mas de dos dimensiones.

Data frames Un dataframe es una estructura similar a la utilizada en SPSS, se caracteriza porque
las columnas pueden tener diferentes modos (numericas, caracter, factor). Cuando importemos datos,
generalmente se van a guardar en un objeto de tipo data.frame.
> f <- c(1:4)
> g <- c("Menor de 18","18-29","30-45","Mayor de 45")
> h <- c(NA,1400,1300,1900) # NA indica que es un valor perdido
> i <- sample(100,4)# 4 n
umeros elegidos al azar entre 1 y 100
> mis.datos <- data.frame(f,g,h,i)
> names(mis.datos) <- c("ID","Gedad","Ing","alea")
> mis.datos

CAPITULO 3. ENTRADA DE DATOS


ID

Gedad

1 Menor de 18

12

Ing alea
NA

72

18-29 1400

10

30-45 1300

73

4 Mayor de 45 1900

79

Para identificar los elementos de un data frame tenemos varias formas.


> mis.datos[2:4] # columnas 2,3 y 4
Gedad

Ing alea

1 Menor de 18

NA

72

18-29 1400

10

30-45 1300

73

4 Mayor de 45 1900

79

> mis.datos[c("Gedad","Ing")] # columnas Gedad e Ing


Gedad

Ing

1 Menor de 18

NA

18-29 1400

3
30-45 1300
4 Mayor de 45 1900
> mis.datos$Ing
[1]

NA 1400 1300 1900

> mis.datos[2,3] # elemento de la fila 2 columna 3


[1] 1400

Listas Las listas son una colecci


on de objetos ordenados. En una lista se puede almacenar cualquier
objeto, as podemos tener una lista con vectores, data frames, matrices e incluso otras listas.
> # lista con la matriz A, y un data.frame
> mi.lista <- list(A,mis.datos)
Para acceder a los elementos de una lista se utiliza el operador [[ ]].
> mi.lista[[1]] # Primer elemento de la lista
C1 C2
A

B 10 34

CAPITULO 3. ENTRADA DE DATOS

13

Hay que diferencias entre el operador [] y [[ ]] . Con el parentesis simple vemos el primer objeto
mientras que con el doble lo seleccionamos. Veamos un ejemplo
> mi.lista[1] # muestra el primer elemento de la lista
> mi.lista[[1]] # selecciona el primer elemento de la lista.
> # queremos ver la primera fila de la matriz A
> # con el operador [] da error
> mi.lista[1][1,]
[1] "Error en mi.lista[1][1, ] : n
umero incorrecto de dimensiones "
> # con [[ ]] si se puede
> mi.lista[[1]][1,]
C1 C2
2

Si ponemos nombres a los objetos de la lista, se puede seleccionar un elemento con el operador $
> mi.lista2 <- list(matriz=A,datos=mis.datos)
> mi.lista2$matriz
C1 C2
A

B 10 34
> mi.lista2$matriz[,2]# segunda columna de la matriz A
A

5 34

Factores Para indicarle a R que una variable es nominal u ordinal se utiliza la funcion factor().
Ve
amoslo con un ejemplo
> #Creamos un vector de caracteres d
onde Hombre se repite 5 veces y Mujer 6.
> sexo <- c(rep("Hombre",5),rep("Mujer",6))#
> sexo <- factor(sexo)# le decimos a R que es un factor.
> sexo
[1] Hombre Hombre Hombre Hombre Hombre Mujer

Mujer

Mujer

Mujer

Mujer

[11] Mujer
Levels: Hombre Mujer
Un vector numerico se puede convertir en un factor, supongamos que tenemos un vector con los valores
1 y 2, y queremos convertirlo en un factor de forma que 1 sea el codigo para hombres y 2 para mujeres.

CAPITULO 3. ENTRADA DE DATOS

14

> sexo.cod <- c(rep(1,5),rep(2,6))#vector num


erico
> sexo.cod <- factor(sexo.cod,levels=c(1,2),labels=c("Hombre","Mujer"))
> sexo.cod
[1] Hombre Hombre Hombre Hombre Hombre Mujer

Mujer

Mujer

Mujer

Mujer

[11] Mujer
Levels: Hombre Mujer
Supongamos una variable codificada con 1,2,3,4, donde
1 : Ganar m
as de 1500
2 : 1200-1500
3 : 1000-1200
4: Menos de 1000
Se trata de una variable ordinal
> ingresos <- c(1, 2, 1, 3, 4, 1, 2, 2, 2, 1, 1, 3)
> ingresos.cat <- factor(ingresos, levels = c(4, 3, 2, 1), labels = c("Menos de 1000",
+

"1000-1200", "1200-1500", "Mas de 1500"), ordered = T)

> ingresos.cat
[1] Mas de 1500

1200-1500

Mas de 1500

1000-1200

Menos de 1000

[6] Mas de 1500

1200-1500

1200-1500

1200-1500

Mas de 1500

[11] Mas de 1500

1000-1200

Levels: Menos de 1000 < 1000-1200 < 1200-1500 < Mas de 1500

Algunas funciones u
tiles
> length(objeto) # n
umero de elementos o componentes del objeto
> head(objeto) # primeros valores de un objeto o filas si es un data.frame
> str(objeto) # estructura del objeto
> class(objeto) # clase o clases del objeto
> names(objeto) # nombres
> c(objeto1,objeto2) # combinar objetos en un vector
> cbind(objeto1,objeto2) # combinar objetos por columnas
> rbind(objeto1, objeto2) # combinar objetos por filas
> ls() # ver los objetos en el espacio de trabajo actual
> rm(objeto1, objeto2) # borrar objeto1 y objeto2

3.2.

Importaci
on de datos

R puede importar datos que esten en ficheros con valores separados ( por comas, tabulador , etc) as
como ficheros de otros programas estadsticos (SPSS, STATA, SAS).

CAPITULO 3. ENTRADA DE DATOS

15

Ficheros con valores separados por comas (csv) La funcion por defecto es read.table() , la
cual tiene multitud de opciones para especificar el separador de los valores, el caracter que identifica los
decimales, si en la primera fila est
a el nombre de las variables o no. Ver la ayuda con help(read.table)
.
Veamos un ejemplo de c
omo sera para un fichero con el nombre de las variables en la primera fila y
los valores separados por comas.
Tenemos el fichero de texto datos.csv.
id,sexo,edad,ingresos
1,H,25,1200
2,M,30,1300
3,M,45,2000
4,H,66,800
5,M,12,
6, ,25,200
7,M,34,1640
8,H,35,1850
9,M,57,3500
10,M,45,900
En R la importaci
on se hace con
> datos <-read.table("/home/jose/Dropbox/cursoR_IESA/Tema1/datos.csv",header=T,sep=",")
> names(datos)
[1] "id"

"sexo"

"edad"

"ingresos"

> head(datos) # muestra las 6 primeras filas, el espacio en blanco en la fila 5 lo pasa a perdido
id sexo edad ingresos
1

25

1200

30

1300

45

2000

66

800

12

NA

25

200

> # sin embargo en la variable sexo toma el espacio en blanco como v


alido para especificar
> # que se trata de un valor perdido, hay que a~
nadir la opci
on na.strings=" "
> class(datos) # lo guarda por defecto en un data.frame
[1] "data.frame"
> datos$sexo # las variables con texto las convierte a factores
[1] H M M H M
Levels:

M H M M

H M

Para facilitar la importaci


on tambien existen las funciones read.csv, read.csv2, read.delim y
read.delim2 que son modificaciones de las opciones por defecto de read. table. As con read.csv
("nombre_fichero") se considera por defecto que el nombre de las variables estan en la primera fila
, que los valores se separan por comas , que el caracter decimal es el punto.

CAPITULO 3. ENTRADA DE DATOS

16

Ficheros de excel Para leer ficheros de excel , tenemos la opcion de convertirlo previamente en un
fichero csv o si se trata de ficheros xls se puede utilizar el paquete RODBC
> library(RODBC)
> conexion <- odbcConnectExcel("c:/fichero_excel.xls")
> misdatos <- sqlFetch(conexion, "nombre_hoja")
> odbcClose(conexion)
Para los ficheros en formato excel 2007 (xlsx) existe el paquete xlsx y se pueden leer con la funcion
read.xlsx()
Ficheros de SPSS La opci
on m
as sencilla es utilizar la funcion spss.get del paquete Hmisc
> library(Hmisc)
> mis.datos <- spss.get("fichero.sav",use.value.labels=TRUE)
Ficheros de SAS Si se tiene un fichero en formato trasport de SAS la funcion sasxport.get del
paquete Hmisc lo importa a un data frame
> library(Hmisc)
> misdatos <- sasxport.get("c:/misdatos.xpt")
Ficheros de Stata. Se utiliza la librera foreign
> library(foreign)
> mi.data.frame <- read.dta("datos_stata.dta")
Acceso a bases de datos relacionales (DBMS) R puede conectarse a con varios sistemas de
bases de datos, incluidos Microsoft SQL Server, Microsoft Access, MySQL, Oracle, PostgreSQL, Teradata. Existen algunos paquetes que instalan un driver nativo, (RPostgreSQL), mientras que otros
permiten acceso mediantee ODBC o JDBC.

3.3.

Exportaci
on de datos

La opci
on m
as simple es exportar a un archivo de texto delimitado , aunque el paquete foreign permite
guardar datos en formato SAS, SPSS o Stata.
De R a fichero delimitado por tabuladores1
> write.table(misdatos,"c:/midirectorio/misdatos.txt", sep="\t")
De R a fichero excel (xls)
> library(xlsReadWrite)
> write.xls(misdatos, "c:/misdatos.xls")
1 Ver

la ayuda de la funci
on write.table para m
as opciones, incluyendo write.csv y write.csv2

CAPITULO 3. ENTRADA DE DATOS


De R a SPSS

17

Se crea un fichero de texto y uno de sintaxis de SPSS

> library(foreign)
> write.foreign(datos, "c:/misdatos.txt", "c:/misdatos.sps",

package="SPSS")

De R a SAS
> library(foreign)
> write.foreign(datos, "c:/datos.txt", "c:/misdatos.sas",

package="SAS")

De R a Stata
> library(foreign)
> write.dta(datos, "c:/datos.dta")

3.4.

Etiquetado en R

Etiquetas de variables Este es uno de los puntos debiles de R, ya que no permite etiquetar
variables tal y como lo hace SPSS por ejemplo. Una solucion sera cambiar el nombre de las variables
y referirnos a las mismas por su posici
on en el data.frame.
Volviendo al ejemplo que se utiliz
o para describir los data.frames ( en la pagina 11)
> mis.datos
ID

Gedad

1 Menor de 18

Ing alea
NA

72

18-29 1400

10

30-45 1300

73

4 Mayor de 45 1900

79

Podramos cambiar el nombre de la variable Ing por Ingresos mensuales


> names(mis.datos)[3] <- "Ingresos mensuales"
Y utilizar la posici
on de la variable en el data.frame
> summary(mis.datos[3])
Ingresos mensuales
Min.

:1300

1st Qu.:1350
Median :1400
Mean

:1533

3rd Qu.:1650
Max.

:1900

NA's

CAPITULO 3. ENTRADA DE DATOS

18

Etiqueta de valores Para etiquetar los valores, la funcion factor sirve perfectamente, ya que con
la opci
on labels se etiquetan los diferentes niveles.
> sexo.cod <- c(rep(1,5),rep(2,6))#vector num
erico
> sexo.cod <- factor(sexo.cod,levels=c(1,2),labels=c("Hombre","Mujer"))
> sexo.cod
[1] Hombre Hombre Hombre Hombre Hombre Mujer

Mujer

Mujer

Mujer

Mujer

[11] Mujer
Levels: Hombre Mujer

3.5.

Valores perdidos

En R los valores perdidos se representan con el smbolo NA (not available). Mientras que , por ejemplo
valores no v
alidos como al dividir por 0 se representan con NaN (not a number).

Detecci
on y eliminaci
on de valores perdidos Para comprobar si existen valores perdidos se
utiliza la funci
on is.na()
> # si tenemos un vector con valores perdidos
> y <- c(1,4,5,NA)
> # la funci
on is.na devuelve un vector del mismo tama~
no indicando d
onde hay valores perdidos
> is.na(y)
[1] FALSE FALSE FALSE

TRUE

Supongamos ahora que al importar datos de SPSS , no hemos tenido en cuenta que los valores perdidos
estaban codificados como 99 u otra codificacion , como podemos recodificarlos al valor NA?
Consideremos el data.frame mis.datos, donde en la primera fila en la variable ingresos tenemos un
valor igual a 999 en vez de NA
ID

Gedad Ingresos mensuales alea

1 Menor de 18

999

72

18-29

1400

10

30-45

1300

73

4 Mayor de 45

1900

79

La forma de recodificarlo es la siguiente


> # seleccionamos las filas d
onde la variable "Ingresos mensuales" es igual a 999
> # y la columna de esa variable, y le asignamos el valor NA
> mis.datos[mis.datos[3]==999,3] <- NA
> mis.datos

CAPITULO 3. ENTRADA DE DATOS


ID

19

Gedad Ingresos mensuales alea

1 Menor de 18

NA

72

18-29

1400

10

30-45

1300

73

4 Mayor de 45

1900

79

Algunas funciones devuelven el valor NA cuando existe alg


un NA en los datos
> x <- c(1,4,5,NA,3)
> mean(x) # devuelve NA
[1] NA
> #con la opci
on na.rm=TRUE podemos excluir el valor perdido
> mean(x,na.rm=TRUE)
[1] 3.25
La funci
on complete.cases() devuelve un vector logico que indica cuales casos estan completos.
> complete.cases(mis.datos)# devuelve TRUE para los casos con valores en todas las variables
[1] FALSE

TRUE

TRUE

TRUE

La funci
on na.omit() devuelve el objeto pero tras eliminar los casos completos
> (nuevos.datos <- na.omit(mis.datos))
ID

Gedad Ingresos mensuales alea

18-29

1400

10

30-45

1300

73

4 Mayor de 45

1900

79

Manejo avanzado de valores perdidos Se han desarrollado paquetes en R para el tratamiento


avanzado de valores perdidos, tales como imputacion m
ultiple.
Algunos de esos paquetes son:
mitools : Herramientas para imputacion m
ultiple
mice : Multivariate Imputation by Chained Equations
AmeliaII: Imputaci
on m
ultiple para datos de series temporales.

CAPITULO 3. ENTRADA DE DATOS

3.6.

20

Valores de fecha

Algunos ejemplos
> # use as.Date( ) to convert strings to dates
>

mydates <- as.Date(c("2007-06-22", "2004-02-13"))

> # number of days between 6/22/07 and 2/13/04


> days <- mydates[1] - mydates[2]
> days
Time difference of 1225 days
Se puede usar as.Date() para convertir caracteres a fechas. El formato es as.Date(x, "formato"),
donde formato especifica el formato de fecha.
> # convert date info in format 'mm/dd/yyyy'
> strDates <- c("01/05/1965", "08/16/1975")
> dates <- as.Date(strDates,"%m/%d/%Y")
> dates # las muestra en formato yyyy-mm-dd
[1] "1965-01-05" "1975-08-16"

Captulo 4

Manejo de datos
4.1.

Creaci
on de nuevas variables

La forma de crear nuevas variables en R es bastante facil, mediante expresiones de la forma


> variable <- expresion
Los operadores son los usuales (+,-,*,) , x % %y (x modulo y)
Algunos ejemplos.
> # si tenemos las variables x1 y x2 en un data.frame
> x1 <- c(1,5,4,3,15)
> x2 <- c(2,3,5,4,34)
> datos <- data.frame(x1,x2)
> # borramos x1 y x2 del espacio de trabajo
> rm(x1,x2)
> # creamos la variable suma en el data.frame, probar suma <- datos$x1+datos$x2
> datos$suma <- datos$x1+datos$x2
> datos
x1 x2 suma
1

5 15 34

49

> # tambi
en se puede

el data.frame para no tener que escribir datos$x1

> attach(datos)
> datos$suma <- x1+x2
> # o utilizar la funci
on transform
> datos <- transform(datos, suma=x1+x2, media=(x1+x2)/2,logaritmo_x1=log(x1),raiz_x2=sqrt(x2))
> datos
21

CAPITULO 4. MANEJO DE DATOS


x1 x2 suma media logaritmo_x1

22
raiz_x2

1.5

0.000000 1.414214

4.0

1.609438 1.732051

4.5

1.386294 2.236068

3.5

1.098612 2.000000

5 15 34

49

24.5

2.708050 5.830952

Para recodificar variables es usual utilizar estructuras de control que se veran en un apartado posterior.
Si en los datos anteriores creamos la variable edad, y queremos categorizarla en mayores de 50 y
menores de 50 , podemos utilizar la funci
on ifelse
> datos <- datos[,1:2] # nos quedamos con las variables x1 y x2
> datos$edad <- c(20,55,30,70,56) # a~
nadimos variable edad
> datos$edad.cat<-ifelse(datos$edad>50,"Mayor de 50","Menor de 50")
> datos
x1 x2 edad

edad.cat

20 Menor de 50

55 Mayor de 50

30 Menor de 50

70 Mayor de 50

5 15 34

56 Mayor de 50

Si queremos crear m
as de dos categoras.
> # seleccionar observaciones por un vector l
ogico
> datos$edad<=25
[1]

TRUE FALSE FALSE FALSE FALSE

> # para seleccionar la primera fila y


> datos$edad.cat[datos$edad<=25] <- "Menor de 25"
> datos$edad.cat[datos$edad>25 & datos$edad<=40] <- "25-40"
> datos$edad.cat[datos$edad>40] <- "Mayor de 40"
> datos
x1 x2 edad

edad.cat

20 Menor de 25

55 Mayor de 40

30

70 Mayor de 40

5 15 34

56 Mayor de 40

25-40

Realizar mismo ejemplo pero utilizando en primer lugar attach(datos). es edad.cat tratada como
factor en R? . Ver funci
on recode en el paquete car

CAPITULO 4. MANEJO DE DATOS

4.2.

Operadores y funciones

Operadores aritm
eticos

Descripci
on

Operador

Suma

Resta

Multiplicaci
on

Divisi
on

Exponente

x m
odulo y

x % %y

Operadores l
ogicos

Descripci
on

Operador

Menor que

<

Menor o igual

<=

Mayor que

>

Mayor o igual

>=

Igual que

==

Distinto de

!=

Distinto de x

!x

xOy

x | y

xYy

x & y

Operadores matem
aticos (funciones incorporadas)

Descripci
on

Operador o funci
on

Valor absoluto de x

abs(x)

Raz cuadrada de x

sqrt(x)

Logaritmo neperiano

log(x)

Logaritmo, base 10

log10(x)

ex

exp(x)

Redondear

round(x,digits=n)

Truncamiento

trunc(x)

23

CAPITULO 4. MANEJO DE DATOS

24

Funciones para texto Tambien existen algunas funciones para trabajar con vectores de texto.
Veamos algunas
substr(x,start=n1,stop=n2) Sirve para extraer texto.
> x<-"abcdefg"
> substr(x,2,4)
[1] "bcd"
> # tambi
en sirve para reemplazar
> # poner un 2 en las posiciones 3 y 4
> substr(x,3,4) <- "22"
> x
[1] "ab22efg"
sub(pattern, replacement, x, ignore.case = FALSE, fixed = FALSE) Busca en x el texto pattern y lo reemplaza por replacement.
> y <- "abjosecd"
> sub("jose","2",y)
[1] "ab2cd"
> y
[1] "abjosecd"
strsplit(x,split) Separa los elementos de x
> strsplit("abc","")
[[1]]
[1] "a" "b" "c"
> strsplit("a.b.c","\\.")
[[1]]
[1] "a" "b" "c"
paste(..., sep="") Concatenar cadenas y despues usar la cadena en sep para separar.
> x<-paste("x",1:5,sep="")

Funciones u
tiles sobre distribuciones estadsticas En R se puede obtener la funcion de densidad, la funci
on de distribuci
on acumulada , la funcion cuantil y valores simulados de la mayora de las
distribuciones, sin m
as que a
nadir un prefijo al nombre que en R tiene dicha distribucion. d para la
funci
on de densidad, p para la distribuci
on acumulada, q para la funcion cuantil y r para simular
valores. Ver la ayuda del paquete stats
Ejemplo.

CAPITULO 4. MANEJO DE DATOS

25

> # obtener 5 valores simulados de una normal de media 3 y desviaci


on t
pica 6
> x <- rnorm(5,mean=3,sd=6)
> x
[1] 10.868089 -1.713154

8.823193

7.194811 -2.632707

Otras funciones u
tiles
mean(x, trim = 0, na.rm = FALSE, ...) Media de x.
Ejemplo
> x <- c(1,2,NA,5,7,9,8,13)
> # obtener la media de x obviando el valor perdido y eliminando el 5% de los datos extremos
> mean(x,trim=0.05,na.rm=T)
[1] 6.428571
sd(x) : Desviaci
on tpica de x. Al igual que para muchas funciones, x puede ser un vector, una matriz
o un data.frame.
Ejemplo
> datos
x1 x2 edad

edad.cat

20 Menor de 25

55 Mayor de 40

30

70 Mayor de 40

5 15 34

56 Mayor de 40

25-40

> mean(datos)
x1

x2

5.6

9.6

edad edad.cat
46.2

NA

> sd(datos)
x1

x2

edad

edad.cat

5.458938 13.685759 20.547506

NA

var, cov y cor: Calculan respectivamente la varianza, covarianza y correlaciones.


Ejemplo
> var(x,na.rm=T)
[1] 17.28571

CAPITULO 4. MANEJO DE DATOS

26

> # si utilizamos cor() sobre un data.frame, con variables num


ericas
> cor(datos[1:3])
x1

x2

edad

x1

1.0000000 0.9710920 0.3820178

x2

0.9710920 1.0000000 0.2857313

edad 0.3820178 0.2857313 1.0000000


scale(x,center=TRUE,scale=TRUE) : Centrar y/o escalar un vector o una matriz numerica
> scale(datos[1:3])
x1

x2

edad

[1,] -0.8426548 -0.5553218 -1.2750939


[2,] -0.1099115 -0.4822531 0.4282758
[3,] -0.2930973 -0.3361158 -0.7884169
[4,] -0.4762831 -0.4091845

1.1582914

[5,]

0.4769435

1.7219468

1.7828752

attr(,"scaled:center")
x1

x2 edad

5.6

9.6 46.2

attr(,"scaled:scale")
x1

x2

edad

5.458938 13.685759 20.547506


seq(from, to,by) : Generar una secuencia
> seq(1,5,0.2)
[1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4 4.6
[20] 4.8 5.0
rep(x,numero_veces) : Repetir x n veces
> (z <- c(1:3,20))
[1]

3 20

> rep(z,3)
[1]

3 20

3 20

3 20

cut(x,n) : Dividir la variable continua x en un factor con n niveles


> x <- 1:10
> cut(x,4)

CAPITULO 4. MANEJO DE DATOS

27

[1] (0.991,3.25] (0.991,3.25] (0.991,3.25] (3.25,5.5]

(3.25,5.5]

[6] (5.5,7.75]

(7.75,10]

(5.5,7.75]

(7.75,10]

(7.75,10]

Levels: (0.991,3.25] (3.25,5.5] (5.5,7.75] (7.75,10]


split(x,ind) Divide el vector x seg
un el factor ind
> x<-c(2,3,5,2,5,7)
> ind <- factor(c(1,1,1,2,2,1),labels=c("cat_1","cat_2"))
> split(x,ind)
$cat_1
[1] 2 3 5 7
$cat_2
[1] 2 5
sample . Muestra aleatoria
> sample(x,2)
[1] 5 7
> sample(x,6,replace=T)
[1] 3 5 2 5 2 2

4.3.

Estructuras de control y bucles

Ejecuci
on condicional : if-else La sintaxis es de la forma
> if (expresion_1) expresion_2 else expresion3
Ejecuci
on repetida: for , repeat and while
For, repeat y while se utilizan para los bucles
For
La sintaxis es de la forma
> for (var in seq) expr
While
> while (condicion) expr
Repeat

CAPITULO 4. MANEJO DE DATOS


> repeat

28

expr

Con while y repeat se puede usar la orden break para controlar el bucle
Ejemplo.
Tenemos el vector, o una variable en un data.frame x=(1000,1200,1800,900,400,2350) y queremos
construir un vector z de forma que valga 1 cuando x<1000 y 2 en caso contrario. Se podra hacer de
la siguiente forma.
> x <- c(1000,1200,1800,900,400,2350)
> z <- numeric(0) # creamos el vector z sin valores
> for (i in 1:length(x)){
+ if (x[i]<1000) z[i]=1 else z[i]=2
+ }
> z
[1] 2 2 2 1 1 2
En R exista una versi
on vectorizada de if , que es ifelse. El ejemplo anterior se puede realizar con
ifelse de la siguiente forma.
> x <- c(1000,1200,1800,900,400,2350)
> z <- ifelse(x<1000,1,2)
> z
[1] 2 2 2 1 1 2

4.4.

Creaci
on de funciones

Aunque la creaci
on de funciones no entra en el proposito de este curso vamos a ver un peque
no
ejemplo.El lenguaje R permite crear funciones.
La sintaxis para crear funciones es la siguiente
> mi.funcion <- function(arg_1,arg_2,...) expresiones
Veamos un peque
no ejemplo que nos calculara la media, la mediana y la desviacion tpica de un vector
numerico
> mi.funcion <- function (x) {
+ # primero evaluamos si x es num
erico
+

if (!is.numeric(x)) {

+
+

print("x no es numerico")
}

+ # si es num
erico calculamos la media, mediana y la desviaci
on tipica
+
+

else
media <- mean(x); med<-median(x); des <- sd(x)

CAPITULO 4. MANEJO DE DATOS

29

+ # guardamos los resultados en una lista


+ result <- list (media=media,mediana=med,desviacion=des)
+ # ahora le decimos a la funci
on que de result como resultado
+ return(result)
+ }
> # Para probar la funci
on simulamos 50 valores de una poisson de parametro 4
> x <- rpois(50,4)
> #ahora ejecutamos la funci
on
> mi.funcion(x)
$media
[1] 4.08
$mediana
[1] 4
$desviacion
[1] 2.107712
Las funciones creadas se pueden guardar en el espacio de trabajo igual que cualquier otro objeto.

4.5.

Ordenando datos

En ocasiones necesitamos ordenar nuestros datos por una o varias variables. En R se utiliza la funcion
order()1 . Por defecto, la ordenaci
on es ascendente , pero se puede indicar que sea descendente
poniendo el signo menos delante de la variable de ordenacion. Veamoslo con un ejemplo.
> # cargamos los datos de mtcars que vienen en R
> data(mtcars)
> # una buena forma de ver que contienen los datos es usar names, str o head
> names(mtcars)
[1] "mpg"

"cyl"

"disp" "hp"

"drat" "wt"

"qsec" "vs"

"am"

[11] "carb"
> str(mtcars)

'data.frame':
$ mpg : num
$ cyl : num
$ disp: num
$ hp : num
$ drat: num
$ wt : num
1 ver

32 obs. of

11 variables:

21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...


6 6 4 6 8 6 8 4 4 6 ...
160 160 108 258 360 ...
110 110 93 110 175 105 245 62 95 123 ...
3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
2.62 2.88 2.32 3.21 3.44 ...

tambi
en la funci
on sort

"gear"

CAPITULO 4. MANEJO DE DATOS

30

$ qsec: num

16.5 17 18.6 19.4 17 ...

$ vs

: num

0 0 1 1 0 1 0 1 1 1 ...

$ am

: num

1 1 1 0 0 0 0 0 0 0 ...

$ gear: num

4 4 4 3 3 3 3 4 4 4 ...

$ carb: num

4 4 1 1 2 1 4 2 2 4 ...

> head(mtcars)
mpg cyl disp
Mazda RX4

21.0

hp drat

wt

qsec vs am gear carb

160 110 3.90 2.620 16.46

Mazda RX4 Wag

21.0

160 110 3.90 2.875 17.02

Datsun 710

22.8

108

93 3.85 2.320 18.61

Hornet 4 Drive

21.4

258 110 3.08 3.215 19.44

Hornet Sportabout 18.7

360 175 3.15 3.440 17.02

Valiant

225 105 2.76 3.460 20.22

18.1

> # podemos ver la ayuda del dataset


> help(mtcars)
Supongamos que ahora queremos ordenar por mpg en orden ascendente
> # asignamos a un nuevo objeto data.frame el conjunto de datos ordenado
> nuevos.datos <- mtcars[order(mtcars$mpg),]
Ahora vamos a ordenar por mpg en orden ascendente y por cyl en orden descendente
> attach(mtcars)
> nuevos.datos <- mtcars[order(mpg,-cyl),]
> head(nuevos.datos)
mpg cyl disp
Cadillac Fleetwood

hp drat

wt

qsec vs am gear carb

10.4

472 205 2.93 5.250 17.98

Lincoln Continental 10.4

460 215 3.00 5.424 17.82

Camaro Z28

13.3

350 245 3.73 3.840 15.41

Duster 360

14.3

360 245 3.21 3.570 15.84

Chrysler Imperial

14.7

440 230 3.23 5.345 17.42

Maserati Bora

15.0

301 335 3.54 3.570 14.60

4.6.

Dataframes (uni
on, agregaci
on de datos, resumen por
grupos)

A
nadiendo variables Para unir dos dataframes horizontalmente (a
nadir variables ) se utiliza la
funci
on merge() . L
ogicamente necesitamos al menos una variable que nos sirva para unir los dos
dataframes. En ambos dataframes la variable ha de tener el mismo nombre. La sintaxis es de la
siguiente forma

CAPITULO 4. MANEJO DE DATOS

31

> total <- merge(dataframeA,dataframeB,by="variable_identificadora")


Veamos un ejemplo sencillo
> ID <- 1:5
> edad <- c(20,25,30,33,44)
> datos1<-data.frame(ID,edad)
> datos1
ID edad
1

20

25

30

33

44

> ingresos <- c(1000,2500,800,1450,3000)


> datos2 <- data.frame(ID=c(2,3,4,1,5),ingresos)
> datos2
ID ingresos
1

1000

2500

800

1450

3000

> # Unimos los dos data.frames por ID


> total <- merge(datos1,datos2,by="ID")
> total
ID edad ingresos
1
2

1
2

20
25

1450
1000

30

2500

33

800

44

3000

Para unir por m


as de una variable
> total <- merge(dataframeA,dataframeB,by=c("var1","var2"))
Se recomienda ver la ayuda con help(merge) donde se especifican todas las opciones. Se puede especificar que incluya todos los casos del primer dataframe aunque el segundo este incompleto, por
ejemplo.
En el ejemplo anterior hemos unido por la variable ID, pero en el caso de que ambos dataframes esten
ordenados se puede utilizar la funci
on cbind().

CAPITULO 4. MANEJO DE DATOS

32

> # ordenamos datos2 por ID


> datos2 <- datos2[order(datos2$ID),]
> # unimos con cbind
> total <- cbind(datos1,datos2)
> total
ID edad ID ingresos
4

20

1450

25

1000

30

2500

33

800

44

3000

A
nadir filas

Los dos dataframes han de tener exactamente las mismas variables. La funcion para

unirlos es rbind().
> # tenemos un nuevo data.frame con el ID y la edad de m
as individuos
> datos3<-data.frame(ID=c(6,7),edad=c(25,45))
> datos3
ID edad
1

25

45

> # para unir datos1 y datos3 usamos rbind


> union<-rbind(datos1,datos3)
> union
ID edad
1

20

25

30

33

44

25

45

Datos agregados Para obtener datos agregados se utiliza la funcion aggregate.


Ejemplo
> # utilizamos de nuevo los datos mtcars y queremos obtener un nuevo data.frame que nos de
> #la media de las variables num
ericas para todas las combinaciones de cyl y vs
> aggdatos <-aggregate(mtcars, by=list(cyl,vs),
> aggdatos

FUN=mean, na.rm=TRUE)

CAPITULO 4. MANEJO DE DATOS


Group.1 Group.2

mpg cyl

33
disp

hp

drat

wt

qsec vs

0 26.00000

4 120.30

91.0000 4.430000 2.140000 16.70000

0 20.56667

6 155.00 131.6667 3.806667 2.755000 16.32667

0 15.10000

8 353.10 209.2143 3.229286 3.999214 16.77214

1 26.73000

4 103.62

81.8000 4.035000 2.300300 19.38100

1 19.12500

6 204.55 115.2500 3.420000 3.388750 19.21500

am

gear

carb

1 1.0000000 5.000000 2.000000


2 1.0000000 4.333333 4.666667
3 0.1428571 3.285714 3.500000
4 0.7000000 4.000000 1.500000
5 0.0000000 3.500000 2.500000
Otra funci
on que se puede utilizar es tapply cuya salida es en forma de matriz o vector. Veamos
el ejemplo anterior utilizando tapply para obtener las medias de la variable mpg en las diferenctes
combinaciones de cyl y vs. Ver la ayuda de tapply.
> aggdatos2 <- tapply(mtcars$mpg,data.frame(cyl,vs),mean,na.rm=TRUE)
> aggdatos2
vs
cyl

4 26.00000 26.730
6 20.56667 19.125
8 15.10000

NA

Otras funciones que se pueden utilizar son summarize() en el paquete Hmisc y summaryBy() en el
paquete doBy.

Reorganizando datos (Reshaping data) Se puede usar la funcion t() para trasponer los datos.
> mtcars
> t(mtcars)
En el paquete reshape hay m
as funciones para manejar la estructura de los dataframes. Veamos un
ejemplo.
Tenemos los datos siguientes
f1

f2

x1

x2

Los introducimos

CAPITULO 4. MANEJO DE DATOS

34

> options(digits=4)
> f1 <- c(1,1,2,2,1)
> f2 <- c(1,2,1,2,2)
> x1 <- c(5,6,1,2,0)
> x2 <- c(6,2,2,8,3)
> datos <- data.frame(f1,f2,x1,x2)
> # cargamos la librer
a reshape , la instalamos si no est
a
> library(reshape)
> # utilizamos la orden melt para construir el siguiente data.frame
> new.datos <- melt(datos,id=c("f1","f2"))
> new.datos
f1 f2 variable value
1

x1

x1

x1

x1

x1

x2

x2

x2

x2

10

x2

Ahora se puede utilizar la funci


on cast para obtener por ejemplo las medias de x1 y x2 en los diferentes
niveles de f1 y f2.
> # cast(datos,formula, funcion)
> f1medias <- cast(new.datos,f1~variable,mean)
> f2medias <- cast(new.datos,f2~variable,mean)
> f1medias
f1

x1

x2

1 3.667 3.667

2 1.500 5.000

> f2medias
f2

x1

x2

1 3.000 4.000

2 2.667 4.333

4.7.

Selecci
on de variables y observaciones

Selecci
on de variables La primera forma de seleccionar variables de un dataframe es a traves de
la indizaci
on.
Ejemplo

CAPITULO 4. MANEJO DE DATOS


> # construimos un dataframe con 4 variables
> v1 <- c(2,4,6,2.2,3,8)
> v2 <- c(300,400,350,180,90,450)
> v3 <- rnorm(6) # 6 valores simulados de una normal 0 1
> v4 <- c("15-19","20-24","15-19","25-29","20-24","25-29")
> v4 <- as.factor(v4)
> misdatos <- data.frame(v1,v2,v3,v4)
> rm(v1,v2,v3,v4)
> misdatos
v1

v2

v3

v4

1 2.0 300

1.8008 15-19

2 4.0 400

1.7163 20-24

3 6.0 350 -0.6437 15-19


4 2.2 180
5 3.0

0.3261 25-29

90 -1.0997 20-24

6 8.0 450

0.8361 25-29

> # seleccionar variables

por su posicion

> (seleccion <- misdatos[2:4])# o con seleccion <- misdatos[,2:4]


v2
1 300
2 400

v3

v4

1.8008 15-19
1.7163 20-24

3 350 -0.6437 15-19


4 180
5

0.3261 25-29

90 -1.0997 20-24

6 450

0.8361 25-29

> # seleccionar variables 1 ,3 y 4


> seleccion <- misdatos[c(1,3,4)]
> # Seleccionar variables por nombre
> misvars <- c("v1","v3")
> (seleccion <- misdatos[misvars])
v1

v3

1 2.0

1.8008

2 4.0 1.7163
3 6.0 -0.6437
4 2.2

0.3261

5 3.0 -1.0997
6 8.0

0.8361

Excluir variables de una selecci


on
> # excluir variables por posicion
> (seleccion <- misdatos[c(-2,-4)])

35

CAPITULO 4. MANEJO DE DATOS


v1

v3

1 2.0

1.8008

2 4.0

1.7163

36

3 6.0 -0.6437
4 2.2

0.3261

5 3.0 -1.0997
6 8.0

0.8361

> # excluir variables v2 y v4 por nombre


> misvars <- names(misdatos) %in% c("v2","v4")
> # produce un vector l
ogico
> misvars
[1] FALSE

TRUE FALSE

TRUE

> # con el operador ! revertimos los valores de misvars


> (seleccion <- misdatos[!misvars])
v1

v3

1 2.0

1.8008

2 4.0

1.7163

3 6.0 -0.6437
4 2.2

0.3261

5 3.0 -1.0997
6 8.0

0.8361

Borrar variables del data.frame

El operador habitual rm() no funciona sobre las variables en

un data frame
> rm(misdatos$v1)#da error
Para borrar variables sin tener que seleccionar las restantes y guardarlas en un nuevo dataframe , se
les puede asignar el objeto NULL
> misdatos$v1 <- NULL
> misdatos
v2

v3

v4

1 300

1.8008 15-19

2 400

1.7163 20-24

3 350 -0.6437 15-19


4 180
5

0.3261 25-29

90 -1.0997 20-24

6 450

0.8361 25-29

CAPITULO 4. MANEJO DE DATOS


Selecci
on de observaciones Selecci
on por posicion
> # Seleccionamos los 3 primeros valores y la variable v2
> seleccion <- misdatos[1:3,2]
> seleccion
[1]

1.8008

1.7163 -0.6437

Selecci
on basada en los valores de una o mas variables
> misdatos[misdatos$v2>=400 | misdatos$v4=="15-19",]
v2
1 300

v3
v4
1.8008 15-19

2 400

1.7163 20-24

3 350 -0.6437 15-19


6 450

0.8361 25-29

> # otra forma


> attach(misdatos)# para no poner misdatos$
> condicion <- v2>=400 | v4=="15-19"
> misdatos[condicion,]
v2

v3

v4

1 300

1.8008 15-19

2 400

1.7163 20-24

3 350 -0.6437 15-19


6 450

0.8361 25-29

Selecci
on usando la funci
on subset
> subset(misdatos,v2>=400,select=c(v2,v3))
v2

v3

2 400 1.7163
6 450 0.8361
Obtener una muestra de los datos usando la funcion sample
> # muestra de tama~
no 3
> muestra <- misdatos[sample(1:nrow(misdatos),3),]
> muestra
v2
5

v3

v4

90 -1.100 20-24

1 300

1.801 15-19

2 400

1.716 20-24

En R existen paquetes especficos para muestreo, tales como sampling o survey

37

CAPITULO 4. MANEJO DE DATOS

4.8.

38

Conversi
on entre tipos de datos

La conversi
on entre datos diferentes es bastante sencilla. Existe la funcion is.tipo de dato, que devuelve
TRUE o FALSE y la funci
on as.tipo de dato para convertir de un tipo de dato a otro. Las funciones
son
is.numeric(), is.character(), is.vector(), is.matrix(), is.data.frame()
as.numeric(), as.character(), as.vector(), as.matrix(), as.data.frame)

Desde vector

A vector

A matriz

A data.frame

c(x,y)

cbind(x,y)

data.frame(x,y)

rbind(x,y)
Desde matriz

as.vector(mimatriz)

Desde data.frame

as.data.frame(mimatriz)
as.matrix(datos)

Para convertir desde un vector numerico a un factor se utiliza as.factor()


Convertir entre tipos de datos es necesario cuando, por ejemplo , una funcion esta definida para que
se le pase una matriz y le pasamos un data.frame o al reves. Siempre es recomendable leer la ayuda
de la funci
on para ver que tipos de datos acepta.
Ejemplos
> is.numeric(misdatos)
[1] FALSE
> is.data.frame(misdatos)
[1] TRUE
> mimatriz <- as.matrix(misdatos)
> mimatriz
v2

v3

v4

[1,] "300" " 1.8008" "15-19"


[2,] "400" " 1.7163" "20-24"
[3,] "350" "-0.6437" "15-19"
[4,] "180" " 0.3261" "25-29"
[5,] " 90" "-1.0997" "20-24"
[6,] "450" " 0.8361" "25-29"
En el dataframe misdatos hay variables de distinto tipo (numericas y factores), al convertirlo a una
matriz , considera que todas las variables son factores, ya que en una matriz todas las columnas tienen
que ser del mismo tipo. Si seleccionamos solo las variables v2 y v3 ya si se convierte a una matriz
numerica
> mimatriz <- as.matrix(misdatos[c("v2","v3")])
> mimatriz

CAPITULO 4. MANEJO DE DATOS


v2

v3

[1,] 300

1.8008

[2,] 400

1.7163

[3,] 350 -0.6437


[4,] 180
[5,]

0.3261

90 -1.0997

[6,] 450

0.8361

39

Captulo 5

Gr
aficos b
asicos
R es un lenguaje muy potente y flexible a la hora de realizar graficos. El poder controlar muchos
aspectos de los gr
aficos, hace que no sea tan sencillo como en SPSS. En R los graficos se van
construyendo, en el sentido de que a un gr
afico ya hecho se le puede a
nadir mas elementos.
Veamos un peque
no ejemplo.
> attach(mtcars) # adjuntamos el dataset mtcars
> plot(wt,mpg)# Variable wt frente a mpg
> abline(lm(mpg~wt))# a~
nadimos la recta de regresi
on simple
> title("Regresi
on lineal de MPG con WT como variable dependiente")
> detach(mtcars)

40

CAPITULO 5. GRAFICOS
BASICOS

41

Regresin lineal de MPG con WT como variable dependiente

30

25

mpg

20

15

10

wt

Para guardar el gr
afico , se puede hacer bien por men
u o mediante codigo. Para hacerlo mediante
c
odigo se tienen las siguientes funciones
> pdf("migrafico.pdf")
> # para otros formatos
> win.metafile()
> png()
> jpeg()
> bmp()
> tiff()
> postscript()

5.1.

Histogramas y gr
aficos de densidad

Para realizar histogramas se utiliza la orden hist(x). Se tienen las opciones freq=FALSE y breaks
que controla el n
umero de barras.
Ejemplo
> par(mfrow=c(2,2))# divide el dispositivo gr
afico en 4 partes
> hist(mtcars$mpg)
> hist(mtcars$mpg,freq=F)
> hist(mtcars$mpg,breaks=30)

CAPITULO 5. GRAFICOS
BASICOS

42

Histogram of mtcars$mpg

0.04

Density

8
6
4
0

0.00

Frequency

12

Histogram of mtcars$mpg

10

15

20

25

30

35

10

15

mtcars$mpg

20

25

30

35

mtcars$mpg

3
2
1
0

Frequency

Histogram of mtcars$mpg

10

15

20

25

30

mtcars$mpg

Para obtener un gr
afico de densidad, se puede utilizar el comando density(x) para obtener la densidad
y luego plot para dibujarla.
> par(mfrow=c(2,2))
> d <- density(mtcars$mpg)
> plot(d)
> plot(d,main=" gr
afico de densidad",col="red")

CAPITULO 5. GRAFICOS
BASICOS

43

10

20

30

40

N = 32 Bandwidth = 2.477

5.2.

0.00 0.02 0.04 0.06

grfico de densidad

Density

0.00 0.02 0.04 0.06

Density

density.default(x = mtcars$mpg)

10

20

30

40

N = 32 Bandwidth = 2.477

Gr
aficos de puntos

Para crear un gr
afico de puntos se utiliza la funcion dotchart(x,labels=) donde x es un vector
numerico y labels es un vector de etiquetas para cada punto. La opcion groups= se usa para especificar
un factor que agrupa a los valores de x. Otras opciones son gcolor para controlar el color de los grupos
y cex para el tama
no de las etiquetas.
> dotchart(mtcars$mpg, labels = row.names(mtcars), cex = 0.7, main = "Gas Milage for Car Models",
+

xlab = "Miles Per Gallon")

CAPITULO 5. GRAFICOS
BASICOS

44

Gas Milage for Car Models


Volvo 142E
Maserati Bora
Ferrari Dino
Ford Pantera L
Lotus Europa
Porsche 9142
Fiat X19
Pontiac Firebird
Camaro Z28
AMC Javelin
Dodge Challenger
Toyota Corona
Toyota Corolla
Honda Civic
Fiat 128
Chrysler Imperial
Lincoln Continental
Cadillac Fleetwood
Merc 450SLC
Merc 450SL
Merc 450SE
Merc 280C
Merc 280
Merc 230
Merc 240D
Duster 360
Valiant
Hornet Sportabout
Hornet 4 Drive
Datsun 710
Mazda RX4 Wag
Mazda RX4

10

15

20

25

30

Miles Per Gallon

Veamos como se hara ordenando por mpg y agrupando por la variable cyl
> x <- mtcars[order(mtcars$mpg),] # ordenamos por mpg
> x$cyl <- factor(x$cyl) # especificamos que cyl es un factor
> x$color[x$cyl==4] <- "red" # creamos la variable color en el data.frame
> x$color[x$cyl==6] <- "blue"
> x$color[x$cyl==8] <- "darkgreen"
> dotchart(x$mpg, labels = row.names(x), cex = 0.7, groups = x$cyl,
+

main = "Gas Milage for Car Models\ngrouped by cylinder",

xlab = "Miles Per Gallon", gcolor = "black", color = x$color)

CAPITULO 5. GRAFICOS
BASICOS

45

Gas Milage for Car Models


grouped by cylinder
4
Toyota Corolla
Fiat 128
Lotus Europa
Honda Civic
Fiat X19
Porsche 9142
Merc 240D
Merc 230
Datsun 710
Toyota Corona
Volvo 142E

6
Hornet 4 Drive
Mazda RX4 Wag
Mazda RX4
Ferrari Dino
Merc 280
Valiant
Merc 280C

8
Pontiac Firebird
Hornet Sportabout
Merc 450SL
Merc 450SE
Ford Pantera L
Dodge Challenger
AMC Javelin
Merc 450SLC
Maserati Bora
Chrysler Imperial
Duster 360
Camaro Z28
Lincoln Continental
Cadillac Fleetwood

10

15

20

25

Miles Per Gallon

5.3.

Gr
aficos de barra

Se utiliza la funci
on barplot().
> par(mfrow=c(2,2))
> barplot(mtcars$cyl)#un mal gr
afico de barras
> barplot(table(mtcars$cyl))
> barplot(table(mtcars$cyl),horiz=T)

30

CAPITULO 5. GRAFICOS
BASICOS

0 2 4 6 8

12

46

10 12 14

Cuando tenemos una tabla podemos hacer un grafico de barras apiladas o agrupadas
> par(mfrow = c(2, 2))
> counts <- table(mtcars$cyl, mtcars$gear)
> barplot(counts, main = "N
umero de marchas por cilindros", xlab = "marchas",
+

legend = rownames(counts))

> barplot(counts, main = "N


umero de marchas por cilindros", xlab = "marchas",
+

legend = rownames(counts), col = c("darkgreen", "red", "orange"),

beside = T)

CAPITULO 5. GRAFICOS
BASICOS

Nmero de marchas por cilindros

Nmero de marchas por cilindros

12

8 10

47

4
2
0
3

marchas

5.4.

4
6
8

0 2 4 6 8

8
6
4

marchas

Gr
aficos de lneas

Los gr
aficos de lneas se crean con la funci
on lines(x,y,type=) donde x e y son numericos y type se
usa para especificar c
omo se unen los puntos. Type puede tomar los siguientes valores
p : puntos
l : lneas
o : lneas y puntos
b,c
s,S
h
n
La funci
on line se utiliza para a
nadir lneas a un grafico ya existente, por s sola no produce el grafico.
Para generar el gr
afico podemos utilizar la funcion generica plot
Ejemplo
> x <- 1:6
> y <- x
> par(mfrow=c(2,2))

CAPITULO 5. GRAFICOS
BASICOS

48

> plot(x,y,type="l")
> plot(x,y,type="h")
> plot(x,y,type="s")

6
5
4
1

y
1

> plot(x,y,type="o")

y
3

2
1

5.5.

Gr
aficos de sectores

En la documentaci
on de R no recomiendan el uso de este tipo de grafico. Se recomienda en general el uso
de barras o de gr
aficos de puntos. Para crear un grafico de sectores se utiliza la funcion pie(x,labels=)
d
onde x es un vector numerico positivo que indica el area y labels= indica las etiquetas.
Ejemplo
> tam <- c(4,8,10,20)
> lbls <- c("etiq1","etiq2","etiq3","etiq4")
> pie(tam,labels=lbls)

CAPITULO 5. GRAFICOS
BASICOS

49

etiq2

etiq3
etiq1

etiq4

> # grafico con porcentajes


> pct <- round(tam/sum(tam)*100)# vector con porcentajes
> etiquetas <- paste(lbls,pct,"%",sep=" ") # a~
nadimos los porcentajes a las etiquetas
> pie(tam,labels=etiquetas,col=terrain.colors(4))

CAPITULO 5. GRAFICOS
BASICOS

50

etiq2 19 %

etiq3 24 %
etiq1 10 %

etiq4 48 %

5.6.

Boxplots

Los boxplots se pueden crear de una sola variable o agrupando. La orden que se utiliza es boxplot(x,data=) , d
onde x puede ser una variable cuantitativa o una formula , y data indica el dataframe. Un ejemplo de f
ormula es ygrupo que hace que obtengamos un boxplot de y por cada categora
de grupo.
Ejemplo
> #boxplot de la variable mpg en los datos mtcars
> boxplot(mtcars$mpg)

10

15

20

25

30

CAPITULO 5. GRAFICOS
BASICOS

> # boxplot de mpg seg


un las categor
as de cyl
> boxplot(mpg~cyl,data=mtcars,col="orange")

51

CAPITULO 5. GRAFICOS
BASICOS

15

20

25

30

52

10

Queda como ejercicio ver la ayuda de boxplot, las opciones varwidth y horizontal.
En otros paquetes existen extensiones de los boxplot, ver paquete vioplot orden vioplot que mezcla
boxplots y gr
aficos de densidad y la orden bagplot del paquete aplpack que generaliza los boxplot al
caso bivariante.

5.7.

Scatterplots

La funci
on usual para crear este tipo de graficos es plot(x,y) con x e y numericos.
Ejemplo
> attach(mtcars)
> plot(wt,mpg,main="Ejemplo",xlab="Peso del autom
ovil", ylab="Millas por gal
on",pch=19)
> # a~
nadimos la recta de regresion
> abline(lm(mpg~wt),col="red")
> # a~
nadimos regresi
on suavizada
> lines(lowess(wt,mpg), col="blue")

CAPITULO 5. GRAFICOS
BASICOS

53

Ejemplo

30

25

20

15

Millas por galn

10

Peso del automvil

La funci
on scatterplot() en el paquete car incluye mas funcionalidades, como la posibilidad de
a
nadir boxplot.
Ejemplo
> library(car)
> scatterplot(mpg ~ wt | cyl, data = mtcars, xlab = "Peso del autom
ovil",
+

ylab = "Millas por Gal


on", main = "Ejemplo con scatterplot del paquete car ",

boxplots = "xy")

CAPITULO 5. GRAFICOS
BASICOS

54

cyl

Ejemplo con scatterplot del paquete car

4
6
8

30

25

20

10

15

Millas por Galn

Peso del automvil


Para obtener varios scatterplots a la vez podemos usar la funcion pairs(formula,...)


Ejemplo
> pairs(~mpg+disp+drat+wt,data=mtcars)

CAPITULO 5. GRAFICOS
BASICOS

mpg

100

drat

5.0

300

disp

4.0

10 15 20 25 30

300

3.0

100

55

10 15 20 25 30

3.0

wt

4.0

5.0

La funci
on scatterplotMatrix() en el paquete car permite ampliar las funcionalidades de pairs.
> library(car)
> scatterplotMatrix(~mpg+disp+drat+wt | cyl, data=mtcars,main="Ejemplo con scatterplotMatrix")

CAPITULO 5. GRAFICOS
BASICOS

56

Ejemplo con scatterplotMatrix


300

4
6
8

10

30

mpg

20

100

3.0

drat

5.0

4.0

100

300

disp

wt

10 15 20 25 30

3.0

4.0

5.0

Tambien existe la posibilidad de realizar graficos 3D .


Algunos ejemplos
> library(scatterplot3d)
> scatterplot3d(wt, disp, mpg, data = mtcars, pch = 16, highlight.3d = TRUE,
+

type = "p", main = "3D Scatterplot")

CAPITULO 5. GRAFICOS
BASICOS

57

3D Scatterplot

35

25

20

mpg

500

disp

30

400

15

300
200

10

100
0
1

wt

> # Queda como ejercicio, otras formas de obtener un gr


afico parecido
> s3d <-scatterplot3d(wt,disp,mpg, pch=16, highlight.3d=TRUE,
> fit <- lm(mpg ~ wt+disp)
> s3d$plane3d(fit)
> library(rgl)
> plot3d(wt, disp, mpg, col="red", size=3)
> # con el paquete Rcmdr
> library(Rcmdr)
> scatter3d(wt, disp, mpg)# adjuntar mtcars si no lo estaba ya

type="h", main="3D Scatterplot")

Captulo 6

Estadstica b
asica
6.1.

Estadsticos descriptivos

R tiene varias formas de obtener estadsticos descriptivos. Veamos en primer lugar la funcion sapply(datos, FUN,opciones) que aplica a las variables del dataframe datos la funcion FUN.
Ejemplo
> # importamos el fichero datos.csv
> setwd("/home/jose/Dropbox/cursoR_IESA/Tema1/")
> datos <-read.table("datos.csv",header=T,sep=",",na.strings="")
> names(datos)
[1] "id"

"sexo"

"edad"

"ingresos"

> datos
id sexo edad ingresos
1

25

1200

30

1300

45

2000

66

800

12

NA

6 <NA>

25

200

34

1640

35

1850

57

3500

10 10

45

900

Para obtener la media en cada variable utilizamos sapply


> sapply(datos,mean)
id

sexo

5.5

NA

edad ingresos
37.4

NA
58


CAPITULO 6. ESTADISTICA BASICA

59

> # queremos s
olo la media de las variables num
ericas y que no devuelva NA en ingresos
> sapply(datos[3:4],mean,na.rm=TRUE)
edad ingresos
37.4

1487.8

Otras funciones que se pueden utilizar con sapply son sd, var,min,max,median,range y quantile
> sapply(datos[3:4],median,na.rm=T)
> sapply(datos[3:4],sd,na.rm=T)
> sapply(datos[3:4],quantile,probs=c(0.1,0.8),na.rm=T)
Tambien tenemos funciones que calculan algunas medidas de resumen por defecto
> # funci
on gen
erica summary
> summary(datos)
id
Min.

sexo

edad

:3

Min.

1st Qu.: 3.25

:6

1st Qu.:26.2

1st Qu.: 900

Median : 5.50

NA's:1

Median :34.5

Median :1300

Mean

Mean

Mean

: 5.50

:12.0

ingresos

: 1.00

:37.4

Min.

: 200

:1488

3rd Qu.: 7.75

3rd Qu.:45.0

3rd Qu.:1850

Max.

Max.

Max.

:3500

NA's

:10.00

:66.0

> # funci
on fivenum
> fivenum(datos$ingresos)# ver la ayuda con help(fivenum)
[1]

200

900 1300 1850 3500

Existen funciones en varios paquetes para obtener medidas agrupadas seg


un las categoras de un factor

o combinaciones de ambos. Aqu vamos a considerar la ma sencillas que es by(datos,factor,funcion,opciones_funcion)


Ejemplo.
> # Obtener un resumen con summary de las variables edad e ingresos seg
un sexo y lo guardamos en res
> res<-by(datos[c(3,4)],datos$sexo,summary,simplify=F)
> res
datos$sexo: H
edad
Min.

:25.0

1st Qu.:30.0

ingresos
Min.

: 800

1st Qu.:1000

Median :35.0

Median :1200

Mean

Mean

:42.0

3rd Qu.:50.5

:1283

3rd Qu.:1525


CAPITULO 6. ESTADISTICA BASICA
Max.

:66.0

Max.

60

:1850

-----------------------------------------------------------datos$sexo: M
edad
Min.

ingresos

:12.0

Min.

: 900

1st Qu.:31.0

1st Qu.:1300

Median :39.5

Median :1640

Mean

Mean

:37.2

:1868

3rd Qu.:45.0

3rd Qu.:2000

Max.

Max.

:3500

NA's

:57.0

C
omo podramos calcular el coeficiente de asimetra ? La formula es
asim =

Pn
1

(x (x))
(x)3

Calcular el coeficiente de la variable mpg en los datos mtcars

6.2.

Frecuencias y tablas de contingencia

Para obtener las frecuencias de una variable categorica se utiliza la orden table() . Como datos de
ejemplo tomamos el conjunto de datos Arthritis del paquete vcd (Visualizing Categorical Data).
Los datos provienen de Kock & Edward (1988) y se trata de un estudio de doble ciego para evaluar
la eficacia de un nuevo tratamiento para la artritis.
> library(vcd)#cargamos la librer
a, si no est
a se instala con install.packages("vcd")
> # vemos los primeros valores del dataframe Arthritis
> head(Arthritis)# ver ayuda de los datos con help(Arthritis)
ID Treatment

Sex Age Improved

1 57

Treated Male

27

Some

2 46

Treated Male

29

None

3 77

Treated Male

30

None

4 17

Treated Male

32

Marked

5 36

Treated Male

46

Marked

6 23

Treated Male

58

Marked

> str(Arthritis)

'data.frame':
$ ID
:
$ Treatment:
$ Sex
:
$ Age
:
$ Improved :

84 obs. of
int

5 variables:

57 46 77 17 36 23 75 39 33 55 ...

Factor w/ 2 levels "Placebo","Treated": 2 2 2 2 2 2 2 2 2 2 ...


Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
int

27 29 30 32 46 58 59 59 63 63 ...

Ord.factor w/ 3 levels "None"<"Some"<..: 2 1 1 3 3 3 1 3 1 1 ...

Tenemos las variable Treatment ( Placebo, Treated) , Sex (Male, Female) y Improved (None, Some,
Marked)


CAPITULO 6. ESTADISTICA BASICA

61

Tablas de frecuencias de una variable.


> attach(Arthritis)
The following object(s) are masked _by_ '.GlobalEnv':
ID
> mitabla <- table(Improved)
> mitabla
Improved
None

Some Marked

42

14

28

Si queremos obtener las proporciones , se puede utilizar prop.table(mitabla)


> prop.table(mitabla)
Improved
None

Some Marked

0.5000 0.1667 0.3333

Tablas cruzadas de dos variables Se utiliza la misma funcion table


> tabla <- table(A,B)
D
onde A es la variable fila y B la variable que va en las columnas. Tambien se puede utilizar xtabs()
, que crea una tabla de contingencia pero utilizando la notacion de formula en R.
> tabla <- xtabs(~A+B , data=misdatos)
D
onde misdatos es un dataframe o una matriz. En general, las variables que queremos tabular se
ponen a la derecha del smbolo y se separan por +. Si se incluye una variable en el lado izquierdo,
R considera que es una variable de frecuencias o ponderacion
> mitabla <- table(Treatment, Improved)
> mitabla
Improved
Treatment None Some Marked
Placebo

29

Treated

13

21

Para obtener las frecuencias y proporciones marginales se usa margin.table() y prop.table() respectivamente.


CAPITULO 6. ESTADISTICA BASICA
> margin.table(mitabla,1) # obtengo el total por filas
Treatment
Placebo Treated
43

41

> prop.table(mitabla,1) # proporciones por filas


Improved
Treatment

None

Some Marked

Placebo 0.6744 0.1628 0.1628


Treated 0.3171 0.1707 0.5122
> # Totales por columnas y proporciones por columnas
> margin.table(mitabla,2)
Improved
None

Some Marked

42

14

28

> prop.table(mitabla,2)
Improved
Treatment

None

Some Marked

Placebo 0.6905 0.5000 0.2500


Treated 0.3095 0.5000 0.7500
Para obtener la proporci
on de cada celda sobre el total, simplemente hacemos.
> prop.table(mitabla)
Improved
Treatment

None

Some

Marked

Placebo 0.34524 0.08333 0.08333


Treated 0.15476 0.08333 0.25000
Podemos usar addmargins() para a
nadir la suma marginal a las tablas.
> addmargins(mitabla)
Improved
Treatment None Some Marked Sum
Placebo
Treated

29
13

7
7

7
21

43
41

Sum

42

14

28

84

> addmargins(prop.table(mitabla))

62


CAPITULO 6. ESTADISTICA BASICA

63

Improved
Treatment

None

Some

Marked

Sum

Placebo 0.34524 0.08333 0.08333 0.51190


Treated 0.15476 0.08333 0.25000 0.48810
Sum

0.50000 0.16667 0.33333 1.00000

Por defecto addmargins() a


nade los totales para todas las variables, pero podemos especificar cual
queremos
> addmargins(mitabla,2)
Improved
Treatment None Some Marked Sum
Placebo

29

43

Treated

13

21

41

La orden table no incluye los valores perdidos (NA) como categora valida, para incluirlo hay que utilzar
la opci
on exclude=NULL si la variable es un vector. Si la variable es un factor, podemos reemplazarlo
con nuevo.factor <- factor(viejo.factor,exclude=NULL)
Otra forma de obtener tablas de dos variables es usar la orden CrossTable() incluida en el paquete
gmodels .
Ejemplo.(queda
> library(gmodels) # si no est
a instalado install.packages("gmodels")
> CrossTable(Arthritis$Treatment,Arthritis$Improved)
Cell Contents
|-------------------------|
|

N |

| Chi-square contribution |
|
|

N / Row Total |
N / Col Total |

N / Table Total |

|-------------------------|

Total Observations in Table:

84

| Arthritis$Improved
Arthritis$Treatment |

None |

Some |

Marked | Row Total |

--------------------|-----------|-----------|-----------|-----------|
Placebo |

29 |

7 |

7 |

43 |

2.616 |

0.004 |

3.752 |

0.674 |

0.163 |

0.163 |

0.512 |

0.690 |

0.500 |

0.250 |


CAPITULO 6. ESTADISTICA BASICA
|

0.345 |

64
0.083 |

0.083 |

--------------------|-----------|-----------|-----------|-----------|
Treated |

13 |

7 |

21 |

41 |

2.744 |

0.004 |

3.935 |

0.317 |

0.171 |

0.512 |

0.488 |

0.310 |

0.500 |

0.750 |

0.155 |

0.083 |

0.250 |

--------------------|-----------|-----------|-----------|-----------|
Column Total |

42 |

14 |

28 |

84 |

0.500 |

0.167 |

0.333 |

--------------------|-----------|-----------|-----------|-----------|
La funci
on CrossTable() tiene muchas opciones, tales como elegir el n
umero de decimales, calcular los
test de idependencia de Fisher y McNemar , ver los valores esperados y los residuos, as como mostrar
la tabla al estilo de SAS o SPSS
> # ejecutar el siguiente c
odigo como ejemplo
> CrossTable(Arthritis$Treatment,Arthritis$Improved,digits=2,format="SPSS")

Tablas multidimensionales Tanto table() como xtabs() se extienden al caso de mas de dos
variables. Las funciones margin.table() , prop.table() y addmargins() funcionan de igual forma
con m
as de dos variables.
> mitabla <- table(Treatment, Sex, Improved)
> mitabla
, , Improved = None
Sex
Treatment Female Male
Placebo

19

10

Treated

, , Improved = Some
Sex
Treatment Female Male
Placebo

Treated

, , Improved = Marked
Sex
Treatment Female Male
Placebo

Treated

16


CAPITULO 6. ESTADISTICA BASICA

65

> # utilizando ftable vemos la tabla de manera m


as compacta
> ftable(mitabla)
Improved None Some Marked
Treatment Sex
Placebo
Treated

Female

19

Male

10

Female

16

Male

> margin.table(mitabla,1)
Treatment
Placebo Treated
43

41

> margin.table(mitabla,2)
Sex
Female

Male

59

25

> margin.table(mitabla,c(1,3))
Improved
Treatment None Some Marked
Placebo

29

Treated

13

21

Test de independencia

Test de la chi-cuadrado: Se utiliza la funcion chisq.test()

> mitabla <- table(Treatment, Improved)


> chisq.test(mitabla)
Pearson's Chi-squared test
data:

mitabla

X-squared = 13.05, df = 2, p-value = 0.001463


Parece que existe relaci
on entre el tratamiento y la mejora de la artritis. Queda como ejercicio ver el
mismo test pero con el sexo.
Test exacto de Fisher: Se utiliza cuando la muestra es peque
na. La funcion es fisher.test()
> fisher.test(mitabla)


CAPITULO 6. ESTADISTICA BASICA

66

Fisher's Exact Test for Count Data


data:

mitabla

p-value = 0.001393
alternative hypothesis: two.sided
Test de Cochran-Mantel-Haenszel: Se utiliza para contrastar la hipotesis nula de que dos variables
nominales son condicionalmente independientes en cada estrato de una tercera variable. Como ejemplo
, vamos a contrastar si la variable Treatmen (tratamiento) e Improved (mejora) son idenpendientes en
cada nivel de sexo. El test asume que no hay interaccion de orden 3. La funcion es mantelhaen.test(x)
donde x es una tabla tridimensional de contingencia donde la u
ltima dimension es el estrato.
> mitabla <- table(Treatment, Improved, Sex)
> mantelhaen.test(mitabla)
Cochran-Mantel-Haenszel test
data:

mitabla

Cochran-Mantel-Haenszel M^2 = 14.63, df = 2, p-value = 0.0006647


Los resultados sugieren que el tratamiento recibido y la mejora no es independiente en cada nivel de
sexo. Es decir, parece que aplicar tratamiento produce una mayor mejora que no aplicarlo cuando
controlamos por sexo)
Tambien es posible usar la funci
on loglm() en el paquete MASS para ajustar modelos loglineales, por
ejemplo, en una tabla con tres variables se pueden ver los siguientes test
> library(MASS)
> tabla <- xtabs(~A+B+C,data=misdatos)
> # A, B y C son mutuamente independientes
> loglm(~A+B+C, tabla)
> # A es parcialmente independiente de B y de C
> loglm(~A+B+C+B*C, tabla)
> # A es independiente de B,dado C
> loglm(~A+B+C+A*C+B*C,tabla)

Medidas de asociaci
on Los test de independencia nos dan donde hay suficiente evidencia para
rechazar la hip
otesis nula de independencia. Una vez que se ha rechazado dicha hipotesis , el interes
se centra en medir la asociaci
on. En el paquete vcd existe la funcion assocstats() que calcula el
coeficiente phi, el coeficiente de contingencia y la V de Cramer para una tabla de dos variables.
> library(vcd)
> attach(Arthritis)
> mitabla <- table(Treatment,Improved)
> assocstats(mitabla)


CAPITULO 6. ESTADISTICA BASICA
X^2 df

P(> X^2)

Likelihood Ratio 13.530

2 0.0011536

Pearson

2 0.0014626

13.055

Phi-Coefficient

67

: 0.394

Contingency Coeff.: 0.367


Cramer's V

6.3.

: 0.394

Correlaciones

Podemos usar cor() para obtener correlaciones y cov() para obtener covarianzas.
Para usar cor() con dataframes el formato es el siguiente cor(x,use,method=) donde
x : Matriz o dataframe
use: Para especificar el tratamiento de los valores perdidos. Las opciones son all.obs ( asume que no
hay datos perdidos, si los hay se produce un error), complete.obs ( borra los casos con alg
un valor
perdido) pairwise.complete.obs , (elimina el valor perdido, pero no el caso completo)
method: Especifica el tipo de correlaci
on. Las opciones son pearson, spearman o kendall
Ejemplo
> cor(mtcars, use="complete.obs", method="kendall")
mpg
mpg
cyl

cyl

disp

hp

1.0000 -0.7953 -0.7681 -0.7428


-0.7953

1.0000

0.8144

drat

wt

qsec

vs

am

0.46455 -0.7278

0.31537

0.5897

0.4690

0.7852 -0.55132

0.7283 -0.44897 -0.7710 -0.4946

disp -0.7681

0.8144

1.0000

0.6660 -0.49898

0.7434 -0.30082 -0.6033 -0.5203

hp

0.7852

0.6660

1.0000 -0.38263

0.6113 -0.47291 -0.6306 -0.3040

drat
wt

-0.7428

0.4645 -0.5513 -0.4990 -0.3826


-0.7278

0.7283

0.7434

1.00000 -0.5471

0.6113 -0.54715

0.03272

0.3751

0.5755

1.0000 -0.14199 -0.4885 -0.6139

qsec

0.3154 -0.4490 -0.3008 -0.4729

0.03272 -0.1420

1.00000

0.6575 -0.1689

vs

0.5897 -0.7710 -0.6033 -0.6306

0.37510 -0.4885

0.65754

1.0000

0.1683

am

0.4690 -0.4946 -0.5203 -0.3040

0.57555 -0.6139 -0.16890

0.1683

1.0000

gear 0.4332 -0.5125 -0.4760 -0.2794 0.58392 -0.5436 -0.09126 0.2697 0.7708
carb -0.5044 0.4654 0.4137 0.5960 -0.09535 0.3714 -0.50644 -0.5769 -0.0586
gear
mpg
cyl

carb

0.43315 -0.50439
-0.51254

0.46543

disp -0.47598

0.41374

hp

0.59598

drat
wt

-0.27945

0.58392 -0.09535
-0.54360

0.37137

qsec -0.09126 -0.50644


vs

0.26975 -0.57693

am

0.77079 -0.05860

gear

1.00000

0.09801

carb

0.09801

1.00000


CAPITULO 6. ESTADISTICA BASICA

68

Para calcular la matriz de covarianzas usamos cov()


> cov(mtcars)
En el caso de que tengamos un vector de pesos, podemos utilizar cov.wt()
Ejemplo
> x <- c(1,3,2,1)
> y <- c(2,3,4,5)
> peso <- c(0.2,0.3,1,0.5)
> datos <- data.frame(x,y)
> cov.wt(datos,wt=peso,cor=T)
$cov
x
x

0.7023 -0.3359

y -0.3359

1.2061

$center
x

1.8 3.9
$n.obs
[1] 4
$wt
[1] 0.10 0.15 0.50 0.25
$cor
x
x

1.0000 -0.3649

y -0.3649

1.0000

Con la funci
on cov2cor() se obtiene la matriz de correlaciones a partir de la matriz de covarianzas
Ni cor() ni cov() nos dan los test de significacion, sin embargo podemos usar cor.test() para
realizar test
Ejemplo. En los datos mtcars, contrastar si el coeficiente de correlacion entre mpg y cyl es distinto de
0
> cor.test(mtcars$mpg,mtcars$cyl)
> # ver opciones de cor.test
> # probar con cor.test(mtcars[1],mtcars[2]) a qu
e se debe el error?
La funci
on rcorr() en el paquete Hmisc nos da las correlaciones/covarianzas junto con el p-valor. La
funci
on toma como argumento una matriz.
Ejemplo


CAPITULO 6. ESTADISTICA BASICA

69

> library(Hmisc)
> rcorr(as.matrix(mtcars))
En el paquete psych tenemos la funci
on corr.test que hace lo mismo que la anterior.
Ejemplo
> # consideramos el conjunto de datos state.x77 que contiene informaci
on, help(state.x77)
> # sobre distintas variables en 50 estados de los USA
> state<-state.x77[,1:6]# nos quedamos con las 6 primeras variables
> head(state)
Population Income Illiteracy Life Exp Murder HS Grad
Alabama

3615

3624

2.1

69.05

15.1

41.3

Alaska

365

6315

1.5

69.31

11.3

66.7

Arizona

2212

4530

1.8

70.55

7.8

58.1

Arkansas

2110

3378

1.9

70.66

10.1

39.9

21198

5114

1.1

71.71

10.3

62.6

2541

4884

0.7

72.06

6.8

63.9

California
Colorado

> # cargamos la librer


a psych , si no est
a, la instalamos
> library(psych)
> corr.test(state)
Call:corr.test(x = state)
Correlation matrix
Population Income Illiteracy Life Exp Murder HS Grad
Population

1.00

0.21

0.11

Income
Illiteracy

0.21

1.00

0.11

-0.44

-0.07

0.34

Murder

0.34

HS Grad

-0.10

Life Exp

-0.07

0.34

-0.10

-0.44

0.34

-0.23

0.62

1.00

-0.59

0.70

-0.66

-0.59

1.00

-0.78

0.58

-0.23

0.70

-0.78

1.00

-0.49

0.62

-0.66

0.58

-0.49

1.00

Sample Size
Population Income Illiteracy Life Exp Murder HS Grad
Population

50

50

50

50

50

50

Income

50

50

50

50

50

50

Illiteracy

50

50

50

50

50

50

Life Exp
Murder

50
50

50
50

50
50

50
50

50
50

50
50

HS Grad

50

50

50

50

50

50

Probability value
Population Income Illiteracy Life Exp Murder HS Grad
Population

0.00

0.15

0.46

0.64

0.01

0.5

Income

0.15

0.00

0.00

0.02

0.11

0.0

Illiteracy

0.46

0.00

0.00

0.00

0.00

0.0

Life Exp

0.64

0.02

0.00

0.00

0.00

0.0

Murder

0.01

0.11

0.00

0.00

0.00

0.0

HS Grad

0.50

0.00

0.00

0.00

0.00

0.0


CAPITULO 6. ESTADISTICA BASICA

6.4.

70

t.test

El t.test, se usa principalmente para realizar contrastes sobre la diferencia de medias en dos grupos.
La funci
on utilizada en R es t.test().Esta funcion presupone por defecto desigualdad de varianzas
entre los dos grupos.
Para ilustrar el uso de t.test, vamos a considerar el conjunto de datos sleep, help(sleep)
> sleep
extra group ID
1

0.7

-1.6

3
4

-0.2
-1.2

1
1

3
4

-0.1

3.4

3.7

0.8

0.0

10

2.0

1 10

11

1.9

12

0.8

13

1.1

14

0.1

15

-0.1

16

4.4

17

5.5

18

1.6

19

4.6

20

3.4

2 10

La sintaxis de t.test es t.test(y~x) d


onde y es una variable numerica y x un factor binario.
> t.test(extra~group,data=sleep)
Welch Two Sample t-test
data:

extra by group

t = -1.861, df = 17.78, p-value = 0.0794


alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-3.3655

0.2055

sample estimates:
mean in group 1 mean in group 2
0.75

2.33

> #supongamos ahora varianzas iguales y contrastar si la media en el grupo 1 es mayor que en el grupo
> t.test(extra~group,alternative="greater",var.equal=T,conf.level=0.90,data=sleep)


CAPITULO 6. ESTADISTICA BASICA

71

Two Sample t-test


data:

extra by group

t = -1.861, df = 18, p-value = 0.9604


alternative hypothesis: true difference in means is greater than 0
90 percent confidence interval:
-2.710

Inf

sample estimates:
mean in group 1 mean in group 2
0.75

2.33

Graficamente podemos ver un boxplot


> boxplot(extra~group,data=sleep)
Si en vez de tener una variable grupo, tenemos dos vectores, la sintaxis es t.test(y1,y2) con y1 e
y2 vectores numericos.
Si ambas muestras est
an relacionadas se puede utilizar la opcion paired=TRUE.
Cuando se tiene m
as de dos grupos, se utiliza el analisis de la varianza (ANOVA)

6.5.

Test no param
etricos

R tiene funciones para realizar varios test no parametricos


Test Mann-Whitney U. La hip
otesis nula es que la distribucion de la variable de estudio es la misma
en las dos muestras
> wilcox.test(y~A)
> # donde y es un vector num
erico y A es un factor binario
> wilcox.test(y,x) # igual que antes pero tenemos dos vectores num
ericos en vez
> # de un factor binario
La sintaxis y opciones son similares a las de t.test()
Test de krukal-wallis. Equivalente a Anova de un factor, pero en el caso no parametrico.
> kruskal.test(y~A)# y variable num
erica y A un factor, posiblemente con m
as de un nivel.
Test de Friedman. Equivalente a Anova de dos factores
> friedman.test(y,grupos,bloques)
> # usando notaci
on de f
ormula
> friedman.test(y~A|B)


CAPITULO 6. ESTADISTICA BASICA

6.6.

72

Regresi
on lineal

No vamos a hacer una introducci


on te
orica a la regresion ni a la regresion m
ultiple. Simplemente
vamos a ver que funciones tiene R para ajustar una regresion.
El comando b
asico es lm() y la sintaxis b
asica es la siguiente.
> # creamos el objeto ajuste
> ajuste <- lm(y~x1+x2+x3,data=dataframe.con.los.datos)# regresi
on m
ultiple
> #con
> summary(ajuste) # se muestra un resumen del modelo
Otras funciones u
tiles son
> coefficients(ajuste) # coeficientes del modelo
> confint(ajuste,level=0.95) # Intervalos de confianza para los coeficientes
> fitted(ajuste) # valores predichos
> residuals(ajuste) # residuos
> anova(ajuste) # muestra una tabla anova del modelo
> influence(ajuste) # valores influyentes, hat values
> predict(ajuste,nuevosdatos)# prediccion de un nuevo conjunto de datos usando el ajuste
Ejemplo de regresi
on lineal simple.
Consideramos el dataset women que viene con R, como siempre, cargamos los datos y vemos la ayuda
con help(women)
> str(women)

'data.frame':
15 obs. of 2 variables:
$ height: num 58 59 60 61 62 63 64 65 66 67 ...
$ weight: num 115 117 120 123 126 129 132 135 139 142 ...
> ajuste <- lm(weight~height,data=women)
> summary(ajuste)
Call:
lm(formula = weight ~ height, data = women)
Residuals:
Min

1Q Median

3Q

Max

-1.733 -1.133 -0.383

0.742

3.117

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -87.5167

5.9369

-14.7

1.7e-09 ***

height

0.0911

37.9

1.1e-14 ***

---

3.4500


CAPITULO 6. ESTADISTICA BASICA
Signif. codes:

73

0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 1.53 on 13 degrees of freedom


Multiple R-squared: 0.991,

Adjusted R-squared: 0.99

F-statistic: 1.43e+03 on 1 and 13 DF,

p-value: 1.09e-14

Ver los resultados que produce las funciones coefficients, fitted y confint sobre el objeto ajuste
creado anteriormente.
Para obtener algunos gr
aficos de diagn
ostico del modelo, podemos usar plot(ajuste)
Consideraciones sobre la sintaxis de lm y modo formula en R, smbolos utilizados
~ A la izquierda de este smbolo se ponen las variables dependientes y a la derecha las independientes
+ Para separar las variables predictoras
: Denota la interacci
on entre variables predictoras, y~x+z+x:z
* Abreviatura para referirse a todas las posibles interacciones y~x * z * w se expande a
y~x+z+w+x:z+x:w+z:w+x:z:w
^ Para

especificar

el

grado

de

las

interacciones

y~(x+z+w)^2

se

expande

y~x+z+w+x:z+x:w+z:w
I() Lo que hay entre parentesis se eval
ua como expresion aritmetica. As, y~x+(z+w)^2 se
expande a y~x+z+w+z:w , pero y~x+I((z+w)^2) se expande a y~x+h con h una nueva variable
creada como el cuadrado de z+w.
funciones. Se pueden usar funciones matematicas como log(y)~x+z+w
-1 Para suprimir el termino constante. Es decir, fuerza a que la recta de regresion pase por el
origen x=0
Volviendo al ejemplo anterior, si dibujamos la recta de regresion
> attach(women)
> plot(height,weight)
> abline(ajuste,col="red")


CAPITULO 6. ESTADISTICA BASICA

74

160

150

140

weight

130

120

58

60

62

64

66

68

70

72

height

Vemos que quiz


a sera interesante utilizar un termino cuadratico (height2 )
> ajuste2 <- lm(weight~height+I(height^2))
> summary(ajuste2)
Call:
lm(formula = weight ~ height + I(height^2))
Residuals:
Median

3Q

Max

-0.5094 -0.2961 -0.0094

Min

1Q

0.2862

0.5971

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 261.87818
height
I(height^2)

25.19677

10.39

2.4e-07 ***

-7.34832

0.77769

-9.45

6.6e-07 ***

0.08306

0.00598

13.89

9.3e-09 ***

--Signif. codes:

0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 0.384 on 12 degrees of freedom


Multiple R-squared: 0.999,

Adjusted R-squared: 0.999

F-statistic: 1.14e+04 on 2 and 12 DF,

p-value: <2e-16


CAPITULO 6. ESTADISTICA BASICA

75

> plot(height,weight,xlab="Altura(en pulgadas)",ylab="Peso(en libras)")


> abline(ajuste,col="red")
> lines(height,fitted(ajuste2),col="blue")# dibujamos los valores ajustados

160

150

140

Peso(en libras)

130

120

58

60

62

64

66

68

70

72

Altura(en pulgadas)

Veamos un ejemplo ahora de c


omo se ajustara una regresion lineal m
ultiple. Si volvemos al ejemplo
de los autom
oviles en el data.frame mtcars . Vamos a ajustar un modelo donde mpg (millas por galon)
es la variable dependiente y hp (horse power) y wt( Weight)
> ajuste3 <- lm(mpg ~ hp + wt ,data=mtcars)
> summary(ajuste3)
Call:
lm(formula = mpg ~ hp + wt, data = mtcars)
Residuals:
Min

1Q Median

3Q

Max

-3.941 -1.600 -0.182

1.050

5.854

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.22727

1.59879

23.28

< 2e-16 ***

hp

-0.03177

0.00903

-3.52

0.0015 **

wt

-3.87783

0.63273

-6.13

1.1e-06 ***


CAPITULO 6. ESTADISTICA BASICA

76

--Signif. codes:

0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 2.59 on 29 degrees of freedom


Multiple R-squared: 0.827,

Adjusted R-squared: 0.815

F-statistic: 69.2 on 2 and 29 DF,

p-value: 9.1e-12

Ejercicio: A
nadir al modelo anterior el termino de interaccion entre hp y wt. Obtener los intervalos
de confianza al 95 % sobre los coeficientes del modelo.
Para validar las hip
otesis de normalidad, , linealidad y homocedasticidad , podemos recurrir a los
gr
aficos de diagn
ostico
> par(mfrow=c(2,2))# dividimos el dispositivo gr
afico en 4 partes
> plot(ajuste3)

20

15

20

25

1
0.5

Chrysler Imperial
Toyota Corolla

Maserati Bora

Toyota
Fiat Corolla
128

30

Cook's distance

0.5

Residuals vs Leverage

0.0

ScaleLocation

10

30

Theoretical Quantiles

25

Fitted values

Chrysler Imperial

1.0

1.5

15

Standardized residuals

2
0

Residuals

10

Standardized residuals

Toyota Corolla

Imperial
Chrysler
128
Fiat

Toyota
Fiat Corolla
128

Chrysler Imperial

Standardized residuals

Normal QQ

Residuals vs Fitted

0.0

Fitted values

0.1

0.2

0.3

0.5

0.4

Leverage

Normalidad: Ver el gr
afico Normal Q-Q plot. Si hay normalidad los puntos deben estar cerca de la
recta de 45.
Linealidad: Si la variable dependiente est
a linealmente relacionada con las independientes, no debera
haber relaci
on entre los residuos y los valores ajustados
Homocedasticidad: Si hay homocedasticidad, los puntos en el grafico Scale-Location deberan situarse
aleatoriamente alrededor de una lnea horizontal.


CAPITULO 6. ESTADISTICA BASICA

77

Para una mejor diagnosis del modelo se aconseja revisar el paquete car (Companion to Applied
Regression), d
onde se puede encontrar m
as funciones , para contrastar la multicolinealidad, graficos
de valores influyentes etc.

6.7.

Anova

Para ajustar un modelo anova se utiliza la funcion aov()


Notaci
on: En adelante en may
uscula ser
an factores y min
usculas variables numericas
> # anova de un factor
> modelo <- aov(y ~ A, data=midataframe)
> # anova dos factores
> modelo <- aov(y ~ A + B, data=midataframe)
> # con interaccion entre los factores
> modelo <- aov(y ~ A + B +A:B, data=midataframe)
> # an
alisis de la covarianza
> modelo <- aov(y ~ A + x, data=midataframe)
Con la orden anova(modelo) se obtiene la tabla anova normal. Ojo! por defecto R calcula la suma
de cuadrados tipo 1, para obtener la suma de cuadrados tipo III se puede usar la funcion Anova del
paquete car
Ejemplo
Consideramos el datasets de ejemplo cholesterol incluido en el paquete multcomp. 50 pacientes
recibieron uno de 5 tratamientos posibles para reducir el colesterol , variable trt . 3 de los tratamiento
consistan en recibir el mismo medicamento pero variando la forma de consumirlo: 20 mg una vez al
da (1time), 10 mg dos veces al da (2time) , 5 mg 4 veces al da (3time). Los otros dos tratamientos
consistan en medicamentos competidores (drugD , drugE). La variabla response indica la reduccion
en el nivel de colesterol.
> library(multcomp)
> attach(cholesterol)
> head(cholesterol)
trt response
1 1time

3.861

2 1time

10.387

3 1time

5.906

4 1time

3.061

5 1time

7.720

6 1time

2.714

> table(trt)
trt
1time 2times 4times
10

10

10

drugD

drugE

10

10


CAPITULO 6. ESTADISTICA BASICA

78

> # medias por trt


> aggregate(response,by=list(trt),FUN=mean) # tambien se obtiene con tapply(response,trt,mean)
Group.1

1time

5.782

2times

9.225

4times 12.375

drugD 15.361

drugE 20.948

> # desviaci
on t
pica por trt
> aggregate(response, by=list(trt), FUN=sd)
Group.1
x
1
1time 2.878
2

2times 3.483

4times 2.923

drugD 3.455

drugE 3.345

Gr
aficamente podemos ver los diferentes boxplot

20

25

> boxplot(response~trt)

10

15

1time

2times

Ahora vamos a ajustar el modelo

4times

drugD

drugE


CAPITULO 6. ESTADISTICA BASICA

79

> bartlett.test(response~trt) # test de bartlett


Bartlett test of homogeneity of variances
data:

response by trt

Bartlett's K-squared = 0.5797, df = 4, p-value = 0.9653


> modelo <- aov(response~trt)
> summary(modelo)# resumen del modelo o anova(modelo)
Df Sum Sq Mean Sq F value
trt
Residuals

1351

338

45

469

10

Pr(>F)

32.4 9.8e-13 ***

--Signif. codes:

0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Para obtener un gr
afico de las medias con intervalos de confianza podemos usar la funcion plotmeans()
del paquete gplots
> library(gplots)
gdata: read.xls support for 'XLS' (Excel 97-2004) files ENABLED.
gdata: read.xls support for 'XLSX' (Excel 2007+) files ENABLED.
> plotmeans(response ~ trt, xlab = "Tratamiento", ylab = "Response",
+

main = "Gr
afico de las medias\n con 95% CI")


CAPITULO 6. ESTADISTICA BASICA

80

Grfico de las medias


con 95% CI

20

Response

15

10

n=10

n=10

n=10

n=10

n=10

1time

2times

4times

drugD

drugE

Tratamiento

Para ver la diferencia de medias , podemos usar el test HSD de Tukey.


> TukeyHSD(modelo)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = response ~ trt)
$trt
diff

lwr

2times-1time

3.443 -0.6583

4times-1time

6.593

drugD-1time
drugE-1time

upr

p adj

7.544 0.1381

2.4915 10.694 0.0004

9.579 5.4779 13.680 0.0000


15.166 11.0643 19.267 0.0000

4times-2times

3.150 -0.9515

7.251 0.2050

drugD-2times

6.136

2.0349 10.237 0.0010

drugE-2times

11.723

7.6213 15.824 0.0000

drugD-4times

2.986 -1.1149

drugE-4times

8.573

4.4715 12.674 0.0000

drugE-drugD

5.586

1.4851

Gr
aficamente

7.088 0.2512
9.688 0.0031


CAPITULO 6. ESTADISTICA BASICA

81

> plot(TukeyHSD(modelo))

drugEdrugD

drugE2times

drugE1time

2times1time

95% familywise confidence level

10

15

20

Differences in mean levels of trt

En el paquete car tenemos algunas funciones u


tiles, como por ejemplo las siguientes.
> library(car)
> # test de levene de homogeneidad de varianzas
> leveneTest(response,trt)# o leveneTest(modelo)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group

0.08

0.99

45
> Anova(modelo,type="III") # obtener la suma de cuadrados de otro tipo
Anova Table (Type III tests)
Response: response
Sum Sq Df F value
(Intercept)
trt

Pr(>F)

334

32.1 9.8e-07 ***

1351

32.4 9.8e-13 ***

Residuals

469 45

--Signif. codes:

0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

También podría gustarte