Menu desplegable
Ir a página principal de um.es

Taller: "ComenzandoR"

"Comenzando en R. Estadística básica con R y Rcmdr"

Antonio Maurandi (amaurandi@um.es)

Índice:

0. Instalación

R 2.12.0 Rcmdr (RCommander 1.6-2)
Otra forma de instalar R y Rcmdr en castellano en windows (tb esta disponible linux):
Una GUI a tener en cuenta: RStudio (http://www.rstudio.org/)

1. Cosas básicas de R y Rcmdr. (Para tener a mano)

Lanzar R y Rcmdr, salir:

- en linux: $ R
- en windows doble clic en el icono "R"

> library(Rcmdr) # lanza RCommander
> Commander() # si cerramos Rcmdr y queremos volver a lanzarlo
> q() # salir

Obtener ayuda en R.

> help.start() # Ayuda general
> help("foo") # ayuda en la funcion foo
> ?foo # ídem, ayuda en la funcion foo
> help.search("foo") # Busca en la ayuda por la cadena 'foo'
> ??foo # Ídem Busca en la ayuda por la cadena 'foo'
> example("foo") # Ejemplos de la funcion foo
> RSiteSearch("foo") # busca por la cadena e'foo' en la ayuda online
> apropos("foo", mode="function") # Muestra todas las funciones que tengan la cadena 'foo'
> data() # muetsra los datasets disponibles, cargados
> help.start() #
> RSiteSearch()

Ejemplo de uso de la ayuda: Nos suena que existe una función 'median'....
> apropos("median", mode="function")
[1] "median" "median.default"
> ?median

Otros comandos útiles
> getwd() # muestra el directorio de trabajo
> setwd("c:/taller/trabajo01") # cambia el directorio de trabajo
> dir.create("c:/cosasdeR/trabajo01") # crea un directorio

Un detalle:

2. Un ejemplo de asignación

> x <-rnorm(10) # asigna 10 valores de una normal N(0,1).
> y <- 15
> z<-y+5

Una función puede recibir casi cualquier argumento, incluidos objetos u otras funciones
Operadores de asignacion '=' o '<-' (más usado)

Otro ejemplillo:
> 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.0,10.4,10.2,6.1)
> mean(c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)) # ídem, tb podmeos asignar el vector directamente
> mean(peso)
> sd(peso)
> cor(edad,peso)
> plot(edad,peso)
> q()

3. Un ejemplo sencillo de simulación estadística (t-student)

.
> altura<-c(rnorm(5,1,0.3),rnorm(5,2,0.3))                       # 5 obs de media 1 y sd 0.3 y lo mismo con media 2.
> g<-c(rep('A',5),rep('B',5))                                             # esta variable va a aguardar a que pob pertenece cada observacion, poblaciones 'A' y 'B'
> hist(altura)                                                                    # no se ven diferencias, ¿tenemos poca muestra?
> n<-5                                                                             # juagamos con el tamaño de la muestra...
> altura<-c(rnorm(n,1,0.3),rnorm(n,2,0.3))
> hist(altura)                                                                    # ¿vemos ahora diferencias?
# Todo junto para repetirlo rapidamente, y aumentamos la muestra

> n<-100;altura<-c(rnorm(n,1,0.3),rnorm(n,2,0.3));hist(altura) # probar con 100, 500,..
> g<-c(rep('A',n),rep('B',n))
> g<-factor(g)                                                                     # convertimos el vector 'g' en un 'factor'
> mdf <- data.frame(g,altura)
> mdf$g
> mdf$altura
> summary(mdf)
> boxplot (mdf$altura~mdf$g)

Es intereante hacer un 'str(mdf)' para inspeccionar un objeto.

> str(mdf)
'data.frame': 200 obs. of 2 variables:
$ g : Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ...
$ altura: num 1.273 1.163 1.08 0.667 0.995 ...

Vamos ahora a contrastarlas con una t de Student.

# independent 2-group t-test: t.test(y~x) # donde y es numérica y x es un factor binario
> t.test(mdf$altura~mdf$g)
> boxplot(mdf$altura~mdf$g)
# con esta secuencia podemos guardar un gráfico en cualquier plataforma 
#(en Win y Mac tb mediante el menu "File -> Save as")

> dev.new()
> jpeg("hist.jpg")
> hist(altura) 
> dev.off()

Sintaxis de otros contrastes similares:


4. Otro ejemplo de simulación estadística (descriptivos más finos, anova)

Muestreamos el peso de tres grupos de pacientes, grupo 'a', 'b' y 'c'. Cada muestra es de tamaño 'n'.

> n<-10
> g<-c(rep('a',n),rep('b',n), rep('c',n))
> peso<-c(rnorm(n,80,0.3),rnorm(n,75,0.5),rnorm(n,77,0.7))
> g<-factor(g)
> mdf<-data.frame(g,peso)
# estadisticos descriptivos
> summary(mdf)
> boxplot (mdf$peso~mdf$g)
Otras formas de obtener descriptivos:
# estadisticos descriptivos segun un factor (g)
> aggregate (mdf$peso, by=list('grupos-de-g'=mdf$g), mean)
> aggregate (mdf$peso, by=list('grupos-de-g'=mdf$g), sd)
> by(mdf$peso, mdf$g, function(x)(c(media=mean(x), destandar=sd(x))))



Contrates:
# ANOVA:
> anova.ex1=aov(mdf$peso~mdf$g)
# Anova.ex1 es un Objeto!, podemos pedir un summary del objeto..
> summary(anova.ex1)
# por pares
> TukeyHSD(anova.ex1)

Más descriptivos. Otros paquetes interesantes (Hmisc, pastecs, psych, doBy).

mt<-mtcars[c("mpg","hp","wt","am")] #'traemos a 'mt' una serie de variables del dataframe mtcars

> library(Hmisc) # Cargamos el paquete Hmisc
> describe(mt) #usamos la funcion 'describe' del paquete Hmisc

#pastecs
> install.packages('pastecs', dependencies=TRUE) # instalamos elpaquete (si no está instalado)
>library(pastecs) # cargamos el paquete
> stat.desc(mt)
Al instalar un paquete que tiene alguna función con el mismo nombre que otra de otro paquete previamnete cargado, la función anterior 'se enmascara'.
# psych. otro paquete chulo para descriptivos
> install.packages('psych', dependencies=TRUE)
> library(psych)
#...... The following object(s) are masked from 'package:Hmisc':
> describe(mt)
> describe.by(mdf$peso,mdf$g)                               # según un factor
> psych::describe(mt)                                        # si se enmasacra la función

Con la funcion aggregate
> aggregate (mt,by=list('grupos de am'=mt$am), mean)
> aggregate (mt, by=list('grupos de am'=mt$am), sd)

# doBy.
> install.packages('doBy', dependencies=TRUE)
> library(doBy)
> summaryBy(peso~g, data=mdf, FUN= c(mean, sd))

Al final nos sentiremos más comodos con unos paquetes que con otros y eso determinara cual usar. También está la opcion de crearte el tuyo propio!

5. Un ejemplo de gráfico bonito (lineas y leyenda)

# 01.ej.grafico.R
# aml, RinAction
# source('01.ej.grafico.R')
# -----------------------
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# save current graphics settings
opar <- par(no.readonly=TRUE)
# set line width, text and symbol size, and set axis labels to bold
par(lwd=2, cex=1.5, font.lab=2)
# create plots
plot(dose, drugA, type="b",pch=15, lty=1, col="red", ylim=c(0, 60),main="Drug A vs. Drug B", xlab="Drug Dosage", ylab="Drug Response")
lines(dose, drugB, type="b",pch=17, lty=2, col="blue")
# add a reference line
abline(h=c(30), lwd=1.5, lty=2, col="grey")
# add minor tick marks
library(Hmisc)
minor.tick(nx=3, ny=3, tick.ratio=0.5)
# add a legend
legend("topleft", inset=.05, title="Drug Type", c("A","B"),lty=c(1,2),pch=c(15, 17), col=c("red", "blue"))
# restore original graphics settings
par(opar)
Si los comandos anteriores los tenemos guardados en un fichero 01.ej.grafico.R, podemos lanzarlo de una vez con el comando source
>source('01.ej.grafico.R')

6. Otro ejemplo de gráfico bonito (histograma con curva normal)

# Add a Normal Curve (Thanks to Peter Dalgaard)
x <- mtcars$mpg
h<-hist(x, breaks=10, col="red", xlab="Miles Per Gallon",main="Histogram with Normal Curve")
xfit<-seq(min(x),max(x),length=40)
yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
yfit <- yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2)

Si los comandos anteriores los tenemos guardado en un fichero 02.ej.grafico.histyNorm.R, podemos lanzarlo de una vez con el comando 'source'
>source('02.ej.grafico.histyNorm.R')

7. Importar ficheros de otros programas (excell, spss, cvs,...)

Podemos importar datos a R desde casi cualquiere Paquete estadistico: ......
R tiene su formato 'nativo' que denotamos con las extensión .r, que en definitiva es un ficheroplano con delimitadores... bla bla

7.1. ficheros csv:

Suele ser lo más común. Un fichero plano con delimitadores y en la primera linea los nombnres de las varioables: (empleados.csv)

>df.misdatos<-read.table('empleados.csv',header=T,sep=";") # Desde un fichero seprados por ; y con nombres de var en la primera fila
# puede interearnos la opcion stringsAsFactors=FALSE


> edit(df.misdatos)                                     # me permite editar el dataframe
> head(df.misdatos)                                   # me permite ver lasprimerdas filas de mi dataframe
>summary(df.misdatos)

7.2. Desde MS-Excell:Necesitamos el paquete RODBC

> install.packages("RODBC")
> library(RODBC)

Si tenemos un fiuchero llamado myfile.xls que tiene un hoja llamada"mysheet" (ojo! esto no funciona en linux).
> library(RODBC)
> channel <- odbcConnectExcel("myfile.xls")
> mydataframe <- sqlFetch(channel, "mysheet")
> odbcClose(channel)

7.3. Desde SPSS.

Necesitamos el paquete Hmisc. (mydata.sav)
> install.packages("Hmisc")
> library(Hmisc)
> mydataframe <- spss.get("mydata.sav", use.value.labels=TRUE)

8. Una sesión sencilla con RCommander


8.1. Importar datos

Se nos presentan varias opciones:

Nota: Efectivamente el formateo de datos se hace mejor con la consola de R o con otros programas, hojas de cálculo etc... Una idea es trabajar en una hoja de cálculo y guardar el fichero ya más o mejos trabajado en formato cvs.

8.2. Descriptivos generáles


8.3. Resumenes numéricos


8.4. Modificación del dataset

Se pueden calcular variables, recodificar variables.

8.5. Un contraste

8.6. Un gráfico chulo sin esfuerzo ninguno

Explorar el menu de gráficos e ir probando....
Ejemplo. Dispersion de salario ini vs salario, segun categorias salariales, fichero empelados.cvs



> scatterplot(sal~sali | catlab, reg.line=lm, smooth=TRUE, spread=TRUE, boxplots='xy', span=0.5, xlab="Salario Inicial", ylab="Salario final",  by.groups=TRUE, data=empleados.cvs)

8.7. Ejercicio propuesto



9. Enlaces de interés