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

Comentarios