2.28. Datos, gráficos, estadística y juegos para aprender: Usando R. Nivel medio

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)}

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 página.

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.

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).

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

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))

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")

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)
  • talleres/rticemedio.txt
  • Última modificación: 2008/02/15 14:19
  • (editor externo)