Documente Academic
Documente Profesional
Documente Cultură
Julio 2016
¿Qué es el R?
R puede extenderse fácilmente mediante paquetes o librerías que son módulos adicionales diseñados
con propósitos específicos.
Aproximadamente una decena de ellos vienen incluidos con la distribución original aunque
actualmente existen más de 6.000 disponibles en http://cran.r‐project.org/
Programando en R
El R guarda los datos y las salidas de los análisis estadísticos (y cualquier otra cosa) en objetos.
Para asignar y guardar en objetos, utilizamos como operador <- o =
http://cran.r-project.org/web/views/
Creando vectores c()
Todo en R es un vector (algunos de un solo elemento <por ejemplo abc>). Para crear vectores tenemos
que utilizar la función c()
Los argumentos de la función pueden tener que ser nombrados (header=TRUE) o pueden ser
no nombrados(“ECH julio.csv”)
El conjunto entero de datos (llamado data frame1)es guardado en un objeto (base). Por lo
tanto, más de un conjunto de datos pueden estar disponible al mismo tiempo.
1
Un data frame tiene la estructura de una matriz. Las observaciones corresponden a las filas y las variables
(numéricas o categóricas) corresponden a las columnas
Mirando los datos
head(base)#muestra las primeras 6 filas de la base de datos
stata=read.dta("ECH julio.dta")
sas=read.xport("ECH julio.xpt")
dbf=read.dbf("ECH julio.dbf")
Ejercicios base de datos
En la carpeta base de datos se encuentran archivos correspondientes a los microdatos de hogares de la
Encuesta continua de hogares del primer trimestre de 2013 en distintos formatos.
1.Cargar los microdatos de la ECH del archivo en formato csv y guardarlo en el objeto d1
2.Cargar los microdatos de la ECH del archivo en formato txt y guardarlo en el objeto d2
3.Cargar los microdatos de la ECH del archivo en formato sav (con y sin las etiquetas de los valores)
y guardarlo en el objeto d3 y d4 respectivamente.
4.Cargar los microdatos de la ECH del archivo en formato dbf y guardarlo en el objeto d5.
5.Listar todos los objetos que se encuentran en la memoria.
6.Borrar todas los objetos que se encuentran en memoria menos base
Cargando archivos Excel XLConnect
install.packages('rJava')
install.packages('XLConnect')
install.packages('XLConnectJars')
library(XLConnect)
#Guarda el archivo Excel en memoria
archivo.excel=file.path("………\\Curso R\\EAE\\Macrovariables 2011.xls")
#Carga la hoja 1 del archivo excel
eae=readWorksheetFromFile(archivo.excel, sheet=1)
Observación: puede ocurrir que tengamos que tener actualizada la versión de java y utilizar la versión
de 32 bits del R.
Trabajando con bases de datos en R
Dado que R puede manejar más de un data frame al mismo tiempo, debemos especificar donde
encontrar una variable.
La sintaxis base$edad significa que la variable edad se encuentra en el data frame base.
Obviamente es un vector!!
Para el caso de variables no numéricas, tenemos que poner los valores entre comillas (' o ")
Datos faltantes
NA es el código para los datos perdidos.
Una forma de verlo es como “No lo conozco”. El R maneja con sensatez los cálculos.
Por ejemplo:
1 + NA = NA
No podemos testear
objeto[fila,columna]
base[1,] # Primera fila
base[,2] # Segunda columna
base[3:7, 2:4] # Algunas filas y columnas
base[, c("sexo","edad")] # Columnas por nombre
base[base$pobre=="Pobre", ]# Personas por debajo de la línea de pobreza
pobres=base[base$pobre=='Pobre', ] # Pone el data frame anterior en uno nuevo
Explorando los datos R
Utilizando la función dim, obtenemos la cantidad de observaciones (filas) y la cantidad de variables
(columnas)
dim(base)
## [1] 11112 8
Utilizando la función str, obtenemos la estructura del data frame, incluyendo el tipo (class) de
variables
str(base)
summary(base)
## departamento ponderador sexo edad cond_act ingreso pobre
## MONTEVIDEO :4058 Min. : 24.0 H:5236 Min. : 0.00 Desocupados : 381 Min. : 0 No pobre:9958
## CANELONES :1688 1st Qu.:258.0 M:5876 1st Qu.:17.00 Inactivos :5553 1st Qu.: 0 Pobre :1154
## MALDONADO : 747 Median :314.0 Median :36.00 Ocupados :5178 Median : 7986
## ROCHA : 453 Mean :306.4 Mean :37.11 Mean : 14941
## SALTO : 426 3rd Qu.:359.0 3rd Qu.:55.00 3rd Qu.: 21663
## SAN JOSE : 375 Max. :799.0 Max. :98.00 Max. :415333
## (Other) :3365
Estadísticas descriptivas en R
Si las variables son numéricas nos devuelve mínimo, máximo, media y los cuartiles.
Si la variable es factor nos devuelve las frecuencias absolutas de cada una de las categorías.
summary(subset(base,edad>60))
R permite anidar funciones, en donde los resultados de una función pasan como argumentos para otra
función.
En este caso, la función subset devuelve un conjunto de datos conteniendo observaciones que
cumplen que edad>60. Este conjunto de datos es pasado a la función summary para obtener las
estadísticas de resumen de dicho subconjunto.
Estadísticas descriptivas en R
R cuenta con varias funciones para calcular distintas estadísticas. Algunas....
quantile(base$ingreso,0.99) #percentil 99
## 99%
## 94082.77
summary(base[base$edad>60,])
table(base$sexo,base$pobre)
## No pobre Pobre
## H 4711 525
## M 5247 629
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Podemos agregarle las frecuencias marginales a la tabla utilizando la función addmargins
tabla1=table(base$sexo,base$pobre)
addmargins(tabla1)#añade las frecuencias marginales a la tabla 1
## No pobre Pobre
## H 0.42395608 0.04724622
## M 0.47219222 0.05660547
Tablas de frecuencias/tablas de contingencia table()o xtabs()
prop.table(tabla1,1) # Frecuencias condicionadas por la variable sexo (fila)
## No pobre Pobre
## H 0.8997326 0.1002674
## M 0.8929544 0.1070456
## No pobre Pobre
## H 0.4730870 0.4549393
## M 0.5269130 0.5450607
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Seguimos anidando funciones………
## No pobre Pobre
## H 2658 189
## M 2195 136
Tablas de frecuencias/tablas de contingencia condicionales en R
#Tabla de las variables sexo, pobre y con_act solo para MONTEVIDEO
tabla3=xtabs(~sexo+pobre+cond_act,data=base[base$departamento=='MONTEVIDEO ',])
ftable(tabla3)
Observación: si queremos que los resultados estén en un data frame tenemos que utilizar la función
aggregate.
Con aggregate podemos calcular para más de una variable al mismo tiempo, pero solo podemos utilizar una
función que el resultado sea un vector de 1 elemento.
Estadísticas descriptivas por grupo aggregate()
Calculamos la edad promedio para la edad y el ingreso, según las variables sexo y pobre
aggregate(base[,c('edad','ingreso')],list(pobre=base$pobre,sexo=base$sexo),mean)
El símbolo ~ nos está indicando que vamos a modelar las variables edad e ingreso en función de
las variables sexo y pobre.
Para introducir el concepto imaginemos que queremos calcular el Indice de Gini (obviamente hay un
paquete que lo hace!)
𝑛+1 2 × ∑𝑛𝑖=1 𝑖𝑥𝑖
𝐺=[ ]−[ 𝑛 ]
𝑛 𝑛 × ∑𝑖=1 𝑥𝑖
La estructura de una función es la siguiente
function (argumentos) {
“Lo que queremos que haga la función”
return(objetos)
}
Creando Funciones (hágalo usted mismo) en R
G=function(x)
{
x=sort(x) #ordena el vector de ingresos
n=length(x)# tamaño del vector de ingresos
i=1:n #genera la secuencia de 1 hasta n
G=(n+1)/n - (2*sum((n+1-i)*x)/(n*sum(x))) #calcula el GINI
return(G) #nos devuelve el GINI
}
G(base$ingreso) #gini con toda la muestra
# [1] 0.6427655
G(base$ingreso[base$cond_act=='Ocupados ']) # gini solo con los ocupados
# [1] 0.4258947
Creando Funciones (hágalo usted mismo) en R
Nuestra función G ya es una más del R. Utilicémosla en el aggregate para calcular el Gini por
departamento.
aggregate(base$ingreso,list(dpto=base$departamento),G)
## dpto x
##1 ARTIGAS 0.6444840
##2 CANELONES 0.6409384
##3 CERRO LARGO 0.6380796
##4 COLONIA 0.5525926
##5 DURAZNO 0.6536870
##6 FLORES 0.6635737
##7 FLORIDA 0.6272090
##8 LAVALLEJA 0.6072111
Recodificando variables cut()
Cuando queremos realizar análisis estadísticos desagregados por una variable cuantitativa (edad,
ingreso, etc.) puede ser útil recodificarla en tramos.
La función por defecto define los intervalos abiertos por la izquierda y cerrados por la derecha.
Recodificando variables cut()
Observación: nos devuelve un factor.
Si queremos hacer los tramos cerrados por la izquierda y abiertos por la derecha
base$tramo_edad=cut(base$edad,cortes,right=FALSE,labels=c('t1','t2','t3','t4')
## t1 t2 t3 t4
## 3264 2846 2829 2173
Recodificando variables cut()
Calculemos una variable que identifique al quintil de ingreso al cual pertenece la persona. Trabajemos
solo con los ocupados.
ocup=base[base$cond_act=='Ocupados ',]
quintiles=quantile(ocup$ingreso,c(0.20,0.40,0.60,0.80))
cortes=c(0,quintiles,Inf)
ocup$quintil=cut(ocup$ingreso,cortes,right=FALSE,label=c('Q1','Q2','Q3','Q4'
,'Q5'))
Recodificando variables cut()
table(ocup$quintil,ocup$sexo)
## H M
## Q1 433 572
## Q2 527 538
## Q3 567 452
## Q4 641 412
## Q5 679 357
La función ifelse ()
Una función muy útil cuando estamos trabajando con base de datos es ifelse, la cual nos permite
realizar distintas “cosas” dependiendo de que se cumpla o no cierta condición.
¿Cómo funciona?
ocup$impuesto1=ifelse(ocup$ingreso>70000,ocup$ingreso*0.20,0)
sum(ocup$impuesto1)
## [1] 4894529
La función ifelse ()
Ahora pensemos que dicho impuesto solo será aplicado a las personas mayores de 40.
ocup$impuesto2=ifelse(ocup$ingreso>70000&ocup$edad>40,ocup$ingreso*0.20,0)
sum(ocup$impuesto2)
## [1] 3857190
Distribuciones de probabilidad en R
Para cada una de las distribuciones de probabilidad hay cuatro funciones que computan diferentes cosas.
Los argumentos en las funciones dependen de los parámetros que describen a las distribuciones de
probabilidad.
"d"= computa la altura de la función de densidad en un punto en el caso de una función continua
(𝑓(𝑥)) y la función de cuantía en el caso de una v.a discreta (𝑝(𝑥) = 𝑃[𝑋 = 𝑥])
"p"= computa la función de distribución evaluada en un punto (𝐹 (𝑥) = 𝑃[𝑋 ≤ 𝑥])
"q"= computa el inverso de la función de distribución, es decir, los cuantiles (𝑃[𝑋 ≤ 𝒙𝜶 ] = 𝛼)
"r"= computa número aleatorios de la distribución de probabilidad
Distribución Normal 𝑋~𝑁(𝜇, 𝜎) en R
Los argumentos para cualquiera de las cuatro funciones son mean (𝜇 = media) y sd (𝜎 = desviación
estándar).
#[1] 5
rnorm(n=1000,mean=100,sd=25)
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom
Los argumentos para cualquiera de las cuatro funciones son:
#[1] 0.2013266
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom
#[1] 0.9936306
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom
#Mediana de una distribución binomial con n=10 y p=0.20
qbinom(0.5,size=10,prob=0.20)
#[1] 2
#Genera 500 obs. provenientes de una distribución binomial con n=10 y p=0.20
rbinom(500,size=10,prob=0.20)
Otras distribuciones de probabilidad continuas
A tener en cuenta:
Para ello, tenemos que utilizar los argumentos title, xlab, ylab y col respectivamente.
Los argumentos title, xlab, ylab y col2 pertenecen a todas las funciones que realizan otros tipos
de gráficos.
2
Por más colores ver http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf
Histogramas hist()
lines(density(log(ocup$ingreso)),col=' darkslategrey',lwd=2)
Histogramas hist()
Diagrama de caja boxplot()
La lógica de la función boxplot es igual al histograma.
Podemos querer que el diagrama este horizontal o vertical (por defecto horizonal=FALSE) y cuál es el
rango que utilizamos para definir que una observación es atípica (por defecto range=1.5)
sexo=c(rep('Hombre',25),rep('Mujer',55))
tabla_sexo=table(sexo)
barplot(tabla_sexo,col=c('blue','red'),main='Cantidad de personas por sexo')
Diagrama de barras barplot()
tabla1=table(base$pobre,base$sexo)
barplot(tabla1,xlab="Sexo", col=c("slategray1","slategray4"),legend
=c('Pobre','No pobre'), main="Distribución por sexo y edad", beside=TRUE)
Diagrama de tarta pie()
La lógica para realizar un diagrama de tarta es exactamente igual al del diagrama de barras
pie(tabla_sexo,col=c('blue','red'))
Diagrama de dispersión plot()
set.seed(23112013)
x=runif(100,10,50)
y=x+rnorm(100,30,10)
plot(x,y,cex=2,pch=21,col='steelblue',bg='lightsteelblue1')
abline(lm(y~x),lwd=2,col='dodgerblue4')
Diagrama de dispersión plot()
Pirámide de población pyramid.plot
library(foreign)
library(survey)
library(plotrix)#carga el paquete para hacer pirámides (y otros)
# levanta la ECH
base=read.spss("ECH 2013.sav",to.data.frame=TRUE,use.value.labels=FALSE)
desempleo=ts(tasas$desempleo,start=c(2006,1),frequency=12)
Graficando series de tiempo
plot(desempleo,ylim=c(0,15),lwd=2,col='royalblue1',main='Tasa de desempleo
2006 - 2013')
lines(decompose(desempleo)$trend,col='orangered',lwd=2)
Graficando mapas
El paquete survey
El paquete contiene funciones para calcular estimaciones y sus respectivas precisiones (varianza,
desviación estándar e intervalos de confianza) cuando los datos provienen de muestras aleatorias que
fueron seleccionadas bajo diseños muestrales complejos (muestreo por conglomerados, en varias etapas,
estratificado, proporcional al tamaño, etc).
Para ver cómo funciona el paquete Survey, vamos a suponer que la muestra de hogares de
Montevideo fue seleccionada bajo distintos diseños muestrales. La especificación del diseño muestral
repercutirá en las estimaciones puntuales y en el cálculo de las estimaciones de las varianzas de los
estimaciones (y por ende en las amplitudes de los intervalos de confianza).
El paquete survey
Como primer paso tenemos que cargar el paquete Survey
Segundo paso, tenemos que especificar el diseño muestral(svydesign) que fue utilizado para
seleccionar la muestra. Esto implica indicarle al Survey cuáles son los ponderadores o probabilidades
de inclusión de los individuos de la muestra, los estratos (si es que los hay), las tasas de muestreo (si es
que las hay) e indicar la cantidad de etapas de selección (si es que las hay).
La función tiene muchos argumentos, pero nos centraremos en argumentos que nos permitan ponderar
nuestra muestra.
El paquete survey
svydesign(ids, probs=NULL, strata = NULL, fpc=NULL, weights=NULL,data=NULL)
ids Formula o variables que especifiquen las etiquetas de los clusters (primera etapa, segunda etapa, etc.).
Si el diseño muestral no tiene clusters, id=~1.
probs Variables indicando las probabilidades de inclusión en cada una de las etapas de muestreo.
strata Variable que indique el estrato al que pertenece cada una de las unidades de la muestra
fpc Factor de corrección por población finita: variable indicando las tasas de muestreo o los tamaños de la
población .
weights Variable que indique los ponderadores de la muestra
data Data frame con la muestra.
El paquete survey
Una vez definido el diseño podemos calcular estimaciones para:
totales (svytotal),
medias (svymean)
percentiles (svyquantile),
tablas (svytable)
razón entre dos variables (svyratio)
modelos de regresión (svyglm)
gráficos (svyhist,svyplot).
#ingreso promedio
svymean(~ingreso,ps)
# mean SE
# ingreso 14790 204.35
# departamento ingreso se
# ARTIGAS ARTIGAS 10939.671 963.0618
# CANELONES CANELONES 13850.623 482.9115
# CERRO LARGO CERRO LARGO 11527.024 1169.4040
# COLONIA COLONIA 14554.338 844.8672