====== 2.28. Datos, gráficos, estadística y juegos para aprender: Usando R. Nivel medio ====== ===== Creando animaciones ===== Crearemos una animación que desplace un punto por la curva de la función seno entre ''-pi'' y ''pi'' for(i in seq(-pi,pi,0.1)){plot(sin,-pi,pi);points(i,sin(i))} Con un poco de control sobre el tiempo se puede apreciar mejor: for(i in seq(-pi,pi,0.1)){plot(sin,-pi,pi);abline(h=0,col="grey");points(i,sin(i));Sys.sleep(0.1)} ===== Cuando las cosas se complican ===== Vaya lio ... es necesario un poco de organización: R + editor = solución: ''vim'', ''emacs'', ''gvim'' ''xemacs'', ''gedit'', ''kedit'', ''tinn-R'', ''nano'', ... block de notas. La ayuda se mejora cuando el editor nos muestra las pareja de los paréntesis, corchetes o llaves. for (i in seq(-pi, pi, 0.1)){ plot(sin, -pi, pi) abline(h = 0, col = "grey") points(i, sin(i)) Sys.sleep(0.1) } Otro ejemplo: for (i in 1:360) { plot(1, ann = F, type = "n", axes = F) text(1, 1, "Animation", srt = i, col = rainbow(360)[i], cex = 7 * i/360) Sys.sleep(0.01)} Extraido de esta [[http://r.yihui.name/intro/documentations/index.htm|página]]. ===== Salidas gráficas ===== Para obtener la lista de formatos de salida puede utilizarse ''?Devices'': pdf(), postscript(), png(), ... En ellos puede definirse más de un gráfico por página mediante la función ''par()'', por ejemplo: ''par(mfrow=c(2,3))'', para una división regular del área gráfica; o mediante ''layout()'', que permite un reparto del área más completo. ===== Lectura de un fichero de datos ===== Para leer datos de un fichero, local en red, utilizaremos la función ''read.table()''. read.table("http://www.um.es/docencia/emc/datos/evolpobmun.dat") -> x Cuando se utiliza fichero de datos datos de otros directorios siempre (winxx, linux, ...) se utiliza el caraćter ''\'' para describir el nombre: read.table("c:/tesis/experimento/lote1/datos.dat") -> x Debe cuidarse siempre de que el fichero se lee con las especificaciones adecuadas: separador de campos, caracter para separar los decimales, tipo de codificación de los caracteres, ... read.table("http://www.um.es/docencia/emc/datos/din.pob.dat",sep=",") Una vez leido el fichero, y para el ''data.frame'' obtenido: ''x'', puede comprobarse que se corresponde con lo esperado utilizando las siguientes funciones: * ''ncol(x)'' y ''nrow(x)'': proporciona el número de columnas y filas de x. * ''dim(x)'': vector con el número de columnas y filas de x * ''colnames(x)'': nombre de las columnas de x. * ''rownames(x)'': nombre de las filas de x * ''t(x)'': traspone la tabla (cuidado con la homogendidad de las variables). ===== Otros objetos en R: Historia de un histograma ===== Desribiremos el comportamiento de una variables mediante un histograma y analizaremos que es un objeto de la //clase histograma// read.table("http://www.um.es/docencia/emc/datos/iris.dat") -> x attach(x) hist(lonsep, 5) hist(lonsep, 5, freq = F) hist(lonsep, 5, plot = F) hist(lonsep, 5, plot = F)->x.hist Una vez construido el objeto histograma ''x.hist'' conoceremos su propiedades mediante: names(x.hist) str(x.hist) Podemos acceder a los elemento el objeto escrinbiendo ''x.hist$'' y pulsando el tabulador lines(x.hist$mids,x.hist$density,lwd=5) lines(x.hist$mids,x.hist$density,lwd=2,col=2) La función ''attributes()'' nos ayuda a identificar rápidamente el tipo de objeto: attributes(x.hist) attributes(x) attributes(x)$class ===== Algo de probabilidad ===== Para cada una de las funciones de R que describen distribuciones de probabilidad hay las cuatro variantes que se identifican por la inicial: |''dffff(x)''|para el valor la funcion de distribución en ''x''| |''pffff(x)''|para la probabilidad acumulada hasta el valor ''x''| |''qffff(p)''|para el percentil que acumula la probabilidad ''p''| |''rffff(n)''|que genera ''n'' valores aleatorios de la distribución| Siendo ''ffff'': |''unif'' | distribución uniforme | |''norm'' | distribución normal | |''pois'' | distribución de Poisson | |''binom''| distribución binomial | |''gamma''| distribución gamma | | ... | ''apropos ("^r")'' para echar un vistazo rápido | Calculando y representando valores de la normal: plot(dnorm,-3,3) dnorm(0) pnorm(2) qnorm(0.975) plot(pnorm,-3,3) plot(qnorm,0,1) plot(rnorm,-3,3) plot(rnorm,-3,3,ylim=c(-3,3)) ===== Estadísticos y condiciones ===== Media de los individuos por grupos: split(lonsep,especie,mean) lapply(split(lonsep,especie),mean) as.matrix(lapply(split(lonsep,especie),mean)) Otra opción: by(lonsep, especie, mean) as.matrix(by(lonsep, especie, mean)) Todas las variables a la vez: aggregate(x, by=list(especie), FUN = "mean") ===== Análisis multivariante de una matriz de datos ===== Utilizaremos el fichero de datos ''evolpobmun.dat'', que ya hemos comprobado antes: read.table("http://www.um.es/docencia/emc/datos/evolpobmun.dat") -> x Se puede hacer una selección de filas automáticamente: apply(x,1,sum) #¿Hay problemas con NA? !is.na(apply(x,1,sum))->seleccion.casos Una clasificación por //k-means// kmeans(x[seleccion.casos, ], 8) kmeans(x[seleccion.casos, ], 8) -> x.km8 Una clasificación jerárquica: plot(hclust(dist(x[seleccion.casos,]),method="mc"),hang=-1) Transformado los datos para otro análisis: tc <- (x[seleccion.casos,1:9] - x[seleccion.casos,2:10]) / x[seleccion.casos,1:9] plot(hclust(dist(tc),method="mc")->tc.hcl,hang=-1) Comparando las dos clasificaciones: cutree(tc.hcl,8) ->tc.h8 table(x.km8$cl,tc.h8)