Introducci on a R Dpto. Ciencias de la Computaci on e Inteligencia...

Post on 26-Mar-2020

1 views 0 download

Transcript of Introducci on a R Dpto. Ciencias de la Computaci on e Inteligencia...

Introduccion a R

Dpto. Ciencias de la Computacion e Inteligencia ArtificialUniversidad de Sevilla

Contenidos

1 Introduccion

2 Vectores

3 Otros tipos de datosArrayFactoresListas y marcos de datos

4 Distribuciones de probabilidad

5 Graficos en RGraficos univariantesGraficos multivariantesGraficos por defecto VS lattice

6 Programacion en R

Introduccion

Instalacion

• El proyecto R (Windows, Mac-OS, Linux,. . . )

• Licencia GPL

• R-Studio Un entorno de desarrollo

Descripcion

• Lenguaje para el analisis de dato y la modelizacion.

• Analisis grafico y estadıstico

• Lenguaje de programacion orientado a objetos

• Ampliable a traves de numerosas bibliotecas disponibles

Guiones

• Conjunto de instrucciones que el interprete debe calcularsucesivamente.

• Las expresiones se escriben en ficheros de texto (con extension.R) y se envıan a la consola de R

R-Studio

Espacio/Directorio de trabajo

Espacio de trabajo (workspace)

• Conjunto de objetos definidos durante una sesion de trabajocon R que no se han borrado expresamente.

• Fichero con extension .RData• Se carga con la instruccion load

Directorio de trabajo (Working Directory)Lugar de referencia que utiliza R para localizar los ficheros que leey escribe

• getwd()

• setwd(’directorio’)

Espacio/Directorio de trabajo

Espacio de trabajo (workspace)

• Conjunto de objetos definidos durante una sesion de trabajocon R que no se han borrado expresamente.

• Fichero con extension .RData• Se carga con la instruccion load

Directorio de trabajo (Working Directory)Lugar de referencia que utiliza R para localizar los ficheros que leey escribe

• getwd()

• setwd(’directorio’)

Extensiones

Es posible extender R a traves de paquetes/bibliotecas.

• lattice: Biblioteca de graficoslibrary(lattice)

• ade4: Analisis de datos ecologicos

• class: Funciones de clasificacion

• seqinr: Analisis de secuencias

• Existen multiples repositorios• Bioconductor: http://www.bioconductor.org

install.packages("bioconductor",repos="www.bioconductor.org")

Ayuda

> ?mean

> help(mean)

> ??regresion

> help.search(’regression’)

• Description: Breve descripcion.

• Usage: Nombre de los argumentos y sus valores por defecto.

• Arguments: Descripcion detallada de cada argumento.

• Details: Descripcion detallada del comportamiento.

• Value: Descripcion detallada del valor devuelto por la funcion.

• See Also: Otras ayudas relacionadas.

• Examples: Ejemplos de uso.

Primeras nociones

• R distingue entre mayusculas y minusculas

> a <- 3

> A <- 5

> a

[1] 3

> A

[1] 5

• Identificadores validos: Cualquier combinacion de sımbolosalfanumericos junto con el punto y . No puede empezar conun dıgito.

• No renombrar las funciones de R (c, t,. . . )

Expresiones/Asignaciones

• Hay dos tipos de comandos: expresiones y asignaciones• Expresion. El resultado se muestra por pantalla y no se guarda.

> rnorm(5)

[1] 0.71690438 0.07539554 0.73687196 -0.43048351 -0.31119274

• Asignacion: no se muestra nada y se guarda

> v <- rnorm(4)

> v

[1] 0.46212728 -0.87838057 0.83872171 0.01630945

Vectores

• La estructura de datos mas simple.

• Coleccion ordenada de datos (todos del mismo tipo). Coercion

> x <- c(1, 2.5, c(4.2, 9, 7), FALSE) ; x

[1] 1.0 2.5 4.2 9.0 7.0 0.0

> x[1] <- 9 ; x

[1] 9.0 2.5 4.2 9.0 7.0 0.0

• Operaciones vectorizadas (se aplican a cada elemento)

• El mas corto se recicla (hasta la longitud del mas largo).

> y <- c(x,0,x) ; length(y)

[1] 13

> v <- 2*x + y + 1

Mensajes de aviso perdidos

In 2 * x + y :

longitud de objeto mayor no es multiplo de longitud de menor

> v

[1] 28.0 8.5 13.6 28.0 22.0 1.0 19.0 15.0 11.9 23.2 24.0 8.0 19.0

Vectores

• La estructura de datos mas simple.

• Coleccion ordenada de datos (todos del mismo tipo). Coercion

> x <- c(1, 2.5, c(4.2, 9, 7), FALSE) ; x

[1] 1.0 2.5 4.2 9.0 7.0 0.0

> x[1] <- 9 ; x

[1] 9.0 2.5 4.2 9.0 7.0 0.0

• Operaciones vectorizadas (se aplican a cada elemento)

• El mas corto se recicla (hasta la longitud del mas largo).

> y <- c(x,0,x) ; length(y)

[1] 13

> v <- 2*x + y + 1

Mensajes de aviso perdidos

In 2 * x + y :

longitud de objeto mayor no es multiplo de longitud de menor

> v

[1] 28.0 8.5 13.6 28.0 22.0 1.0 19.0 15.0 11.9 23.2 24.0 8.0 19.0

Generacion de secuencias

• El operador : (tiene la maxima precedencia)

> 1:15

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

• La funcion seq(from,to,by,length.out)

> seq(from=1, to=15, by=3)

[1] 1 4 7 10 13

• La funcion rep

> rep(c(1,2,3), times=3)

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

> rep(c(1,2,3), each=3)

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

> rep(c(1,2,3), times=c(3,2,1))

[1] 1 1 1 2 2 3

Operaciones elementales

• +, -, *, /, , %%, %/%, sum, prod, cumsum, cumprod

• sin, cos, tan, asin, acos, atan, abs, sqrt, diff

• log, exp, max, min, pmax, pmin, cummax, cummin

• rev, range, length, sort, order

• summary, mean, median, var, sd, quantile, IQR

• round, ceiling, floor, trunc, signif

> max(x)

[1] 9

> sort(x)

[1] 0.0 1.0 2.5 4.2 7.0 9.0

> order(x)

[1] 6 1 2 3 5 4

Inf, NA, NaN

> sqrt(-17)

[1] NaN

> sqrt(-17+0i)

[1] 0+4.123106i

> pi

[1] 3.141593

> pi / 0

[1] Inf

> (- pi) / 0

[1] -Inf

> 0 / 0

[1] NaN

> Inf - Inf

[1] NaN

> NA * 2

[1] NA

Operaciones de conjuntos

• union, intersect, setdiff, setequal, is.element,

%in%, match

> conj1 <- unique(c(1,2,3,4,3,2,3,1,4)) ; conj1

[1] 1 2 3 4

> conj2 <- c(3,4,5)

> conj3 <- c(2,4,3,1)

> intersect(conj1,conj2)

[1] 3 4

> setequal(conj1,conj3)

[1] TRUE

> is.element(2,conj1)

[1] TRUE

> c(2,6,4,8) %in% conj1

[1] TRUE FALSE TRUE FALSE

> match(c(2,1),conj3)

[1] 1 4

Cadenas de caracteres

• Delimitadas por ", ’

• \\, \", \n, \t

> paste(c("X","Y"), 1:10, sep="")

[1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"

> strsplit(c("acgtca","acgtaccgtacgact"), split="")

[[1]]

[1] "a" "c" "g" "t" "c" "a"

[[2]]

[1] "a" "c" "g" "t" "a" "c" "c" "g" "t" "a" "c" "g" "a" "c" "t"

> strsplit(c("acgtca","acatgaccgtatgact"), split="atg")

[[1]]

[1] "acgtca"

[[2]]

[1] "ac" "accgt" "act"

Valores logicos

• Comparacion: ==, !=, <, <=, >, >=

• Operadores: &, &&, |, ||, xor, !

> x <- 11:20

> !(x > 15)

[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE

> x < 13 | x >= 17

[1] TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE

> ((-2:2) >= 0) & ((-2:2) <= 0)

[1] FALSE FALSE TRUE FALSE FALSE

> ((-2:2) >= 0) && ((-2:2) <= 0)

[1] FALSE

> ((0:2) <= 0) & ((0:2) >= 0)

[1] TRUE FALSE FALSE

> ((0:2) <= 0) && ((0:2) >= 0)

[1] TRUE

Seleccion/Modificacion de datos

• Vector de posiciones

> x[c(1,2,3,2,11)]

[1] 11 12 13 12 NA

> x[11] <- 21 ; x

[1] 11 12 13 14 15 16 17 18 19 20 21

> x[c(1,2,3)] <- 3:1 ; x

[1] 3 2 1 14 15 16 17 18 19 20 21

> x[1:3] <- c(5,6)

Mensajes de aviso perdidos

In x[1:3] <- c(5, 6) :

numero de items para para sustituir no es un multiplo de ...

> x

[1] 5 6 5 14 15 16 17 18 19 20 21

> x <- c(11,12,13,x[4:10]) ; x

[1] 11 12 13 14 15 16 17 18 19 20

Seleccion de datos

• Vector de exclusiones

> x[-c(1,7,5)]

[1] 12 13 14 16 18 19 20

• Vector de valores logicos

> y <- 1:10; x[y > 5]

[1] 16 17 18 19 20

> x[c(TRUE,FALSE,FALSE)]

[1] 11 14 17 20

• Vector de nombres

> names(x) <- letters[1:10] ; x

a b c d e f g h i j

11 12 13 14 15 16 17 18 19 20

> x[c(’b’,’f’,’c’)]

b f c

12 16 13

Algunos ejemplos

> x <- c(2, 3, 5, 7, 11, 13)

> which.max(x)

[1] 6

> which(x > 5)

[1] 4 5 6

> length(x > 5)

[1] 6

> length(which(x > 5))

[1] 3

> sum(x > 5)

[1] 3

> sum(x[x > 5])

[1] 31

> x < 3 | x > 5

[1] TRUE FALSE FALSE TRUE TRUE TRUE

> which(x < 3 | x > 5)

[1] 1 4 5 6

> length(which(x < 3 | x > 5))

[1] 4

> sum(x < 3 | x > 5)

[1] 4

Problema 1

En el vector notas se guardan las notas de cien estudiantes de unafacultad. Se pide calcular:

• La media, la mediana y la desviacion tıpica de las notas.

• El numero de estudiantes con una nota superior a 5 e inferioro igual a 8.

• La nota del trigesimo octavo estudiante con mejor puntuacion.

# Media de las notas ; Mediana de las notas ; Desviacion tıpica

mean(notas) ; median(notas) ; sd(notas)

# N. de estudiantes con nota superior a 5 e inferior o igual a 8.

sum(5 < notas & notas <= 8)

# Nota del 38 mejor estudiante

sort(notas, decreasing = T)[38]

Problema 1

En el vector notas se guardan las notas de cien estudiantes de unafacultad. Se pide calcular:

• La media, la mediana y la desviacion tıpica de las notas.

• El numero de estudiantes con una nota superior a 5 e inferioro igual a 8.

• La nota del trigesimo octavo estudiante con mejor puntuacion.

# Media de las notas ; Mediana de las notas ; Desviacion tıpica

mean(notas) ; median(notas) ; sd(notas)

# N. de estudiantes con nota superior a 5 e inferior o igual a 8.

sum(5 < notas & notas <= 8)

# Nota del 38 mejor estudiante

sort(notas, decreasing = T)[38]

Problema 2

Realizada una encuesta en una ciudad, se han agrupado losnegocios hoteleros por el numero de plazas:

Plazas No de hotelesMenos de 100 25100-200 37200-300 12300-500 22500-600 21600-700 13700-800 5800-1000 3mas de 1000 2

• La tabla de frecuencias completa.

• El numero de negocios con mas de 300 plazas.

• Porcentaje de negocios con mas de 100 y menos de 500.

• La media, mediana y moda de la distribucion, si es posible.

# Extremos inferiores de los intervalos.

li <- c(0, 100, 200, 300, 500, 600, 700, 800, 1000) ; li

# Extremos superiores de los intervalos.

Li <- c(100, 200, 300, 500, 600, 700, 800, 1000, Inf) ; Li

n_negocios <- c(25, 37, 12, 22, 21, 13, 5, 3, 2) ; n_negocios

# Frecuencias absolutas

ni <- n_negocios ; ni

# Total

n <- sum(ni) ; n

# Frecuencias relativas

fi <- round(ni/n, digits = 2) ; fi

# Frecuencias absolutas acumuladas

Ni <- cumsum(ni) ; Ni

# Frecuencias relativas acumuladas

cumsum(fi)

# Negocios con mas de 300 plazas

sum(ni[300 <= li])

# Negocios con mas de 100 y menos de 500 plazas

entre.100.500 <- sum(ni[100 < Li & Li <= 500]) ; entre.100.500

# Porcentaje respecto del total de negocios

round((entre.100.500 * 100) / n, digits = 2)

# La media no se puede calcular, pues no se conocen todas las marcas

# de clase (el ultimo intervalo es [1000, Inf)).

Mediana (j intervalo donde la frecuencia acumulada llega hasta lamitad de la suma de las frecuencias absolutas)

lj +n2 − Nj−1

nj∗ cj

# Tama~nos de los intervalos

ci <- Li - li ; ci

# Intervalo de la mediana

jmed <- which(n/2 <= Ni)[1] ; jmed

# Mediana

li[jmed] + (n/2 - Ni[jmed-1])/ni[jmed] * ci[jmed]

Mediana (j intervalo donde la frecuencia acumulada llega hasta lamitad de la suma de las frecuencias absolutas)

lj +n2 − Nj−1

nj∗ cj

# Tama~nos de los intervalos

ci <- Li - li ; ci

# Intervalo de la mediana

jmed <- which(n/2 <= Ni)[1] ; jmed

# Mediana

li[jmed] + (n/2 - Ni[jmed-1])/ni[jmed] * ci[jmed]

Moda (j intervalo que tiene mayor altura)

lj +hj − hj−1

(hj − hj−1) + (hj − hj+1)∗ cj

(alturas hi =

nici

)

# Alturas

hi <- ni / ci

# Intervalo de la moda

j.moda <- which.max(hi) ; j.moda

# Moda

li[j.moda] +

(hi[j.moda] - hi[j.moda-1]) /

((hi[j.moda] - hi[j.moda-1]) + (hi[j.moda] - hi[j.moda+1])) *

ci[j.moda]

Moda (j intervalo que tiene mayor altura)

lj +hj − hj−1

(hj − hj−1) + (hj − hj+1)∗ cj

(alturas hi =

nici

)# Alturas

hi <- ni / ci

# Intervalo de la moda

j.moda <- which.max(hi) ; j.moda

# Moda

li[j.moda] +

(hi[j.moda] - hi[j.moda-1]) /

((hi[j.moda] - hi[j.moda-1]) + (hi[j.moda] - hi[j.moda+1])) *

ci[j.moda]

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): generacion multidimensional delos vectores. Todos los elementos de la matriz han de ser delmismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): generacion multidimensional delos vectores. Todos los elementos de la matriz han de ser delmismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): generacion multidimensional delos vectores. Todos los elementos de la matriz han de ser delmismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): generacion multidimensional delos vectores. Todos los elementos de la matriz han de ser delmismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): generacion multidimensional delos vectores. Todos los elementos de la matriz han de ser delmismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Array

• Todos los datos del mismo tipo

• Atributo dim

> x <- 1:42 ; dim(x) <- c(3,7,2) ; x

, , 1

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 7 10 13 16 19

[2,] 2 5 8 11 14 17 20

[3,] 3 6 9 12 15 18 21

, , 2

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 22 25 28 31 34 37 40

[2,] 23 26 29 32 35 38 41

[3,] 24 27 30 33 36 39 42

> x[15]

15

Array y seleccion de datos

> x[c(FALSE,TRUE,FALSE),-c(1,7),2]

[1] 26 29 32 35 38

> x[-2,,1]

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 7 10 13 16 19

[2,] 3 6 9 12 15 18 21

> x <- array(1:5,dim=c(3,7,2))

> x[1:2,2:5,2] <- 99 ; x

, , 1

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 2 5 3 1 4

[2,] 2 5 3 1 4 2 5

[3,] 3 1 4 2 5 3 1

, , 2

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 2 99 99 99 99 2 5

[2,] 3 99 99 99 99 3 1

[3,] 4 2 5 3 1 4 2

Matrices (un caso particular)

> a <- matrix(1:20,5,4) ; a

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

[1,] 1 6 11 16

[2,] 2 7 12 17

[3,] 3 8 13 18

[4,] 4 9 14 19

[5,] 5 10 15 20

> ncol(a)

[1] 4

> b <- matrix(21:32, nrow=3, byrow=T)

> rownames(b) <- letters[1:3]; colnames(b) <- LETTERS[1:4]; b

A B C D

a 21 22 23 24

b 25 26 27 28

c 29 30 31 32

> b["a","A"]

[1] 21

> b["a",]

A B C D

21 22 23 24

rbind y cbind

> a %*% t(b)

a b c

[1,] 790 926 1062

[2,] 880 1032 1184

[3,] 970 1138 1306

[4,] 1060 1244 1428

[5,] 1150 1350 1550

> cbind(rbind(a,b),1:8)

A B C D

1 6 11 16 1

2 7 12 17 2

3 8 13 18 3

4 9 14 19 4

5 10 15 20 5

a 21 22 23 24 6

b 25 26 27 28 7

c 29 30 31 32 8

Algunas funciones

• t, det, diag

• solve(A, B) resuelve A ∗ X = B, solve(A) devuelve A−1

> apply(b, 1, sum)

a b c

90 106 122

> apply(b, 2, mean)

A B C D

25 26 27 28

> rowSums(b)

a b c

90 106 122

> colMeans(b)

A B C D

25 26 27 28

> solve(matrix(c(3,1,2,-1),nrow=2),c(5,0))

[1] 1 1

Problema 3

Crear la siguiente matriz:

4,5 -2,1 6,3 2,7 1,6-2,6 3,6 8,4 5,2 8,32,5 1,7 3,7 -4,4 3,73,8 5,8 5,2 1,9 -4,2

Y calcular la fila y columna del mayor y menor elemento.

A <- matrix(c(4.5, -2.6, 2.5, 3.8, -2.1, 3.6, 1.7, 5.8, 6.3, 8.4,

3.7, 5.2, 2.7, 5.2, -4.4, 1.9, 1.6, 8.3, 3.7, -4.2),

nrow = 4)

# Fila del maximo

which.max(apply(A, 1, max))

# Columna del mınimo

which.min(apply(A, 2, min))

Problema 3

Crear la siguiente matriz:

4,5 -2,1 6,3 2,7 1,6-2,6 3,6 8,4 5,2 8,32,5 1,7 3,7 -4,4 3,73,8 5,8 5,2 1,9 -4,2

Y calcular la fila y columna del mayor y menor elemento.

A <- matrix(c(4.5, -2.6, 2.5, 3.8, -2.1, 3.6, 1.7, 5.8, 6.3, 8.4,

3.7, 5.2, 2.7, 5.2, -4.4, 1.9, 1.6, 8.3, 3.7, -4.2),

nrow = 4)

# Fila del maximo

which.max(apply(A, 1, max))

# Columna del mınimo

which.min(apply(A, 2, min))

Factores

> fr <- factor(c("Sı", "No", "No", "Sı")); fr

[1] Sı No No Sı

Levels: No Sı

> table(fr)

No Sı

2 2

> fr <- factor(c("Sı", "No", "No", "Sı"), levels = c("No", "Sı", "O"),

labels = c("No fumador", "Fumador", "NS/NC")); fr

[1] Fumador No fumador No fumador Fumador

Levels: No fumador Fumador NS/NC

> table(fr)

No fumador Fumador NS/NC

2 2 0

> nlevels(fr)

[1] 3

> levels(fr)

[1] "No fumador" "Fumador" "NS/NC"

Factores ordenados

> fc <- factor(c("Muchos", "Pocos", "Pocos", "Bastantes"),

levels = c("Pocos", "Bastantes", "Muchos"),

ordered = TRUE) ; fc

[1] Muchos Pocos Pocos Bastantes

Levels: Pocos < Bastantes < Muchos

> sum(fc < "Muchos")

[1] 3

> ordered(c("Muchos", "Pocos", "Pocos", "Bastantes"),

levels = c("Pocos", "Bastantes", "Muchos"))

[1] Muchos Pocos Pocos Bastantes

Levels: Pocos < Bastantes < Muchos

> table(fr,fc)

fc

fr Pocos Bastantes Muchos

No fumador 2 0 0

Fumador 0 1 1

NS/NC 0 0 0

Factores

• La funcion tapply permite aplicar una operacion a un vectoragrupando previamente los datos en cada uno de los nivelesproporcionados por un factor.

• Reordenar los niveles de un factor: reorder (el factor cuyosniveles hay que reordenar; un vector de la misma longitud acuyos subconjuntos de valores correspondientes a cada niveldel factor se aplicara la funcion que determina el orden; esafuncion).

• Una variable cuantitativa se puede transformar en una variablecualitativa.

tapply,reorder

> head(Cebada)

Cosecha Variedad A~no Lugar

1 27.00000 Manchuria 1931 University Farm

2 48.86667 Manchuria 1931 Waseca

3 27.43334 Manchuria 1931 Morris

4 39.93333 Manchuria 1931 Crookston

5 32.96667 Manchuria 1931 Grand Rapids

6 28.96667 Manchuria 1931 Duluth

> head(Cebada$Variedad)

[1] Manchuria Manchuria Manchuria Manchuria Manchuria Manchuria

10 Levels: Glabron Manchuria No.457 No.462 No.475 ... Wisconsin No.38

> tapply(Cebada$Cosecha, Cebada$Variedad, median)

Glabron Manchuria No.457 No.462 ...

32.40000 30.96667 33.96666 30.45000 ...

> Variedad_re <- reorder(Cebada$Variedad, Cebada$Cosecha, median)

> head(Variedad_re)

Manchuria Manchuria Manchuria Manchuria Manchuria Manchuria

10 Levels: Svansota No.462 Manchuria No.475 Velvet ... Trebi

> tapply(Cebada$Cosecha, Variedad_re, median)

Svansota No.462 Manchuria No.475

28.55000 30.45000 30.96667 31.06667

Factores

> num <- c(10, 0, 4, 8, 5, 22)

> interv <- cut(num, breaks = 4); interv

[1] (5.49,11] (-0.022,5.49] (-0.022,5.49]

[4] (5.49,11] (-0.022,5.49] (16.5,22]

Levels: (-0.022,5.49] (5.49,11] (11,16.5] (16.5,22]

> interv <- cut(num, breaks = c(0, 5, 10, 30), right=F); interv

[1] [10,30) [0,5) [0,5) [5,10) [5,10) [10,30)

Levels: [0,5) [5,10) [10,30)

> interv <- cut(num, breaks = c(0, 5, 10, 30), order=T,

labels = c("Poco","Bastante","Mucho"),

include.lowest = TRUE) ; interv

[1] Bastante Poco Poco Bastante Poco Mucho

Levels: Poco < Bastante < Mucho

> table(interv)

Poco Bastante Mucho

3 2 1

> which("Poco" < interv )

[1] 1 4 6

Problema 4

Se ha realizado un experimento para estudiar como afecta laconcentracion de nitrogeno del suelo al crecimiento de dos especiesde plantas. Los vectores especie, nitrogeno y ganancia.peso

guardan, respectivamente, para cada planta la especie (A o B) a laque pertenecen, la concentracion de nitrogeno del suelo en el queesta plantada y la ganancia de peso obtenida.

• Clasificar la concentracion de nitrogeno del suelo en 4intervalos con aproximadamente el mismo numero de datos

• Para cada uno de los intervalos anteriores calcular la media deganancia de peso de cada especie de planta.

• ¿Afecta por igual al crecimiento de las dos especies laconcentracion de nitrogeno del suelo?

# Intervalos de concentracion de nitrogeno

intervalos.nitrogeno <-

cut(nitrogeno, breaks = quantile(nitrogeno),

include.lowest = TRUE) ; intervalos.nitrogeno

# Media de la ganancia de peso segun la concentracion y la especie

tapply(ganancia.peso, list(especie, intervalos.nitrogeno), mean)

# El peso aumenta con la concentracion de nitrogeno, mas en la especie

# A que en la B

Problema 5Se considera publicitar unas galletas saladas de un cierto tipo de fibra: laspersonas a regimen consumiran las galletas antes del almuerzo, llenando susestomagos de tal forma que se sentiran menos hambrientos y comeran menos.Un laboratorio ha estudiado si serıan realmente efectivas.Se proporcionaron a distintos grupos de personas con sobrepeso uno de lostipos de galletas y se les permitio comer despues todo lo que quisieran. Secontrolo la cantidad de comida consumida y el peso, ası como cualquier efectosecundario producido.Los vectores galleta, calorias y molestias contienen el tipo de galletaconsumida (Sin fibra, Fibra de goma, Ambos tipos, Salvado), las calorıasconsumidas y el grado de molestias desarrolladas (Ninguna, Baja, Media yAlta) por cada persona.

• Para cada tipo de galleta, la media de calorıas consumidas.

• Ordenar los tipos de galletas segun su efectividad.

• Calcular la tabla de doble entrada del tipo de galleta consumido respectoal grado de molestias desarrollado.

• Calcular la tabla de contingencia del tipo de galleta consumido por laspersonas que no desarrollaron un grado medio o alto de molestias.

# Media de calorıas consumidas segun el tipo de galleta

calorias.medias <- tapply(calorias, galleta, mean) ; calorias.medias

# Tipos de galletas ordenados por efectividad

names(sort(calorias.medias))

# Tabla doble entrada: tipo de galleta, grado de molestias

table(molestias, galleta)

# Tabla contingencia: tipo de galleta consumido por personas con pocas

# o ninguna molestia

table(galleta[molestias < "Media"])

# Las galletas mas efectivas son las que producen mayores molestias.

Listas

> lst <- list(nombre="Carlos", num.hijos=3, edad.hijos=c(4,7,9))

> lst$apellido <- "Garcıa"; lst

$nombre

[1] "Carlos"

$num.hijos

[1] 3

$edad.hijos

[1] 4 7 9

$apellido

[1] "Garcıa"

> length(lst)

[1] 4

> lst[1]

$nombre

[1] "Carlos"

> lst[[3]][2]

[1] 7

> lst$num.hijos

[1] 3

> lst["nombre"]

$nombre

[1] "Carlos"

Marcos de datos

> df <- data.frame(Nombre=c("Pedro","Marıa","Jose","Marta"),

Edad=c(27,34,40,39),

Poblacion=c("Malaga","Madrid","Leon","Barcelona"),

Sexo=c("H","M","H","M"),

Casado=c(F,T,T,F)); df

Nombre Edad Poblacion Sexo Casado

1 Pedro 27 Malaga H FALSE

2 Marıa 34 Madrid M TRUE

3 Jose 40 Leon H TRUE

4 Marta 39 Barcelona M FALSE

> attach(df)

> Nombre

[1] Pedro Marıa Jose Marta

Levels: Jose Marıa Marta Pedro

> Edad

[1] 27 34 40 39

> detach(df)

> Edad

Error: objeto ’Edad’ no encontrado

Marcos de datos

> names(df)

[1] "Nombre" "Edad" "Poblacion" "Sexo" "Casado"

> rownames(df)

[1] "1" "2" "3" "4"

> ncol(df)

[1] 5

> df$Nombre

[1] Pedro Marıa Jose Marta

Levels: Jose Marıa Marta Pedro

> df[1:3]

Nombre Edad Poblacion

1 Pedro 27 Malaga

2 Marıa 34 Madrid

3 Jose 40 Leon

4 Marta 39 Barcelona

> df[1,3]

[1] Malaga

Levels: Barcelona Leon Madrid Malaga

Operaciones simultaneas

• Las funciones lapply y sapply aplica una operacion a cadaelemento de una lista.

• La funcion by permite aplicar una operacion a un marco dedatos agrupando previamente las filas de datos en cada unode los niveles proporcionados por una lista de factores.

• La funcion aggregate permite aplicar una operacion a cadacolumna de un marco de datos agrupando previamente losdatos en cada uno de los niveles proporcionados por una listade factores.

Operaciones simultaneas> df <- data.frame(altura=c(150,135,210,140), peso=c(65,61,100,65),

sexo=c("H", "M", "H", "M"))

> apply(df[-3], 2, sd)

altura peso

34.73111 18.26426

> lapply(df[-3], sum)

$altura

[1] 635

$peso

[1] 291

> sapply(df[-3], sum)

altura peso

635 291

> by(df[-3], df$sexo, prod)

sexo: H

[1] 204750000

--------------------------------------------------------------------

sexo: M

[1] 74938500

> aggregate(df[-3], list(df$sexo), mean)

Group.1 altura peso

1 H 180.0 82.5

2 M 137.5 63.0

Marcos de datos: read.table

• Todas las filas tienen el mismo numero de elementos menos laprimera que tiene un elemento menos.

• La primera fila contiene los nombres de las columnas.

• El primer elemento del resto de filas es el nombre de cada fila

• Los datos estan separados por espacios en blanco.

• El separador de los decimales es un punto.

• Los valores desconocidos se expresan con NA.

• write.table

Marcos de datos: read.csv

• La primera fila contiene los nombres de las columnas.

• Las filas no tienen nombre.

• Las filas que tengan menos elementos que la mas larga soncompletadas con valores NA.

• Los datos estan separados por comas.

• El separador de los decimales es un punto.

• Los valores desconocidos se expresan con NA.

Marcos de datos: read.csv2

• La primera fila contiene los nombres de las columnas.

• Las filas no tienen nombre.

• Las filas que tengan menos elementos que la mas larga soncompletadas con valores NA.

• Los datos estan separados por puntos y coma.

• El separador de los decimales es una coma.

• Los valores desconocidos se expresan con NA.

Problema 6

En el marco de datos vehiculos aparece la relacion de ventas delano 2001 organizadas por provincias (filas) y tipos de vehıculos(columnas). Se distingue tres modos de ventas (n-nuevos,i-importacion, u-usados).

• Calcular: el total de camiones, de cualquier tipo, vendidos enSevilla. El total de vehıculos vendidos en 2001. El total devehıculos nuevos vendidos en cada provincia. Las 10provincias con mayores ventas.

# Camiones vendidos en Sevilla, Total

sum(v["Sevilla", 1:3]) ; sum(v)

# Nuevos en cada provincia

apply(v[,seq(1,18,3)],1,sum)

# 10 mejores provincias

row.names(v)[order(apply(v, 1, sum), decreasing=T)[1:10]]

Problema 6

En el marco de datos vehiculos aparece la relacion de ventas delano 2001 organizadas por provincias (filas) y tipos de vehıculos(columnas). Se distingue tres modos de ventas (n-nuevos,i-importacion, u-usados).

• Calcular: el total de camiones, de cualquier tipo, vendidos enSevilla. El total de vehıculos vendidos en 2001. El total devehıculos nuevos vendidos en cada provincia. Las 10provincias con mayores ventas.

# Camiones vendidos en Sevilla, Total

sum(v["Sevilla", 1:3]) ; sum(v)

# Nuevos en cada provincia

apply(v[,seq(1,18,3)],1,sum)

# 10 mejores provincias

row.names(v)[order(apply(v, 1, sum), decreasing=T)[1:10]]

Problema 7

Se ha medido el nivel de glucosa en sangre de distintos sujetos endiversos momentos antes y despues de ingerir alcohol. Para cadasujeto se realizo el experimento en dos situaciones: en condicionesnormales y tras haber ingerido un aditivo dietetico.El marco de datos alcohol contiene los datos de las siguientesvariables:

• Sujeto: un numero identificador de cada sujeto delexperimento.

• Aditivo: el sujeto ingirio o no el aditivo dietetico.

• Tiempo: momento en que se realizo la medicion, relativo almomento en que se ingirio alcohol.

• Glucosa: nivel medido de glucosa en sangre.

Problema 7(Cont.)

• Los valores de la variable Tiempo representan periodos de diezminutos. Transformarla para que representen el total deminutos relativo al momento en que se ingirio alcohol.

• Calcular, para cada momento en que se realizo una medicion ypara las dos situaciones en las que se realizo el experimento,la media del nivel de glucosa en sangre medido.

# Minutos relativos al momento de ingerir alcohol

alcohol$Tiempo <- alcohol$Tiempo * 10

# Media del nivel de glucosa con o sin ingerir aditivo para cada

# momento de medicion.

aggregate(alcohol["Glucosa"],

list(Aditivo = alcohol$Aditivo, Tiempo = alcohol$Tiempo),

mean)

Problema 7(Cont.)

• Los valores de la variable Tiempo representan periodos de diezminutos. Transformarla para que representen el total deminutos relativo al momento en que se ingirio alcohol.

• Calcular, para cada momento en que se realizo una medicion ypara las dos situaciones en las que se realizo el experimento,la media del nivel de glucosa en sangre medido.

# Minutos relativos al momento de ingerir alcohol

alcohol$Tiempo <- alcohol$Tiempo * 10

# Media del nivel de glucosa con o sin ingerir aditivo para cada

# momento de medicion.

aggregate(alcohol["Glucosa"],

list(Aditivo = alcohol$Aditivo, Tiempo = alcohol$Tiempo),

mean)

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad:

• Funcion de distribucion:

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad:

• Funcion de distribucion:

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: P(X = x) = f (x)

• Funcion de distribucion:

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion:

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion:

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: P(X <= x) =∫ x−∞ f (x)dx

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

P(X >= x) =∫∞x f (x)dx

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

pnorm(x, mean = 0, sd = 1, lower.tail = FALSE)

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

pnorm(x, mean = 0, sd = 1, lower.tail = FALSE)

• Funcion cuantil:

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

pnorm(x, mean = 0, sd = 1, lower.tail = FALSE)

• Funcion cuantil: P(X <= p) = x

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: pnorm(x, mean = 0, sd = 1)

pnorm(x, mean = 0, sd = 1, lower.tail = FALSE)

• Funcion cuantil: qnorm(x, mean = 0, sd = 1)

Distribucion normal

• Generacion aleatoria: rnorm(n, mean = 0, sd = 1)

• Funcion de densidad: P(X = x) = f (x)dnorm(x, mean = 0, sd = 1)

• Funcion de distribucion: P(X <= x) =∫ x−∞ f (x)dx

pnorm(x, mean = 0, sd = 1)

P(X >= x) =

∫ ∞x

f (x)dx

pnorm(x, mean = 0, sd = 1, lower.tail = FALSE)

• Funcion cuantil: P(X <= p) = xqnorm(x, mean = 0, sd = 1)

Otras distribuciones

Distribucion Nombre en R Parametros

beta beta shape1, shape2binomial binom size, probCauchy cauchy location, scalechi-cuadrado chisq dfexponencial exp rateF f df1, df2gamma gamma shape, scalegeometrica geom probhipergeometrica hyper m, n, knormal logarıtmica lnorm meanlog, sdloglogıstica logis location, scalemultinomial multinom size, probbinomial negativa nbinom size, probnormal norm mean, sdPoisson pois lambdat de Student t dfuniforme unif min, maxWeibull weibull shape, scale

Muestreo

• Permutaciones aleatorias: sample(sucesion)

• Sin remplazamiento: sample(muestra, size = n)• Con remplazamiento:sample(muestra, size = n, replace = TRUE)

• Con distintas probabilidades:sample(muestra, size = n, prob = probabilidades)

# 10 tiradas de un dado cargado (sobre el 6).

sample(1:6, 10, replace = T, prob = c(rep(1/11, 5), 6/11))

Problema 8

Sea X una variable aleatoria con distribucion binomial negativa deparametros 3 (numero de exitos) y 0.2 (probabilidad de exitos).

• Calcular P(X = 12), P(X ≤ 15), P(X > 22) y P(2 < X ≤ 10).

• Calcular los cuartiles. ¿Cuanto vale P(X ≤ Qi ) para i=1, 2, 3?

s <- 3 ; p <- 0.2

# P(X = 12), P(X <= 15), P(X > 22)

dnbinom(12, s, p) ; pnbinom(15, s, p) ; 1 - pnbinom(22, s, p)

# P(2 < X <= 10)

sum(dnbinom(3:10, s, p))

# Calculo de los cuartiles

cuartiles <- qnbinom(c(0.25, 0.5, 0.75), s, p) ; cuartiles

# Probabilidades acumuladas de los cuartiles

pnbinom(cuartiles, s, p)

Problema 8

Sea X una variable aleatoria con distribucion binomial negativa deparametros 3 (numero de exitos) y 0.2 (probabilidad de exitos).

• Calcular P(X = 12), P(X ≤ 15), P(X > 22) y P(2 < X ≤ 10).

• Calcular los cuartiles. ¿Cuanto vale P(X ≤ Qi ) para i=1, 2, 3?

s <- 3 ; p <- 0.2

# P(X = 12), P(X <= 15), P(X > 22)

dnbinom(12, s, p) ; pnbinom(15, s, p) ; 1 - pnbinom(22, s, p)

# P(2 < X <= 10)

sum(dnbinom(3:10, s, p))

# Calculo de los cuartiles

cuartiles <- qnbinom(c(0.25, 0.5, 0.75), s, p) ; cuartiles

# Probabilidades acumuladas de los cuartiles

pnbinom(cuartiles, s, p)

Objetivos

Comunicar de ideas complejas con claridad, precision y eficiencia.

• Mostrar los datos.

• Inducir a pensar sobre el contenido en lugar de lametodologıa, el diseno grafico o la tecnologıa que lo produjo

• Evitar la distorsion en la comunicacion de los datos.

• Presentar muchos numeros en un pequeno espacio.

• Hacer que grandes conjuntos de datos tengan coherencia.

• Inducir a la comparacion entre diferentes partes de los datos.

• Revelar detalles, desde un perspectiva global o particular.

• Tener un proposito razonablemente claro: la descripcion, laexploracion, la tabulacion o la decoracion.

• Estar integrado con las descripciones estadısticas y verbales,

Recomendaciones

• Hacer que los datos sobresalgan. Evitar lo superfluo.

• Utilizar elementos prominentes para mostrar los datos.

• Hacer la region de datos menor que la region delimitada porlas escalas. Las marcas hacia afuera.

• No congestionar la region de datos.

• No exagerar el numero de marcas (de 3 a 10 marcas).

• Utilizar una lınea cuando haya un valor que deba verse atraves del grafico, pero que no interfiera con los datos.

• Las etiquetas no deben interferir o congestionar el grafico.

• Evitar colocar claves en el interior. Colocar las notas en eltexto o la explicacion.

• Los sımbolos o conjuntos de datos que se superpongan debenpoder ser reconocidos facilmente.

Dispositivos graficos

R puede generar graficos en casi cualquier tipo de dispositivografico o de impresion.

• la ventana de RStudio (por defecto);

• postscript, pdf y bmp, para generar ficheros PostScript, PDFy Mapa de Puntos (BMP)

• png y jpeg, para generar imagenes PNG y JPEG.

histogram(rnorm(1000))

png(file="histograma.png")

histogram(rnorm(1000))

dev.off()

histogram(rnorm(1000))

savePlot(file="histograma.png", type="png")

trellis.device("png", file = "histograma.png")

histogram(rnorm(1000))

dev.off()

Parametros comunes

Para mayorıa de las funciones graficas

• data: Marco de datos con las variables a partir de las cualesse construye el grafico

• horizontal: Determina el sentido del grafico

• main: Tıtulo principal

• sub: Subtıtulo

• xlab, ylab: Etiquetas de los ejes X e Y

• xlim, ylim: Lımites de los ejes X e Y

Diagrama de dispersion

Muestra los valores dibujando un punto por cada dato.

> head(faithful$eruptions)

[1] 3.600 1.800 3.333 2.283 4.533 2.883

> stripplot(~eruptions, data = faithful,

main = "Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)")

> savePlot("erupciones.png")

Diagrama de caja y bigote

Un rectangulo entre el primer y el tercer cuartil, en su interior lamediana. A ambos lados dos lıneas con los valores que seencuentran a lo sumo a una distancia de 1.5 veces el rangointercuartılico. Cualquier otro valor se marca individualmente.

> bwplot(~Sepal.Width, data = iris, main = "Ancho de los Sepalos",

xlab = "")

Varios diagramas de caja y bigote

Para comparar las distribuciones para distintas agrupaciones en losdatos podemos realizar un diagrama por cada uno.

> bwplot(Sepal.Width~Species, data = iris,

main = "Ancho de los Sepalos", xlab = "")

Histograma

Se divide el rango de datos en clases, se calcula la frecuencia dedatos para cada clase y se dibuja una barra por clase (ancho laamplitud de la clase y superficie proporcional a la frecuencia)

> histogram(~eruptions, data = faithful, type = "count",

main = "Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)",

ylab = "No de erupciones")

Histograma (Cont.)

Fijar el numero de clases (por defecto usa la regla de Sturges,log2(n) + 1), sus extremos y/o utilizar las frecuencias relativas.

> print(histogram(faithful$eruptions, type = "percent", nint = 20),

split = c(1,1,2,1), more=T)

> print(histogram(faithful$eruptions, type = "density",

breaks = c(0, 2, 3, 3.5, 4, 4.5, 5, 5.5)),

split = c(2,1,2,1))

Grafico de densidad

> densityplot(faithful$eruptions, plot.points = "jitter",

main = "Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)", ylab = "Probabilidad")

Opciones de plot.points: valor logico, ”rug” o ”jitter”

Diagrama de barras

Una barra por cada dato, la longitud de cada barra es proporcionalal valor del dato. Para conjuntos de datos pequenos.

> barchart(sort(tapply(drosophila$fecundidad, drosophila$linea, mean)),

xlab="", main="Fecundidad media de cada lınea genica")

Diag. de barras (variables cualitativas)

Frecuencias absolutas de los distintas categorıas de esa variable.

> barchart(table(iris$Species),

horizontal=FALSE,

main = "Numero de plantas estudiadas segun la especie",

xlab = "Especie de lirio")

Diag. de barras (grupos de valores)

Por cada grupo de valores, un grupo de barras

> barchart(Departamento ~ Solicitudes, groups = Resultado,

data = UCBAdmisiones, auto.key=T)

Diagrama de puntos

Un punto por cada dato en una coordenada vertical distinta.

> dotplot(sort(islands[islands < islands["Java"]]),

xlab="Superficie en millas cuadradas")

Problema 9

En este ejercicio trabajaremos con los datos relativos a lapoblacion mundial en los anos 1950 y 2000. Para ello seproporciona la siguiente informacion:

• continente al que pertenece cada uno de los paıses.

• area (en km2) ocupada por cada uno de los paıses.

• poblacion de los paıses en los anos 1950 y 2000.

> head(censo)

Continente Area P1950 P2000

Afghanistan Asia 647500 8150368 25888797

Albania Europe 28748 1227156 3490435

Algeria Africa 2381740 8892718 31193917

American Samoa Oceania 199 19100 65446

Andorra Europe 468 6176 66824

Angola Africa 1246700 4117617 10132376

Problema 9

1 Comparar la distribucion de las poblaciones en los anos 1950 y2000. Para cada una de las variables crea un histograma ¿Quelos esta distorsionando? Elimina las causas y crealos de nuevo.

2 Comparar el aumento de poblacion durante esos 50 anos encada continente. Crea un diagrama de barras que muestre,para cada continente, dos barras adosadas indicando lapoblacion en cada ano. ¿Que continente ha crecido mas?

3 Variacion de la distribucion de la poblacion segun elcontinente. Crea, para cada ano, un grafico diagramas de cajay bigote mostrando la distribucion en cada uno de loscontinentes (procura eliminar los elementos distorsionadores).¿Que relacion observas entre los continentes en ambos anos?

4 Comparar la densidad de poblacion por continentes calculandola media, en los anos 1950 y 2000 respectivamente, de cadauno. Crear un grafico de puntos de los resultados obtenidos.¿Que ha ocurrido a lo largo de esos 50 anos?

Problema 9

# Eliminamos los paıses con mayor poblacion (representan

# alrededor del 15del total)

histogram(censo$P1950)

histogram(log(censo$P1950,10))

histogram(censo$P1950[censo$P1950 < 1e7])

# Analgo para el a~no 2000.

# Calculamos el area y la poblacion de cada continente

censoC <- aggregate(censo[-1], censo[1], sum)

# Creamos un marco de datos que nos permita agrupar los datos

# obtenidos con comodidad

censoTC <- data.frame(Continente = rep(censoC$Continente,2),

A~no = as.character(rep(c(1950,2000),each=5)),

Poblacion = c(censoC$P1950,censoC$P2000))

barchart(A~no ~ Poblacion, groups = Continente, data = censoTC,

auto.key=T)

Problema 9

# Incluımos los dos graficos en una misma imagen

print(bwplot(Continente[P1950 < 1e7] ~ P1950[P1950 < 1e7], data = censo,

xlab="Poblacion en el a~no 1950"),

split = c(1,1,2,1), more=T)

print(bwplot(Continente[P2000 < 1e7] ~ P2000[P2000 < 1e7], data = censo,

xlab="Poblacion en el a~no 2000"),

split = c(2,1,2,1))

# Creamos un marco de datos con las densidades de poblacion por

# continente que nos permita agrupar los datos con comodidad.

censoDC <- data.frame(Continente = rep(censoC$Continente,2),

A~no = as.character(rep(c(1950,2000),each=5)),

Densidad = c(censoC$P1950/censoC$Area,

censoC$P2000/censoC$Area))

dotplot(A~no ~ Densidad, groups=Continente, data=censoDC,

auto.key=T)

Diagrama de dispersion bivariante

Dibuja un punto por cada par de valores.ejeY ~ ejeX

> A~no <- 1700:1988

> xyplot(sunspot.year ~ A~no)

> xyplot(sunspot.year ~ A~no, type = "b")

> xyplot(sunspot.year ~ A~no, type = "s")

Matriz de diagramas de dispersion

> splom(environmental)

Tecnicas de visualizacion (I)

Anadir una ligera perturbacion a los datos: jitter

> xyplot(Sepal.Length ~ Petal.Length, data = iris)

> xyplot(jitter(Sepal.Length) ~ jitter(Petal.Length), data = iris)

Tecnicas de visualizacion (II)

Razon de aspecto: Relacion entre la altura y la anchura

> f <- function (x) {if (x < 0) x^2 else 10*x}

> ex <- -10:10 ; ey <- sapply(ex, f)

> xyplot(ey ~ ex, type = "l", aspect = 1, xlab = "x", ylab = "f(x)")

> xyplot(ey ~ ex, type = "l", aspect = 1/10, xlab = "x", ylab = "f(x)")

> xyplot(ey ~ ex, type = "l", aspect = 10, xlab = "x", ylab = "f(x)")

Regresion lineal simple

Anadir la recta de regresion

> lm(ozone ~ wind, data = environmental)

Coefficients:

(Intercept) wind

99.054 -5.731

> xyplot(ozone ~ wind, data = environmental, type = c("p", "r"),

aspect = "xy")

Ajuste de una curva

Ajuste de loess:

• alfa (span): si aumenta la curva se hace mas suave

• lambda (degree): grado de ciertos polinomios (1 o 2)

xyplot(ozone ~ wind, data = environmental, type = c("p", "smooth"),

aspect = "xy", span = 0.6, degree = 2)

Distribucion en paneles (trellis)

En cada panel se dibuja el grafico correspondiente a unsubconjunto de datos que se obtienen a partir de variablescondicionantes:

• ~ x | g1 * g2 * ...: histograma, grafico de densidad,matriz de dispersion

• y ~ x | g1 * g2 * ...: diagramas de caja y bigote,barras, puntos y dispersion

> dotplot(variety ~ yield | year * site, data = barley,

xlab="", layout = c(6,2))

Condicionante cuantitativa

> E.shingle <- equal.count(ethanol$E, number = 9, overlap = 1/4)

> xyplot(NOx ~ C | E.shingle, data = ethanol, aspect = "xy",

xlab = "Razon de compresion",

ylab = "Oxidos de nitrogeno (microgramos/J)")

Superposicion de paneles

> xyplot(Sepal.Length+Sepal.Width ~ Petal.Length+Petal.Width | Species,

data = iris, auto.key = list(column = 2),

xlab = "Longitud y anchura del petalo",

ylab = "Longitud y anchura del sepalo")

Problema 10

El asma es una enfermedad caracterizada por vıas respiratorias quese estrechan causando dificultad para pasar el aire. Se ha realizadoun experimento para determinar la eficacia de un nuevomedicamento. Se proporcionaron a una serie de pacientes tresmedicamentos: un placebo , el medicamento estandar y el nuevo.Para controlar la eficacia se midio el Volumen Espiratorio Forzado,VEF1, once horas antes de iniciar el tratamiento y cada horadurante las ocho siguientes al inicio del mismo (a mayor valor,mayor efectividad del medicamento).El marco de datos asma contiene los datos de las siguientesvariables:

• Paciente: un numero identificador de cada paciente.

• Medicamento: medicamento proporcionado al paciente.

• Hora: momento en que se midio el VEF1.

• VEF1: valor medido del VEF1.

Problema 10

• Seleccionar los datos del paciente 1 y el medicamento nuevo yconstruir un grafico que muestre la evolucion en el tiempo delVEF1.

paciente1.Nuevo <- asma[asma$Paciente == "1" & asma$Medicamento == "Nuevo",

c("Hora", "VEF1")]

xyplot(VEF1 ~ Hora, data = paciente1.Nuevo, type= "l", aspect = "xy",

main = "Evolucion a lo largo del tiempo del valor de VEF1

para el paciente 1 y el medicamento nuevo",

xlab = "Hora",

ylab = "VEF1")

Problema 10

• Seleccionar los datos del paciente 1 y el medicamento nuevo yconstruir un grafico que muestre la evolucion en el tiempo delVEF1.

paciente1.Nuevo <- asma[asma$Paciente == "1" & asma$Medicamento == "Nuevo",

c("Hora", "VEF1")]

xyplot(VEF1 ~ Hora, data = paciente1.Nuevo, type= "l", aspect = "xy",

main = "Evolucion a lo largo del tiempo del valor de VEF1

para el paciente 1 y el medicamento nuevo",

xlab = "Hora",

ylab = "VEF1")

Problema 10

• Seleccionar todos los datos correspondientes al paciente 1 yconstruir un grafico que muestre como evoluciono en eltiempo el valor de VEF1 para cada uno de los tresmedicamentos, diferenciando estos con distintos colores.

paciente1 <- asma[asma$Paciente == "1", -1]

xyplot(VEF1 ~ Hora, data = paciente1, type = "l", aspect = "xy",

group = Medicamento, auto.key = list(points=F, lines=T),

main = "Evolucion a lo largo del tiempo del valor de VEF1

para el paciente 1 y cada uno de los tres medicamentos",

xlab = "Hora",

ylab = "VEF1")

Problema 10

• Seleccionar todos los datos correspondientes al paciente 1 yconstruir un grafico que muestre como evoluciono en eltiempo el valor de VEF1 para cada uno de los tresmedicamentos, diferenciando estos con distintos colores.

paciente1 <- asma[asma$Paciente == "1", -1]

xyplot(VEF1 ~ Hora, data = paciente1, type = "l", aspect = "xy",

group = Medicamento, auto.key = list(points=F, lines=T),

main = "Evolucion a lo largo del tiempo del valor de VEF1

para el paciente 1 y cada uno de los tres medicamentos",

xlab = "Hora",

ylab = "VEF1")

Problema 10

• Usar la funcion aggregate para calcular, para cadamedicamento y para cada hora, la media de los valores deVEF1 medidos para cada paciente. Construir un grafico quemuestre como evoluciono en el tiempo el valor medio de VEF1para cada uno de los tres medicamentos, diferenciando estoscon distintos colores. ¿Se puede pensar que el medicamentonuevo es mas efectivo que el medicamento estandar?

medias.Medicamento.Hora <-

aggregate(asma["VEF1"],

list(Medicamento = asma$Medicamento, Hora = asma$Hora),

mean)

xyplot(VEF1 ~ Hora, data = medias.Medicamento.Hora, type = "l",

aspect = "xy",

group = Medicamento, auto.key = list(points=F,lines=T),

main = "Evolucion a lo largo del tiempo del valor medio de VEF1

para cada uno de los tres medicamentos",

xlab = "Hora", ylab = "VEF1")

Problema 10

• Usar la funcion aggregate para calcular, para cadamedicamento y para cada hora, la media de los valores deVEF1 medidos para cada paciente. Construir un grafico quemuestre como evoluciono en el tiempo el valor medio de VEF1para cada uno de los tres medicamentos, diferenciando estoscon distintos colores. ¿Se puede pensar que el medicamentonuevo es mas efectivo que el medicamento estandar?

medias.Medicamento.Hora <-

aggregate(asma["VEF1"],

list(Medicamento = asma$Medicamento, Hora = asma$Hora),

mean)

xyplot(VEF1 ~ Hora, data = medias.Medicamento.Hora, type = "l",

aspect = "xy",

group = Medicamento, auto.key = list(points=F,lines=T),

main = "Evolucion a lo largo del tiempo del valor medio de VEF1

para cada uno de los tres medicamentos",

xlab = "Hora", ylab = "VEF1")

Superposicion de paneles

> densityplot(~height, data = singer, groups = voice.part,

bw = 1.5, auto.key = list(columns = 4))

plot

Nube de puntos:

> plot(1:100)

plot/xyplot

> plot(x=1:10, y=1:10,pch=3, col="red")

> points(c(2,2), c(4,5),pch=5,col="blue")

plot/xyplot

> xyplot(1:10 ~ 1:10,

panel = function (x, y) {

panel.xyplot(x, y, pch=3, col="red")

panel.points(c(2,2), c(4,5), pch=5, col="blue")})

plot/bwplot

> a <- 1:100 ; b <- factor(rep(1:5,20))

> plot(b,a)

plot/bwplot

> bwplot(a~b)

plot/splom

> d <- data.frame(norm=rnorm(10),unif=runif(10),expo=rexp(10))

> plot(d)

plot/splom

> splom(d)

plot

> a <- rnorm(10) ; par(mfrow=c(2,3))

> plot(a,type="p",main="Tıtulo (tipo p)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

> plot(a,type="l",main="Tıtulo (tipo l)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

> plot(a,type="b",main="Tıtulo (tipo b)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

> plot(a,type="h",main="Tıtulo (tipo h)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

> plot(a,type="s",main="Tıtulo (tipo s)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

> plot(a,type="o",main="Tıtulo (tipo o)",sub="Subtıtulo",

xlab="Etiqueta eje x",ylab="Etiqueta eje y",xlim=c(1,10))

plot

plot

> plot(rnorm(15,10,5),col="red",type="l")

> lines(rnorm(15,10,5),col="blue",type="p",pch=1)

> lines(rnorm(15,10,5),col="green",type="b",pch=2)

> title(main="Mi grafico")

> legend("topright", c("lineas","puntos","ambos") ,

+ lty=1:3, col=c("red", "blue","green"), bty="n", cex=.75)

plot/xyplot

> data(iris)

> attach(iris)

> plot(Sepal.Length, Sepal.Width, col=Species, pch=as.numeric(Species))

> legend(’topright’, levels(Species), lty=1, col=1:3, bty=’n’, cex=.75)

plot/xyplot

xyplot(Sepal.Width ~ Sepal.Length, groups = Species, pch=1:3, col=1:3,

key = list(lines=list(col=1:3), corner=c(1,1),

text=list(c("Setosa", "Versicolor", "Virginica"))))

pairs/splom

> pairs(iris[,1:4], pch=as.numeric(Species), col=Species)

pairs/splom

> splom(iris[,1:4], groups=Species, pch=1:3, col = 1:3)

barplot/barchart

> par(mfrow=c(1,2))

> barplot(1:10)

> m <- matrix(1:10,2,5,byrow=T)

> barplot(m,horiz=TRUE, beside=TRUE, col=c("blue","gray"))

barplot/barchart

> barchart(1:10~1:10, horizontal = F)

> barchart(rep(1:5, each=2)~1:10, groups = rep(c(1,2), 5),

ylab="", xlab="")

boxplot/bwplot

> d <- data.frame(expo=rexp(10), norm=rnorm(10), unif=runif(10))

> boxplot(d)

boxplot/bwplot

> bwplot(expo + norm + unif ~ rep(c("expo", "norm", "unif"), each = 10),

data = d, horizontal = F, xlab="", ylab="")

hist/histogram

> rmt <- matrix(rexp(1000 * 16), nrow = 16) ; par(mfrow=c(1,3))

> mns <- cbind(rmt[1, ], apply(rmt[1:4, ], 2, mean),

apply(rmt, 2, mean))

> hist(mns[, 1])

> hist(mns[, 2], main = "Media de muestras de tama~no 4")

> hist(mns[, 3], main = "Media de muestras de tama~no 16")

hist/histogram

> histogram(mns[, 1], type="count")

> histogram(mns[, 2], type="count")

> histogram(mns[, 3], type="count")

hist/histogram

> data.mns = data.frame(mns = c(mns),

ssz = gl(3, 1000, labels = c("1", "4", "16")))

> histogram(~ mns | ssz, data = data.mns, layout = c(3, 1),

main = "Histogramas de las medias segun el tama~no de la muestra")

hist/histogram

> meds <- cbind(rmt[1, ], apply(rmt[1:4, ], 2, median),

apply(rmt, 2, median))

> alldat <- data.frame(sim = c(mns, meds),

ssz = gl(3, 1000, labels = c("1", "4","16")),

type = gl(2, 3000, labels = c("Media", "Mediana")))

> histogram(~sim | ssz * type, data = alldat, layout = c(3, 2),

main = "Histogramas de medias y medianas segun el tama~no de la muestra")

hist/histogram

> a <- rnorm(1000) ; par(mfrow=c(1,2))

> hist(a, col="blue", border="white", prob=TRUE)

> lines(density(a), col="orange", lwd=3)

> hist(a,col="blue", border="white", prob=TRUE, breaks=25)

> lines(density(a), col="orange", lwd=3)

hist/histogram

> histogram(~ a, type = "density",

panel = function(x, ...) {

panel.histogram(x, ..., col="blue", border="white")

panel.densityplot(x,..., col = "orange", lwd=3)})

> histogram(~ a, type = "density",

panel = function(x, ...) {

panel.histogram(x, breaks=25, col="blue", border="white")

panel.densityplot(x,..., col = "orange", lwd=3)})

pie

Diagrama de sectores

> pie(c(5,3,14,7,9,24), labels=paste("Grupo",1:6), main="Sectores")

> pie(c(5,3,14,7,9,24), labels=paste("Grupo",1:6), main="Sectores",

density = 10, angle = 60 + 10 * 1:6)

coplot

> x <- rnorm(100) ; y <- rnorm(100)

> f1 <- factor(rep(c("a","b","c","c","a"),20))

> f2 <- factor(rep(c("e","f","g","e","f"),20))

> coplot(x~y|f1)

> coplot(x~y|f1+f2)

lattice: escala logarıtmica y curvasuavizada

> xyplot(dist ~ speed, data = cars,

main = "Conjunto de datos: cars (escala logarıtmica)",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)",

scales = list(x=list(equispaced.log = FALSE,log=TRUE),

y=list(equispaced.log = FALSE,log=TRUE)),

panel = function(x, y) {panel.xyplot(x, y)

panel.loess(x, y, span=1, col="red")})

Otras opciones (I)

Para cualquiera de los tıtulos

> xyplot(ozone^0.5 ~ wind, data = environmental,

ylab = expression(sqrt("Concentracion de ozono")),

xlab = list(label = "Velocidad del viento",

cex = 2, col = "red", font = 3))

Otras opciones (II)

Elegir parte de un factor

> bwplot(Species ~ Sepal.Length, data = iris,

subset = Species != "setosa")

Otras opciones (III)

Recorrido y seleccion de paneles

> histogram(~ height | voice.part, data = singer, layout = c(3, 3))

> histogram(~ height | voice.part, data = singer, layout = c(3, 3),

as.table=T, skip = c(rep(FALSE, 4), TRUE, rep(FALSE, 4)))

plot/panel

> rojos <- runif(10,1,10)

> verdes <- runif(10,1,10)

> lineas <- runif(10, 1, 10)

> textos <- runif(10,1,10)

> poligono <- runif(8,1,10)

> plot(1:10, 1:10, axes = FALSE, xlab = "", ylab = "")

> points(rojos[1:5], rojos[6:10], cex=1.5, col="red")

> points(verdes[1:5], verdes[6:10], cex=1.7, col="green", pch="+")

> lines(1:10, lineas, lty=2, lwd=2)

> text(textos[1:5], textos[6:10], cex=1.7, col= rainbow(5),

labels=c("uno", "dos", "tres", "cuatro", "cinco"))

> abline(h=5, lty=4)

> polygon(poligono[1:4], poligono[5:8], col="blue")

> title("Grafico inventado")

> legend(8, 3, lty = c(1:3), col = rainbow(3),

legend = c("uno","dos","tres"))

plot/panel

plot/panel

> xyplot(1:10 ~ 1:10, xlab = "", ylab = "", col="black",

scales = list(x = list(labels=c("uno", "tres", "cinco",

"siete", "nueve"),

at = seq(1,10,by=2)),

y = list(labels=1:10, at=1:10)),

main = "Grafico inventado",

key = list(text = list(c("uno", "dos", "tres")),

x=0.8, y=0.3, lines=list(col=rainbow(3), lty=1:3)),

panel = function (x, y, ...) {

panel.xyplot(x, y, ...)

panel.points(rojos[1:5], rojos[6:10], cex=1.5, col="red")

panel.points(verdes[1:5], verdes[6:10], cex=1.7, col="green",

pch="+")

panel.lines(1:10, lineas, lty=2, lwd=2, col="black")

panel.text(textos[1:5], textos[6:10], cex=1.7, col=rainbow(5),

labels = c("uno", "dos", "tres", "cuatro", "cinco"))

panel.abline(h=5, lty=4)

panel.polygon(poligono[1:4], poligono[5:8], col="blue")})

plot/panel

Problema 11

A partir del marco de datos turismos generar un grafico como el dela imagen con los porcentajes de cuota de mercado de las 10marcas que han realizado un mayor numero de ventas.

Problema 11

tur.por <- apply(turismos[-1],2,sum)*100/sum(turismos[-1])

tur.por.sort <- sort(tur.por,decreasing=TRUE,index.return=TRUE)

tur.por.dat <- as.vector(tur.por.sort$x[1:10])

tur.por.nom <- colnames(turismos)[-1][tur.por.sort$ix][1:10]

b <- barplot(tur.por.dat,main="Ventas nacionales de coches",

sub="Cuota de mercado",ylim=c(0,15),axes=FALSE,col=rainbow(10))

text(b,tur.por.dat+0.5,format(tur.por.dat,digits=3),cex=0.8)

text(b,2,format(tur.por.nom),srt=90,font=4,cex=0.8)

barchart(tur.por.dat~1:10, horizontal=F,

main="Ventas nacionales de coches",

sub="Cuota de mercado", scales=list(draw=F),

ylim=c(-1,15), xlab="",ylab="", col=rainbow(10),

panel = function(x,y,...) {

panel.barchart(x, y, ...)

panel.text(1:10, tur.por.dat+0.5,

format(tur.por.dat,digits=3),cex=0.8)

panel.text(1:10, 1,format(tur.por.nom),

srt=90,font=4,cex=0.8) })

Agrupacion de expresiones

• Las expresiones pueden ser agrupadas entre llaves:

• En una misma lınea han de separarse por ;

{

a <- 0; b <- 1

c <- a+b

}

• El valor que devuelve el grupo es el valor de la ultimaexpresion

Condicional: if e ifelse

if (condicion) consecuencia [else alternativa]

• Condicion tiene que devolver un unico valor logico

• Si consecuencia y/o alternativa son un grupo deexpresiones han de ir entre llaves

• Si condicion devuelve el valor TRUE se obtiene el valor deconsecuencia

• en caso contrario, se obtiene el valor de alternativa

ifelse(condicion,a,b)

• Devuelve un vector de la misma longitud que condicion, conlos elementos a[i] si condicion[i] tiene el valor TRUE, yb[i] en caso contrario.

for, while, repeat

for (var in vector) expr

• expr se calcula tantas veces como elementos tenga vector

• la variable var toma como valor, en cada ocasion, cada unode los elementos de vector

while (condicion) expr

• se calcula expr mientras condicion tenga el valor TRUE

repeat expr

• se calcula expr mientras no se interrumpa explıcitamente conla instruccion break.

Ejemplos> a <- 1:5000; b <- 11:5010

> system.time(res <- a+b)

user system elapsed

0 0 0

> system.time({resFor <- c() ;

for (i in 1:5000) resFor[i] <- a[i]+b[i]})

user system elapsed

0.026 0.000 0.025

> system.time({resWhile <- c() ; i<-1 ;

while (i <= 5000) {resWhile[i] <- a[i]+b[i] ; i<- i+1}})

user system elapsed

0.028 0.000 0.027

> system.time({resRepeat <- c() ; i<-1 ;

repeat {if (i<=5000) {resRepeat[i] <- a[i]+b[i] ; i<- i+1}

else break}})

user system elapsed

0.028 0.000 0.028

> identical(res,resFor)

[1] TRUE

> identical(resFor,resWhile)

[1] TRUE

> identical(resWhile,resRepeat)

[1] TRUE

Definicion de funciones

nombre <- function(var1,...,varn) expr

• expr es una agrupacion de expresiones que utiliza var1,. . . varn

nombre(arg1,..., argn)

• valor de expr tras sustituir cada vari por el valor de argi

> ecGrado2 <- function(a, b, c)

{ disc <- (b^2)-(4*a*c)

sol1 <- (-b + sqrt(disc))/(2*a)

sol2 <- (-b - sqrt(disc))/(2*a)

c(sol1,sol2)

}

> ecGrado2(2,4,1)

[1] -0.2928932 -1.7071068

> "%porcentaje%" <- function(a,b) (a/(a+b))*100

> 4 %porcentaje% 6

[1] 40

>