jueves, 29 de septiembre de 2011

Estadística descriptiva (Clase 2)

###########################################################################
# Análisis de datos con R #
# 2010/2011 #
# Msc. Rosana Ferrero #
# http://statisticalecology.blogspot.com/ #
###########################################################################
# Clase 2. Estadística descriptiva
###########################################################################
# 0. Funciones de interés para manejar los datos #
# 1. Estadística descriptiva #
# a. Tablas de Frecuencia #
# b. Gráficos #
# c. Estadísticos, medidas o estimadores #
# 2. Ejemplo: datos Iris #
# 3. Otras funciones para el manejo de datos #
###########################################################################
 
###########################################################################
# 0. Funciones de interés para manejar los datos #
###########################################################################
 
########## Leer los datos
 
### La función "scan"
x<-scan()
1: 6
2: 7
3: 3
4: 4
5: 8
6: 5
7: 6
8: 2
9:
 
### La función "read.table". Producen un dataframe
data<-read.table("c:\\temp\\regression.txt",header=T)
map<-read.table("c:\\temp\\bowens.csv",header=T,sep=",")
data<-read.table(file.choose(),header=T)
## opción seq=""
#\n newline
#\r carriage return
#\t tab character
#\b backspace
#\a bell
#\f form feed
#\v vertical tab
## chequear un archivo
file.exists("c:\\temp\\Decay.txt")
## leer datos desde archivos con formato no estándar. Producen un objeto lista no un dataframe
murders<-scan("c:\\temp\\murders.txt", skip=1, what=list("","","",""))
murder.frame<-as.data.frame(murders)
murders<-read.table("c:\\temp\\murders.txt",header=T)
## leer archivos con diferentes números/valores por línea
line.number<-length(scan("c:\\temp\\rt.txt",sep="\n"))
(my.list<-sapply(0:(line.number-1),function(x) scan("c:\\temp\\rt.txt",skip=x,nlines=1,quiet=T)))
## leer líneas. Produce un objeto de clase character.
readLines("c:\\temp\\murders.txt",n=-1)
 
######## Ver ítem 4 para obtener más funciones de interés
 
###########################################################################
# 1.a. Tablas de frecuencias #
###########################################################################
 
table(rpois(100,5)) # realiza tablas de frecuencias absolutas
table(rpois(100,5))/sum(rpois(100,5)) #realiza tablas de frecuencias relativas
table(cut(rpois(100,5),3)) #para variables numéricas si queremos hacer una tabla de frecuencias absolutas agrupando los datos por intervalos
margin.table(tabla, 1 o 2 o ...) #realiza tablas marginales del objeto tabla
prop.table(tabla, 1 o 2 o ...) #tabla de frecuencias condicionadas por la dimensión indicada con 1 o 2 o... del objeto tabla
ftable(tabla) # tabla de frecuencias para 3 o más variables categóricas
 
m <- matrix(1:4,2); m
margin.table(m,1) # totales por filas
margin.table(m,2) # totales por columnas
prop.table(m,1) # porcentaje por filas
prop.table(m,2) # porcentaje por columnas
 
data(Titanic)
Titanic
ftable(Titanic) # crea tablas de contingencia llanas; x= factores o lista o tabla
ftable(Titanic, row.vars = 1:2, col.vars = "Survived")
 
tabulate(c(2,3,3,5), nbins = 10) # cuenta el número de veces que ocurre cada valor en un vector dado
 
# Tabla de frecuencias de 3 vías (3 variables)
xtabs(~A+B+C, data) # tabla de frecuencias de 3 vías
 
# Tabla de contingencia (Cross Tabulation) de 2 vías (2 variables)
library(gmodels)
CrossTable(mydata$myrowvar, mydata$mycolvar)
 
requires(stats)
with(warpbreaks, table(wool, tension)) #distribución de frecuencias simples
table(state.division, state.region)
with(airquality, table(cut(Temp, quantile(Temp)), Month)) #tabla de contingencia de 2 vías
 
#La tabla ignora los valores perdidos, para incluir los NA como una categoría para contar debemos incluir la opción exclude=NULL si la variable es un vector. Si la variable es un factor debemos crear un nuevo factor usando: newfactor <- factor(oldfactor, exclude=NULL). (Obtenido de "QuickR" -http://www.statmethods.net/stats/frequencies.html-)
 
hist(x, nclass=, breaks=seq(0,100,by=5))
#por ejemplo:
(hist(velocidades, plot=FALSE, col='14',nclass=10,ylim=c(0,10), labels=TRUE,main= 'Velocidad autom¶oviles', sub='Via el Volador', ylab='Frecuencias',xlab='Velocidad en Km/h'))
#$breaks (límites de clase)
#$counts (frecuencias absolutas)
#$intensities (frecuencias relativas)
#$mids (marcas de clase o puntos medios)
 
###########################################################################
# 1.b. Gráficos #
###########################################################################
 
x11() # activa un dispositivo gráfico
dev.off() #cierra un dispositivo gráfico
par() # selecciona ciertos parámetros gráficos que están definidos por defecto y pueden modificarse
demo(graphics) # demostración de gráficos y código de R
plot(x,y) # gráfico de dispersión: x e y son vectores
plot(x) #si x es un vector numérico realiza un gráfico de sus elementos sobre el índice, y si x es una serie temporal realiza un gráfico de x frente al tiempo
plot(f) # si f es factor realiza un gráfico de barras
plot(f, x) # si f es factor y x vector, realiza un diagrama de cajas para cada nivel del factor f
plot(hoja.datos) # realiza un gráfico de dispersión para cada pareja de variables
 
## argumentos de las funciones gráficas
#type= "n" (nada) "p" (puntos) "l" (líneas) "b" (both: punto+línea) "o" "s" "S" "h"
#xlab= ylab= (añade etiquetas a los ejes)
#main= sub= (añade título y subtítulo)
#xlim=c(,) ylim=c(,) (selecciona los límites mínimo y máximo para los ejes)
#add= T o F (solapa un gráfico con otro ya existente o no)
#col= (indicar color). ver la opción colors()
 
## otras funciones gráficas
points(x,y, pch=nº) #añade puntos definidos por las coordenadas contenidas en los vectores x e y el aspecto indicado en pch. Se puede utilizar type
abline(h=, v=) # añade líneas horizontales y/o verticales
abline(lm) o abline(a,b, lty=nº) #añade una recta y=a+b*x con el trazo indicado en lty
legend(x,y) # añade la leyenda en el punto indicado
title(main="" , sub="") #añade título y subtítulo
axis() # modifica elementos referentes a los ejes como color, tickmarks, fuentes, etc
text(x,y,etiquetas) #añade etiquetas en las posiciones marcadas por x e y
lines()
curve()
 
#gráficos simples
hist(vector, nclass, breaks, probability, plot) #histograma
mid.age<-c(2.5, 7.5, 13, 16.5, 17.5, 19, 22.5, 44.5, 70.5) ;
acc.count<-c(28, 46, 58, 20, 31, 64, 149, 316, 103) ;
age.acc<-rep(mid.age, acc.count) ; age.acc ;
brk<-c(0, 5, 10, 16, 17, 18, 20, 25, 60, 80) ; hist(age.acc, breaks=brk)
A<-hist(x); lines(c(min(A$breaks), A$mids, max(A$breaks)), c(0, A$counts, 0), type="l", col="red") #histograma con polígono de fercuencias
 
x<-seq(100, 145, by=5) ; n<-length(x) #funciónd e distribución empírica
plot(sort(x), (1: n)/n , type=”s, ylim=c(0,1))
 
qqnorm(x) #gráfico de probabilidad normal, en abscisas están los valores esperados de los cuantiles de la normal y en las ordenadas los valores de x
qqplot(x) #gráfico cuantil-cuantil, en abscisas están lso cuantiles del vector x y en ordenadas los cuantiles del vector y
 
boxplot(vector1, vector2, plot=F o T) #diagrama de cajas como vectores
boxplot(formula, data=NULL, subset, plot=F o T) # diagrama de cajas múltiple
plot(factor, vector) #diagrama de cajas para cada nivel del factor f
 
stripchart(formula o x, method="overplot" o "jitter" o "stack") #gráfico de puntos
stem(vector) #diagrama de tallo-hojas
 
plot(table()) #diagrama de barras para una variable numérica discreta
plot(factor) #diagrama de barras para una variable categórica
barplot(vector o tabla, names.args=NULL) #cada valor representa la altura de una barra que podemos etiquetar opcionalmente con names.args
barplot(matriz o tabla, beside=T (adyacentes) o F (apiladas)) #diagrama de barras múltiples apiladas o no.
pie(x,labels=names(x), col) #diagrama de sectores
 
#gráficos múltiples por ventana
par(mfrow=c(filas, columnas)) #divide la pantalla gráfica en tantas filas y columnas como se indique
split.screen()
#datos multivariantes
plot(data.frame) #realiza un gráfico de dispersión de todos los pares de variables
pairs(A) # matriz de gráficos planos, un gráfico de dispersión para cada pareja de columnas de A
coplot(a~b|c) #gráficos condicionales
persp() #representa gráficamente funciones de 2 variables
contour() #representa curvas de nivel de una función de 3 variables
image() #representa un mapa de 2 variables
matplot() #representa una matriz frente a otra por columnas
matpoints o matlines # añade puntos o líneas a un gráfico (matrices)
 
#otros
library(lattice)
xyplot(circumference ~ age, groups=Tree, data=Orange)
 
#guardar gráficos
pdf(file="f1,pdf", width=8, heigth=10)
plot(runif(10))
dev.off()
#otra forma
plot(runif(50))
dev.copy2eps() #el nombre del archivo por defecto es Rplot.eps y el formato es postcript
 
###########################################################################
# 1.c. Estadísticos simples #
###########################################################################
 
#mean Media aritmética
#mean(datos, trim=.05) Media truncada o recortada al 5%
#median El percentil 0.5: la mediana
#min El mínimo de una serie de números
#max El máximo de una serie de números
#quantile Los percentiles de una distribución
#range Mínimo y máximo de un vector
#sum Suma aritmética
#var Cuasi-Varianza y cuasi-covarianza
#var(datos)*(length(datos)-1)/length(datos) Varianza
#sd Cuasi-desviación típica
#sqrt(var(datos))*(length(datos)-1)/length(datos) Desviación típica
#sd(datos)/abs(mean(datos)) Coeficiente de Variación
#mad Desviación media de la mediana
#skewness Asimetría
#kurtosis Curtosis o apuntalamiento
#summary Resumen de estadísticas de una serie de datos
#fivenum Retorna los 5 números de Tukey (de cajas de Tukey): minimum, lower-hinge, median, upper-hinge, maximum.
#cor Correlación (admite uno o dos argumentos)
#cumsum Suma cumulativa de un vector
#prod El producto de los elementos de un vector
#sample Muestreo aleatorio (y permutaciones)
 
### Veamos algunos ejemplos:
mean(1:10) #media aritmética
exp(mean(log(abs(1:10)))) #media geométrica
1/mean(1/1:10) #media armónica
median(1:10) #mediana
quantile(1:10) #cuartiles
quantile(1:10, probs=seq(0,1, by=1/10)) #deciles
weigthed.mean()
IRQ()
range()
cor()
tapply(x,f) #para obtener resúmenes por grupos
100*sd(x)/mean(x) # CV coeficiente de variación
 
#Estadísticas simples:
x = seq(1:10)
x
# [1] 1 2 3 4 5 6 7 8 9 10
cumsum(x)
# [1] 1 3 6 10 15 21 28 36 45 55
median(x)
#[1] 5.5
 
 
###########################################################################
# 2. Ejemplo: datos Iris
###########################################################################
data(iris)
head(iris)
attach(iris)
 
table(Species)
summary(Sepal.Length) # resumen estadístico de 1 variable
summary(iris) #resumen estadístico de varias variables
tapply(Sepal.Length, Species, mean)
var(Sepal.Length)
cor(iris[1:4]) #matriz de correlaciones
 
plot(iris) #gráfico de un dataframe
plot(Sepal.Length) # gráfico de 1 variables
plot(Sepal.Length, Petal.Length) # gráfico de 2 variables; ídem plot(Petal.Length~Sepal.Length)
plot(Species[Sepal.Length>5.1]) # gráfico de 1 factor
plot(Species, Sepal.Length) # gráfico de 1 factor (diagrama de cajas)
hist(Sepal.Length) #histograma
pie(table(Species[Sepal.Length>5]))
qqline(Sepal.Length) # comparación de un vector con los valores esperados normales
qqplot(Sepal.Length, Petal.Length) # comparación de las distribuciones de dos vectores o variables
cols <- rep(c("red","blue","green"), each=50)
pich <- rep(c(21,22,23),each=50)
plot(Sepal.Length,Petal.Length, pch=pich, bg=colores)
 
 
################################################################################ # 3. Otras funciones para el manejo de datos #
################################################################################
 
######### Primer visión de los datos
worms=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/worms.txt",header=T)
attach(worms)
names(worms)
summary(worms)
#las funciones by y aggregate permiten resumir un dataframe según los niveles del factor
by(worms, Vegetation, mean)
 
## Subíndice e índices
worms[3, 5]
worms[14:19, 7]
worms[1:5, 2:3]
worms[3, ]
worms[, 3]
worms[, c(1,5)]
# Seleccionar filas aleatoriamente de un Dataframe
worms[sample(1:20,8),]
# Ordenando los Dataframes
worms[order(Slope), ]
worms[rev(order(Slope)), ]
worms[order(Vegetation, Worm.density)]
# Usar condiciones lógicas para seleccionar filas de un Dataframe
worms[Damp == T,]
worms[Worm.density > median(Worm.density) & Soil.pH < 5.2,]
worms[,sapply(worms,is.numeric)]
worms[,sapply(worms,is.factor)]
# Drop filas
worms[-(6:15),]
worms[!(Vegetation=="Grassland"),]
worms[-which(Damp==F),]
 
### Omitir filas que contengan valores perdidos
data<-read.table("c:\\temp\\worms.missing.txt",header=T)
data
na.omit(data)
new.frame<-na.exclude(data)
data[complete.cases(data),]
apply(apply(data,2,is.na),2,sum)
 
#### Usar order y unique para eliminar la pseudoreplicación
worms[rev(order(Worm.density)),][unique(Vegetation),]
 
#### Ordenar de manera compleja con direcciones mixtas
worms[order(Vegetation,-Worm.density),]
# solo podemos utilizar el signo de menos cuando ordenamos variables numéricas, si no debemos utilizar la función rank para hacer numéricos los niveles de los factores.
worms[order(-rank(Vegetation),-Worm.density),]
 
### Un dataframe con nombres en las filas en lugar de números
detach(worms)
worms=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/worms.txt",header=T)
#worms<-read.table("c:\\temp\\worms.txt",header=T,row.names=1)
worms
 
##### Crear un dataframe
x<-runif(10)
y<-letters[1:10]
z<-sample(c(rep(T,5),rep(F,5)))
new<-data.frame(y,z,x)
new
 
y<-rpois(1500,1.5)
table(y)
as.data.frame(table(y))
 
short.frame<-as.data.frame(table(y)) # expandir un dataframe
long<-as.data.frame(lapply(short.frame, function(x) rep(x, short.frame$Freq)))
long[,1]
 
##### Eliminar filas duplicadas en un Dataframe
dups<-read.table("c:\\temp\\dups.txt",header=T)
dups
unique(dups)
dups[duplicated(dups),]
 
##### Juntar dos Dataframes: Merge
lifeform=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/lifeforms.txt",header=T); lifeform
flowering=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/fltimes.txt",header=T); flowering
merge(flowering,lifeforms) #contiene solo las filas que tienen entradas completas para ambos dataframes
(both<-merge(flowering,lifeforms,all=T)) # si queremos incluir todas las especies poniendo NA donde no hay coincidencias
# cuando tenemos diferentes nombres en 2 dataframes que queremos unir:
(seeds<-read.table("c:\\temp\\seedwts.txt",header=T))
merge(both,seeds,by.x=c("Genus","species"),by.y=c("name1","name2"))
 
##### Juntar dos Dataframes: Match
herb=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/herbicides.txt",header=T)
herb
worms$hb=herb$Herbicide[match(worms$Vegetation,herb$Type)] ## agregar un herbicida recomendado
match(worms$Vegetation,herb$Type)
worms
 
##### Resumir los contenidos de un dataframe:
#summary: resume los contenidos de todas las variables
#aggregate: crea una tabla del tipo tapply
#by: crea funciones para cada nivel del factor especificado
aggregate(worms[,c(2,3,5,7)],by=list(veg=Vegetation),mean)
aggregate(worms[,c(2,3,5,7)],by=list(veg=Vegetation,d=Damp),mean)
 
x1=1:8; x2=11:18; x3=rep(c("a","i"),each=4); x4=rep(c("f","m"),4)
df=data.frame(y=x1,z=x2,age=x3,sex=x4); df
summary(df)
table(df$age,df$sex) # returns frequencies
table(df$age)
table(df$age)
 
## apply (to a matrix)
x=matrix(1:6, 2,3); x # 2 rows, 3 cols
sum(x) # 21
apply(x,1,sum) # 9 12 sum rows(1)
apply(x,2,sum) # 3, 7 11 sum cols(2)
 
## tapply (table apply)
tapply(df$y,df$age,mean) # tapply(vector,factor,function) for table apply
t=tapply(df$y,list(df$age,df$sex),mean); t
t["a","m"]; t[1,2] # 3 you can reference individual elements
 
# Unir y cortar vectores de un Dataframe
require(stats)
formula(PlantGrowth) # check the default formula
pg <- unstack(PlantGrowth) # unstack according to this formula
pg
stack(pg) # now put it back together
stack(pg, select = -ctrl) # omitting one vector
subset(x, cond) #devuelve una selección de x que cumple unas condiciones
split(x, f) #divide el vector o la hora de datos x en grupos definidos por los valores de f
cut(x, breaks, labels=T o F) # divide el rango del vector x en intervalos y codifica los elementos de x de acuerdo con el intervalo en el que caigan
Created by Pretty R at inside-R.org