17

Click here to load reader

Graficas especiales

Embed Size (px)

Citation preview

Page 1: Graficas especiales

Graficas Especiales en R

Alvaro Naupayk z [email protected]

21 de noviembre de 2013

Page 2: Graficas especiales

Indice general

Introduccion i

1. Creando Scripts 11.1. getwd() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. Instalando paquetes en R 3

3. Graficas especiales 43.1. Polar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.2. Carta o grafico de eventos . . . . . . . . . . . . . . . . . . . . . . . . 73.3. Dibujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Page 3: Graficas especiales

Introduccion

Este trabajo esta dirigido para aquellos que ya tienen cierta experiencia utilizan-do R .

El objetivo del siguiente trabajo es dar una idea , espero satisfactoria para ellector, sobre como realizar Graficos Especiales en R , sin llegar a ser un manualespecializado en la materia.

Para la creacion de Graficos Especiales en R es necesario saber definir fun-ciones, crear scripts, descargar e instalar paquetes.

Sobre el codigo, se mencionara algunas direcciones de donde se podran obtener,a su vez se mostraran algunos ejemplos de como alterarlos.

No olvide que la mejor manera de aprender un programa es el ensallo y error,siempre y cuando no borren nada indevido...

i

Page 4: Graficas especiales

Capıtulo 1Creando Scripts

1.1. getwd()

Antes que nada debemos de estar seguros de cual es nuestro directorio de trabajo,esto lo sabremos escribiendo en el promt(consola) de R el siguiente comando

> getwd()

[1] "C:/WorkR"

en este caso, aparece el directorio que yo he definido, dependiendo del compu-tador este directorio puede ser diferente.

Es recomendable crear un directorio especial donde podamos guardar nuestrostrabajos, a continuacion veamos como hacerlo.

Nos hubicamos en la ventana principal de R , hacemos click en la pestana file,elegimos la opcion select directory o algo que aparesca por el estilo, luego dehacer click aparecera una ventana que ya es familiar para todos, aquı podemosseleccionar una nueva carpeta o crear una en el lugar que queramos, realizado esto noolvidemos precionar save, para guardar los cambios. Lamentablemente se tendra queseleccionar el directorio de trabajo cada vez que se inicie la sesion con R .

Luego escriba en la consola de R > getwd(), para verificar que los cambios sehan guardado correctamente y listo.

1.2. script

Para crear un script, tenemos que ubicarnos en la venta principal de R , hacerclick en la pestana file, selecionar new script, a continuacion se habrira una venta,que sera el script y a continuacion escribimos lo siguiente en el script.

1

Page 5: Graficas especiales

print("hola R")

a continuacion presionamos Ctrl + s para salvar el script, luego aparecera unaventana donde guardamos con el nombre saludo.r, siempre especificando la exten-sion .r, hacemos click en save y listo, a continuacion en la consola escribimos losiguiente.

> source("saludo.r")

[1] "saludo"

Cada vez que altere el script no olviden hacer Ctrl+s para salvar los cambios.Lo que hace el comando source() es introducir en la consola lo que esta escrito

en el script y lo ejecuta automaticamente sin necesidad de aparcer lo escrito enel script, cada vez que se realicen cambios en el script es necesario cargarlo en laconsola con source() para hacer efectivo los cambios.

A continuacion habramos otro script y escribamos lo siguiente

sum=function(x,y){

sum=sin(x)+sin(y)

sum

}

luego guardenlo con el nombre se sum.r, note que en este escript hemos cambiado<- por =, esto tambien es posible, lo que agiliza la escritura del script, hecho estoescribamos en la consola lo siguiente.

> source("sum.r")

Esto es para cargar en la consola nuestro script, cada vez que realicen cambiosen el escript se tendra que volver a cargar en la consola. Luego escribimos sum(2,3)y presionamos enter y tendremos lo siguiente

> sum(2,3)

[1] 1.050417

En este caso hemos llamado a la funcion igual que el nombre del archivo, estono es una ragla, ambos pueden tener nombres diferentes y no habra problemas.

Para aprender un poco mas hacerca de funciones se pueden buscar manuales eninternet o tambien consultar la pagina de R , http://lib.stat.cmu.edu/R/CRAN/,aquı tambien podras encontrar diversos manuales, aunque la mayoria estan en ingleshay algunos en espanol y potugues, tambien puedne ver la revista de R onlinehttp://journal.r-project.org/.

2

Page 6: Graficas especiales

Capıtulo 2Instalando paquetes en R

En R existen muchos, estos son desarrollados por muchas personas en el mundopara que sean utilizados de manera libre.

Empezaremos con un ejemplo, supongamos que deseas intalar el paquete RGraphics,escribimos en la consola lo siguiente

> install.packages("RGraphics")

luego de presionar enter, ocurren dos cosas, el paqueta empieza a instalar oaparece una ventana en la cual te pide seleccionar el mirror de donde descargar elpaquete, luego de seleccionar el mirror se presiona enter y comienza la instalacion.

Este proceso por lo general no ofrece ninguna complicacion, ahora para cargarel paquete dentro de la sesion de R se tiene que escribir lo siguiente en la consola

> libray(RGraphics)

cada vez que se cierra la sesion de R , los paquetes cargados se descargan, espor ello que es necesario escribir en el script los paquetes que utilizaran nuestrosprogramas.

Observacion : Al momento de correr cualquier programa, siempre que no estecargado o instalado un paquete, R nos lo dira, es entonces cuando tenemos querealizar lo dicho al inicio.

3

Page 7: Graficas especiales

Capıtulo 3Graficas especiales

Para crear graficos especiales conR es necesario escribir scripts y tambien cargarlos paquetes necesarios, dependiendo de lo que se desee hacer.

3.1. Polar

El siguiente codigo sirve para poder grafica informacion de la manera polar, elautor de este codigo es Ross Ihaka, pueden visitar su pagina, en la cual podranencontrar sus clases y tutoriales.http://www.stat.auckland.ac.nz/~ihaka/.

Escribamos a continuacion el siguiente codigo en un script

polar.plot <- function(r, theta,pch = NULL,col = NULL,

angle.axis = -90){

rpretty <- pretty(range(abs(r), 0, na.rm=TRUE))

rmax <- rpretty[length(rpretty)]

plot.new()

plot.window(xlim = c(-rmax, rmax),ylim = c(-rmax, rmax),

asp = 1)

grid <- seq(0, 2 * pi, length = 360 / 5 + 1)

for(rad in rpretty){

if(rad > 0)

lines(rad * cos(grid), rad * sin(grid), col = "gray")

}

rad <- seq(0, 2 * pi, length = 12 + 1)[-1]

segments(0, 0, rmax * cos(rad), rmax * sin(rad), col = "gray")

text(rpretty[-1] * cos(angle.axis * pi / 180),

rpretty[-1] * sin(angle.axis * pi / 180),

rpretty[-1])

4

Page 8: Graficas especiales

points(r * cos(theta),r * sin(theta),col = col, pch = pch) }

Salvemos este script con el nombre de polar1.r, hecho esto escribamos en la consolael siguiente ejemplo

source("polar1.r")

group <- sample(3, 100, replace = TRUE)

theta <- 0.5 * rnorm(100) + 0.5 * group

r <- rnorm(100, 4)

polar.plot(r, theta, col = c("red","green4","blue")[group], pch = 20)

a continuacion nos saldra el siguiente grafico

1

2

3

4

5

6

7

Figura 3.1: Esta figura utiliza la funcion polar.plot aplicada sobre los datos simulados presentadosen el ejemplo previo. Observe como este grafico nos permite analizar la dispersion y a la vezidentificar grupos o clusters en un conjunto de datos.

daremos ahora una explicacion del codigo escrito

Asumiendo que r esta dado en radianes

polar.plot <- function(r, theta,pch = NULL,col = NULL,

angle.axis = -90){

5

Page 9: Graficas especiales

Determinar el rango de valores.

Elegir los puntos de corte en valores exactos los cuales se incluyen en el rango.

rpretty <- pretty(range(abs(r), 0, na.rm=TRUE))

rmax <- rpretty[length(rpretty)]

Inicio de un nuevo grafico.

plot.new()

Fijar las coordenadas del grafico.

Elegir una region cuadrada la cual incluye un cırculo suficientemente grandepara incluir a todos los datos. El uso de asp = 1, permite que los cırculostengan tal apariencia aun cuando la ventana de graficos sea redimensionada.

plot.window(xlim = c(-rmax, rmax),ylim = c(-rmax, rmax),

asp = 1)

Dibujar una rejilla circular

1. Los cırculos son realmente polıgonos con muchos vertices

2. El numero “5” es elegido para que un cambio de direccion de menos de5 grados aparezca suave.

grid <- seq(0, 2 * pi, length = 360 / 5 + 1)

for(rad in rpretty){

if(rad > 0)

lines(rad * cos(grid), rad * sin(grid), col = "gray")

}

Dibujar una rejilla circular en gris. El uso de “12” da divisiones en seccionesde 30 grados.

rad <- seq(0, 2 * pi, length = 12 + 1)[-1]

segments(0, 0, rmax * cos(rad), rmax * sin(rad), col = "gray")

6

Page 10: Graficas especiales

Etiquetar ejes basicos. Las etiquetas aparecen a lo largo del radio en anguloangle.axis al eje x

text(rpretty[-1] * cos(angle.axis * pi / 180),

rpretty[-1] * sin(angle.axis * pi / 180),

rpretty[-1])

Graficar los datos.

points(r * cos(theta),r * sin(theta),col = col, pch = pch) }

3.2. Carta o grafico de eventos

Este tipo de graficos es comun en estudios de tiempos de vida o de sobrevivencia.En el eje horizontal se describen los tiempos o perıodos de observacion y en el ejevertical las unidades o individuos cuyos tiempos de vida son observados. Obviamenteno todas las unidades o individuos tendran el mismo tiempo de vida y por otra parte,es posible que la observacion sea realizada tan solo hasta cierto tiempo t0 (biensea por diseno del experimento o por alguna otra circunstancia que impide seguirobservando a un individuo u unidad), razon por la cual algunas de las unidadeso individuos aun “sobreviven” al final del experimento, se dice que estos han sidocensurados en t0. Otra posible situacion es que no todas las unidades (individuos)comienzan a ser observados en el mismo tiempo. La idea de este grafico es indicarpara cada caso los siguientes eventos: el tiempo de inicio de observacion, el tiempode fallo (muerte), o si fue censurado y ademas cualquier otro evento especial, comocontroles periodicos. A continuacion se presenta un posible programa en R para laelaboracion de este tipo de graficos y dos graficos obtenidos a partir de este:

paciente corresponde a una variable numerica, pero tomada como un codigopara el paciente.

inicio es una variable numLerica que indica el punto de inicio de las obser-vaciones, si es cero significa que la fecha de comienzo de observacion para unindividuo coincide con la fecha de inicio del estudio.

dıas es el numero de dıas totales de observacion de un individuo.

censura es un vector de unos y ceros; el valor de 0 si la observacion fue censu-rada o de 1 si el individuo fue observado hasta el “fallo”.

7

Page 11: Graficas especiales

especiales es una matriz; la columna 1 para indicar el nLumero del individuo,la columna 2 para indicar el tiempo a partir del respectivo inicio en que ocurreel evento especial y la col 3 para indicar el tipo de evento especial. Para el casose tienen tres eventos para E1 el valor es 1, para E2 es 2 y para E1,2 es 3. Sino ocurren eventos especiales, se omite en el argumento al llamar la funcioncarta.eventos.

“a” es una variable que por defecto toma el valor de 0. Si existen eventosespeciales debe especificarse como 1.

A continuacion escribamos el siguiente script

carta.eventos<-function(paciente,inicio,dias,censura,

especiales="NULL",a=0){

n<-length(paciente)

plot(inicio,paciente,xlim=c(-1,(max(dias+inicio)+1)),

ylim=c(-0.5,(n+1)),xlab="dias",pch=19)

for(i in 1:n){

temp1<-censura[i]

if(temp1==0)temp1<-4

else temp1<-0

points((inicio[i]+dias[i]),paciente[i],pch=temp1)

segments(inicio[i],paciente[i],(inicio[i]+dias[i]),

paciente[i])

}

if(a==1){

m<-nrow(especiales)

for(j in 1:m){

temp2<-especiales[j,3]

if(temp2==1)temp2<-17

else{

if(temp2==2)temp2<-15

else temp2<-13

}

temp3<-0

for(i in 1:n){

temp3[especiales[j,1]==i]<-inicio[i]

}

points((temp3+especiales[j,2]),especiales[j,1],pch=temp2)

}

}

x1<--0.5

8

Page 12: Graficas especiales

y<-0.5

x2<-max(dias+inicio)/5-1

x3<-2*max(dias+inicio)/5-2

x4<-3*(max(dias+inicio))/5-3

x5<-4*(max(dias+inicio))/5-4

x6<-max(dias+inicio)-4

legend(x1,y,c("inicio"),bty="n",cex=0.7,pch=19)

legend(x2,y,c("fallo"),bty="n",cex=0.7,pch=4)

legend(x3,y,c("E1"),bty="n",cex=0.7,pch=17)

legend(x4,y,c("E2"),bty="n",cex=0.7,pch=15)

legend(x5,y,c("E1,2"),bty="n",cex=0.7,pch=13)

legend(x6,y,c("censura"),bty="n",cex=0.7,pch=0) }

Guardemos este script con el nombre cartaevento.r, luego escribamos en la consolael siguiente ejemplo

source("cartaevento.r")

paciente<-c(1,2,3,4)

inicio<-c(0,0,1,5)

dias<-c(20,20,15,12)

censura<-c(1,1,0,0)

especiales<-matrix(c(1,5,1,1,15,2,2,5,1,2,15,2,4,10,3), ncol=3,byrow=T)

> especiales

[,1] [,2] [,3]

[1,] 1 5 1

[2,] 1 15 2

[3,] 2 5 1

[4,] 2 15 2

[5,] 4 10 3

luego escribimos lo siguiente en la consola para generar el primer grafico

fig1<-carta.eventos(paciente,inicio,dias,censura,especiales,1)

esto generar la figura 3.2. Luego el siguiente codigo generara la figura 3.3

fig2<-carta.eventos(paciente,inicio,dias,censura)

9

Page 13: Graficas especiales

0 5 10 15 20

01

23

45

dias

paci

ente

inicio fallo E1 E2 E1,2 censura

Figura 3.2: Esta grafica presenta el grafico de eventos considerando la ocurrencia de los eventosespeciales E1, E2, y E1,2 para los datos supuestos en un experimento en el cual se observanlos tiempos de vida de cuatro individuos sometidos a un tratamiento especfico. Es obtenida config1< −carta.eventos(paciente,inicio,dias,censura,especiales,1)

0 5 10 15 20

01

23

45

dias

paci

ente

inicio fallo E1 E2 E1,2 censura

Figura 3.3: Esta grafica presenta el grafico de eventos sin considerar la ocurrencia de los even-tos especiales E1, E2, y E1,2 para los mismos datos del ejemplo previo. Es obtenida config2< −carta.eventos(paciente,inicio,dias,censura)

10

Page 14: Graficas especiales

3.3. Dibujos

A continuacion presentaremos 2 graficos utilizando el paquete RGraphics, sepodra encontrar mas informacion en las siguientes direcciones:http://www.stat.auckland.ac.nz/~paul/RGraphics/RGraphicsChapters-1-4-5.pdf

http://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html.Escribamos el siguiente script

library(RGraphics)

pushViewport(viewport(xscale=c(0, 1), yscale=c(0.5, 1),

clip=TRUE))

res <- 50

for (i in 1:res)

grid.rect(y=1 - (i-1)/res, just="top",

gp=gpar(col=NULL, fill=grey(0.5*i/res)))

moon <- function(x, y, size) {

angle <- seq(-90, 90, length=50)/180*pi

x1 <- x + size*cos(angle)

y1 <- y + size*sin(angle)

mod <- 0.8

x2 <- x + mod*(x1 - x)

grid.polygon(c(x1, rev(x2)), c(y1, rev(y1)),

default.unit="native",

gp=gpar(col=NULL, fill="red"))

}

moon(.1, .9, .03)

star <- function(x, y, size) {

x1 <- c(x, x + size*.1, x + size*.5, x + size*.1,

x, x - size*.1, x - size*.5, x - size*.1) + .05

y1 <- c(y - size, y - size*.1, y, y + size*.1,

y + size*.7, y + size*.1, y, y - size*.1) + .05

grid.polygon(x1, y1,

default.unit="native",

gp=gpar(col=NULL, fill="green"))

}

11

Page 15: Graficas especiales

star(.5, .7, .02)

star(.8, .9, .02)

star(.72, .74, .02)

star(.62, .88, .02)

grid.circle(runif(20, .2, 1), runif(20, .6, 1), r=.002,

default.unit="native",

gp=gpar(col=NULL, fill="white"))

hill <- function(height=0.1, col="black") {

n <- 100

x <- seq(0, 1, length=n)

y1 <- sin(runif(1) + x*2*pi)

y2 <- sin(runif(1) + x*4*pi)

y3 <- sin(runif(1) + x*8*pi)

y <- 0.6 + height*((y1 + y2 + y3)/3)

grid.polygon(c(x, rev(x)), c(y, rep(0, n)),

default.unit="native",

gp=gpar(col=NULL, fill=col))

}

hill()

rdir <- function(n) {

sample(seq(-45, 45, length=10), n)/180*pi

}

grid.text(" Es hora de dormir zzzzzz...",

x=.15, y=.51, just="bottom",

default.unit="native",

gp=gpar(col="white", fontface="italic", fontsize=10))

popViewport()

grid.rect()

guardamos esto con el nombre de luna.r y luego escribimmos en la consola

source("luna.r")

si durante la ejeucion nos pide instalar algun paquete adicional, no se preocupe,instalelo. De salir todo bien saldra el siguiente grafico

12

Page 16: Graficas especiales

Es hora de dormir zzzzzz...

◭ Figura 3.4 ◮

Escribamos otro script mas sobre graficos

grid.rect(gp=gpar(col="grey"))

grid.circle(x=seq(0.1, 0.9, length=100),

y=0.5 + 0.4*sin(seq(0, 2*pi, length=100)),

r=abs(0.1*cos(seq(0, 2*pi, length=100))))

guardelo como circulos.r, luego ejecutelo en la consola y tendremos el siguientegrafico(figura 3.5)

13

Page 17: Graficas especiales

◭ Figura 3.5 ◮

14