Curso R PDF
Curso R PDF
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?
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.
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
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 /.
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()
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.
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).
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()
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.
4 21
<- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE)
> e
[1]
10
[1] 4
> a[2:6] # elementos del 2 al 6, ver ?colon para ver como funcion :
[1]
4 21
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
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
11
9 12
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
Gedad
1 Menor de 18
12
Ing alea
NA
72
18-29 1400
10
30-45 1300
73
4 Mayor de 45 1900
79
Ing alea
1 Menor de 18
NA
72
18-29 1400
10
30-45 1300
73
4 Mayor de 45 1900
79
Ing
1 Menor de 18
NA
18-29 1400
3
30-45 1300
4 Mayor de 45 1900
> mis.datos$Ing
[1]
B 10 34
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.
14
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",
+
> ingresos.cat
[1] Mas de 1500
1200-1500
Mas de 1500
1000-1200
Menos de 1000
1200-1500
1200-1500
1200-1500
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).
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
M H M M
H M
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
17
> 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
:1300
1st Qu.:1350
Median :1400
Mean
:1533
3rd Qu.:1650
Max.
:1900
NA's
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
1 Menor de 18
999
72
18-29
1400
10
30-45
1300
73
4 Mayor de 45
1900
79
19
1 Menor de 18
NA
72
18-29
1400
10
30-45
1300
73
4 Mayor de 45
1900
79
TRUE
TRUE
TRUE
La funci
on na.omit() devuelve el objeto pero tras eliminar los casos completos
> (nuevos.datos <- na.omit(mis.datos))
ID
18-29
1400
10
30-45
1300
73
4 Mayor de 45
1900
79
3.6.
20
Valores de fecha
Algunos ejemplos
> # use as.Date( ) to convert strings to dates
>
Captulo 4
Manejo de datos
4.1.
Creaci
on de nuevas variables
5 15 34
49
> # tambi
en se puede
> 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
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]
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
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
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.
25
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
NA
26
x2
edad
x1
x2
x2
edad
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
3 20
> rep(z,3)
[1]
3 20
3 20
3 20
27
(3.25,5.5]
[6] (5.5,7.75]
(7.75,10]
(5.5,7.75]
(7.75,10]
(7.75,10]
4.3.
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
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)
29
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:
tambi
en la funci
on sort
"gear"
30
$ qsec: num
$ 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
21.0
Datsun 710
22.8
108
Hornet 4 Drive
21.4
Valiant
18.1
hp drat
wt
10.4
Camaro Z28
13.3
Duster 360
14.3
Chrysler Imperial
14.7
Maserati Bora
15.0
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
31
20
25
30
33
44
1000
2500
800
1450
3000
1
2
20
25
1450
1000
30
2500
33
800
44
3000
32
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
20
25
30
33
44
25
45
FUN=mean, na.rm=TRUE)
mpg cyl
33
disp
hp
drat
wt
qsec vs
0 26.00000
4 120.30
0 20.56667
0 15.10000
1 26.73000
4 103.62
1 19.12500
am
gear
carb
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
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
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
v2
v3
v4
1 2.0 300
1.8008 15-19
2 4.0 400
1.7163 20-24
0.3261 25-29
90 -1.0997 20-24
6 8.0 450
0.8361 25-29
por su posicion
v3
v4
1.8008 15-19
1.7163 20-24
0.3261 25-29
90 -1.0997 20-24
6 450
0.8361 25-29
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
35
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
TRUE FALSE
TRUE
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
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
0.3261 25-29
90 -1.0997 20-24
6 450
0.8361 25-29
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
0.8361 25-29
v3
v4
1 300
1.8008 15-19
2 400
1.7163 20-24
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
37
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)
v3
v4
v3
[1,] 300
1.8008
[2,] 400
1.7163
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
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.
grfico de densidad
Density
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",
+
CAPITULO 5. GRAFICOS
BASICOS
44
10
15
20
25
30
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,
+
CAPITULO 5. GRAFICOS
BASICOS
45
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
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))
beside = T)
CAPITULO 5. GRAFICOS
BASICOS
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
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
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
10
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",
+
boxplots = "xy")
CAPITULO 5. GRAFICOS
BASICOS
54
cyl
4
6
8
30
25
20
10
15
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
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
CAPITULO 5. GRAFICOS
BASICOS
57
3D Scatterplot
35
25
20
mpg
500
disp
30
400
15
300
200
10
100
0
1
wt
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
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.
:6
1st Qu.:26.2
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.: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
: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
6.2.
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
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 ...
27 29 30 32 46 58 59 59 63 63 ...
Tenemos las variable Treatment ( Placebo, Treated) , Sex (Male, Female) y Improved (None, Some,
Marked)
CAPITULO 6. ESTADISTICA BASICA
61
Some Marked
42
14
28
Some Marked
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
None
Some Marked
Some Marked
42
14
28
> prop.table(mitabla,2)
Improved
Treatment
None
Some Marked
None
Some
Marked
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
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 |
|-------------------------|
84
| Arthritis$Improved
Arthritis$Treatment |
None |
Some |
--------------------|-----------|-----------|-----------|-----------|
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
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
mitabla
CAPITULO 6. ESTADISTICA BASICA
66
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
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)
2 0.0011536
Pearson
2 0.0014626
13.055
Phi-Coefficient
67
: 0.394
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.8144
drat
wt
qsec
vs
am
0.46455 -0.7278
0.31537
0.5897
0.4690
0.7852 -0.55132
disp -0.7681
0.8144
1.0000
0.6660 -0.49898
hp
0.7852
0.6660
1.0000 -0.38263
drat
wt
-0.7428
0.7283
0.7434
1.00000 -0.5471
0.6113 -0.54715
0.03272
0.3751
0.5755
qsec
0.03272 -0.1420
1.00000
0.6575 -0.1689
vs
0.37510 -0.4885
0.65754
1.0000
0.1683
am
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
0.26975 -0.57693
am
0.77079 -0.05860
gear
1.00000
0.09801
carb
0.09801
1.00000
CAPITULO 6. ESTADISTICA BASICA
68
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
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
extra by group
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
extra by group
Inf
sample estimates:
mean in group 1 mean in group 2
0.75
2.33
6.5.
Test no param
etricos
CAPITULO 6. ESTADISTICA BASICA
6.6.
72
Regresi
on lineal
'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
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
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
3Q
Max
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:
p-value: <2e-16
CAPITULO 6. ESTADISTICA BASICA
75
160
150
140
Peso(en libras)
130
120
58
60
62
64
66
68
70
72
Altura(en pulgadas)
1Q Median
3Q
Max
1.050
5.854
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.22727
1.59879
23.28
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:
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
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
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
4times
drugD
drugE
CAPITULO 6. ESTADISTICA BASICA
79
response by trt
1351
338
45
469
10
Pr(>F)
--Signif. codes:
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
20
Response
15
10
n=10
n=10
n=10
n=10
n=10
1time
2times
4times
drugD
drugE
Tratamiento
lwr
2times-1time
3.443 -0.6583
4times-1time
6.593
drugD-1time
drugE-1time
upr
p adj
7.544 0.1381
4times-2times
3.150 -0.9515
7.251 0.2050
drugD-2times
6.136
drugE-2times
11.723
drugD-4times
2.986 -1.1149
drugE-4times
8.573
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
10
15
20
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
1351
Residuals
469 45
--Signif. codes: