########################################################################### # 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
Comentarios
Publicar un comentario