Sei sulla pagina 1di 239

Introducción al lenguaje de

programación “R”.
Morelia, Michoacán, agosto 2015.

Docentes:
Rodrigo Macip (ENES Morelia)
Ernesto Vicente Vega Peña (IIES,UNAM)
INTRODUCCIÓN AL LENGUAJE “R”

Contenido
I. Generalidades: ¿Qué es el proyecto “R”?
I.1. Menú Archivo: cambiar de directorios.
I.2. Menú paquetes (1): Cargar paquetes.
Menú paquetes (2): Seleccionar espejos CRAN.
Menú paquetes (3): Instalar paquetes.
I.3. Menú Ayuda (1): Funciones R (texto).
Menú Ayuda (2): Ayuda html.
Menú Ayuda (3): Manuales en PDF: “ An Introduction
to ‘R’ ”.
Menú Ayuda (4): Manuales en PDF: “ ‘R Reference
Manual´”.
Contenido (cont).

II. Primordios del lenguaje R


II.1. Los scripts como estrategia de análisis.
II.2. Objetos en R.
II.3. Operador de asignación, la instrucción básica.
II.4. Anatomía de una función ya diseñada.
Funciones y bibliotecas de ayuda.
II.5. Funciones hechas por el usuario.
II.6. Lectura de datos del archivo y su correspondiente
despliegue en pantalla.
II.7. Manejo básico de datos.
II.8. Rudimentos de programación.
Contenido (cont).

II. Primordios del lenguaje R


II.9. Introducción a gráficos.
II.10. Distribuciones de probabilidad.

III. Modelos estadísticos univariados.


III.1. Funciones y fórmulas.
III.2. Sintáxis de modelos estadísticos.
III.3. Acceso a la información de un modelo estadístico.
III.4. Funciones complementarias.

IV. Modelos estadísticos multivariados.


IV.1. PCA, análisis de discriminantes,
correspondencia canónica.
Contenido (cont).

V. Sistemas “avanzados” de graficación:


Sistema estándar {graphics}.
Sistema trellis {lattice}.
Sistema ggplot {ggplot2}.
Algo así como los padres fundadores:

Ross Ihaka is an Associate Robert Clifford


Professor of Statistics at the Gentleman (born 1959)
University of Aucland. is a Canadian statistician.
I.1. Proyecto “R”.
I.1. Proyecto “R”.
Así se ve todo antes de empezar…
I.2. Directorios.
I.2. Directorios (cont.).

* Elegir el directorio en el que


Están los datos
I.3. Paquetes {packages}.

Los paquetes de “R”:

* Son archivos con funciones que realizan diversas cosas con


los datos

* Una función es un conjunto de instrucciones “agrupadas”


que le hacen “algo” a los datos.

* Todas las funciones en R están asociadas a algún paquete.

* Para que una función “funcione” es necesario que el


paquete que la contiene “esté cargado” en la computadora.
I.3. Paquetes (cont).

* Elegir el paquete que se usará

* Seleccionar el “espejo” CRAN de


dónde se conseguirá el paquete

* Cargar el paquete en la máquina


I.4. Ayuda.

* Funciones R (texto)
I.4. Ayuda!!!
* Ayuda html
I.4. Más Ayuda!!! Ayuda
Manuales (en PDF)
An Introduction to R
I.4. Otra vez más Ayuda!!! Ayuda
Manuales (en PDF)
R Reference Manual
Sitios y ligas pertinentes para obtener manuales y
ayuda espiritual:
http://www.rseek.org/
http://crisol.uc3m.es/index.php/gnur
http://www.statmethods.net/index.html

En especial para gráficas:

http://addictedtor.free.fr/graphiques/thumbs.php
http://rgm2.lab.nig.ac.jp/RGM2/images.php?
show=all&pageID=499
http://rgm2.lab.nig.ac.jp/RGM2/images.php?show=all&pageID=406
II.1. Scripts en “R”.

* Los scripts son conjuntos de instrucciones PARA


HACER ALGO.

* Normalmente son instrucciones que:

1) LEEN DATOS DE UN ARCHIVO,

2) LOS TRANSFORMAN O MODIFICAN, DE


ACUERDO CON NUESTROS INTERESES

Y uno se queda feliz (o triste, a según) con los


resultados de esa transformación.
II.1. Scripts en “R” (cont).

* Nuevo script
* Abrir script

Ojo: si se crea un script nuevo, hay que guardarlo.


II.2. y II.3.
Gran parte de las instrucciones en R son “objetos”, que son algo así
como “espacios de memoria RAM con propiedades determinadas, a
las que se puede acceder de manera independiente”.
Los datos y los resultados de las funciones se guardan en espacios
de memoria. TODO LO QUE SE HAGA SE DEBERÍA GUARDAR EN
ESPACIOS DE MEMORIA.

La forma en la que se llenan esos espacios de memoria es mediante


el OPERADOR DE ASIGNACIÓN (una flecha “<-” que apunta de
derecha a izquierda):

<-
( signos “<“ y “-” )

Significa algo como esto: todo lo que está del lado


derecho del operador de asignación se va a almacenar
en el espacio de memoria que está en su lado izquierdo.
II.2. y II.3.
Acerca de los objetos en “R”.
Prácticamente todo lo que se hace en R se hace por medio de
objetos.

Los objetos tienen propiedades, como los objetos en estado sólido. Y tienen
partes o componentes.

Una propiedad importante es el modo del objeto, i.e., el tipo de objeto.Si un


objeto tiene componentes de un solo tipo, es un objeto atómico.

Hay varios tipos de objetos atómicos en R:

numeric,
complex,
logical,
character
raw (almacenar bytes silvestres así nomás),
II.2. y II.3.

Un objeto puede estar compuesto de partes diferentes. Este


tipo (o modo) de objeto se llama list.

La lista es una secuencia ordenada de objetos que pueden


ser de cualquier tipo.

Este tipo de objeto se conoce también como recursivo, pues


los componentes de una lista pueden ser listas también.

Para conocer la clase de un objeto:

attributes(object)
II.2. y II.3.
Cápsula erudita:
Hay dos grandes sistemas de objetos en “R”. Esto significa que
hay dos grandes maneras de construir objetos. Estos sistemas
se conocen como “clases”.

La primera clase de objetos es la “S3”, que fue la usada desde


el inicio del lenguaje, a principios de la década de los noventa.
La segunda clase de objetos es la “S4”, se desarrolló en 1998.
Las clases de objetos permiten encapsular (ocultar)
información de un objeto.

Esto permite separar la información que recibe el usuario de


la estructura interna del objeto.

En consecuencia, se pueden modificar ambas secciones del


objeto sin que haya interferencia.
Lenguaje orientado a objetos.

Tiene tres conceptos principales muy relacionados:

objetos

métodos clase
Los conceptos de clase y métodos son fundamentales para
cualquier lenguaje orientado a objetos.

A class is a definition of an object. Una clase es cómo se define un objeto.

Typically a class contains Tipicamente una clase tiene varias


several slots that are used to hold class- propiedades “slots” que se usan para
specific information. An object in the guardar información específica de la clase.
language must be an instance of some Un objeto en el lenguaje debe ser una
class. Programming is based on objects instancia de alguna clase. Por tanto, la
or instances of classes. programación está basada en objetos (o
instancias de clases).

Computations are carried out Los cálculos se ejecutan por medio de


via methods. métodos

Methods are basically functions that are Los métodos son funciones especializadas
specialized to carry out specific para ejecutar cálculos específicos en
calculations on objects, usually of a objetos, usualmente d una clase particular.
specific class. This is what makes the Esto es lo que hace al R un lenguaje
language object oriented. orientado a objetos.
Another feature of most object-oriented Una característica fundamental de la mayoría de
languages is the concept of inheritance. los lenguajes orientados a objetos es el concepto
de herencia.

In most programming problems there are En la mayoría de los problemas de programación


usually many objects that are related to one frecuentemente hay muchos objetos relacionados
another. The programming is considerably unos con otros. La programación se simplifica
simplified if some components can be reused. muchísimo si algunos componentes se pueden
reutilizar.

If a class inherits from another class then Si una clase es heredera de otra clase, entonces
generally it gets all the slots in the parent class generalmente recibe todas las propiedades de la
and can extend it by adding new slots. clase parental, y la clase heredera puede
aumentar sus propiedades.
The entities that R creates and manipulates T Las entidades que el lenguaje R crea y
are known as objects. manipula se conocen como objetos.

These may be variables, arrays of numbers, Estos pueden ser variables, arreglos de números,
character strings, functions, or more general cadenas de caracteres, funciones o estructuras
structures built from such components. más generales construidas a partir de los objetos
antes mencionados.

By the mode of an object we mean the basic A hablar del modo de un objeto se hace
type of its fundamental constituents. referencia al tipo básico de sus componentes
fundamentales.
Examples are vectors of numeric (real) or Un ejemplo son los vectores de valores
complex values, vectors of logical values and numéricos (reales) o complejos, vectores de
vectors of character strings. These are known valores lógicos y vectores de cadenas de
as “atomic” structures since their components caracteres. Estos son conocidos como
are all of the same type, or mode, estructuras “atómicas”, ya que sus componentes
namely numeric, complex, logical, character a son todos del mismo tipo o modo, es decir
nd raw. numéricos, complejos, lógicos, de carácter y raw.

Vectors must have their values all of the Los vectores deben tener todos sus valores en
same mode. Thus any given vector must be el mismo modo. Pro tanto, un vector dado debe
unambiguously ser inambiguamente lógico, numérico complejo,
either logical, numeric, complex, character or r de carácter o raw.
aw. 
R also operates on objects El lenguaje R también trabaja con
called lists, which are of mode list. objetos llamados listas, que son del
modo lista.

These are ordered sequences of Ellos son secuencias ordenadas de


objects which individually can be of objetos que individualmente pueden
any mode. lists are known as ser de cualquier modo. Las listas son
“recursive” rather than atomic conocidas como “estructuras
structures since their components recursivas” (en lugar de estructuras
can themselves be lists in their own ”atómicas”), debido a que sus
right. componentes también pueden ser a su
vez listas.
All objects in R have a class, reported by the
function class. For simple vectors this is just the mode, for
example "numeric", "logical", "character" or "list",
but "matrix","array", "factor" and "data.frame" are other
possible values.

Todos los objetos en R pertenece a una clase, que se


puede identificar con la función class. En el caso de
vetores simple la clase coincide con el modo (por ejemplo
“numeric”, “character” o “list”), pero para “matrix”, “array”,
“factor” y “data.frame” pueden aparecer otros valores.
Símbolos reservados en R:
Aritméticos
+ - * / %% ^
Relacionales
> >= < <= == !=
Lógicos
! & |
Definicion de
~ modelos

asignación 
-> <-
Indexar listas
$
Palabras reservadas
(no utilizarlas para nombres de objetos):

B I R
break if repeat
in
Inf
E
else W
N while
NA
F NaN
FALSE next
for NA_character_
T
function NA_complex_ TRUE
NA_integer_
NA_real_ Y los
NULL números
II.2. y II.3.

Para desactivar un renglón del script se usa el símbolo:

#
Que significa: ignora olímpicamente todo lo que esté a
la derecha del símbolo.

Esto es muy útil para ponerle comentarios al script.


II.4. Anatomía de una función ya diseñada (1/4).

Función para leer un archivo de datos, organizado en filas y renglones.

read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", row.names,
col.names, as.is = !stringsAsFactors, na.strings = "NA", colClasses = NA,
nrows = -1, skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(), encoding = "unknown")

Argumentos:
Función que Instrucciones para “matizar”
se realiza o “modular” la función

read.table( )
Así están construidas TODAS las funciones en “R”
II.4. Anatomía de una función ya diseñada (2/4).

Función para leer un archivo de datos, organizado en filas y


renglones.
Disección muy somera. El nombre del archivo es obligatorio.
Lo demás se incluye sólo si se necesita.

Las columnas Carácter que Carácter que


tienen nombre separa a los separa a los Los renglones
Nombre (F / T) decimales
del archivo datos tienen nombre
(F / T)

read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", row.names,
col.names, as.is = !stringsAsFactors, na.strings = "NA", colClasses = NA,
nrows = -1, skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(), encoding = "unknown")
Llenar los
Qué hacer si espacios
aparece un renglón vacíos con NA
en blanco (F/T)
II.4. Anatomía de una función ya diseñada (3/4).

Función para convertir un archivo de datos a un formato de R


denominado data.frame (que acepta números y cadenas de
carácter).

Muchas funciones en R necesitan que los datos tengan


este formato.

Nuevamente, se agregan modificadores sólo si son necesarios.

data.frame(..., row.names = NULL, check.rows = FALSE,


check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
II.4. Anatomía de una función ya diseñada (4/4).

Se puede acceder al contenido del resultado de cualquier


función.

Es decir, a cada partecita del objeto que es resultado de la


función.

Esto permite que el usuario tenga muchas posibilidades para


hacer cosas “novedosas”.
II.5. Funciones en “R” y la “Ayuda”.

Se puede teclear el nombre de una función en esta


sección y obtener una descripción de la función:
Aparece algo como esto:
Nombre de la Paquete en el Descripción, anatomía y
función que se ubica fisiología de la función
En la parte final aparecen ejemplos.
¡¡Pueden copiarlos y pegarlos en un script para ver
cómo funcionan!!
II.5. Funciones diseñadas por el usuario. 1ª parte.

NombrePoderoso<-function () {

Entre las dos llaves se ponen todas las instrucciones


que uno desee

Esta estructura permite agrupar líneas de código en un


“paquete”.

Al escribir el nombre del paquete en el script se pueden


ejecutar todas las líneas de código inscritas en él.
II.5. Funciones diseñadas por el usuario. 2ª parte.

A las funciones se les puede “dar de comer” datos que


provienen de “afuera” de la función:

NombrePoderoso<-function (InformacionExterna) {

resultado…
return(list(NombreResultado=resultado))
}

La función puede “exportar” los resultados de sus procesos


a otras funciones del script. Esto se logra con la función
return (última línea antes del corchete de cierre) y su
argumento NombreResultado.
II.5. Funciones diseñadas por el usuario. 2ª parte.

Una forma de representar esto:

NomPod  NombrePoderoso(InformacionExterna)

ResX  NomPod$NombreResultado

Notar cómo NombreResultado se “transformó” en una


propiedad del objeto NomPod.
II.5.2. La función “c”.

La función “c” concatena (agrupa, junta) elementos sueltos


en un vector.

v0<- c(67,12,1,-99,0.444,333.22)
v1<- c(“chivas”,”tuzos”,”monarcas”,”xolos”)
v2<- c(TRUE,TRUE,FALSE,FALSE,TRUE)

Los elementos son de un único tipo: números, letras, booleanos,


etc. En un vector no se mezclan tipos de datos diferentes.

Cada elemento tiene una posición en el vector.


Se accede a un elemento particular usando
Corchetes rectangulares “ [“ y “]”.
II.5.2. La función “c”.
v0<- c(67,12,1,-99,0.444,333.22,0.003)
v1<- c(“chivas”,”tuzos”,”monarcas”,”xolos”,”tecos”)
v2<- c(TRUE,TRUE,FALSE,FALSE,TRUE)

Cada elemento tiene una posición en el vector.


Se accede a un elemento particular usando corchetes
rectangulares “ [“ y “]”.

E0<- v0[5]
E3<- v1[3]
E4<- V2[4]

Y también se puede:

E26<-v0[2:6]
Ex<-v1[c(1,3,5)]
II.5.2. La función “c”.
v0<- c(67,12,1,-99,0.444,333.22,0.003)
v1<- c(“chivas”,”tuzos”,”monarcas”,”xolos”,”tecos”)
v2<- c(TRUE,TRUE,FALSE,FALSE,TRUE)

Cada elemento tiene una posición en el vector.


Se accede a un elemento particular usando corchetes
rectangulares “ [“ y “]”.

Esto es muy útil:

E26<-v0[2:6] El símbolo “:” para secuencias de números

Ex<-v1[c(1,3,5)] “c” para elementos salteados


II.6. Lectura de datos.

Las siguientes instrucciones:

1. DatosChidos <- read.table(“ArchivoDatosChidos.txt”)


2. o<-data.frame(DatosChidos)

1. indica que se lea la tabla de datos llamada


“ArchivoDatosChidos.txt” y que se guarde en el espacio de
memoria DatosChidos.

2. Y luego convierte ese archivo al formato data frame y lo


almacena en el espacio de memoria llamado “o”.

Los nombres del lado izquierdo del “<-” se


definen al gusto del usuario.
II.6. Lectura de datos (cont.).

Estas instrucciones también se pueden usar:

* Para elegir el directorio de trabajo:


setwd(“CadenaDeCaracteresConLaDirección”)

* Para cargar datos dentro de un paquete en uso :


data(NombreDelArchivo)

* Carga datos escritos con la función save:


load(file, envir = parent.frame())

* Para bajar archivos de Internet:


download.file(url, destfile, method, quiet = FALSE,
mode = "w", cacheOK = TRUE)
II.6. Lectura de datos (cont.).

Ejemplos:
II.6. Lectura de datos (cont.).
Ejercicios:

Emplear las funciones print, names, cbind, rbind, unique


con los archivos de datos.

print(Nombre): imprime en pantalla el archivo con los datos

names(Nombre): detecta los nombre de las columnas

cbind(Nombre1,Nombre2,…,NombreX): junta columnas específicas

rbind(Nombre1,Nombre2) : junta conjuntos de renglones

unique(Nombre): detecta los elementos diferentes en una columna


II.6. Lectura de datos (cont.).

Más funciones de lectura de archivos:

read.csv( ) archivos “comma separated values”

scan( ) archivos de tipo: logical, integer, numeric,


complex, character, raw and list.
II.6. Lectura de datos (cont.).

Más funciones de lectura de archivos:

library(xlsx)
read.xlsx( ) archivos de excel

library(foreign): archivos stata, systat,dbf, spss, y otros.

library(jpeg)
readJPEG( )

library(tiff)
II.7. Manejo elemental de datos.

Manejo de datos, elaboración de subconjuntos y


las funciones:

summary(…
tapply(…mean, var, length)
ftable(tapply(…
unique(…
length(…

El símbolo “$” permite acceder a las columnas de


un archivo:

NombreArchivo$NombreColumna.
II.7. Manejo elemental de datos (cont).

Se puede acceder a cualquier componente de un


data.frame, especificando el renglón y la columna en la
que está:

NombreArchivo[renglon,columna]

(notar los corchetes!!)

Ejercicios:

Agrupar las instrucciones de lectura y manejo de archivos


en una función construida por ti, querid@ usuari@.
II.7. Manejo elemental de datos (cont).

Se puede acceder a secciones de los datos que cumplan


con una condición particular:

o<-read.table("Spred3.txt",header=T)
names(o)
#[1] "Species" "tcum" "tint" "remaining" "taken"
unique(o$Species)
#[1] abz cd cor dio mmu pol psd uva

SpUVA<-o[o$Species==“uva”,]
II.7. Manejo elemental de datos (cont).

Función subset:
o<-read.table("Spred3.txt",header=TRUE)
names(o)
#[1] "Species" "tcum" "tint" "remaining" "taken"

unique(o$Species)
unique(o$tint)
unique(o$taken)

o1<-subset(o,Species=="uva")

o2<-subset(o,Species=="uva" & tint>5)

o3<-subset(o,Species=="uva" & tint>5 & 1<taken & taken<4)

o4<-subset(o,Species=="uva" | Species=="abz")

o5<-subset(o,Species=="uva" | Species=="abz",select="remaining")

o6<-subset(o,Species=="uva" | Species=="abz", select=c("remaining","tint"))


II.7. Manejo elemental de datos (cont).

Funciones “mean” y “sd”:

Calcular promedios y varianzas de un conjunto de datos:

x<-seq(1,5,1)

prom<-mean(x)
print(prom)

sdev<-sd(x)
print(sdev)
II.7. Manejo elemental de datos (cont).

Funciones “cbind” y “rbind”:

x<-runif(10,0,1)
y<-runif(10,0,1)

z1<-rbind(x,y)
print(z)

z2<-rbind(x,y)
print(z2)
II.7. Manejo elemental de datos (cont).

Funciones “sum” , “cumsum” “cumprod”:

x<-seq(1,5,1)

s1<-sum(x)
print(s1)

sc<-cumsum(x)
print(sc)

sp<-cumprod(x)
print(sp)
II.7. Manejo elemental de datos (cont).

Función “apply” y sus parientas: “lapply” y “tapply”.

Para hacer cálculos en secciones de arreglos:

* A lo largo de renglones y/o columnas en matrices;

* En columnas en data.frames.
II.7. Manejo elemental de datos (cont).

Función “apply”:

Calcular promedios y varianzas fácilmente a partir de la


base de datos, agrupando por niveles de factores :

Ox <- apply(X, MARGIN, FUN)


Qué se va a
calcular:
Matriz de
mean, var,
datos
Criterio de sum, etc.
cálculo; o una función diseñada
MARGIN=1  a lo largo de líneas
MARGIN=2  a lo largo de columnas por el usuario.
MARGIN=c(1,2)  líneas y columnas
II.7. Manejo elemental de datos (cont).

Funciones “lapply”:

Esta función “escupe” una lista del mismo tamaño


de X, cada elemento es el resultado de aplicar la FUN a
Cada elemento de X.

CuadroProms<- lapply(X, FUN)

Matriz de
Qué se va a
datos
calcular:
mean
var
II.7. Manejo elemental de datos (cont).

Función “tapply”:

Calcular promedios y varianzas fácilmente a partir de la


base de datos, agrupando por niveles de factores :

CuadroProms<-tapply(Y_Var,factor,mean)

Variable de
Qué se va a
respuesta
Factor para calcular:
agrupar la mean
Variable de var
respuesta
II.7. Manejo elemental de datos (cont).

Función aggregate:

Agrupa los datos de la forma que uno prefiera y calcula una


cuenta para cada uno de los subgrupos.

Modo en el Cuenta que


Datos para se aplicará
que se
agrupar a los datos
agruparán

dataXaggregate(x=MatrizDatos,by=grupos,FUN,data=…)

dataXaggregate(formula,by,FUN,data)
II.7. Manejo elemental de datos (cont).

Función by:

Aplica una FUN a un data.frame agrupado en factores.

oXby(data, INDICES, FUN)

Datos
En formato Lo que se va a
data.frame Un factor o una calcular para cada
lista de factores nivel de cada factor
cada uno con los
mismos renglones
que data.
II.7. Manejo elemental de datos (cont).

Función outer (o producto externo):

Aplica una FUN a cada par de combinaciones de los


elementos de dos vectores x & y.

oXouter(x,y,FUN)

Lo que se va a
Vectores calcular para cada
xyy combinación de
xi y yi
II.7. Manejo elemental de datos (cont).

Función merge:

Combina dos dataframes usando los mismos nombres de


columnas o renglones.
Los dos Nombres compartidos
dataframes que (renglones o columnas)
se van a combinar

Mezcladosmerge(x, y, by = intersect(names(x), names(y)),


by.x = by, by.y = by)

Nombre de la Nombre de la
Columna en el Columna en el
Dataframe X Dataframe Y
II.7. Manejo elemental de datos (cont).

Función plot().

o<-read.table("igpe_adquim_5g_spp.txt",header=T)
print(o)
plot(o)
II.7. Manejo elemental de datos (cont).
Álgebra matricial.

DatMat<-c( 0.0, 0.1, 1.1, 0.5,


0.7, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.2, 0.0)

m1<-matrix(DatMat,4,4,byrow=T)
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Matriz transpuesta.

TranspA<-t(m1)
print("Transpuesta:")
print(TranspA)

[1] "Transpuesta:"
[,1] [,2] [,3] [,4]
V1 0.0 0.7 0.0 0.0
V2 0.1 0.0 0.5 0.0
V3 1.1 0.0 0.0 0.2
V4 0.5 0.0 0.0 0.0
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Determinante de una matriz.

deterA<-det(m1)
print("determinante")
print(deterA)

[1]
"determinante"
[1] -0.035
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Valores y vectores propios.

props<-eigen(m1)
print(props)
$values
[1] 0.78543527+0.0000000i -0.34658326+0.6023545i -0.34658326-0.6023545i
[4] -0.09226874+0.0000000i

$vectors
[,1] [,2] [,3] [,4]
[1,] 0.6840602+0i -0.3102905+0.5392785i -0.3102905-0.5392785i -0.01015893+0i
[2,] 0.6096519+0i 0.6266989+0.0000000i 0.6266989+0.0000000i 0.07707110+0i
[3,] 0.3880981+0i -0.2248710-0.3908212i -0.2248710+0.3908212i -0.41764470+0i
[4,] 0.0988237+0i -0.0652142+0.1121870i -0.0652142-0.1121870i 0.90527882+0i
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Matriz inversa.

invA<-solve(m1)
print("inversa m1")
print(invA)

[1] "inversa m1"


[,1] [,2] [,3] [,4]
V1 0 1.428571 0.0 0
V2 0 0.000000 2.0 0
V3 0 0.000000 0.0 5
V4 2 0.000000 -0.4 -11
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Matriz inversa.

library(MASS)
invA<-ginv(m1)
print("inversa m1")
print(invA)

[1] "inversa m1"


[,1] [,2] [,3] [,4]
V1 0 1.428571 0.0 0
V2 0 0.000000 2.0 0
V3 0 0.000000 0.0 5
V4 2 0.000000 -0.4 -11
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Multiplicación de matrices.
identidad<-m1 %*% invA
print("identidad")
print(identidad)

V1 V2 V3 V4 [,1] [,2] [,3] [,4] [,1] [,2] [,3] [,4]


[1,] 0.0 0.1 1.1 0.5 V1 0 1.428571 0.0 0 [1,] 1 0 0 0
[2,] 0.7 0.0 0.0 0.0 %*% V2 0 0.000000 2.0 0 = [2,] 0 1 0 0
[3,] 0.0 0.5 0.0 0.0 V3 0 0.000000 0.0 5 [3,] 0 0 1 0
[4,] 0.0 0.0 0.2 0.0 V4 2 0.000000 -0.4 -11 [4,] 0 0 0 1
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Análisis de sensibilidad de la tasa de
crecimiento de un modelo demográfico.

MatSensib<-function(){
m1<-as.matrix(read.table("matrizDem.txt",header=F))
props<-eigen(m1)
vD<-props$vectors[,1]
mt<-t(m1)
props2<-eigen(mt)
vI<-props2$vectors[,1]
vIt<-t(vI)
ProdEscalar<-as.numeric(vIt%*%vD)
print(ProdEscalar)
mS1<- vD%*%vIt
print(mS1)
MatSens<- mS1/ProdEscalar
print(MatSens)
}
II.7. Manejo elemental de datos (cont).
Álgebra matricial. Análisis de sensibilidad de la tasa de
crecimiento de un modelo demográfico.
Matriz de proyección:

V1 V2 V3 V4
[1,] 0.0 0.1 1.1 0.5
[2,] 0.7 0.0 0.0 0.0
[3,] 0.0 0.5 0.0 0.0
[4,] 0.0 0.0 0.2 0.0

Matriz de sensibilidad para la tasa de crecimiento:

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


[1,] 0.33573983 0.37671700 0.52462568 0.21372851
[2,] 0.29921992 0.33573983 0.46755982 0.19048032
[3,] 0.19048032 0.21372851 0.29764376 0.12125781
[4,] 0.04850312 0.05442295 0.07579078 0.03087659
II.9. Gráficas.

x <- seq(0,1,0.1)
y<-x^0.5
plot(x,y,type=“l”)

y<-x
lines(x,y,type=“b”)

y<-x^2
lines(x,y,type=“p”)

y<-x^1/x
lines(x,y,type=“n”)

¿Graficar variables de archivos?


II.9. Gráficas. Funciones (cont).

La función gráfica fundamental:

par(…
Abreviación de “parameter”.

Sirve para determinar prácticamente todas las


características de una gráfica.

Tiene como 30 opciones para modificar.

Pero algunas características de no se pueden modificar


con esta función.
II.9. Gráficas. Funciones (cont).

Libro de Crawley, pág. 848.


Cuadro con los argumentos de la función par(),
II.9. Gráficas. Funciones (cont).

Libro de Crawley, pág. 848.


Cuadro con los argumentos de la función par(),
II.9. Gráficas. Funciones (cont).

Libro de Crawley, pág. 848.


Cuadro con los argumentos de la función par(),
II.9. Gráficas. Funciones (cont).

Función plot y modificaciones varias.


II.9. Gráficas. Funciones (cont).

Función plot y modificaciones varias.

o<-read.table("GradVolcTekila_DatMadera_8marzo2012.txt",header=T)
print(names(o))

plot(o$NumHojas,o$ArFolProm)

120
o$ArFolProm

80
Notar los nombres
de los ejes
40
0

0 50 100 150 200

o$NumHojas
Títulos
Símbolos
120

Ejes
o$ArFolProm

Texto en la gráfica
80

Tipo de caja
40

Aspecto
Y un abundante etc.
0

0 50 100 150 200

o$NumHojas Con el parámetro par( )


o dentro de plot( ).
Argumentos de la función plot:

Títulos varios: Tipos de caja:

main=“ titulo principal” bty= alguno de estos


sub=“ titulo secundario”  "o" , "l", "7", "c", "u", or "]"
xlab= “titulo eje x”
ylab= “titulo eje y” La caja se parece a la letra
mayúscula correspondiente.

“n”= no dibuja caja


Argumentos de la función plot:

Tipo de gráfica: Dimensiones de ejes:

type= “p” (puntos) xlim=c(inf,sup) rango eje x


“l” (líneas) ylim=c(inf,sup) rango eje y
“b” (ambos)
“n” (nada)

Dimensiones: Símbolos:

cex= de símbolos pch= del 1 al 25


cex.lab= de etiquetas
cex.main= del título principal (ver referencia)
tima<-"titulazazo principal"
tise<-"titulazo secundario"
tix<-"ejezote X"
tiy<-"ejezote Y"
plot(o$NumHojas,o$ArFolProm,bty="c",col="green",main=tima,sub=tise,
xlab=tix,ylab=tiy,cex=4,pch=25,cex.lab=2,col.lab="orange",
col.main="purple")

Antes:
titulazazo principal
120

120
100
o$ArFolProm

80

ejezote Y
80
60
40

40
20
0

0 50 100 150 200


0 50 100 150 200

o$NumHojas ejezote X
titulazo secundario
Guardar en archivo las gráficas (1):

Metafile bmp
Postcript TIFF
Guardar como:
Pdf jpg
png
Guardar en archivo las gráficas (2):

png(“NombreChido.png”,res=200,height=600,width=600)
plot(grafica)
dev.off()

También se pueden emplear las funciones:


jpeg( ), bmp( ) y tiff( ).

Sin embargo, se necesita la función par() antes de plot


para ajustar el formato de la gráfica, pues lo que se ve en
pantalla no es lo que se almacena en archivo.
II.9. Gráficas. Diagramas de caja y bigotes
(box and whiskers).

plot(Factor,y) En lugar de que X sea continua, como en los casos


anteriores, ahora es categórica.

75avo percentil

Bigotes Caja Mediana


(whiskers) (box)

25avo percentil
II.9. Gráficas. Diagramas de caja y bigotes
(box and whiskers).
Sin valores Con valores
atípicos (outliers) atípicos (outliers)

Los bigotes muestran los Los bigotes muestran 1.5 veces el


valores máximos y mínimos rango intercuantil de los datos
( ≈ 2 desvíos típicos).
II.9. Gráficas. Histogramas.

Esta es la función completa:

hist(x, breaks = "Sturges", freq = NULL, probability = !freq, include.lowest =


TRUE, right = TRUE, density = NULL, angle = 45, col = NULL, border = NULL,
main = paste("Histogram of" , xname), xlim = range(breaks), ylim = NULL,
xlab = xname, ylab = yname, axes = TRUE, plot = TRUE, labels = FALSE,
nclass = NULL, ...)

Pero las partes fundamentales son estas:


hist(x, breaks = "Sturges", freq = F/T)

Datos a) Número de El histograma


organizados categorías que tendrá mostrará
como el histograma frecuencias (T) o
vector b) Método para construir valores absolutos (F)
las categorías
II.9. Gráficas. Histogramas (cont).

o<-read.table("GradVolcTekila_DatMadera_8marzo2012.txt",header=T)

hist(o$ArFolProm) Histogram of o$ArFolProm

50
Frequency

30
0 10

0 20 40 60 80 100 120 140

o$ArFolProm
II.9. Gráficas. Histogramas (cont).

maximo<-max(o$ArFolProm)
minimo<-min(o$ArFolProm)
rango<-maximo-minimo
nucates<-12 Notar:
tampaso<-rango/nucates
intervalos<-seq(minimo,maximo,tampaso) 1) cómo se
hist(o$ArFolProm,breaks=intervalos,col="gray") construyen
los intervalos

Histogram of o$ArFolProm
2) Cómo se
incluyen en la
función
30
Frequency

20
10
0

0 20 40 60 80 100 120

o$ArFolProm
II.10. Funciones de probabilidad.
Prefijos para usar con
cada función:

d: densidad
p: probabilidad acumulada
q: distribución de cuantiles
r: números aleatorios
Ejemplo:

dnorm( )
pnorm( )
qnorm( )
rnorm( )

Dentro de los paréntesis


deben ir los valores de
los parámetros de
de la distribución.
II. 10. Funciones de probabilidad. Curva normal (cont).

1
1 − [ ( x−μ )/σ ]2
2
Y= ⋅e
σ √2 π

Y = variable de respuesta (eje y)


x = variable independiente (eje x)
μ = media de la población
σ = desvío típico
π = 3.141592654…etc.
e = 2.71828…etc.
II. 10. Funciones de probabilidad. Curva normal (cont).

Ejemplo para dibujar una curva normal:

¿Cuántos puntos tiene este gráfico?


¿Qué es lo que hace la función “dnorm”?
II. 10. Funciones de probabilidad. Curva normal (cont).

Para construir un conjunto aleatorio de datos (se usa el


prefijo “r”) proveniente de una distribución normal con media
y desvío típico conocidos:
Cuántos datos necesito

Si no agrego nada más, estoy suponiendo


que la media=0 y el desvío=1.
II. 10. Funciones de probabilidad. Curva normal (cont).

promedio<-5
desvest<-1
tam<-10
tit<-as.character(tam)
xdat<-runif(tam,0,10)
ydat<-dnorm(xdat,promedio,desvest)
plot(xdat,ydat,pch=20,cex=1,main=tit,bty="l")

20 40 80 160
0.4

0.4

0.4

0.4
0.3

0.3

0.3

0.3
0.2
ydat

0.2
ydat

0.2
ydat

ydat

0.2
0.1

0.1

0.1

0.1
0.0

0.0

0.0

0.0
0 2 4 6 8 10 0 2 4 6 8 10 0 2 4 6 8 10 0 2 4 6 8 10
xdat xdat xdat xdat
II. 10. Funciones de probabilidad. Curva normal (cont).
Histogramas observados y su correspondiente curva normal:
o<-read.table("GradVolcTekila_DatMadera_8marzo2012.txt",header=T)

maximo<-max(o$ArFolProm)
minimo<-min(o$ArFolProm)
rango<-maximo-minimo
nucates<-12
tampaso<-rango/nucates
intervalos<-seq(minimo,maximo,tampaso)

h0<-hist(o$ArFolProm,breaks=intervalos,col="gray",freq=T,ylim=c(0,50))

xdat<-h0$counts
medios<-h0$mids

ynorm<-dnorm(medios,mean(xdat),sd(xdat))
lines(medios,ynorm*1000,type="p",pch=19,cex=1.6)

ynorm<-dnorm(1:100,mean(xdat),sd(xdat))
lines(1:100,ynorm*1000,type="p",pch=19,col=“red”,cex=0.6)
II. 10. Funciones de probabilidad. Curva normal (cont).

Histogram of o$ArFolProm
50

h0<-hist(o$ArFolProm,breaks=intervalos,col="gray",freq=T,ylim=c(0,50))
40

ynorm<-dnorm(medios,mean(xdat),sd(xdat))
lines(medios,ynorm*1000,type="p",pch=19,cex=1.6)
30
Frequency

ynorm<-dnorm(1:100,mean(xdat),sd(xdat))
lines(1:100,ynorm*1000,type="p",pch=19,col=“red”,cex=0.6)
20
10
0

0 20 40 60 80 100 120

o$ArFolProm
II. 10. Funciones de probabilidad. Curva normal (cont).
Normal Q-Q Plot

¿Y esto será normal?

120
100
EsNormal<-shapiro.test(o$ArFolProm)

Sample Quantiles

80
print(EsNormal)

60
qqnorm(o$ArFolProm)
qqline(o$ArFolProm,lty=2)

40
20
Shapiro-Wilk normality test

0
-2 -1 0 1 2

Theoretical Quantiles
data: o$ArFolProm
W = 0.8156, p-value = 7.701e-10

No parece muy normal


II.10. Funciones de probabilidad.
Cuantiles.

Produce los cuantiles de una muestra, de acuerdo al


vector de probabilidades. La observación más pequeña
corresponde a una probabilidad 0 y la más grande a la
probabilidad 1.
Vector de
Vector de
probabilidades
observaciones

Cuanquantile(x, probs = seq(0, 1, 0.25))


II.9. Gráficas. Funciones (cont).

Gráficos en 3d. La función persp.

Empecemos con una matriz, por ejemplo la matriz de sensibilidad


para la tasa de crecimiento:

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


[1,] 0.33573983 0.37671700 0.52462568 0.21372851
[2,] 0.29921992 0.33573983 0.46755982 0.19048032
[3,] 0.19048032 0.21372851 0.29764376 0.12125781
[4,] 0.04850312 0.05442295 0.07579078 0.03087659

Los ejes X y Y son las edades (1~4) y el eje Z es la


matriz con los valores de sensibilidad.
II.9. Gráficas. Funciones (cont).

Gráficos en 3d. La función persp.

La matriz de sensibilidad se almacena en un objeto llamado


msfin.
rotación rotación
HORIZONTAL VERTICAL

ejeX<-seq(1,4,1)
ejeY<-seq(1,4,1)

persp(ejeX,ejeY,msfin,theta=0,phi=0,col="gray",shade=0.1,
zlab="lambda",xlab="age cat",ylab="age cat.",
ticktype="detailed",nticks=4)
II.9. Gráficas. Funciones (cont).

Gráficos en 3d. La función persp.

theta=135, phi=40
theta=0, phi=0

0.4
0.4
lambda

0.2

0.2
1 1

4 2 2
3
2
3 3
1
1 2 3 4
age cat 4 4
II.9. Gráficas. Funciones (cont.).
Divide la pantalla Renglones Columnas

Se crean 4
split.screen(c(2,2))
split.screen(c(2,2)) Espacios para
screen(1) gráficas
x <- seq(0,1,0,01)
y<-x^0.5
plot(x,y)

screen(2)
secuencia desde hasta En incrementos de
y<-x
plot(x,y)

screen(3)
y<-x^2
x <- seq(0,1,0.01)
plot(x,y)

screen(4)
y<-x^1/x grafica eje Y
plot(x,y) eje X

plot(x,y)

OJO: Los vectores x,y, tienen que tener


el mismo número de elementos.
II.10. El núcleo del remuestreo intensivo, la función
“sample”.
Número de elementos
Conjunto de donde que se eligirán El muestreo se hará
Se remuestreará con reemplazo (TRUE)
o sin él (FALSE)

sample( x, tamsubc, replace=FALSE)


II.7. Manejo elemental de datos (cont).

Función pairs().

pairs(x, labels, panel = points, ..., lower.panel = panel,


upper.panel = panel, diag.panel = NULL, text.panel =
textPanel, label.pos = 0.5 + has.diag/3, cex.labels =
NULL, font.labels = 1, row1attop = TRUE, gap = 1)

Algo muy interesante de esta función son los argumentos:


panel
diag.panel
lower.panel
upper.panel
Con los
argumentos se
pueden diag.panel upper.panel
agregar objetos
diferentes en
cada subregión
de la gráfica.

Para ello, el valor del argumento


debe ser una función diseñada
por el usuario.
lower.panel
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0

CE

0.6
0.0
HCO3
0.6

0.42
0.0001703
0.0

pHH2O

0.8
0.086 0.38
0.4575 0.0007718

0.5
MO
0.6

-0.063 -0.16 -0.37


0.5845 0.1559 0.001005
0.0

NTOTAL

0.8
0.0025 -0.15 -0.39 0.89
0.9831 0.1942 0.0003812 0

0.2
P
0.6

-0.00043 0.15 0.42 0.15 0.095


0.997 0.1972 0.0001523 0.189 0.4119
0.0

0.8
0.28 0.36 0.52 -0.077 0.02 0.46
0.01528 0.001321 1.602e-06 0.5037 0.8646 2.419e-05

0.2
Na
0.6

0.73 0.38 0.48 -0.099 -0.087 0.36 0.47


7.35e-14 0.0005931 1.122e-05 0.394 0.4512 0.001268 1.574e-05
0.0

0.0 0.2 0.4 0.6 0.8 1.0 0.5 0.7 0.9 0.2 0.4 0.6 0.8 1.0 0.2 0.4 0.6 0.8 1.0
Este es el el escrip:

o2<-read.table("igpe_adquim_5g_spp.txt",header=T)
o<-o2[,-1]
x<-o
y<-o

for ( cc in 1:ncol(o) ){
mx<-max(o[,cc])
o[,cc]<-o[,cc]/mx
}

pairs(o,upper.panel =panel.smooth,lower.panel=corre,diag.panel=histos)

La gráfica se construye con la función pairs().


Pero lo interesante son sus argumentos.
pairs(o,upper.panel =panel.smooth,lower.panel=corre,diag.panel=histos)

Esta es una función del R.


No es necesario hacerle nada.
pairs(o,upper.panel =panel.smooth,lower.panel=corre,diag.panel=histos)

corre<-function(x,y) {

par(usr=c(0,1,0,1))
c2<-cor.test(x,y)
c2es<-c2$estimate
c2value<-c2$p.value
c3<-as.character(format(c2es,digits=2))
text(0.5,0.5,c3)
c4<-as.character(format(c2value,digits=4))
text(0.5,0.2,c4)
}
pairs(o,upper.panel =panel.smooth,lower.panel=corre,diag.panel=histos)

histos<-function(o) {

par(usr=c(0,1,0,2))
hist(o,add=T,prob=T,col="gray",ylim=c(0,2))
}
Así se ve completo el escrip:
Los arcanos
mensajes
de error del R.
La interpretación de los errores puede ser
(frecuentemente lo es) un arte mayor.
¿Qué hacer? ¿Cómo proceder?
¿Quién podrá ayudarnos?

Se puede copiar el texto del error, colocarlo en


la página:
http://www.rseek.org/

y tener fe en que aparezca alguna señal que


estemos capacitados para entender.
Principales tipos de error:

1) Digitales (de dedo, oséase, errores ortográficos);

2) Gramaticales (uso incorrecto de los componentes del


lenguaje);

3) Lógico-estructurales (construcción incorrecta del


algoritmo).

Normalmente, el compilador del lenguaje empleado se


encarga de los primeros dos tipos de error.

El error del que uno debe preocuparse realmente es del


tipo 3.
Ejemplo:

o<-read.table(" DatGLM_17may2011.txt",header=T)

Error en file(file, "rt") : no se puede abrir la conexión


Además: Mensajes de aviso perdidos
In file(file, "rt") :
no fue posible abrir el archivo ' DatGLM_17may2011.txt': No such file or directory
>

¿Dónde está el error?


library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

m1<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poison)
m2<-glm(NsppExot ~ TipoVeg + Ubicacion + TamPueblo,data=o,poisson)

CompaMode<-anova(m1,m2,test="Chi")
print(CompaMode)
library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

m1<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poisson)
m2<-glm(NsppExot ~ TipoVeg + Ubicacion + TamPueblo,data=o,poisson)

CompaMode<-anova(m1,m2,test="Chi")
print(CompaMode

Activar la ventana de la consola


y oprimir Esc. De lo contrario, el
R se quedará pasmado.
library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

ml<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poisson)
m2<-glm(NsppExot ~ TipoVeg + Ubicacion +
TamPueblo,data=o,poisson)

CompaMode<-anova(m1,m2,test="Chi")
print(CompaMode)
II.11. Pequeño bestiario de fórmulas para modelos
estadísticos univariados.

Libro de Crawley, página 329, cuadro 9.3.


II.11. Pequeño bestiario de fórmulas para modelos
estadísticos univariados.
II.11. Pequeño bestiario de funciones para modelos
estadísticos univariados.

Libro de Crawley, páginas 349~350.


II.11. Pequeño bestiario de funciones para modelos
estadísticos univariados.
II.11. Pequeño bestiario de funciones para modelos
estadísticos univariados.
Cada una de las funciones anteriores tiene implementadas las
siguientes “capacidades” para acceder a los resultados de la
función.
II.11. Sintaxis general de modelos estadísticos con
una variable de respuesta.

Variables
Variable explicativas y
De estructura del modelo (cómo se
Respuesta relacionan las variables)

TipoDeAnalisis(Yvar ~ Xvar1+Xvar2.Xvar3*Xvar4…etc.)

aov
lm
Infaltable tilde
que significa “=“ “+” : efecto principal
ó “función de”
glm
“.” : interacción
Lenguaje “R” “*” : modelo completo
(efecto principal e
interacción)
II.11. De los factores y sus niveles.

Para construir “factores con varios niveles”, rápidamente:

fx<-factor(rep(c(“EtiqNivel1”,”EtiqNivel2”),c(NumRepNivel1, NumRepNivel2)))

Genero<-factor(rep(c(“fem”,”masc”),c(10,10)))
II.12. Sintaxis general de modelos lineales
generalizados (glm).

Tipo de error:
Para indicar el (poisson, binomial,
glm normal,gamma)

modelo<-glm(yvar~fx1*fx2,poisson)

La función de enlace se determina al indicar el tipo de error.


II.12. La regresion!!!

o<-read.table("Mate_I_QuercusCast_2sep09.txt",header=T)
#print(names(o))
#[1] "Papm" "Hm" "KgC" "KgD" "KgT"

10
8
plot(o$Papm,o$Hm)

o$Hm
m0<-lm(Hm~Papm,data=o)

6
print("*** Partes de m0: *****")

4
print(names(m0))

2
print("*** Este es m0: ******") 0.05 0.10 0.15 0.20 0.25

print(m0) o$Papm

Sm0<-summary(m0) ¿Qué pasó


print("*** Partes de Sm0: ******") aquí?
print(names(Sm0))
print("*** Este es Sm0: *****")
print(Sm0)
Para obtener los valores de pendiente, ordenada al
origen y r2:

ValCoef<- Sm0$coefficients
print("Coeficientes:")
print(ValCoef)
print(ValCoef[1])
print(ValCoef[2])

print("R2:")
ValR2<-Sm0$adj.r.squared
print(ValR2)
El valor de p no es parte de los atributos de la función
summary. Se calcula en el momento al usar summary,
por eso no se puede extraer de ahí.

## para rescatar el valor de p


fval<-Sm0$fstatistic
valorP<-pf(q = fval[1], df1 = fval[2], df2 = fval[3], lower.tail = FALSE)
print(valorP)
La línea calculada para los datos observados:

pred<-predict(m0)
lines(sort(o$Papm),sort(pred),type="b",pch=19,cex=0.6)

¿Por qué usar sort?

10
8
o$Hm

6
4
2

0.05 0.10 0.15 0.20 0.25

o$Papm
Y los infaltables residuales:
Residuals vs Fitted Normal Q-Q
par(mfrow=c(2,2))

Standardized residuals

3
18 18

0 1 2
plot(m0)

Residuals

1
-1

-2
-3
70
99
99 70

4 6 8 10 -2 -1 0 1 2

Fitted values Theoretical Quantiles


Al “plotear” el modelo
lo que se muestran
Scale-Location Residuals vs Leverage
son los residuales. Standardized residuals

Standardized residuals
18

1 2 3
99

1.5
70

1.0
0.5

-1
Cook's
44 distance
7099
0.0

-3
4 6 8 10 0.00 0.02 0.04 0.06

Fitted values Leverage


II.12. Sintaxis general de modelos mixtos con
factores fijos, aleatorios, anidados y demás (lme).

Para la función lme se necesita el paquete (library) {nlme}.

Sección de Sección de
efectos fijos efectos
aleatorios

modelo<-lme(yvar~modelo,random=~1 | f1 / f2…etc)

f2 está
anidado
dentro de f1
II.12. Sintaxis general de modelos mixtos con
factores fijos, aleatorios, anidados y demás (lmer).

Para la función lmer se necesita el paquete (library) {lme4}.

Sección de
Sección de efectos
efectos fijos aleatorios

modelo<-lmer(yvar~Xvars+(1 | f1 / f2…etc) )

f2 está
anidado
dentro de f1
Comparaciones múltiples. Datos “normales”.

o<-read.table("igpe_adquim_5g_spp.txt",header=T)
m0<-aov(MO~grupo,data=o)

Sm0<-summary(m0)

print(Sm0[[1]])
print(Sm0[[1]][[2]]) ¿Y todo esto
print(Sm0[[1]][[2]][[1]])
print(Sm0[[1]][[5]])
para qué?

cmT<-TukeyHSD(m0)
print(cmT)

cmPW<-pairwise.t.test(o$MO,o$grupo)
print(cmPW)
Comparaciones múltiples. Datos No “normales” y GLMs.

La función apropiada es glht.

library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

mGLM<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poisson)

print(summary(mGLM))

CompMult<-glht(mGLM,linfct=mcp(TipoVeg="Tukey"))
print(summary(CompMult))

par(mfrow=c(2,2))
plot(mGLM)
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

Cada función estadística produce mucha información, a


la que se puede acceder mediante tres formas:

1) Por nombre;

2) Por subscriptos;

3) Con el signo $.

En general una o varias de formas sirven para todas las


funciones.
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

Usando los nombres (names).

npk.aov  aov(yield ~ block + N*P*K, npk)

1) Para conocer los nombres de un objeto en “R”:

print(names(npk.aov))
"coefficients" "residuals" "effects“ "rank" "fitted.values" "assign" "qr“
"df.residual" "contrasts" "xlevels" "call“ "terms" "model"

2) Así se usa:
print(coefficients(npk.aov))
(Intercept) block1 block2 block3 block4 block5
54.8750000 1.7125000 1.6791667 -1.8229167 -1.0137500 0.2950000
N1 P1 K1 N1:P1 N1:K1 P1:K1
2.8083333 -0.5916667 -1.9916667 -0.9416667 -1.1750000 0.1416667
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.
Usando el signo “$”.
npk.aov  aov(yield ~ block + N*P*K, npk)

print(names(npk.aov))
"coefficients" "residuals" "effects“ "rank" "fitted.values" "assign" "qr“
"df.residual" "contrasts" "xlevels" "call“ "terms" "model"

1) print(npk.aov$coefficients)
(Intercept) block1 block2 block3 block4 block5
54.8750000 1.7125000 1.6791667 -1.8229167 -1.0137500 0.2950000
N1 P1 K1 N1:P1 N1:K1 P1:K1
2.8083333 -0.5916667 -1.9916667 -0.9416667 -1.1750000 0.1416667
N1:P1:K1
NA

2) print(npk.aov$coefficients[4])
block3
-1.822917
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.
Usando los subscriptos.

npk.aov aov(yield ~ block + N*P*K, npk)

1) print(npk.aov[1])

$coefficients
(Intercept) block1 block2 block3 block4 block5
54.8750000 1.7125000 1.6791667 -1.8229167 -1.0137500 0.2950000
N1 P1 K1 N1:P1 N1:K1 P1:K1
2.8083333 -0.5916667 -1.9916667 -0.9416667 -1.1750000 0.1416667
N1:P1:K1
NA

Notar la notación (sic notarial)


2) print(npk.aov[[1]][[3]]) de los corchetes
[1] 1.679167
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.
Usando los subscriptos.
npk.aov  aov(yield ~ block + N*P*K, npk)
SUMMnpk.aov<-summary(npk.aov)
1) print(SUMMnpk.aov[1])
Df Sum Sq Mean Sq F value Pr(>F)
block 5 343.29 68.659 4.4467 0.015939 *
N 1 189.28 189.282 12.2587 0.004372 **
P 1 8.40 8.402 0.5441 0.474904
K 1 95.20 95.202 6.1657 0.028795 *
N:P 1 21.28 21.282 1.3783 0.263165
N:K 1 33.14 33.135 2.1460 0.168648
P:K 1 0.48 0.482 0.0312 0.862752
Residuals 12 185.29 15.441

2) print(SUMMnpk.aov[[1]][[3]])
68.6590000 189.2816667 8.4016667 95.2016667 21.2816667 33.1350000
0.4816667 15.4405556

3) print(SUMMnpk.aov[[1]][[3]][[5]]) Notar la notación (sic notarial)


21.28167 de los corchetes
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

npk.aov  aov(yield ~ block + N*P*K, npk)


par(mfrow=c(2,2))
plot(npk.aov)
Homogeneidad Normalidad
Residuals vs Fitted Normal Q-Q

2
2 2

1
La función plot utilizada con

2
0

als
ls

0
sidua

ardizedresidu
un modelo estadístico
e

-2
R

-1
nd
-4

Sta
3 5

muestra los análisis de


3

-6
5

-2
50 55 60 65 -2 -1 0 1 2

homogeneidad de varianza y Fitted values Theoretical Quantiles

normalidad de los Scale-Location


Constant Leverage:
Residuals vs Factor Levels

2
3 5

residuales.
2 2
Standardized residuals

1.2

1
0.8

0
ardizedresiduals

-1
0.4

Stand
3

-2
5
0.0

block :
50 55 60 65 4 5 1 6 2 3

Fitted values Factor Level Combinations


II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

Función plot.design().

Útil para representar el efecto de los factores de un


experimento.

Emplea notación de fórmulas.

plot.design(yvar~xvar1*xvar2, etc)
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

o<-read.table("DatosAnovaDosVias.txt",header=T)
print(names(o))
# genero tipocomida consumo
par(mfrow=c(1,3),cex=1.5)
plot.design(consumo~genero,data=o)
plot.design(consumo~tipocomida,data=o)
plot.design(consumo~genero*tipocomida,data=o)

masc fresca fresca

660
660
m ean of consum o

m ean of consum o

m ean of consum o
610

620
620

masc
600

580
580

fem
590

540
540
580

fem rancia rancia


genero tipocomida genero

Factors Factors Factors


II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

Función interaction.plot().

Útil para representar interacciones entre los factores de


un experimento.

La variable de
respuesta va
interaction.plot(xvar1,xvar2,yvar) al final
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

o<-read.table("DatosAnovaDosVias.txt",header=T)
print(names(o))
# genero tipocomida consumo
interaction.plot(o$genero,o$tipocomida,o$consumo)
700

o$tipocomida

fresca
650

rancia
mean of o$consumo

600
550

fem masc

o$genero
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.

Función coplot().

“co” es abreviatura de “conditioning”.


Útil para representar modelos estadísticos agrupados
por niveles del factor condicionante.

coplot(yvar~xvar1 | xvar2)
Modelo Factor
estadístico condicionante
del modelo
II.12. Extracción de información y representaciones
varias de los modelos estadísticos.
o<-read.table("DatosAnovaDosVias.txt",header=T)
print(names(o))
# genero tipocomida consumo
coplot(o$consumo~o$genero|o$tipocomida)
Given : o$tipocomida

rancia

fresca

fem masc
700
650
o$consumo

600
550
500

fem masc

o$genero
II.12. Para simplificar un modelo.

La función step compara los efectos de cada factor en


el modelo.

Construye el modelo completo y calcula el valor de


Akaike (AIC).

Remueve un factor (o interacción) y calcula de nuevo el


AIC.

Si el AIC baja, el factor es eliminado del modelo


II.12. Para simplificar un modelo.

library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

m1<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poisson)

MejorModelo <-step(m1)

print(summary(MejorModelo))
II.12. Para comparar dos modelos.

Para decidir si un modelo estadístico es mejor que otro


se pueden emplear las siguientes estrategias generales:

1) Criterio de información de Akaike (AIC):

AICm1m2AIC(modelo1,modelo2)

2) Análisis de varianza entre modelos:

ANOVAm1m2<-anova(m1,m2)
II.12. Para comparar dos modelos.

library(multcomp)

o<-read.table("DatGLM_17may2011.txt",header=T)

m1<-glm(NsppExot~TipoVeg*Ubicacion*TamPueblo,data=o,poisson)

m2<-glm(NsppExot ~ TipoVeg + Ubicacion + TamPueblo,data=o,poisson)

CompaMode<-anova(m1,m2,test="Chi")

print(CompaMode)
¿Qué pretenden los
métodos
multivariados?

¿Cuáles son sus


ocultas intenciones?
Ecología de comunidades.

Típicos conjuntos de datos:


Matriz de sitios por especies
Matriz de sitios por variables ambientales.

Gradientes Grupos
(variación continua) (variación discreta)

¿Qué significan los ejes coordenados?

Dos grandes preguntas en esta área de estudio:

I) ¿Hay patrones?
II) ¿Existen variables que “expliquen” o estén
“relacionadas” con los patrones?
Dos grandes
familias de
métodos
multivariados.
*CCorA
Valores y *PCA
*CCA
Vectores *CA
*CCA
propios *DA
parciales

Métodos
Matriz de *Dendro-
*NMDS
distancia gramas
*Adonis
(o alguna medida *NMDS
de similitud)

Descripción Relación “causal”


(una yvar) (al menos una yvar y una xvar)

Propósitos
Ejemplo de análisis de componentes principales

Requiere la biblioteca (library): { MASS }

Matriz de datos ¿Se emplea la


(sitios,especies) matriz de correlación (TRUE)
o la de covarianza (FALSE)?

princomp(x, cor = FALSE, scores = TRUE, covmat = NULL,


subset = rep(TRUE, nrow(as.matrix(x))), ...)
Ejemplo de análisis de componentes principales

o<-read.table("datos_ej_pca.txt",header=T)
odf<-data.frame(o)
# matrices de covarianza
x<-odf
mcov<-cov(x,y=x)
print(mcov)

# matrices de correlación
mcor<-cor(x=odf,y=x)
print(mcor)

# analisis de PCA con matriz de correlación


pcaq<-princomp(odf,cor=TRUE,scores=T)

print(names(pcaq))

biplot(pcaq)
Ejemplo de análisis de NMDS:
Nonmetric Multi Dimensional Scaling

Requiere la biblioteca (library): { vegan }

Matriz de datos (sitios,spp) Índice de disimilitud o de


distancia entre sitios
(ver función vegdist en {vegan}

metaMDS(comm, distance = "bray", k = 2, trymax = 20,


autotransform =TRUE, noshare = 0.1, wascores = TRUE,
expand = TRUE, trace = 1, plot = FALSE, previous.best,
old.wa = FALSE, ...)
Ejemplo de análisis de NMDS:
Nonmetric Multi Dimensional Scaling

# Para activar una biblioteca


library(vegan)

data(dune) # para “cargar” un archivo de datos a partir de


una biblioteca
print(dune)

library(MASS)

sol<-metaMDS(dune, distance = "bray")

plot(sol, type="t")
Ejemplos de análisis de discriminantes.

I.
o<-read.table("kuitzeoplus.txt",header=TRUE)
oad3<-lda(odf3$Veget~odf3$alt.m+odf3$Cob.m2+odf3$AB.cm2,data=odf3,
method="moment")
plot(oad3,pch=".",abbrev=2,dimen=2,cex=0.5)

II.
o3<-read.table("igpe_adquim_5g_spp.txt",header=T)
odf3<-data.frame(o3)
oad3<-lda(odf3$grupo~.,data=odf3,method="moment")
print(oad3)
pairs(oad3)
Ejemplo de análisis de correspondencia canónica.

o1<-read.table("igpedat_cca_sittotspp.txt",header=TRUE)
o2<-read.table("igpedat_cca_sitamb.txt",header=TRUE)

odfsitspp<-data.frame(o1)
odfsitamb<-data.frame(o2)

objcca<-cca(odfsitspp,odfsitamb,scannf=FALSE,nf=2)

plot(objcca)
II.8. Rudimentos de
programación
Para que un problema (proceso) se pueda programar, debe
cumplir con lo siguiente:

* Tener objetivo finalidad claro y no ambiguo, expresable en


términos de lenguaje lógico-formal (matemático).

* Que exista forma explícita de resolverlo.

* Que exista un algoritmo para la solución del problema.


Dos grandes estrategias de programación:

Lo general

Lo particular
Rudimentos de programación.
Las “runas” de la programación:

Dirección de
Flujo del
Estos símbolos muestran los
algoritmo procesos que ocurren en
prácticamente cualquier
Inicio o
Término algoritmo.
Disyuntiva
Es decir, para que un problema
Hacer un
sea traducido a un lenguaje de
proceso programación, debería ser
posible representarlo con
Salida o estos procesos.
Entrada

Conector
Ejemplo 1: Ejemplo 2:
Como algunas cosas en la vida, el aprendizaje es un proceso
dialéctico de triunfo-fracaso-triunfo-fracaso-fracaso-fracaso-
fracaso-fracaso-fracaso-fracaso-triunfo-fracaso-fracaso-
fracaso-fracaso-fracaso-fracaso, etc…

El aprendizaje de la programación es algo así como el arte de


disfrutar viviendo en el error.
Estructuras de control. El ciclo de repetición.

contador desde hasta


dentro de
la secuencia

for ( j in 1:nuloc ) {

instrucciones diversas

}
Estructuras de control. El operador “while”

while ( Condición para que el ciclo continúe) {

instrucciones diversas

}
Estructuras de control. El condicional if-else.

I. Versión simple:

if (se cumple el condicional) { acción consecuente }

II. Versión completa

if (se cumple el condicional) {


acciones correspondientes
} else {
acciones para cuando NO se
cumple el condicional
}
La programación estructurada consiste en formar grupos de
instrucciones. Los criterios para agrupar las instrucciones
dependen de los intereses del usuario. Por ejemplo, se pueden
agrupar instrucciones que:
*Usan una sola base de datos;
*Que realizan un cálculo que está dividido en varios
subcálculos.
* Se realizan varias veces en distintas ocasiones.

El programa resultante tendrá dos “tipos” de instrucciones:

Las que están dentro de los grupos;


Las que están fuera de los grupos.

Por tanto, un programa estructurado tiene jerarquías y


anidamientos.
La programación estructurada es previa a la programación
orientada a objetos, que es la estrategia de programación
actual.

El lenguaje “R” es un “híbrido”, pues está basado en objetos


que pueden utilizarse en scripts estructurados.

Es una buena práctica de programación el hacer scripts


estructurados:

* “Obligan” al programador a hacer script “ordenados”;

* Son más fáciles de entender por terceros (y por el


programador);

* Por tanto, suelen ser más fáciles de modificar.


Una cosa es tener buena:
Ortografía
Redacción de oración
Construcción de párrafos

Otra cosa es cómo le hago para escribir:


Tabletas te arcilla
Máquina de escribir
Computadora (y un procesador de texto)

Y otra cosa es tener algo qué decir.


R

IDEAS
ALGORITMOS
PROPÓSITOS

Es un triángulo interactivo.

Cada vértice retroalimenta/estorba al otro.


10
8
6
Sistemas

4
z

2
para
1
0.5

0
0.0

graficación
-0.5
-1.0

-2
-1.0 -0.5 0.0 0.5 1.0

en “R”.
x
Principales sistemas de gráficos en R:

{graphics} o estándar
{lattice} o trellis
{ggplot2}
{scatterplot3d}
vcd
plotrix
gplots
grid

En general son independientes entre sí, y no muy compatibles.

Pero grid y lattice se pueden combinar.


II.9. Gráficas. Funciones (cont).

Otra opción para dividir la pantalla gráfica:

par(mfrow=c(2,2))

ó también:

par(mfcol=c(2,2))
II.9. Gráficas. Funciones (cont).

La instrucción completa:

par(mfrow=c(2,2))

makeframebyrow =c(2,2)

Número de renglones Número de columnas


en los que se divide la en los que se divide la
pantalla gráfica pantalla gráfica
Varias gráficas dentro del mismo “gráfico”:
Los argumentos fig y mar de la función par().

Argumento fig:
Vector numérico de la forma c(x1,x2,y1,y2) que da las
coordenadas (en formato NDC) de la figura dentro de
la región de visualización.

NDC (Normalized Device Coordinates): van desde cero (0) hasta uno (1).

Argumento mar:
Vector numérico de la forma c(abajo,izquierda,arriba,derecha)
que especifica el número de líneas de margen en cada lado de
la figura. Los valores automáticos son c(5,4,4,2).

{graphics} par
o<-read.table("HuracanesMexico_14marzo2011.txt",header=T)
print(names(o))
# "anio" "pacifico" "atlantico"

par(fig=c(0,1,0.5,1),mar=c(0,5,2,2),cex=1.5)
plot(o$anio,o$atlantico,type="l",xlab="",xaxt="n")

par(fig=c(0,1,0,0.5),mar=c(5,5,0,2),cex=1.5,new=T)
plot(o$anio,o$pacifico,type="l")
60 1 2 3 4 5 6 7
o$atlantico
o$pacifico

4
2
0

1970 1980 1990 2000

o$anio {graphics} par


Varias gráficas dentro del mismo “grafico”:
La función layout.

El espacio de graficación se representa como una matriz. En


cada celda se coloca una gráfica.

layout(mat, widths =anchos, heights =largos)

Argumento mat:
Las gráficas se colocarán dentro de un arreglo
rectangular. Cada gráfica se identificará con un número
entero consecutivo. Si alguna celda de la matriz no
llevará gráfica, se pondrá un cero (0) en esa celda.

{graphics} layout
layout(mat, widths =anchos, heights =largos)

Argumentos widths, heights:

El ancho y el largo de cada columna se asignarán de


manera individual con un par de vectores.

{graphics} layout
El número de la gráfica se pone en cada celda:

1 4 6
¿Qué significa el 0 en
2 0 7 esa posición?

3 5 8
Para transformar este arreglo de gráficas en una matriz:

ngrafs<-c(1,2,3,4,0,5,6,7,8)
matriz<-matrix(ngrafs,3,3,byrow=T)

Notar la posición del 0.

Y las dimensiones de las columnas y los renglones de la rejilla:


Rdim<-c(1,1,1)
Cdim<-c(1,1,1)

{graphics} layout
Para tener una vista preliminar del arreglo de gráficos:

nf<-layout(MatGraf,widths=Rdim, heights=Cdim, respect=T)

layout.show(nf)

Una vez que la forma y dimensiones de la rejilla están como uno quiere, se
dibuja cada gráfica de manera individual:

#grafico 1
par(mar=c(4,4,4,4))
interaction.plot(o1$Genero,o1$LongPie,o1$Estatura)

#grafico 2
par(mar=c(5,5,5,5))
plot(o2$edad,o2$largo)

#grafico 3...etc.

{graphics} layout
Así se ve el arreglo del ejemplo anterior:
1.5 1.6 1.7 1.8 1.9
mean of o1$Estatura

o1$LongPie

3.0
0.3

o3$Grupo
o2$largo

0 2 4 6 8
0.29

2.0
0.27
0.265

1.0
0.26
0.25 5 10 15 20 50 60 70 80
f m
0.28
o2$edad o3$valor
o1$Genero 0.22
0.225
Histogram of o4$pacifico 0.23
0.235
0.24

5
0.245
0 2 4 6 8
Frequency

o5$grupo

4
0.255

3
2
1
0 2 4 6 0 10 20 30

o4$pacifico o5$CE

Histogram of o4$atlantico
mean of o7$consumo

fresca 4.0
660
20
Frequency

o8$tratam

3.0

masc
600
5 10

fem
2.0
540

1.0

rancia
0

o7$genero
0 2 4 6 340 360 380

o4$atlantico Factors o8$valor {graphics} layout


Varias gráficas dentro del mismo “grafico”:
La función split.screen .

Esta función divide la pantalla de graficación en varias


subpantallas.

A su vez, cada subpantalla se puede subdividir nuevamente,


así que con esta función se pueden hacer figuras
complicadas.

La función screen(x) dibuja la x-ésima figura.

La función erase.screen(x) borra la x-ésima figura.

La función close.screen(all=T) regresa todo a la normalidad.

{graphics} split.screen
Lo primero es saber que las dimensiones de toda la
zona de graficación se miden en unidades NDC
(Normalized Device Coordinates), que van desde cero
(0) hasta uno (1).
El cero corresponde a la zona (1,1)
inferior izquierda.

El 1 corresponde a la zona (0,0)


superior derecha.

Todas la gráficas se deben colocar en este espacio; por


tanto, las dimensiones de las gráficas estarán entre 0 y 1.

{graphics} split.screen
Como de costumbre, lo primero es diseñar el gráfico completo:
1) Cuántas gráficas;
2) De que dimensiones;
3) Ubicaciones en el espacio de graficación.

Las dimensiones de cada gráfica se especifican con 4


números que indican, además, la posición relativa de la
gráfica en el espacio NDC:
0.95 (1,1)
c(Izq,Der,Fondo,Arriba)
0.7

c(0.6,0.9,0.7,0.95) 0.6 0.9

(0,0)

{graphics} split.screen
Por tanto, las dimensiones (y posiciones) de las gráficas se
pueden almacenar en una matriz.

Un arreglo de figuras 1 2 3 4
como este:
6
5 8
7

Tiene la siguiente
representación matricial:

{graphics} split.screen
Traducido a lenguaje R:
MatCoord<-c(0.10, 0.30, 0.7, 0.95,
0.35, 0.65, 0.7, 0.95,
0.75, 0.85, 0.6, 0.95,
0.88, 0.98, 0.6, 0.95,
0.10, 0.35, 0.10, 0.55,
0.40, 0.67, 0.15, 0.35,
0.40, 0.67, 0.40, 0.65,
0.80, 0.98, 0.10, 0.50)

MC<-matrix(MatCoord,8,4,byrow=T)

Es aquí donde se implementa la regionalización de la


pantalla:

split.screen(MC)

{graphics} split.screen
Y luego se construyen la graficas de manera individual:
screen(1)
par(mar=c(1,1,1,1))
plot(o1$LongPie,o1$Estatura)

screen(2)
par(mar=c(1,1,1,1))
plot(o2$edad,o2$largo)

screen(3)
par(mar=c(1,1,1,1.5))
interaction.plot(o3$Grupo,o3$Subgrupo,o3$
valor,cex=0.5)

…etc
{graphics} split.screen
Queda algo como esto:
Histogram of log(o6$AreaKm2)
1.9

o3$Subgrupo

250
80
8
o2$largo

mean of o3$valor
1.7

Frequency
70
4

150
1.5

60

50
0.22 0.24 0.26 0.28 0.30 5 10 15 20

50

0
Histogram of o4$atlantico
o1$LongPie o2$edad
H L M 2 6
Frequency

15
o3$Grupo log(o6$AreaKm2)
5

380
0

0 1 2 3 4 5 6 7
0.5

370
Histogram of o4$pacifico
o4$atlantico

360
Frequency

8
0.3

350
4
0
0.1

340
0 1 2 3 4 5 6
0 2 4 6 8 10 12 o4$pacifico a b c d

o5$MO

{graphics} split.screen
Sistema de
graficación basado
en enrejados
(trellis):

Los misterios del


paquete {lattice} por
fin revelados!!
Deepayan Sarkar
(el que desarrolló este
paquete)
Las capacidades gráficas normales de R no son muy eficientes para
representar y modificar varias gráficas en una sola página.

El paquete {lattice} pretende resolver esto.

Proviene del sistema “Trellis” (enrejado), implementado en inicialmente en S.

Trellis hace referencia al arreglo rectangular de páneles con forma de


enrejado del que está hecha la página.

trellis = entramado, enrejado, celosía. 


{lattice}
Las rutinas gráficas normales no regresan objetos, lo que
hacen es dibujar el gráfico en la zona gráfica.

En cambio, las rutinas de {lattice} no grafican nada, pero sí


devuelven un objeto clase “trellis”. El gráfico aparece
porque la función print (o plot) imprime el objeto gráfico
trellis.

{lattice}
Tipos de gráfica:

{lattice}
Tipos de gráfica:

{lattice}
Sintáxis genérica de una gráfica en lattice:

Variables Variables
primarias condicionantes
“Fórmula”
Símbolo de
del gráfico condicionamiento:
Tal que.

Variables primarias: Interactúan como una fórmula de un modelo estadístico


y: variable de respuesta
x: variable explicativa

Variables condicionantes: indican la forma en la que se agrupan las


variables primarias.
{lattice}
El sistema lattice permite construir gráficas complicadas
en dos “niveles”:

I) Usando las funciones antes vistas, de manera


individual, para crear gráficas con varios páneles.

II) Combinando y “anidando” las funciones, de manera


colectiva, para hacer un “enrejado de enrejados”.

En cualquier caso, es fundamental DISEÑAR ANTES la


figura completa, con todos los paneles.

{lattice}
Nivel I: hacer gráficas a partir de una sola función (o
fórmula).
Argumentos “principales” de una gráfica diseñada en trellis:

data=… objeto del que provienen las variables; si se declara ya no es necesario


usar “obj$...” dentro de la funcion, y evitar el uso del attach().

factor(VariableCondicionante) Indica que cada panel corresponde a un nivel


de la variable.

groups=… El factor indica cómo se agrupan y representan los niveles de un


factor dentro del panel.

ref=T Agrega líneas de referencia al panel principal

auto.key=list(columns=2) Agrega leyendas al gráfico, repartidas en 2


columnas (ejemplo)

aspect=(x/y) Forma general de los páneles (x: largo, y: alto)

{lattice}
Nivel I: hacer gráficas a partir de una sola función (o
fórmula).

Ejemplos:

g1<-xyplot(CE~pHH2O|factor(grupo),data=o,aspect=(1/1))

g0<-densityplot(~pHH2O,groups=grupo,data=o,ref=T,
auto.key=list(columns=2),xlab="Tremendee")

Para verlas en pantalla se pueden usar print() o plot().

El enrejado se construye de manera automática.

{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Ahora, el enrejado es construido por el usuario,


mediante argumentos de las funciones plot() y print().

Dentro de los páneles de este enrejado, se insertan las


funciones gráficas (que a su vez también son
enrejados).

{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Argumentos para diseñar enrejados de la función plot (del


paquete trellis):

split=c(x,y,nx,ny)

nx: número de columnas en las que se divide la rejilla


ny: número de renglones en los que se divide la rejilla

x: columna en la que va la gráfica


y: renglón en el que va la gráfica

El origen de las coordenadas está en el panel superior


izquierdo.
{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Argumentos para diseñar enrejados de la función plot (del


paquete trellis):

position = c(0,0,1,1) Vector de 4 números que muestra las


coordenadas inferior izquierda y superior
derecha del rectángulo en el que se ubicará
el gráfico. El rango de los ejes va de 0 a 1.

{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Argumentos para diseñar enrejados de la función plot (del


paquete trellis):

more= T/F Valor lógico que indica si habrá más gráficas en


la página

newpage=T/F Valor lógico que indica si la gráfica debe estar


en una nueva página

{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Argumentos para diseñar enrejados de la función plot (del


paquete trellis):

panel.width=list(x,”cm”) Ancho del panel; lista con dos


componentes, x es la magnitud del
ancho y “cm” es la unidad de medida
de la magnitud.

panel.height=list(x,”cm”) Alto del panel; lista con dos


componentes, x es la magnitud del
ancho y “cm” es la unidad de medida
de la magnitud.
{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Principales opciones de unidades para el sistema de


coordenadas que se usa para definir el tamaño del panel:

“npc”: Normalised Parent Coordinates (poción por omisión).


El origen del puerto de visualización es (0,0). El
tamaño máximo del panel es (1,1).

"cm“: centímetros.

"inches“: pulgadas. 1 in = 2.54 cm.

"mm“: milímetros. 10 mm = 1 cm.

"points“: puntos. 72.27 pt = 1 in.


{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Ejemplo de la función plot:

plot(g0,split=c(1,1,2,1),panel.width=list(4,"cm"),
panel.height=list(4,"cm"),more=T)

plot(g1,split=c(2,1,2,1),more=F)

g0 y g1 son las funciones de graficación básicas, que


producen enrejados.

{lattice}
Nivel II: hacer gráficas combinando dos o más
fórmulas.

Ejemplo de la función print:

print(g0, position = c(0,0,1,1), split=c(1,1,1,1),more=TRUE)

print(g1, position = c(0.75,0.35,1,0.85), split=c(1,1,1,1),


more=FALSE)

g0 y g1 son las funciones de graficación básicas, que


producen enrejados.

{lattice}
Sistema de
graficación con el
paquete
{ggplot2}:

La Gramática
De las
Gráficas.

Hadley
Wickham
(sí, es quién inventó
este paquete;
nótese el parecido
de los pelos)
Este paquete está basado en la “Grammar of graphics”(1).
Como el nombre sugiere, existen un conjunto de elementos y
reglas de interacción entre ellos que tienen como finalidad
desarrollar gráficos complicados de manera fácil y rápida.

La diferencia con el resto de la gramática del R, es que ésta


es más consistente, porque está concebida desde el
principio como un sistema gramatical.

(1)

{ggplot2}
Todo empieza con la pregunta inicial:

¿Qué es una gráfica estadística?


Las 6 partes de cualquier gráfica:

data: datos
geoms: las entidades usadas para representación (puntos,
líneas, polígonos, etc.)
stats: transformaciones estadísticas útiles para la
visualización
scales: dimensiones de la gráfica apropiadas para
la visualización
coord: sistema de coordenadas de la gráfica
facet: agrupación de los datos en subconjuntos para
su visualización
{ggplot2}
geoms
datos (puntos)
(x,y)

sistema de Transformación
Escala estadística
coordenadas

facet
agrupación de
datos
Manejo básico de la función qplot (quick plot)

Se parece al plot tradicional. Pero las diferencias están en la


forma de agrupar e identificar los datos.

Principales argumentos:

colour= factorX Usa color del marcador para identificar


niveles del factor

size= factorX Usa tamaño del marcador para identificar


niveles del factor

shape= factorX Usa forma del marcador para identificar


niveles del factor
{ggplot2}
Manejo básico de la función qplot (quick plot)

Principales argumentos:

alpha=I(1/x) Cambia el grado de transparencia del marcador


para identificar niveles del factor
(1/x=0: transparente;1/x=1: opaco)

{ggplot2}
Manejo básico de la función qplot (quick plot)

Un súper argumento:

geom= Determina el tipo del marcador para


identificar los niveles del factor

La gráfica que resulta de qplot depende del valor que


tenga geom y de cuántas variables se grafiquen.

Más información de geom:


http://had.co.nz/ggplot2/
{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento geom.

Si se usa una variable:

* continua geom=“histogram” histogramas


“freqpoly” polígono de frecuencias
“density” distribución de densidades

* discreta geom= “bar” gráfica de barras

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento geom.

Si se usan dos variables:

geom=“point” gráficos de x vs y
“smooth” agrega una línea “suavizante”
“boxplot” gráfico de caja y bigotes
“ path” dibuja líneas que conectan puntos
“line” dibuja líneas que conectan puntos

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento geom.

Ejemplo:

qp<-qplot(carat,price, data=dsmall,geom=c("point","smooth"))

El argumento de
geom es un vector
con uno o dos
componentes

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento method.

Permite elegir varios tipos de “suavizantes” (smoothers”):

method=“loess” (valor por omisión) usa una regresión


local suave.

Se ajusta con el argumento span:

span≈0 línea muy “arrugada”


span≈1 línea muy “lisa”

qp<-qplot(carat,price, data=dsmall,geom=c("point","smooth"),span=0.5)

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento method.

Más tipos de “suavizantes” (smoothers”):

method=“gam” usa modelos aditivos generalizados


requiere el paquete {mgcv}

Se complementa con el argumento:

formula= y ~ s(x) con menos de 1000 datos

formula= y ~ s(x, bs=“cs”) con más de 1000 datos

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento method.

Más tipos de “suavizantes” (smoothers”):

method=“lm” ajusta un modelo lineal

Se complementa con el argumento:

formula= y ~ poly(x,2) para ajustar una polinomial de grado 2.

formula= y ~ ns(x, 5) para ajustar un splin natural de grado 5;


requiere el paquete {splines}

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento method.

Más tipos de “suavizantes” (smoothers”):

method=“rlm” ajusta un modelo lineal “robusto” (los valores


atípicos no meten mucho ruido);
requiere el paquete {MASS}

{ggplot2}
Manejo básico de la función qplot (quick plot)

El argumento method.

Ejemplos:

qp<-qplot(carat,price, data=dsmall,geom=c("point","smooth"),

method=“lm”,formula=y~poly(x,2) )

{ggplot2}
Manejo básico de la función qplot (quick plot)

El también súper argumento facets=r~c

Permite agrupar y representar distintos subconjuntos de


los datos, en una rejilla de r renglones y c columnas.

Se pueden poner los nombres de los factores en los lugares de


r o c y así dividir la rejilla en los niveles de correspondientes:

qp<-qplot(carat, data=dsmall,facets=cut~color,
geom="histogram",binwidth=0.1, xlim=c(0,3))

{ggplot2}
Según lo propuesto por esta “gramática”, cualquier gráfico
está compuesto por los siguientes elementos:

1) Un conjunto de datos y los correspondientes


“mapeos” entre variables y atributos estéticos (aes);

2) Una o más capas, cada una compuesta de un


objeto geométrico, una transformación estadística
y un ajuste de posición (y opcionalmente, también
el inciso 1));

3) Una escala para cada mapeo dato-atributo estético;

4) Un sistema de coordenadas;

5) El agrupamiento de subconjuntos (faceting).


{ggplot2}
El asunto de las capas.

Las gráficas están compuestas de una o


varias capas.

Cada capa tiene las siguientes partes:

a) datos y “mapeos estéticos” (datos y sus


representaciones);

b) transformación estadística;

c) un objeto geométrico;

d) un ajuste de posición;

{ggplot2}
La función qplot() y sus argumentos agregan las
capas de la gráfica de una sola vez.

Pero las capas se pueden agregar de una en una,


usando la función ggplot().

Las capas son objetos, por lo que se pueden


modificar de manera independiente. Esto hace que
las gráficas en este sistema sean “modulares” y
fáciles de aplicar a datos diferentes.

{ggplot2}
Ejemplo.

Empecemos con el objeto siguiente:

p<-ggplot(diamonds, aes(carat,price,colour=cut))

En esta instrucción se han definido:


Base de datos (diamonds)
Variables (carat,price)
factor de agrupación (color)

Pero no hemos indicado la forma geométrica que se usará


para representar la información.

{ggplot2}
Ejemplo.

p<-ggplot(diamonds, aes(carat,price,colour=cut))

p<-p + layer(geom="point“)

La capa geom se agrega con el signo “+” y “layer”.

{ggplot2}

Potrebbero piacerti anche