Академический Документы
Профессиональный Документы
Культура Документы
CUADERNOS UNIVERSITARIOS
N 61 Agosto de 2017
2017
Resumen
1
Evelyn Hall: Quisiera saber como (si) puedo extraer alguna informacion del resumen de mi nlme.
Simon Blomberg: Esto es R. No existe si. Solo como.
5
6
Indice general
Prologo 7
1. Introduccion a R 11
1.1. Que es y para que sirve R . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. RStudio: una interfaz de trabajo con R . . . . . . . . . . . . . . . . . . 12
1.3. Algunos detalles iniciales . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4. R como calculadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2. Ingresar datos a R 17
2.1. Ingresando matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2. Asignar nombres a las filas y columnas de una matriz . . . . . . . . . . 19
2.3. Extraer partes de una matriz . . . . . . . . . . . . . . . . . . . . . . . 19
2.4. Listas y hojas de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.1. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.2. Hojas de datos (data frames) . . . . . . . . . . . . . . . . . . . 22
2.5. Leer datos en R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.1. Corregir los datos importados . . . . . . . . . . . . . . . . . . . 26
2.5.2. foo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3. Matrices 29
3.1. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1. Sumar matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.2. Multiplicar matrices por un numero real . . . . . . . . . . . . . 30
7
INDICE GENERAL INDICE GENERAL
5. Graficar con R 61
5.1. Graficos basicos en R . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.1.1. Comandos de alto nivel . . . . . . . . . . . . . . . . . . . . . . . 62
5.1.2. Comandos de bajo nivel . . . . . . . . . . . . . . . . . . . . . . 71
5.2. El comando curve() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3. El comando par() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8
INDICE GENERAL INDICE GENERAL
A. Paquetes 139
9
Departamento de Matematica
Universidad Nacional del Comahue
B. Solucion ejercicios seleccionados 143
B.1. Captulo 4: Condiciones, Bucles y Funciones . . . . . . . . . . . . . . . 143
B.1.1. 4.2: Condicionales . . . . . . . . . . . . . . . . . . . . . . . . . 143
B.1.2. 4.3: Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
B.1.3. 4.4 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
B.2. Captulo 7: Ecuaciones Diferenciales. El paquete deSolve . . . . . . . 147
B.2.1. 7.1: Ecuaciones Diferenciales Ordinarias . . . . . . . . . . . . . 147
B.2.2. 7.4: Analisis cualitativo de sistemas no lineales . . . . . . . . . 149
10
Prologo
11
Departamento de Matematica
Universidad Nacional del Comahue
estimular la creatividad y ayudar a desarrollar competencias en otras areas del conoci-
miento.
En estas notas vamos a focalizar en el uso del lenguaje R para trabajar con matrices
y ecuaciones diferenciales, que son las unidades tematicas de la asignatura Matematica
2 de la Licenciatura en Ciencias Biologicas que se dicta en el Centro Regional Univer-
sitario Bariloche de la Universidad Nacional del Comahue. Nuestro interes es brindar
herramientas basicas de lectura y escritura de codigos y usos de paquetes predisenados,
que sean utiles para aprender a resolver problemas como los que se plantean en esta
asignatura y abrir el camino para que los estudiantes las tengan disponibles para su uso
en otras disciplinas de su carrera o en el desarrollo de su tarea profesional.
El texto se divide en siete captulos, que recorren desde la instalacion de R y una
de las interfaces que pueden utilizarse, RStudio, hasta el uso de paquetes especficos
relacionados con el uso de matrices y de ecuaciones diferenciales, aplicadas a problemas
biologicos. El captulo 1 introduce a R y el uso de la interfaz RStudio; el captulo 2,
muestra distintas formas de ingresar datos; en el captulo 3 se trabaja con operaciones
basicas con matrices y calculos relacionados como autovalores, autovectores y solucion
numerica de sistemas de ecuaciones lineales; el captulo 4 se dedica ya mas a cuestiones
relacionadas con la programacion, especficamente al uso de condicionales y la definicion
de funciones, que seran de utilidad despues; el captulo 5 da un pantallazo breve sobre
algunos tipos de graficos elementales; el captulo 6 ahonda en el uso de dos paquetes
especficos para el trabajo con modelos matriciales en dinamica de poblaciones, y el
captulo 7 introduce a la solucion numerica de ecuaciones diferenciales ordinarias y sis-
temas ecuaciones diferenciales no lineales. A lo largo del texto hemos incluido ejemplos
y algunos ejercicios para aplicar las herramientas que vamos introduciendo. Asimismo,
en el Apendice B se muestra la solucion de algunos ejercicios seleccionados. El apendice
A explica la instalacion de paquetes. Tambien hemos incluido alguna bibliografa de
referencia.
Esperamos que este material sea de utilidad para nuestros lectores.
Por ultimo, queremos agradecer al Dr. Guillermo Abramson por sus elogiosos con-
ceptos relativos a este trabajo y a la Dra. Agustina Di Virgilio por la exhaustiva lectura
de estas paginas, y sus valiosos comentarios.
MdTC y ADK
12
Captulo 1
Introduccion a R
13
Departamento de Matematica
Universidad Nacional del Comahue
es muy util para el trabajo interactivo, pero tambien es un poderoso lenguaje de pro-
gramacion para el desarrollo de nuevas herramientas. Otra ventaja muy importante es
que tiene una comunidad muy activa, por lo que, haciendo las preguntas correctas rapi-
damente se puede encontrar la solucion a los problemas que se presenten en el ambito
de la programacion con R. Estas caractersticas han promovido que el numero de sus
usuarios en el area de las ciencias se incremente enormemente.
El hecho de ser un software libre lo convierte en un lenguaje atractivo, debido
a que no hay que preocuparse por licencias. Es decir con R se tiene la libertad de
correrlo con cualquier proposito; estudiar como trabaja el programa y adaptarlo a las
propias necesidades, pues se tiene acceso al codigo fuente; redistribuir copias, y mejorar
el programa y liberar sus mejoras al publico general, que tendra con los codigos las
mismas libertades que nosotros.
R cuenta tambien con un muy buen sistema de ayuda online, que permite obtener
informacion de cualquier funcion en especfico. Para ello basta tipear help( )4 poniendo
entre parentesis aquello sobre lo que queremos recibir ayuda. La unica exigencia es tener
una conexion activa a Internet.
14
Departamento de Matematica
Universidad Nacional del Comahue
Para que una lnea de codigo escrita sea leda y ejecutada por R hay que ejecutar-
la, presionando el boton Run que aparece a arriba a la derecha de la primera consola.
Este boton ejecuta lnea por lnea el codigo del programa y permite ir detectando po-
sibles errores. Tambien, presionando simulatneamente los botones Ctrl + Enter puede
ejecutarse una lnea. El boton Run ejecuta una lnea por vez. Si uno desea ejecutar
un conjunto de lneas de codigo, se pueden seleccionar y presionar el boton una vez
realizada la seleccion (o Ctrl + Enter ). Cuando este boton ejecuta una lnea, en la
consola de R aparece la lnea de codigo ejecutada y el resultado (si es que esta lnea
produce un resultado). Por ejemplo, si en la consola de arriba a la izquierda escribimos
2+4 y ejecutamos la lnea, en la consola de R aparecera lo siguiente5 :
> 2+4
[1] 6
El smbolo >, llamado prompt aparece siempre a la izquierda del editor. Una
vez iniciado el R, lo que vemos es el prompt y el cursor intermitente, indicando
que se espera el input del usuario.
5
El [1] adelante del resultado significa que tenemos 1 dato, y el 6 es el resultado.
15
Departamento de Matematica
Universidad Nacional del Comahue
La secuencia de smbolos <- indica la asignacion de o un nombre o un valor
a un objeto. As, por ejemplo, x<-5 asignara el valor 5 a la variable x, y cada
vez que se utilice x, tomara ese valor. El uso de <- equivale al =. As, x<-4
equivale a x = 4
Los comentarios (lneas de texto como recordatorios o avisos) van precedidos por
el smbolo #. Por ejemplo,podemos poner un cartel de alerta que nos recuerde a
que llamamos x:
>x<-5 #x es el numero de columnas de la tabla
16
Departamento de Matematica
Universidad Nacional del Comahue
> 2+3
[1] 5
> 3/2
[1] 1.5
> 2^3 # otra forma 2**3
[1] 8
> 4^2-3*2
[1] 10
> (56-14)/6 - 4*7*10/(5^2-5)
[1] -7
Ademas de las operaciones aritmeticas basicas, las siguientes funciones estandar que
se encuentran en la mayora de las calculadoras, estan disponibles en R:
Comando Operacion
sqrt(x) Raz cuadrada de x
abs(x) Valor absoluto de x
sin(x), cos(x), tan(x) seno, coseno y tangente de x
exp(x), log(x) exponencial y logaritmo de x
factorial(x) factorial de x
pi R conoce el numero
choose(n,k) calcula el numero combinatorio
Los datos tambien pueden combinarse en forma de vectores, como veremos ensegui-
da. Para crear una combinacion tenemos que usar la funcion de concatenacion de datos
c( ). Por ejemplo, podemos crear un vector o una secuencia de datos de la siguiente
manera, separando con comas los elementos del vector:
> c(2,5,7)
[1] 2 5 7
c(0,30,45,60,90)
[1] 0 30 45 60 90
17
Departamento de Matematica
Universidad Nacional del Comahue
Comando Operacion
length() devuelve la cantidad de componentes del vector
sum() calcula la suma de las componentes del vector
prod() calcula el producto de las componentes del vector
cumsum(), cumprod() calcula sumas y productos acumulados
sort() ordena el vector
diff() calcula diferencias entre componentes (por defecto consecutivas)
v <- c(1,1,3,4,7,11)
length(v)
[1] 6
sum(v) # 1+1+3+4+7+11
[1] 27
> prod(v) # 1*1*3*4*7*11
[1] 924
> cumsum(v) # 1, 1+1, 2+3, 5+4, 9+7, 16+11
[1] 1 2 5 9 16 27
> diff(v) # 1-1, 3-1, 4-3, 7-4, 11-7
[1] 0 2 1 3 4
> diff(v, lag = 2) # 3-1, 4-1, 7-3, 11-4
Ejercicio 1. Usar R para realizar los siguientes calculos:
18
Captulo 2
Ingresar datos a R
La siguiente tabla indica la funcion de cada uno de los argumentos del comando matrix
1
Cuando se importan datos de otra fuente, estos siempre tienen un formato de data.frame, no de
matriz. Lo que puede hacerse luego es usar el comando as.matrix( ) para convertirlos en una matriz
(Ver seccion 2.4.2).
19
Departamento de Matematica
Universidad Nacional del Comahue
data son los elementos de la matriz, se ingresan mediante un vector
nrow indica el numero de filas de la matriz
ncol indica el numero de columnas de la matriz
byrow indica si los elementos del vector en data son ingresados en la matriz por filas
(byrow=TRUE) o, la opcion default, por columnas (byrow=FALSE).
dimnames permite darle nombre a las columnas o filas.
> A<-matrix(c(1,0,3,-1,2,2,1,0,-1,-2,0,3),ncol=4,nrow=3,byrow=T)
> A
La salida en R sera:
Observacion. Segun el objetivo que persiga nuestro trabajo, los elementos de una matriz
pueden no ser numeros. En este caso hablaramos mas propiamente de una tabla que
de una matriz, pero ademas, a los efectos practicos del ingreso de datos, no es lo mismo
matrices con datos cuantitativos que nominales.
Cuando ingresamos los elementos de una matriz lo hacemos con la funcion de con-
catenacion separando los elementos por comas. Lo que hace R es reconocer cada objeto
ingresado entre comas y lo ubica ordenadamente en filas y columnas como se lo hayamos
indicado. Pero, para senalar a R que se trata de elementos de caracteres de texto, cada
uno de ellos debe ir encerrado entre comillas. Es importante aclarar que las matrices
solo pueden contener datos de un tipo a la vez, o numeros o caracteres. Por ejemplo,
una matriz cuyos elementos sean texto, podra ser la siguiente:
20
Departamento de Matematica
Universidad Nacional del Comahue
> gente<-matrix(c("Manuel", "Luisa", "Ana", "Sara", "Pablo", "Jose"),ncol=3,
nrow=2,byrow=T)
> gente
[,1] [,2] [,3]
[1,] "Manuel" "Luisa" "Ana"
[2,] "Sara" "Pablo" "Jose"
>datos<-matrix(c(20,65,174,22,70,180),ncol=3,nrow=2,byrow=T)
>datos
[,1] [,2] [,3]
[1,] 20 65 174
[2,] 22 70 180
Para identificar las filas con los nombres de las personas Ana y Juan y las columnas
con las variables edad, peso y altura usamos las funciones rownames y colnames de la
siguiente forma
21
Departamento de Matematica
Universidad Nacional del Comahue
3. Extraer una columna de una matriz.
> A<-matrix(c(1,0,3,2,2,1,0,-1,0,3,2,3),ncol=4,nrow=3,byrow=T)
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 3 2
[2,] 2 1 0 -1
[3,] 0 3 2 3
> A[2,3]
[1] 0
> A[2,]
[1] 2 1 0 -1
> A[,3]
[1] 3 0 2
Cuando las filas o columnas de la matriz tienen nombre podemos tambien extraer
partes de una matriz usando los nombres.
> datos
edad peso altura
Ana 20 65 174
Juan 22 70 180
> datos[,edad]
Ana Juan
20 22
> datos[Ana,]
edad peso altura
20 65 174
22
Departamento de Matematica
Universidad Nacional del Comahue
2.4. Listas y hojas de datos
2.4.1. Listas
En R, una lista es una coleccion ordenada de objetos, llamados componentes. Los
distintos componentes de una lista no tienen que ser del mismo tipo, as una lista puede
estar formada por ejemplo por caracteres, un vector y una matriz.
Por ejemplo:
> Lista1
$nombre
[1] "Pedro"
$esposa
[1] "Mara"
$no.hijos
[1] 3
$edad.hijos
[1] 4 7 9
Los componentes de una lista estan numerados y pueden ser referidos por dicho
numero. Por ejemplo:
>Lista1[[1]]
[1] "Pedro"
>Lista1[[4]]
[1] 4 7 9
>Lista1[[4]][1]
[1] 4
>Lista1[[4]][3]
[1] 9
Los componentes de una lista pueden llevar nombre (como en nuestro ejemplo). Para
averiguar los nombres de los componentes de una lista el comando names( ) es de gran
utilidad:
23
Departamento de Matematica
Universidad Nacional del Comahue
>names(Lista1)
[1] "nombre" "esposa" "no.hijos" "edad.hijos"
>Lista1$esposa
[1] "Mara"
>Lista1$no.hijos
[1] 3
>Lista1$edad.hijos
[1] 4 7 9
Tambien es posible utilizar los nombres de los componentes entre dobles corchetes,
as por ejemplo Lista1[["nombre"]] coincide con Lista1$nombre y con Lista1[[1]].
Es importante comprender la diferencia entre Lista1[[1]] y Lista1[1]. La expre-
sion Lista1[[1]] es el primer elemento de la lista, y si los componentes tienen nombre,
el nombre no esta incluido. En cambio Lista1[1] es una sublista de la lista Lista1.
>Lista1[[1]]
[1] "Pedro"
>Lista1[1]
$nombre
[1] "Pedro"
>Lista1[[4]]
[1] 4 7 9
>Lista1[4]
$edad.hijos
[1] 4 7 9
24
Departamento de Matematica
Universidad Nacional del Comahue
frame deben ser de la misma longitud. Los datos de un data frame pueden ser accedidos
como los elementos de una matriz o de una lista.
El siguiente ejemplo introduce el uso del comando data.frame. Partimos de la
matriz datos utilizada anteriormente.
> datos<-matrix(c(20,65,174,22,70,180),nrow=2,ncol=3,byrow=T)
> rownames(datos)<-c(Ana,Juan)
> colnames(datos)<-c(edad,peso,altura)
> datos
edad peso altura
Ana 20 65 174
Juan 22 70 180
Ahora agregamos una columna a la matriz para que contenga tambien la provincia
de origen de cada persona:
Como vemos, todas las variables de la matriz fueron convertidas al tipo caracter,
lo que no es conveniente, porque si queremos hacer algun calculo sobre las columnas
obtendremos un error.
Para averiguar que tipo de datos contiene cada matriz usamos el comando mode
> mode(datos)
[1] "numeric"
> mode(datos2)
[1] "character"
Con el comando data.frame podemos anadir una columna del tipo caracter (nomi-
nal) sin causar problemas:
> datos2<-data.frame(datos,provincia)
> datos2
25
Departamento de Matematica
Universidad Nacional del Comahue
2.5. Leer datos en R
En R existe mas de una opcion para leer datos, como por ejemplo una tabla de Excel.
RStudio ofrece ademas una opcion muy simple para hacer esto mediante la interfaz del
programa. Lo primero que uno debe hacer para simplificar la importacion de datos
es guardar los mismos en formato csv (comma separated values ). Por ejemplo si
tenemos los siguientes datos en una tabla de Excel, que guardamos en formato .csv
bajo el nombre BaseDatos
Para importar los datos seleccionamos Import Dataset bajo la opcion Tools del
menu principal. Elegimos la opcion From Local File... para buscar el archivo .csv que
queremos importar.
Una vez que elegimos el archivo se abre una ventana donde vemos el archivo a
importar y el formato en data frame que adquiere una vez importado. Hay distintas
opciones que se pueden cambiar a nuestra preferencia, como por ejemplo el nombre
las lineas (Row Names) o por ejemplo si las cifras decimales de un numero estan
separadas por una coma (Comma) o un punto (Decimal).
26
Departamento de Matematica
Universidad Nacional del Comahue
Una vez que importamos los datos, estos aparecen en la ventana arriba a la izquierda,
donde podemos chequearlos.
27
Departamento de Matematica
Universidad Nacional del Comahue
En R hay tambien comandos especificos para leer datos, como read.table( ) o
read.delim( ), aunque no nos detendremos aqu a explicalos en detalle. El comando
read.table crea un marco de datos (data frame) y constituye la manera mas usual de
leer datos en forma tabular. Por ejemplo si tenemos un archivo de nombre datos.dat,
el comando datos <- read.table("datos.dat") creara un data frame llamado mis-
datos, y cada variable recibira por defecto el nombre V1, V2, ... que puede ser accedida
individualmente como vimos antes. Existen varias opciones que el usuario puede es-
pecificar para el comando read.table( ). Un detalle de los mismos puede verse en
Paradis(2002). Asimismo, los comandos read.delim( ) y read.delim2 permiten im-
portar datos copiados en el clipboard, pero en este caso con variables separadas por
tabulaciones (), usando puntos y comas respectivamente para indicar decimales. Para
mas detalles de este comando puede usarse el comando help en R.
> BaseDatos[11]<-list(NULL)
La funcion names nos permite ver que los nombres de las columnas del data frame, son
aquellas que nos interesan.
> names(BaseDatos)
[1] "Nombre"
[2] "INC"
[3] "DENS.Incendio"
[4] "DC"
[5] "NBI"
[6] "DES"
[7] "Uso.de.la.tierra"
[8] "J.venes.de.15.a.18.que.no.estudia.ni.trabaja"
[9] "Total.viviendas"
[10] "total.pobaci.n"
> names(BaseDatos)[7]<-Uso.tierra
> names(BaseDatos)[7]
[1] "Uso.tierra"
28
Departamento de Matematica
Universidad Nacional del Comahue
> names(BaseDatos)[8]<-Jovenes
> names(BaseDatos)[8]
[1] "Jovenes"
> names(BaseDatos)[10]<-total.pob
> names(BaseDatos)[10]
[1] "total.pob"
> class(BaseDatos)
[1] "data.frame"
> class(BaseDatos$Nombre)
[1] "factor"
> class(BaseDatos$INC)
[1] "integer"
> class(BaseDatos$DENS.Incendio)
[1] "numeric"
> class(BaseDatos$DC)
[1] "integer"
> class(BaseDatos$NBI)
[1] "numeric"
> class(BaseDatos$DES)
[1] "factor"
> class(BaseDatos$Uso.tierra)
[1] "factor"
> class(BaseDatos$Jovenes)
[1] "factor"
> class(BaseDatos$Total.viviendas)
[1] "integer"
> class(BaseDatos$total.pob)
[1] "factor"
2
La clase de un objeto son atributos propios del objeto. Al final de este captulo hay una breve mencion
de las clases mas importantes
29
Departamento de Matematica
Universidad Nacional del Comahue
Vemos que algunos de los objetos de este data frame son de la clase factor. Basi-
camente un objeto de la clase factor es una variable que solo puede tomar un numero
limitado de valores, numericos o no. Este tipo de variables se conocen comovariables
categoricas. Uno puede averiguar que valores puede tomar un objeto de la clase factor
mediante la funcion level( ):
> levels(BaseDatos$Uso.tiera)
[1] "Exlusivo residencial y/o comercial"
[2] "Forestal- Lindero forestal"
[3] "Industrial"
[4] "Quintas"
> BaseDatos$DES<-as.numeric(BaseDatos$DES)
> class(BaseDatos$DES)
[1] "numeric"
Clases de objetos en R
30
Captulo 3
Matrices
> A
[,1] [,2] [,3]
[1,] 1 0 3
[2,] 2 2 1
[3,] 0 -1 -2
> B
[,1] [,2] [,3]
[1,] 3 -1 1
[2,] 1 -2 3
[3,] -1 -1 3
31
Departamento de Matematica
Universidad Nacional del Comahue
3.1.1. Sumar matrices
Habiendo ingresado las matrices A y B, la suma se escribe simplemente como A+B.
El requerimiento para esta realizar esta operacion es que ambas matrices sean del mismo
orden. Las siguientes lneas de codigo permiten calcular la suma de las matrices A y B
a la cual le asigna el nombre C. A continuacion se muestra el resultado.
> C<- A + B
> C
[,1] [,2] [,3]
[1,] 4 -1 4
[2,] 3 0 4
[3,] -1 -2 1
> D<-2*A
> D
[,1] [,2] [,3]
[1,] 2 0 6
[2,] 4 4 2
[3,] 0 -2 -4
1. A + B 3. 2 A 5. 4 B 2 A
2. A B 4. 4 B 6. 3 A + 3 B
32
Departamento de Matematica
Universidad Nacional del Comahue
las matrices, funcionando directamente como varios productos simultaneos de pares de
numeros (como la suma).
Para realizar este producto es necesario hacerlo entre dos matrices de iguales dimen-
siones, obteniendo como resultado otra matriz de la misma dimension1 . No usaremos
este producto a menos que se avise explcitamente. Las siguientes lneas de codigo per-
miten calcular el producto elemento a elemento de las dos matrices A y B ingresadas
anteriormente y denomina E a este producto que se muestra a continuacion.
> E<-A*B
> E
[,1] [,2] [,3]
[1,] 3 0 3
[2,] 2 -4 3
[3,] 0 1 -6
donde aik son los elementos correspondientes a la i-esima fila, k-esima columna de la
matriz A, y bkj corresponde al elemento de la k-esima fila y j-esima columna de la
matriz B , para todo i = 1, , m, k = 1, , n y j = 1, , r.
En R este producto se calcula con el comando %*%. De modo que para calcular el
producto (habiendo cuidado que las dimensiones de las matrices sean adecuadas para
realizar el producto2 ), haremos:
> P<-A%*% B
> P
obteniendo:
33
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 5. Para las matrices A y B del ejercicio 4, calcular
a) A + B d) 4 B 2 A g) B A
b) A B e) A2 h) A2 B 2
c) 2 A f) A B i) (A + B) (A B)
Ejercicio 6. Verificar que, si las matrices ingresadas son cuadradas, aunque es posible
realizar ambos productos A B y B A, en general el resultado no coincide (si coincide,
deje la ciencia y vaya a jugar a la lotera)
3.1.4. Potencias
Al igual que lo que ocurre con el producto * la potencia escrita como A^2 no da
como resultado el producto A A sino que devuelve una matriz cuyos elementos son
los cuadrados de los elementos de A. Las siguientes lneas de codigo permiten calcular
la potencia A2 (potencia elemento a elemento) a la cual le asigna el nombre S y a
continuacion se muestra el resultado.
> S<-A^2
>S
[,1] [,2] [,3]
[1,] 1 0 9
[2,] 4 4 1
[3,] 0 1 4
Para calcular una potencia de A mediante un comando sin tener que desarrollar el
producto matricial es necesario tener instalado el paquete exmp. En el apendice A hay
un instructivo para instalar y cargar paquetes en R.
Una vez instalado y cargado el paquete exmp, la potencia de una matriz se calcula
con A%^%n. Analogamente a lo que dijimos con el producto, cuando nos refiramos a
potencias, hablaremos de potencias elemento a elemento solo cuando se lo diga explci-
tamente. En cualquier otro caso, la potencia tendra el significado usual. Las siguientes
lneas de codigo permiten calcular la potencia A3 (= A A A) a la cual le asigna el
nombre T y a continuacion se muestra el resultado.
>P3<-A%^%3
>P3
34
Departamento de Matematica
Universidad Nacional del Comahue
[,1] [,2] [,3]
[1,] -5 -3 6
[2,] 12 0 9
[3,] -2 -3 -12
a) A2 d) A2 + 2A B + B 2 g) A2 + B 2
b) B 5 e) (A B)2 h) A2 B 2
c) (A + B)2 f) A2 2A B + B 2 i) (A B) (A + B)
> A<-matrix(c(1,0,3,2,2,1,0,-1),ncol=4,nrow=2,byrow=T)
> Tr<-t(A)
> A > Tr
[,1] [,2]
[,1] [,2] [,3] [,4] [1,] 1 2
[1,] 1 0 3 2 [2,] 0 1
[2,] 2 1 0 -1 [3,] 3 0
[4,] 2 -1
35
Departamento de Matematica
Universidad Nacional del Comahue
Si x es un vector, y escribimos x+1003 , R devolvera un nuevo vector al que le ha
sumado 100 a todas las componentes de x.
Se pueden anidar los vectores. Por ejemplo :
> x<-c(1,2,3,4,5)
> n<-c(x,x,x)
> x
[1] 1 2 3 4 5
> n
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
El comando cbind( ) permite tambien agregar una fila o columna a una matriz.
Por ejemplo, para agregar una columna deberemos ingresar la columna que que-
remos agregar, llamemosla e, y escribir cbind(A,e). Supongamos que tenemos
la matriz A de orden 3 4, a la cual queremos agregar como quinta columna al
vector e = (5, 6, 7):
> A<-matrix(c(1,0,3,-1,2,2,1,0,-1,-2,0,3),ncol=4,nrow=3,byrow=T)
> e<-c(5,6,7)
> newmat<-cbind(A,e)
3
Matematicamente este operacion no esta definida porque x es un vector y 100 un escalar, lo que hace
R matematicamente hablando es al vector x sumarle un vector de igual longitud con todos sus
elementos igual a 100
36
Departamento de Matematica
Universidad Nacional del Comahue
> newmat
e
[1,] 1 0 3 -1 5
[2,] 2 2 1 0 6
[3,] -1 -2 0 3 7
Existe asimismo una forma de eliminar una columna (o varias). Por ejemplo, de la
nueva matriz que hemos generado, si queremos eliminar las dos primeras columnas
ponemos:
> m2<-newmat[,-c(1,2)]
> m2
e
[1,] 3 -1 5
[2,] 1 0 6
[3,] 0 3 7
37
Departamento de Matematica
Universidad Nacional del Comahue
> x<-seq(1,6) #desde 1 hasta 6. El incremento (tacito) es 1
> x
[1] 1 2 3 4 5 6
> y<-seq(0,1,0.1) #desde 0 hasta 1, con incremento de 0.1
> y
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Tambien con el mismo comando diag( ) puede construirse una matriz diagonal
enumerando los elementos de la diagonal
> A <- diag(c(3,1,3))
> A
[,1] [,2] [,3]
38
Departamento de Matematica
Universidad Nacional del Comahue
[1,] 3 0 0
[2,] 0 1 0
[3,] 0 0 3
Extraer la diagonal de una matriz o calcular su traza (la suma de los elementos
de la diagonal)
> diag(A)
[1] 3 1 3
> sum(diag(A))
[1] 7
Ejercicio 8. Pensar una manera de agregar una fila a una matriz (o de eliminarla) con
lo que sabe hasta aca. No son necesarios nuevos comandos, con lo que hay alcanza.
Ejercicio 9. En R ingresar un vector x de longitud deseada. Ejecutar el comando
prod(x) y deducir que es lo que hace.
Ejercicio 10. Suponer que A1 y A2 son matrices cuadradas. Que hace el comando
T <- A1\%*\%t(A2)? Haga una pruebita.
3.3.1. Determinante
El comando para el calculo del determinante de una matriz es det(A).
El unico recaudo a tomar es que la matriz ingresada debe ser cuadrada, de cualquier
manera, si uno comete el error de ingresar una matriz inadecuada para este calculo, R
da el mensaje de error (normalmente los mensajes de error se muestran en rojo):
> A<-matrix(c(1,0,3,-1,2,1,0,-2,0,2,3,0),ncol=3,nrow=4,byrow=T)
> det(A)
Error in determinant.matrix(x, logarithm = TRUE, ...) :
x must be a square matrix
39
Departamento de Matematica
Universidad Nacional del Comahue
3.3.2. Inversa
El comando solve(A) da como resultado la inversa de A. Por ejemplo, para la
matriz A de la seccion anterior, tenemos:
> Ai<-solve(A)
> Ai
[,1] [,2] [,3] [,4]
[1,] 0.3333333 0.66666667 0.11111111 -0.5555556
[2,] -0.4166667 -0.08333333 -0.13888889 0.4444444
[3,] 0.1666667 -0.16666667 0.05555556 0.2222222
[4,] -0.1666667 0.16666667 0.27777778 0.1111111
Para que una matriz sea inversible la matriz debe tener determinante distinto de
cero. Aun as se puede ir a ciegas, y si la matriz no tiene inversa, R dara un mensaje
de error informando que la matriz ingresada tiene determinante 0. Por ejemplo:
3.3.3. Rango
El rango es uno de varios atributos de la matriz. Se calcula dentro de otro comando
llamado la descomposicion QR de una matriz. Esta descomposicion devuelve una lista
(la descripcion de cuyos elementos excede el interes de estas notas), de la cual tomaremos
el elemento rango, que aparece siempre bajo el nombre rank. As para el calculo del
rango, la secuencia de comandos es la siguiente:
Comando Accion
A Ingresar la matriz de la cual desea calcularse el rango
la.qr<-qr(A) Calcula la descomposicion QR de A
rango<- la.qr$rank Selecciona el rango de la lista que provee la descomposicion
rango Da el valor del rango calculado
40
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 12. Dadas las siguientes matrices, determinar su rango y su determinante.
Luego, si es posible, hallar la matriz inversa.
2 1 0 0 4 1 2 1
2 0 4 1 2 3 0 2 1 0
D = 2 1 0 1
A = 0 1 1 B = 3 4 1 C = 0 0 2 1 1 1 1 1
3 1 1 2 2 2
0 0 0 2 1 0 1 0
> eigen(A)
$values
[1] 3.0000+0.0000i -2.4348+0.0000i 1.2174+1.8564i 1.2174-1.8564i
$vectors
[,1] [,2] [,3] [,4]
[1,] 0.1193631+0i 0.6273331+0i -0.1105597+0.6189491i -0.1105597-0.6189491i
[2,] 0.5669748+0i -0.1614418+0i 0.6572984+0.0000000i 0.6572984+0.0000000i
[3,] 0.3282485+0i -0.5386974+0i -0.2932687-0.0176686i -0.2932687+0.0176686i
[4,] 0.7460194+0i 0.5386974+0i 0.2932687+0.0176686i 0.2932687-0.0176686i
Si uno desea calcular solo los autovalores, debera pedirlo explcitamente a traves del
argumento only.values:
41
Departamento de Matematica
Universidad Nacional del Comahue
Tipo 1: Intercambiar dos filas (o columnas). Utilizaremos la notacion pij para la
matriz elemental obtenida de intercambiar en la identidad las filas (y columnas)
i y j.
Tipo 2: Multiplicar una fila (o columna) por una constante k 6= 0. La notacion
para esta matriz elemental es mi (k), que indica que la i-esima fila (o columna) de
la matriz identidad ha sido multiplicada por la constante k.
Tipo 3: Sumar a una fila (o columna) un multiplo de otra. Utilizaremos la notacion
tij () para indicar la matriz obtenida de la identidad sumandole a la i-esima fila,
la j-esima fila multiplicada por .
Ejercicio 14. Para el uso de matrices elementales, armar una matriz identidad de
orden 4 4 y construir las siguientes matrices elementales (buscando el recurso que
parezca mas adecuado) a partir de la identidad
Ejercicio 15. Ingresar una matriz A de orden 44 y realizar las siguientes operaciones,
verificando el efecto de premultiplicar y postmultiplicar la matriz A por las matrices
elementales construidas en el tem anterior, sobre las filas y columnas de A.
A E1 A E2 A E3
E1 A E2 A E3 A
Ejercicio 17. Con la matriz B construida en el ejercicio anterior, aplicar las operaciones
elementales E1 , E2 y E3 a sus filas y columnas.
42
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 18. Calcular el determinante y el rango de las matrices resultantes de aplicar
las operaciones elementales a las matrices A y B del Ejercicio 15, y verificar el efecto
de las operaciones elementales sobre filas y columnas de estas matrices sobre ambos
(rango y determinante).
Observacion. El rango es el mismo en todos los casos, es decir, las operaciones elemen-
tales no modifican el rango de la matriz (no modifican la dependencia/independencia
lineal de los vectores). Sin embargo las operaciones elementales s producen cambios en
el determinante: el intercambio de filas produce un cambio de signo en el determinante,
multiplicar una fila por un numero real produce que el determinante resulte multipli-
cado por ese valor, y que si se suma a una fila un multiplo de otra, el determinante no
cambia (analogo columnas).
Para lograr los mismos efectos sin necesidad de recurrir a las operaciones elementales,
las siguientes funciones estan disponibles en R:
Obtener de A una nueva matriz donde una fila sea una la combinacion lineal de dos
se sus filas: fi0 = fi +fj se escribe en forma generica como A[j, ] = alpha*A[i, ]
+ beta*A[j, ]. En particular si queremos sumar a una fila un multiplo de otra,
se debera poner alpha = 1 y elegir beta adecuadamente. Por ejemplo para res-
tar a la segunda fila dos veces la primera haremos lo siguiente (observar que
A[2,1]/A[1,1]=2):
> A[2,]<-A[2,]-A[2,1]/A[1,1]*A[1,]
> A
[,1] [,2] [,3]
[1,] 1 0 3
[2,] 0 2 -5
[3,] 0 -1 -2
43
Departamento de Matematica
Universidad Nacional del Comahue
3.6. Sistemas de ecuaciones
Como R resuelve numericamente las operaciones que se le solicitan, solo se pueden
resolver sistemas compatibles determinados (es decir, con solucion unica). Para ello
basta con ingresar la matriz del sistema, el vector de terminos independientes y usar el
comando solve() para encontrar la solucion. Por ejemplo:
3 2 4 1 w 1
Ejercicio 20. El sistema con la misma matriz que en ejercicio anterior pero con:
6 1
7 2
b=8 y b = 5
9 2
Observacion. En R hay varios paquetes para resolver sistema no lineales del tipo F (x) =
0, donde F : Rp Rp es una funcion no lineal con derivadas parciales continuas.
Ejemplos de estos paquetes son multiroot, rootsolve, nleqslv y BB, pero exceden el
proposito de estas notas. En Mora (2016) puede encontrarse algun detalle del uso de
estos paquetes.
44
Captulo 4
Una ventaja de R comparado con otros paquetes estadsticos con menues y boto-
nes es la posibilidad de programar de una manera sencilla una serie de analisis que se
pueden ejecutar de manera sucesiva. Esto es comun a cualquier otro lenguaje de pro-
gramacion, pero R posee caractersticas muy particulares que hacen posible programar
sin muchos conocimientos o experiencia previa en esta area. Como en otros lengua-
jes, R posee estructuras de control, que son un conjunto de herramientas que permiten
manejar de forma mucho mas elaborada el flujo de ejecucion de nuestros comandos.
Permiten realizar cosas como saltear lneas, repetir lneas, hacer bifurcaciones y mucho
mas. Antes de comenzar con las estructuras de control vamos a hacer un parentesis
para estudiar como funcionan en R los operadores logicos.
45
Departamento de Matematica
Universidad Nacional del Comahue
Los operadores logicos en R son los operadores y conectivos de la logica proposicio-
nal. As, tenemos:
Operadores logicos en R
Expresion logica comando en R
Negacion p !condicion1
Disyuncion pq condicion1 || condicion2
Conjuncion pq condicion1 && condicion2
Implicacion p = q if . . . else if . . . else . . .
46
Departamento de Matematica
Universidad Nacional del Comahue
Observacion. Al plantear una expresion del tipo condicion1 && condicion2, estare-
mos evaluando el cumplimiento simultaneo de ambas condiciones. Esta expresion da
como resultado TRUE s y solo s ambas condiciones son verdaderas. Dependiendo de
las caractersticas de los elementos involucrados en cada condicion, pueden usarse las
variantes &y &&. Por ejemplo
Pero si por ejemplo x e y son dos vectores, las expresion x >= y dara varios resultados,
porque hara la comparacion elemento a elemento de las componentes de los vectores.
Al aplicar el operador logico obtenemos un vector logico con valores TRUE para las
posiciones en las dos comparaciones son verdaderas. El uso de & para comparaciones
con vectores esta sujeto a que las condiciones evaluadas tengan la misma longitud. Si los
vectores no tienen la misma longitud al usar el conectivo &, R simplemente evaluara los
primeros elementos de los vectores logicos e ignorara el resto. En general && es preferido
para usar en los condicionales if o while por ejemplo. Es decir, ante la duda, mejor
usar && en vez de & para evitar errores. Lo mismo ocurre con el conector ||.
4.2. Condicionales
Hay tres tipos de condicionales:
Los que consisten en una condicion que, de cumplirse, desencadena una accion
(por ejemplo, si llueve llevo paraguas).
Los que consisten en una condicion, y si esta se cumple se desencadena una accion
y si no se cumple se desencadena otra (por ejemplo, si hace fro voy en auto y si
no en bicicleta).
Los que chequean varias condiciones encadenadamente y la accion depende de
cual de ellas es verdadera (por ejemplo, me voy a comprar una camisa que este
en un determinado rango de precio; para cada prenda que me gusta chequeo si el
precio cae en el rango deseado, de ser as, la compro).
47
Departamento de Matematica
Universidad Nacional del Comahue
4.2.1. El comando if
Para el caso de los condicionales que consisten en una condicion que, de cumplirse,
desencadena una accion en R se trabaja con el comando if. Este tipo de condicional
se puede representar en un esquema como el siguiente:
48
Departamento de Matematica
Universidad Nacional del Comahue
Por ejemplo, supongamos que queremos calcular las races de una ecuacion de se-
gundo grado. Para que las races sean reales es necesario que (si los coeficientes de la
ecuacion son a, b y c) que el resultado de la operacion b2 4ac sea mayor o igual que
cero. Podemos hacer uso del siguiente diagrama de flujo si queremos calcular las races:
49
Departamento de Matematica
Universidad Nacional del Comahue
> if(3>2){print(Correcto)}
[1] "Correcto"
> if(3<2){print(Incorrecto)}
50
Departamento de Matematica
Universidad Nacional del Comahue
La estructura if/else permite lograr el siguiente flujo:
(
S, comando1
Se cumple la condicion?
No, comando2
> a<-1
> x<-(a^2+5*a^3+100*a^3)/5
> if(x<0){
+ y<-1
+ print(y)
+ } else{
+ y<-0
+ print(y)
+ }
[1] 0
> x
[1] 21.2
Ejercicio 21. Escribir el codigo del ejemplo anterior cambiando las condiciones y ex-
plicar lo que hace.
La sentencia que sigue a else puede ser a su vez una sentencia if, de forma que se
pueden encadenar una serie de secuencias if . . . else if . . . else . . . La estructura
basica de este tipo de condicional es:
51
Departamento de Matematica
Universidad Nacional del Comahue
En el primer caso, se ingresa una terna de numeros. La secuencia logica es la siguiente:
si el primer numero es 10, la variable y toma el valor 0, si la primera componente es
mayor que 10, la variable y toma el valor 1. En cualquier otro caso, la variable y toma
el valor 2.
> x<-c(1,10,100)
> if(x[1]==10){
+ y<-0;
+ print(y);
+ }else if(x[1]>10){
+ y<-1;
+ print(y);
+ }else{
+ y<-2
+ print(y)
+ }
[1] 2
> if(x[2]==10){
+ y<-0
+ print(y)
+ }else if(x[2]>10){
+ y<-1
+ print(y)
+ }else{
+ y<-2
+ print(2)
+ }
[1] 0
> if(x[3]==10){y<-0
+ print(y)}else if(x[3]>10){
+ y<-1
+ print(y)
+ }else{
+ y<-2
+ print(y)
+ }
[1] 1
Ejercicio 22. Analizar la logica la las dos ultimas secciones del codigo anterior
Ejercicio 23. Escribir un codigo para ejecutar el siguiente condicional. Ingresa una
matriz A:
52
Departamento de Matematica
Universidad Nacional del Comahue
Si no es cuadrada, que se escriba el mensaje La matriz ingresada no es cuadrada
Si es cuadrada, calcular el determinante.
Si el determinante es cero, escribir el mensaje La matriz ingresada tiene deter-
minante cero y por lo tanto no tiene inversa
Si el determinante es distinto de cero, calcular la inversa y escribir el resultado
Ingresar varias matrices para ver si el script funciona, probando todos los casos.
Ingresar varias matrices para ver si el script funciona, probando todos los casos.
4.3. Bucles
En programacion, un bucle (tambien llamado loop) es una sentencia (compuesta por
uno o varios comandos) en la que se realiza repetidas veces un segmento de codigo, hasta
que la condicion asignada a dicho bucle deje de cumplirse. Por ejemplo, se sabe que para
buscar los divisores positivos de un numero natural n, basta con chequear si el numero
es divisible por todos los numeros naturales menores o iguales a su raz cuadrada, n
(el lector deducira por que). El bucle en este caso sera as: se toma un numero x y se
calcular la division n/x (y uno se fija si es exacta porque estamos buscando divisores).
Se toma el proximo numero y se repite este procedimiento mientras el divisor x sea
53
Departamento de Matematica
Universidad Nacional del Comahue
menor que n. En el momento en que x toma un valor mayor o igual a n, el proceso
se detiene.
Por ejemplo, para buscar los divisores de 150 probaremos con 1, 2, 3, ... hasta
12 ( 150 12, 25). Otro ejemplo podra ser el siguiente: para cada uno de los primeros
100 numeros naturales probar si es divisible por 3. El proceso va a durar 100 pasos, y
eso lo sabemos a priori.
Los bucles sirven para hacer una accion repetida sin tener que escribir varias veces el
mismo codigo, lo que ahorra tiempo computacional, procesos, deja el codigo mas claro
y facilita su modificacion en el futuro. En R existen dos comandos para realizar bucles,
el comando for y el comando while.
for(variable in secuencia) {
comando1
comando2
...
}
54
Departamento de Matematica
Universidad Nacional del Comahue
La variable i va tomando los valores del 1 al 10 y en cada iteracion se imprime el
cuadrado de i. Notar que al finalizar el bucle, la variable de control i tiene el valor 10,
que es el ultimo valor que tomo en la iteracion, la variable toma los valores del 1 al 10,
no el de los cuadrados.
x<-c(1,2,3,4,5)
for(i in 1:(length(x)-1)){
y<-x[i]+x[i+1]
print(y)
}
while (condicion) {
comando1
comando2
...
}
R ejecuta los comando1, comando2, ... siempre y cuando la condicion tenga el valor
TRUE. Por ejemplo:
> x<-1
> while(x<11){
+ print(x)
+ x<-x+1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
55
Departamento de Matematica
Universidad Nacional del Comahue
[1] 7
[1] 8
[1] 9
[1] 10
> x
[1] 11
f<-5
n<-0
while(f>0.001){
n<-n+1
f<-f/n
print(f)
}
Ejercicio 28. Para una matriz A escribir un codigo que verifique si la matriz es pri-
mitiva siguiendo los pasos a continuacion:
Chequear que la matriz sea cuadrada y que sus elementos no sean negativos, si
se da alguna de las condiciones anteriores escribir un mensaje que indique que la
matriz no puede ser primitiva
Si la matriz es cuadrada y ninguno de sus elementos es negativo, leer su orden y
llamarlo n. Calcular n2 + 3n + 2 y llamarlo T
Calcular A2 y chequear si algun elemento de A es cero.
56
Departamento de Matematica
Universidad Nacional del Comahue
Si ninguno de los elementos es cero, parar y escribir el mensaje La matriz ingre-
sada es primitiva
Si alguno es cero, volver a multiplicar el resultado del producto anterior por A
Repetir el proceso hasta que ningun elemento sea nulo o hasta llegar al lmite T
Si llegados a este punto aun hay elementos nulos escribir el mensaje La matriz
ingresada es no primitiva
4.4. Funciones
Cuando los calculos que queremos realizar son mas complejos, podemos escribir
las instrucciones a ejecutar en una funcion personalizada. Para esto vamos a utilizar el
comando function. Las funciones son almacenadas como un objeto. Tienen argumentos
y estos argumentos podran tener valores por defecto. La sintaxis general sera algo as
como:
> sumar<-function(x,y){
+ x+y
+ }
> sumar(3,12)
[1] 15
La funcion tiene el nombre sumar y toma como argumentos las variables x y y. Una
vez ejecutada, la funcion sumar devuelve la suma de los dos argumentos x e y.
57
Departamento de Matematica
Universidad Nacional del Comahue
Como en las instrucciones de la funcion no existe ninguna condicion para los argu-
mentos, no solo podemos sumar dos numeros, tambien podemos sumar dos vectores de
igual longitud o dos matrices del mismo orden.
> v_1<-c(1,4,3,6,-1,-2,3,2,4)
> v_2<-c(0,0,3,4,-1,4,1,-3,-5)
> sumar(v_1,v_2)
[1] 1 4 6 10 -2 2 4 -1 -1
> A<-matrix(v_1,nrow=3,ncol=3,byrow=T)
> B<-matrix(v_2,nrow=3,ncol=3,byrow=T)
> sumar(A,B)
[,1] [,2] [,3]
[1,] 1 4 6
[2,] 10 -2 2
[3,] 4 -1 -1
Ejercicio 29. Definir en R la funcion sumar del ejemplo y estudiar que ocurre si
> funcion<-function(a){
+ doble<-2*a
+ triple<-3*a
+ a1<-doble+triple
+ a2<-doble-triple
+ return(a1)
+ }
> funcion(4)
[1] 20
58
Departamento de Matematica
Universidad Nacional del Comahue
> doble
Error: Object doble not found
> a1
Error: Object a1 not found
Tambien vemos que si queremos ver los valores de doble o a1 R nos devuelve un
mensaje de Error, diciendo que no encuentra estos objetos. Esto es porque los variables
que se definen dentro de una funcion son locales y solo existen dentro de la funcion.
Incluso el objeto a1, que es el que la funcion devuelve, existe solo dentro de la funcion.
Si queremos guardarlo debemos definirlo:
> b<-funcion(4)
> b
[1] 20
Ejercicio 30. El siguiente codigo, define una funcion que encuentra las races reales de
la ecuacion cuadratica ax2 + bx + c = 0.
raicesCuad<-function(a,b,c){
discriminante<-(b^2)-(4*a*c)
if(discriminante<0){
msj<-la funcion no tiene raices reales
sol<-NULL
} else if(discriminante==0){
msj<-la funcion tiene una sola raz
sol<-(-b+sqrt(discriminante))/(2*a)
}else{
msj<-la funcion tiene dos raices reales
s1<-(-b+sqrt(discriminante))/(2*a)
s2<-(-b-sqrt(discriminante))/(2*a)
sol<-c(s1,s2)
}
return(list(msj, sol))
}
59
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 32. Escribir la funcion mat1 que devuelva una matriz de orden n que cumpla
las siguientes condiciones:
aij = 0
si i = j
aij = 1 si i < j
aij = 1 si i > j
Ejercicio 34. Escribir la funcion primitiva, que verifique si una matriz es primitiva.
donde X es un objeto con dimension distinta de cero, como por ejemplo una matriz,
una lista o un data frame. En el argumento MARGIN es un indice. Si X es una matriz,
MARGIN = 1 indica que la operacion se aplica a las filas mientras que MARGIN = 2 indica
que que la operacion se aplica a las columnas. MARGIN = c(1,2) indica que la funcion
se aplica tanto a filas como a columnas, es decir, a todos los elementos de la matriz.
FUN es la funcion que se aplica y ...se usa para argumentos opcionales de FUN.
Por ejemplo: ingresamos una matriz y aplicamos en primer lugar la suma por filas
y luego por columnas.
60
Departamento de Matematica
Universidad Nacional del Comahue
> filas.suma
[1] 4 5 -3
> col.suma
[1] 3 1 2
En el mismo ejemplo podemos hacer el promedio por filas, el promedio por columnas
usando la funcion mean:
Ejercicio 35. Ingrese una matriz de cualquier orden y calcule las sumas y los promedios
por filas y por columnas.
61
Departamento de Matematica
Universidad Nacional del Comahue
62
Captulo 5
Graficar con R
63
Departamento de Matematica
Universidad Nacional del Comahue
5.1.1. Comandos de alto nivel
En R los comandos de alto nivel, son aquellos que abren una nueva ventana grafica
y crean un grafico nuevo completo. La siguiente tabla presenta algunos de los comandos
graficos mas usados y su uso basico:
La mayora de los comandos utilizados para realizar graficos presentan opciones que
les son comunes, y que permiten adecuar el grafico a las necesidades de cada uno. A
continuacion presentamos algunos.
1
Ver Tabla 5.1
2
Ver Tabla de referencias en http://www.r-project.org o utilizatr el comando colors() en R
64
Departamento de Matematica
Universidad Nacional del Comahue
Figura 5.1: Tabla de referencia de los smbolos usados para graficar puntos.
El comando plot()
> Edad<-c(25, 25, 25, 32, 36, 40, 40, 51, 51, 51, 52, 56, 56, 60, 60, 60, 60)
Puntaje<-c(120, 100, 85, 86, 90, 80, 82, 87, 95, 70, 70, 77, 61, 65, 55, 76, 81)
> plot(Edad,Puntaje)
Tambien podemos usar algunos recursos para la cosmetica del grafico, como son
el ttulo, o los nombres de los ejes:
65
Departamento de Matematica
Universidad Nacional del Comahue
> plot(Edad, Puntaje, pch=3, col=blue, xlab=Edad, ylab=Puntaje,
+ main=Resultado del test segun la edad)
El comando plot() tambien se puede utilizar para construir graficos de lneas para
lo que se utiliza el comando type. Por ejemplo, supongamos que tenemos los siguientes
datos que corresponden al crecimiento en altura de una preparacion de engrudo con
levadura que se dispone en un recipiente graduado, a una temperatura constante. Se
utiliza la altura de la preparacion como medida indirecta de la velocidad de crecimiento.
Se realizaron mediciones de la altura a intervalos regulares de tiempo (cada 5 minutos)
durante una hora. Si bien se tomaron los datos cada cinco minutos, para cualquier
instante de tiempo de la hora de duracion del experimento, haba una altura (aunque
no haya sido medida), y la grafica mas conservadora es la que supone un paso lineal de
una medicion a la siguiente.
> Tiempo<-c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60)
> Altura<-c(5, 7, 8.5, 10, 11.5, 13.5, 14.5, 14.9, 15.2,15.3, 15.4, 15.4, 15.4)
> plot(Tiempo, Altura, type=o, pch=7, col=red, xlab=Tiempo (min),
+ ylab=Altura (cm), main=Altura vs. Tiempo, ylim=c(0,20))
66
Departamento de Matematica
Universidad Nacional del Comahue
El comando hist()
> cobertura<-c(77, 78, 72.75, 77.5, 46.75, 78, 26.25, 43, 66.25, 65.5, 45.75,
+ 58.5, 7.25, 62.25, 66.75, 60.75, 30.75, 47.25, 31.75, 41.25,
+ 46.75, 44, 46.5, 35.25, 58, 57.5, 75.25, 35.25, 60, 57.5, 65,
+ 54, 51.25, 51, 30, 36.75, 81.75, 71.75, 90.75, 76, 76.05, 74,
+ 72.75, 75.25, 84.2, 90.15, 90, 68.25, 38.5, 64.55, 62.25, 68,
+ 72.25, 89, 61.75, 65.05, 69.75, 91.5, 59.8, 66.5, 87.25, 82,
+ 77.5, 88.5, 86, 87.75, 81, 74.25, 70, 65, 64.75, 91.75, 69.3,
+ 65.25, 68, 50.05)
> hist(cobertura, col=blue, xlab = Cobertura, ylab = Frecuencia,
+ main = Cobertura)
67
Departamento de Matematica
Universidad Nacional del Comahue
68
Departamento de Matematica
Universidad Nacional del Comahue
> hist(cobertura, breaks = seq(from=0, to=100, by=5), col = violet,
+ border = blue, xlab = Cobertura, ylab = Frecuencia,
+ main = Cobertura sitio testigo)
Con el argumento border que utilizamos en el codigo anterior se puede cambiar el color
del borde de la barra, por ejemplo: border=blue, o especificar que no se dibuje el
borde: border=FALSE.
Figura 5.7: Grafico obtenido con hist() eligiendo en numero de categoras de otra
forma
El comando barplot()
69
Departamento de Matematica
Universidad Nacional del Comahue
+ border=orange, xlab=Galletita,
+ ylab=Cantidad de ni~nos que la prefieren,
+ main=Cual es la galletita preferida de los ni~
nos?
Hay muchos detalles de cosmetica posibles para las barras, que pueden explorarse
en el Help de R poniendo ?barplot.
El comando pie()
Los graficos de torta (tambien conocidos como graficos circulares) se usan para
representar frecuencias relativas de las observaciones en las diferentes clases o categoras,
previamente establecidas. El comando pie() permite construir graficos de sectores.
Recibe como argumento un vector o tabla con las frecuencias absolutas o relativas
observadas en cada clase.
Por ejemplo, los datos que se presentan en la siguiente tabla corresponden a un
estudio realizado con ninos en edad escolar relacionado con sus costumbres alimentarias
y la influencia de las pautas publicitarias en las decisiones que toman a la hora de gastar
su dinero en el kiosco de la escuela.
70
Departamento de Matematica
Universidad Nacional del Comahue
Horas frente a la TV Snacks Bebidas Lacteos Golosinas Otros
menos de 1 14 8 1 4 6
1a2 10 14 7 8 3
3a4 18 16 12 12 1
5 o mas 24 12 5 13 2
> consumoTV<-matrix(c(14,10,18,24,8,14,16,12,1,7,12,5,4,8,12,13,6,3,1,2),
+ ncol=5, nrow=4)
> filas<-rownames(consumoTV)<-c(<1, 1-2, 3-4, 5+)
> columnas<-colnames(consumoTV)<-c(snacks, bebidas, lacteos,
+ golosinas, otros)
> consumoTV
snacks bebidas lacteos golosinas otros
<1 14 8 1 4 6
1-2 10 14 7 8 3
3-4 18 16 12 12 1
5+ 24 12 5 13 2
El siguiente codigo permite realizar un grafico de torta para la frecuencia relativa del
producto elegido por los ninos (los totales, sin discriminar por la cantidad de horas que
miran television, o sea la suma de los valores de cada columna). Es interesante notar
que uno no necesita ingresar las frecuencias relativas para la construccion de un grafico
de tortas sino que, si se ingresan las frecuencias absolutas (como mostramos en este
caso), R calculara la frecuencia relativa de la categora sobre el total de respuestas.
71
Departamento de Matematica
Universidad Nacional del Comahue
El comando boxplot()
> altura.muj<-c(1.81, 1.78, 1.61, 1.67, 1.57, 1.93, 1.59, 1.75, 1.78, 1.69,
+ 1.85, 1.50, 1.65, 1.88, 1.87, 1.74, 1.77, 1.72, 1.67, 1.70,
+ 1.87, 1.58, 1.62, 1.72, 1.65, 1.59, 1.69, 1.64, 1.75, 1.83)
> altura.hom<-c(1.73, 1.94, 1.95, 1.62, 1.97, 1.84, 1.72, 2.05, 1.90, 2.04,
+ 1.68, 2.02, 2.06, 1.84, 1.65, 1.79, 1.90, 1.76, 1.67, 1.70,
+ 1.67, 1.73, 1.86, 1.99, 1.84, 1.79, 1.74, 1.90, 1.62, 1.78)
> alturas<-data.frame(altura.muj, altura.hom)
> colnames(alturas)<-c(Mujeres, Hombres)
> boxplot(alturas, col=c(pink, lightblue),border=darkgreen,
+ main=Datos estadsticos altura,
+ ylab=Altura (m))
72
Departamento de Matematica
Universidad Nacional del Comahue
En R, por default, la longitud de los bigotes3 del boxplot (las lineas que salen de
la caja central) no es mayor a 1, 5 veces el rango intercuartlico (RIC). Las lineas se
extienden entonces hasta los valores mnimo y maximo de los datos que no sobrepasan
este lmite. El argumento range en la funcion boxplot() permite modificar este lmite,
siendo su argumento un numero real y positivo que determina el factor por el cual se
multiplica el RIC. Los datos que sobrepasan este lmite son los outliers y se identifican
mediante puntos. Si se quiere que se extiendan hasta los valores mnimo y maximo de
los datos debemos escribir el argumento range=0.
3
Muchas veces se usa tambien el vocablo ingles de whisker
73
Departamento de Matematica
Universidad Nacional del Comahue
Algunas opciones para los comandos de bajo nivel
Comando Utilidad
points(x,y) agrega puntos en las coordenadas especificadas en x e y
lines(x,y) igual al anterior pero con lneas
text(x,y,labels,..) agrega el texto en labels en las coordenadas (x,y)
segments(x0,y0,x1,y1) agrega un segmento desde (x0, y0) hasta (x1,y1)
arrows(x0,y0,x1,y1) lo mismo que el anterior pero con flechas
abline(a,b) agrega una recta con ordenada al origen a y pendiente b
abline(h=b) agrega un linea horizontal con ordenada el origen b
abline(v=a) agrega un linea horizontal en la abscisa a
polygon(x,y) dibuja un polgono. Los argumentos x e y deben ser vectores
especificando los vertices del polgono.
axis(side) agrega un eje abajo (side=1), a la izquierda (side=2), arri-
ba (side=3) o a la derecha (side=4)
box() dibuja una marco alrededor del grafico
legend(x,y,...) agrega una leyenda en (x,y) con el texto dado en ...
title() agrega un ttulo
Figura 5.11: Histograma y curva densidad generado con los comandos hist() y lines()
74
Departamento de Matematica
Universidad Nacional del Comahue
5.2. El comando curve()
Los anteriores son, generalmente, graficos que se construyen para mostrar datos o
analisis de datos. R tambien permite dibujar graficas de funciones definidas por ecuacio-
nes. El comando curve( )se utiliza para graficar una funcion continua sobre un rango
especificado de valores Los principales argumentos que ingresan a este comando son:
Por ejemplo, con el siguiente codigo podemos dibujar la funcion f (x) = 1 e(0,5x)
para x en un rango de 1 a 10, superpuesta a la funcion g(x) = sin(x). Para agregar
una curva a un grafico ya existente debemos condicionar la opcion add = TRUE
75
Departamento de Matematica
Universidad Nacional del Comahue
ParametroUtilidad
adj determina la forma en la cual las cadenas de texto (strings) son justi-
ficadas: izquierda (0), centrado (0,5), derecha (1).
ann si se ajusta a FALSE, en las funciones de alto nivel no se realiza anotacion
sobre los ejes, solo se producen ejes con ttulos y graficos.
bg determina el color de fondo.
bty determina el tipo de caja que sera dibujada alrededor de los graficos.
cex valor numerico para especificar la cantidad por la cual el texto y los
smbolos graficos deberan ser escalados en relacion al valor 1.
cex.axis como cex pero para la anotacion sobre los ejes (los ticks).
cex.lab como cex pero para las etiquetas de los ejes.
cex.main como cex pero para los ttulos principales.
cex.sub como cex pero para los subttulos.
col color de los smbolos.
col.axis color para los ticks en los ejes.
col.lab color para las etiquetas de los ejes.
col.main color del ttulo.
col.sub color del subttulo.
fg color de los ejes y borde del grafico.
font tipo de fuente: normal (1), negrita (2), italica (3), italica y negrita (4).
font.axis fuente para los ticks de los ejes.
font.lab fuente para las etiquetas de los ejes.
font.main fuente para los ttulos.
font.sub fuente para los subttulos.
las estilo de las anotaciones en los ejes: paralelo al eje x (por defecto) (0),
horizontal (1), perpendicular al eje (2), vertical (3).
lty tipo de lnea: invisible (0), solida (1), lneas (2), punteada (3), punto y
linea(4), lnea larga (5), dos lneas(6).
lwd ancho de las lneas (1 por defecto) (entero positivo).
mai vector numerico de la forma c(abajo,izquierda,arriba,derecha)
que determina los tamanos de los margenes (en pulgadas).
mfcol, vector de la forma c(nr,nc). Los graficos subsecuentes seran dibujados
mfrow en un arreglo nrnc por columnas (mfcol, los graficos se acomodan por
columnas de izquierda a derecha y de arriba a abajo) o por filas (mfrow).
new si TRUE el siguiente comando de alto nivel no limpiara la ventana ante-
rior, es decir, superpondra el nuevo grafico con el previo.
oma vector de la forma c(abajo,izquierda,arriba,derecha) que deter-
mina el tamano de los margenes exteriores en lineas de texto.
pch smbolo para usar en graficos de puntos.
ps numero entero que determina el tamano de los puntos.
76
Departamento de Matematica
Universidad Nacional del Comahue
Antes de cambiar los parametros puede ser util guardar una copia de los parame-
tros preestablecidos en par() y luego de haber realizado los cambios recuperar los
parametros originales. Para hacer esto basta con escribir el siguiente comando antes de
comenzar:
oldpar<-par(no.readonly=TRUE)
par(oldpar)
77
Departamento de Matematica
Universidad Nacional del Comahue
5.4. El comando layout()
El comando layout() permite dividir la ventana grafica en varias partes en las
cuales se dibujaran los graficos solicitados. El argumento que ingresa a este comando es
una matriz de enteros que indica el numero y orden de las divisiones. Por ejemplo, para
dividir la ventana grafica en cuatro partes iguales podemos usar el siguiente codigo:
> layout(matrix(1:4,2,2))
lo que permitira colocar cuatro graficos ordenados en dos filas y dos columnas. Veamos
un ejemplo. Usemos los datos de la Tabla 5.1 de habitos alimentarios en los ninos que
ingresamos anteriormente y hagamos graficos de barras, uno para cada categora del
tiempo que los ninos pasan frente al televisor. Dos cosas importantes hay que considerar
aqu. Una, la forma en que R va ordenando los graficos en la matriz solicitada. R
ira completando los lugares por columnas de modo que hay que tenerlo en cuenta si
uno desea un orden especfico. Si se desea que el ordenamiento sea por filas, debera
indicarse especficamente, con el argumento byrow=TRUE. Otra cosa importante es que
una vez que se termina de indicar la construccion de este grafico, debe ponerse la lnea
layout(1) porque, de otra manera, R interpretara que todos los graficos a continuacion
deberan disponerse en una pantalla partida. Veamos el ejemplo en el siguiente codigo:
layout(matrix(1:4,2,2,byrow=TRUE))
categorias<-c(S, B, L, G, O)
layout(1)
78
Departamento de Matematica
Universidad Nacional del Comahue
Estos dos argumentos permiten que la division de la salida grafica no sea en partes
iguales. Si se especifica en centmetros debera hacerse mediante el comando lcm(). Para
ver la division que se creo podemos usar el comando layout.show() cuyo argumento
es el numero de ventanas (4 en el ejemplo).
Por ejemplo, las siguientes lneas de codigo producen distribuciones en sectores segun
se muestran en los graficos a continuacion:
79
Departamento de Matematica
Universidad Nacional del Comahue
80
Captulo 6
81
Departamento de Matematica
Universidad Nacional del Comahue
6.1. Modelos discretos. Poblaciones estructuradas
Los modelos matriciales demograficos requieren considerar etapas en el ciclo de
vida de los individuos de la poblacion, bien diferenciadas y criteriosamente elegidas, aun
cuando la vida de cualquier organismo es un proceso continuo. En algunas especies las
etapas estan claramente definidas por las caractersticas del ciclo de vida (por ejemplo
en los insectos: huevo, larva, pupa y adulto), pero en otras, es necesario tomar decisiones
de corte, lo que redunda en una clasificacion de los organismos de la poblacion en
categoras. Las categoras en las que se divide el ciclo de vida estaran desctiptas por
una o varias caractersticas de los individuos, como pueden ser la edad, el tamano, o
la etapa de desarrollo, entre otras. Siendo que esto es una decision que se toma de
acuerdo a las caractersticas de la especie en estudio y que el criterio es una decision
del investigador, no haremos referencia aca a esta cuestion, sino que supondremos que
tenemos una especie cuyo ciclo de vida ha sido separado en etapas adecuadamente
elegidas.
Al analisis de la dinamica poblacional para el caso de este tipo de poblaciones se lo
conoce como estudio de poblaciones estructuradas. Si el criterio de division es la edad,
las poblaciones de dicen estructuradas por edades y las categoras son clases de edad,
mientras que si el criterio es otro, o considera ademas de la edad, otra caracterstica
para la division en categoras, las poblaciones se dicen simplemente estructuradas y las
etapas en las que se divide el ciclo de vida se denominan clases, estados o categoras.
En adelante usaremos estas denominaciones indistintamente.
El centro de cualquier estudio de poblaciones estructuradas esta dado por tres ele-
mentos basicos: una unidad de tiempo (usualmente un ano) que se relaciona con los
procesos demograficos involucrados que gobiernan la dinamica de la poblacion, un vec-
tor nt cuya longitud (numero de componentes) es el numero de categoras en las que
se dividio el ciclo de vida del organismo, usualmente conocido como vector de estado,
y una (o mas de una en algunos casos) matriz cuadrada M , denominada matriz de
proyeccion, cuyo orden coincide con la dimension del vector nt .
Cada elemento del vector representa la cantidad de individuos de la poblacion en
cada categora en el tiempo t. Por su parte, los elementos de la matriz de proyeccion
pueden ser de dos tipos: a) el aporte per capita de individuos de una categora en
el tiempo t a otra categora en el tiempo t + 1, usualmente describiendo el proceso
reproductivo, y b) la probabilidad de transicion de un organismo de una categora a otra,
de t a t + 1, basados usualmente en los procesos de crecimiento y supervivencia. De esta
manera, la matriz de proyeccion M puede pensarse como la suma M = T +F . La matriz
T es una matriz de transiciones, en la que cada elemento tij representa la probablidad de
transicion de un individuo de la categora j a la categora i de una unidad de tiempo a
la siguiente, constituida por los procesos de crecimiento (eventualmente decrecimiento,
82
Departamento de Matematica
Universidad Nacional del Comahue
proceso posible en algun tipo de modelos como veremos mas adelante) y supervivencia
de los individuos. La probabilidad de que un individuo pase de una categora a otra
de una unidad de tiempo a la siguiente se denomina probabilidad de transicion y la
probabilidad que tiene un individuo de permanecer en su categora de una unidad de
tiempo a la siguiente se denomina estasis. Dado que se trata de probabilidades, estos
elementos son siempre valores entre 0 y 1. La matriz F es la matriz de fertilidades
cuyos elementos fij representan los aportes per capita de cada individuo de la clase j
a la clase i que llegan vivos de t a t + 1. Usualmente, los unicos elementos no nulos de
F se ubican en la primera fila, pero las particularidades de algunos modelos podran
hacer que haya elementos no nulos fuera de la primera fila.
Por ejemplo, el siguiente grafico, muestra el ciclo de vida de Lepidocaryum tenue,
una especie de palma cuyas hojas constituyen uno de los materiales mas apreciados
para el techado de casas en el noroccidente de Amazonia (Navarro et al., 2011). El
ciclo de vida de esta especie fue dividido en ocho clases, una de plantulas, otra de
rizomas, dos clases de juveniles y cuatro clases de adultos. En esta planta coexisten dos
tipos de estrategia reproductiva: la reproduccion sexual que conduce a la produccion de
plantulas en unidades per capita para cada individuo adulto en cada una de las clases,
y la reproduccion asexual por rizomas, tambien provenientes de las clases de juveniles
y adultos. De esta manera, habra parametros relacionados con la produccion de nuevos
individuos fuera de la primera fila de la matriz F .
Figura 6.1: Diagrama conceptual del ciclo de vida de Lepidocaryum tenue. Las flechas
indican el aporte (por reproduccion sexual o asexual, por crecimiento, decrecimiento o
permanencia en la clase) entre clases de una unidad de tiempo a la siguiente.
83
Departamento de Matematica
Universidad Nacional del Comahue
La matriz correspondiente a este digrafo se descompone en la suma de las siguientes
dos matrices:
0, 87 0 0 0 0 0 0 0
0 0, 89 0, 02 0 0 0 0 0
0 0, 04 0, 83 0, 05 0 0 0 0
0 0 0, 13 0, 89 0 0 0 0
T = 0
0 0 0, 05 0, 94 0 0 0
0 0 0 0 0, 05 0, 95 0 0
0 0 0 0 0 0, 04 0, 93 0
0 0 0 0 0 0 0, 05 0, 82
0 0 0, 12 0, 18 0, 48 0, 97 1, 79 1, 21
0 0 0 0 0, 00 0, 02 0, 06 0, 03
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
F =
0
0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Aun cuando se haga esta distincion entre los diferentes procesos involucrados, la
matriz que se utiliza en los analisis es la que resulta de la suma de estas dos.
84
Departamento de Matematica
Universidad Nacional del Comahue
ella puede extraerse mucha informacion acerca de esta dinamica a partir del analisis de
determinadas propiedades algebraicas de esta matriz.
Los resultados del analisis del modelo demografico dependeran de las propiedades
y caractersticas de la matriz de proyeccion. Estas propiedades son muy sencillas de
probar y permitiran ofrecer solidez a los resultados presentados. Antes de mencionar
las propiedades que son deseables en la matriz de proyeccion de un modelo demografico,
daremos algunas definiciones:
Un teorema del algebra matricial (enunciado en Caswell 2001) conocido como Teore-
ma de Perron-Frobenius relaciona ciertas propiedades de las matrices con propiedades
y caractersticas de de los autovalores y autovectores de dichas matrices. Este teorema
muestra que, si la matriz de proyeccion es primitiva e irreducible, tiene un autovalor
real y positivo, raz simple del polinomio caracterstico, estrictamente mayor que el va-
lor absoluto del resto de los autovalores, y que tiene asociado un autovector con todas
las componentes positivas. Este autovalor es llamado autovalor dominante, usualmente
denotado como o 0 y el autovector como o 0 . Si bien la mayora de la matrices de
proyeccion son primitivas, es conveniente chequear esto. Lo interesante de este teorema
es que tanto como su autovector asociado tienen interpretacion en terminos de la
demografa de la poblacion cuya dinamica esta representada por esta matriz.1
Otro teorema, conocido como Teorema de Fuerte Ergodicidad (Cohen, 1983) afirma
que si la matriz de proyeccion es primitiva e irreducible, la dinamica a largo plazo
de la poblacion estara descripta por la tasa de crecimiento y con una distribucion
estable que se corresponde con el autovector a derecha asociado a este autovalor, . Es
decir, que independientemente de las condiciones iniciales, si la matriz de proyeccion
es primitiva e irreducible, la poblacion eventualmente se estabilizara en determinadas
proporciones entre las categoras en las que fue dividida, y mantendra un crecimiento o
decrecimiento sostenido, a un ritmo dado por . Mas aun, podemos decir que si > 1
la poblacion crecera, si 0 < < 1 la poblacion decrecera, y si i = 1 la poblacion se
mantendra estatica.
1
El Teorema generaliza a otros casos como el de matrices irreducibles pero no primitivas y a matrices
reducibles. Para un enunciado general ver Caswell (2001), y para la demostracion formal desde el
algebra, puede consultarse Gantmacher (1959), Captulo 13.
85
Departamento de Matematica
Universidad Nacional del Comahue
Un teorema del algebra ofrece herramientas sencillas para evaluar estas propiedades
deseables de la matriz de proyeccion (Gantmacher 1959). Dice que si A Rnn es una
matriz no negativa (esto es, si sus complonentes son mayores o iguales que cero), se
puede mostrar que:
86
Departamento de Matematica
Universidad Nacional del Comahue
la matriz de elasticidades, una matriz cuyos elementos son sensibilidades propor-
cionales, y se interpretan como el aporte relativo que cada proceso demografico
tiene en la constitucion de la tasa de crecimiento poblacional3 . Como la suma de
los elementos de esta matriz es 1, las elasticidades pueden agruparse para calcular
la importancia relativa de cada proceso en la tasa de crecimiento poblacional,
el damping ratio, cuya traduccion es algo as como tasa de amortiguacion, que
es una medida de la velocidad con la que la poblacion converge al equilibrio des-
pues de una perturbacion o, dicho de otra manera, describe como las oscilaciones
de un sistema decaen despues de un disturbio. Segun Caswell (2001) puede consi-
derarse como una medida de la resiliencia intrnseca de la poblacion. Este valor,
usualmente notado con la letra griega , se define como el cociente entre el auto-
valor dominante y el valor absoluto del siguiente autovalor (ordenados en orden
decreciente de magnitud). Mientras mas grande es con respecto a los otros au-
tovalores, mas rapida sera la convergencia, es decir, mas rapidamente la poblacion
volvera a la estabilidad.
nt+1 = M (t) nt
donde los elementos de M (t) son los valores de los parametros en cada tiempo t.
Hay basicamente dos tipos de estocasticidad. Una generada por variaciones ambien-
tales, es decir, situaciones en las que las variaciones de algunas variables ambientales
generan variaciones en la respuesta de la poblacion a dichas condiciones, y consecuen-
temente la variacion de los parametros demograficos. A este tipo de estocasticidad se
lo conoce como estocasticidad ambiental. Otro tipo de estocasticidad, la estocasticidad
demografica, se refiere ya no a la influencia de la variabilidad ambiental en la variacion
de los parametros, sino a la variabilidad propia de los organismos en su respuesta a
3
Idem
87
Departamento de Matematica
Universidad Nacional del Comahue
las mismas condiciones ambientales. Sucintamente podemos mencionar algunas formas
en que la estocasticidad puede ser incluida en la simulacion numerica de los modelos
demograficos. Por ejemplo: los parametros pueden variar en funcion de variables ex-
ternas, de modo que en cada iteracion se calcula el valor del parametro en funcion de
esa o esas variables; o en cada iteracion del modelo, los parametros pueden ser elegidos
aleatoriamente dentro de un conjunto de parametros posibles, provenientes de diferen-
tes estimaciones en condiciones de campo. Alternativamente, son las matrices las que
pueden ser ingresadas aleatoriamente (o no) en cada iteracion del modelo. Veremos un
ejemplo de esto con el paquete PopBio. Tambien, la estocasticidad puede ser incor-
porada en distintas corridas del programa, tomando los parametros del modelo de la
distribucion cuyos parametros son los elementos ingresados en la matriz. Veremos esto
mas adelante para ser aplicado con el paquete Rramas.
88
Departamento de Matematica
Universidad Nacional del Comahue
6.3. El paquete PopBio
89
Departamento de Matematica
Universidad Nacional del Comahue
de cada clase a la clase diametrica 1. El elemento de la primera fila, primera columna
(0, 9) es la suma de la probabilidad de permanencia en la clase diametrica 1 (0, 4) y la
tasa per capita de produccion de nuevos nidos producidos por nido de la clase diametrica
1 (0, 5) que se encuentran activos al muestreo siguiente. Analogamente los elementos
correspondientes a la primera fila y la segunda y tercera columnas. Hay dos elementos
interesantes de destacar en este ejemplo. El primero es el que corresponde a la fila 3
columna 1. Se trata de la probabilidad de que un nido de tamano chico se convierta
en un nido de tamano grande en una unidad de tiempo (es decir, individuos que se
saltean una categora, cosa que no podra pasar, por ejemplo, en categoras de edades).
El otro elemento interesante es el que corresponde a la fila 2 columna 3. Se trata de
la probabilidad de que un nido de tamano grande se transforme en uno de tamano
mediano de una unidad de tiempo a la siguiente. En este caso, el valor 0, 33 indica que
aproximadamente uno de cada tres nidos disminuye su tamano, lo cual puede ocurrir
por roturas en la estructura del domo.
90
Departamento de Matematica
Universidad Nacional del Comahue
demas autovalores, este comando sera suficiente, pero si se desea conocer los demas,
pueden calcularse sencillamente con el comando eigen( ).
Un recurso adicional interesante para ver la evolucion, las eventuales oscilaciones
de los tamanos poblacionales y la velocidad con la que se alcanza la estabilidad, es el
comando pop.projection. Este comando permite proyectar una cantidad determinada
de unidades de tiempo un vector inicial, calcula cada vez el tamano poblacional (suma
de las componentes del vector poblacional en cada t) y calcula la tasa de crecimiento
de la poblacion de una unidad de tiempo a la siguiente. En pop.projection ingresan
como argumentos la matriz de proyeccion, un vector inicial y un tiempo lmite para la
proyeccion (ver ejemplo mas abajo). La salida da como resultado tres tems:
91
Departamento de Matematica
Universidad Nacional del Comahue
$stable.stage
chicos medianos grandes
0.6455214 0.2168786 0.1376000
$sensitivities
chicos medianos grandes
chicos 0.5452808 0.1832003 0.1162326
medianos 0.7208187 0.2421765 0.1536504
grandes 0.9970994 0.3349997 0.2125427
$elasticities
chicos medianos grandes
chicos 0.2952258 0.11020918 0.13984582
medianos 0.1300885 0.08158524 0.03050277
grandes 0.1199665 0.05038207 0.04219410
$repro.value
chicos medianos grandes
1.000000 1.321922 1.828598
$damping.ratio
[1] 9.331949
$stable.stage
chicos medianos grandes
0.6455214 0.2168786 0.1376000
$stage.vectors
0 1 2 3 4 5 6
chicos 5 19.50 31.3000 51.98800 86.40410 143.62686 238.74995
medianos 5 5.95 10.4690 17.45523 29.02767 48.25458 80.21377
grandes 5 3.90 6.6745 11.07984 18.41775 30.61559 50.89216
7 8 9 10 11 12
chicos 396.87305 659.7205 1096.6510 1822.9587 3030.2973 5037.252
medianos 133.33911 221.6491 368.4465 612.4672 1018.1018 1692.387
grandes 84.59785 140.6267 233.7632 388.5837 645.9411 1073.745
92
Departamento de Matematica
Universidad Nacional del Comahue
13 14
chicos 8373.404 13919.078
medianos 2813.248 4676.452
grandes 1784.883 2967.004
$pop.sizes
[1] 15.00000 29.35000 48.44350 80.52306 133.84952
[6] 222.49704 369.85588 614.81001 1021.99633 1698.86061
[11] 2824.00953 4694.34029 7803.38399 12971.53550 21562.53408
$pop.changes
[1] 1.956667 1.650545 1.662206 1.662251 1.662292 1.662296 1.662296
[8] 1.662296 1.662296 1.662296 1.662296 1.662296 1.662296 1.662296
93
Departamento de Matematica
Universidad Nacional del Comahue
0 100
similitudes y diferencias.
94
Departamento de Matematica
Universidad Nacional del Comahue
matrices, una lista de dos o mas matrices de proyeccion.
prob, vector de probabilidades con los pesos usados para seleccionar las matrices
de proyeccion. Por default todas las matrices tienen la misma probabilidad de ser
seleccionadas. Si se elige ingresar probabilidades diferentes para el sorteo de cada
matriz debera tener en cuenta que la longitud de este vector tiene que ser igual al
numero de matrices ingresadas, y que la suma de las componentes debe ser uno.
Si este vector no se ingresa, se supone que las probabilidades son iguales.
maxt, numero de iteraciones que corre el modelo, por default 50000.
verbose, si TRUE, imprime un comentario partiendo del tiempo 1, 10000, 20000,
etc. (para usuarios ansiosos).
Popbio cuenta tambien con la funcion stoch.projection que permite simularla va-
riacion poblacional estocastica a largo plazo utilizando tecnicas de seleccion de matrices
(no de sus parametros) a partir de un conjunto de 2 o mas matrices de proyeccion y
de un vector de estado inicial. La funcion requiere como input una lista de matrices de
proyeccion (al menos dos) y un vector de poblacion inicial. Por defecto, se dan valores
razonables para el numero de pasos de tiempo (iteraciones) y probabilidades de selec-
cion (por defecto se suponen identica y uniformemente distribuidas). Si la probabilidad
de elegir las matrices no es uniforme, se debera indicar explcitamente. Los argumentos
para la funcion stoch.projection son los siguientes:
95
Departamento de Matematica
Universidad Nacional del Comahue
prob, vector de probabilidad usado para seleccionar las matrices de proyeccion.
Por default prob= NULL indica que la seleccion de las matrices es equiprobable,
pero puede ingresarse una probabilidad diferente para la seleccion de cada matriz.
nmax, numero maximo de individuos que la proyeccion de la poblacion no puede
exceder. Por default se considera que no hay densodependencia.
sumweight, vector de unos y ceros usado para omitir clases cuando se chequea la
densidad.
threshold, por default es la suma de los individuos de todas las clases.
verbose, si TRUE, imprime un comentario partiendo del tiempo 1, 10000, 20000,
etc. Si verbose=FALSE omite esta accion.
Para ilustrar este ejemplo utilizaremos datos de L. Jofre (datos no publicados) que
estudio la dinamica poblacional de hormigas cortadoras de hojas en la provincia de
San Luis. Tomaremos el ejemplo de Acromyrmex striatus. Los muestreos se llevaron
a cabo en tres anos consecutivos. Aun cuando los parametros estimados presentaron
diferencias entre muestreos, no se registraron variaciones en las condiciones ambientales
que pudieran explicar las variaciones en los parametros. En este caso suponemos que se
debe a la estocasticidad demografica, debida a la respuesta diferencial de los organismos
a las mismas condiciones ambientales. Al igual que en el caso anterior el estudio focaliza
en la dinamica de nidos, aunque en esta especie la clasificacion se realizo teniendo en
cuenta el numero de bocas de entrada al nido, ya que sus hormigueros no poseen domo.
Segun la bibliografa, el numero de entradas del nido es un buen estimador de la edad de
la colonia: una colonia de un ano tiene en promedio una o dos entradas, raramente tres;
del segundo al quinto ano, se abren una o dos nuevas entradas al ano, estabilizandose a
partir de entonces. En los muestreos realizados, el numero de entradas vario de 1 a 12
bocas, permitiendo definir las siguientes categoras: 1, hasta 2 bocas (nidos incipientes,
chicos); 2, de 3 a 5 bocas (nidos medianos); y 3, mas de 5 bocas (nidos grandes).
El muestreo consistio en censos de nidos en el area de de estudio. En el primer
muestreo se marcaron y se registro el tamano de cada uno de los nidos segun el cri-
terio explicado anteriormente. En los muestreos consecutivos se determino el numero
de nuevos nidos (que se marcaron), y se evaluo el estatus de cada uno de los nidos
marcados en el censo anterior, determinando su estado de actividad (activo/inactivo) y
el numero de bocas para estimar la transicion de una categora a otra o la permanencia
en la misma. A partir de los datos del primer al segundo ano se construyo una matriz
de proyeccion (que llamaremos M1 ) y de la transicion del segundo al tercer ano se cons-
truyo una nueva matriz (que llamaremos M2 ). Dado que no hay variaciones ambientales
que puedan explicar la variacion de los parametros en las matrices, supondremos que
pueden sucederse aleatoriamente. Es decir, vamos a asumir que la probabilidad de que
la dinamica de la poblacion en tiempo cualquiera este gobernada por M1 o por M2
96
Departamento de Matematica
Universidad Nacional del Comahue
es identica. Si en cambio esta probabilidad estuviera gobernada por la ocurrencia del
algun suceso ambiental (sequas, lluvias abundantes, etc., la probabilidad de eleccion
de M1 o M2 ya no sera la misma y debera ingresarse un vector de probabilidades que
indique cual es la probabilidad de elegir cada una.
Para nuestro ejemplo las matrices que ingresaremos, M1 y M2 , son las siguientes:
1, 0714 1, 2 2, 611 1, 214 1 2, 5
M1 = 0, 0476 0, 2 0 M2 = 0, 01 0, 64 0, 11
0 0, 2 0, 77 0 0, 01 0, 778
Veamos como ingresar el codigo y los resultados que produce (recordar que es nece-
sario tener cargado el paquete popbio):
Con esto tendremos una idea de las tasas de crecimiento poblacional que tendramos
en cada caso (en el caso estocastico si la seleccion de matrices es equiprobable, no
deberamos encontrarnos con un valor muy lejos de su promedio).
Cabe resaltar que el comando eigen.analysis devuelve una lista con seis tems
como mencionamos anteriormente. Con los corchetes despues del comando le decimos
a R que solo nos muestre el primer elemento de la lista.
A continuacion tenemos el codigo y los resutados para la funcion stoch.growth.rate:
97
Departamento de Matematica
Universidad Nacional del Comahue
> stochlambda <-stoch.growth.rate(matrices, prob = NULL,
+ maxt = 50000, verbose=F)
> stochlambda
$approx
[1] 0.1876534
$sim
[1] 0.1877923
$sim.CI
[1] 0.1874055 0.1881790
> lambdasT<-exp(stochlambda$approx)
> lambdasT
[1] 1.206415
> lambdasSim<-exp(stochlambda$sim)
> lambdasSim
[1] 1.206583
Los resultados difieren al nivel del tercer decimal, indicando que las dos estimaciones
son una buena aproximacion de la tasa estocastica de crecimiento poblacional.
En este caso lo que hicimos fue estimar la tasa estocastica de crecimiento poblacional
suponiendo que la probabilidad de elegir una u otra matriz era la misma. Veamos ahora
como proceder si las matrices tienen distinta probabilidad de ser elegidas. En el ejemplo
supondremos que la matriz M1 tiene una probabilidad de 0, 2 de ser elegida, mientras
que (y por consiguiente) M2 tiene una probabilidad de 0, 8 de ser elegida. Ponemos a
continuacion el codigo y la salida. Lo unico que difiere en este codigo con respecto al
anterior es que esta explcito el vector de probabilidades que pondera la seleccion de
las matrices.
$sim
98
Departamento de Matematica
Universidad Nacional del Comahue
[1] 0.1990805
$sim.CI
[1] 0.1987677 0.1993933
> lambdasunT<-exp(stochlambdaun$approx)
> lambdasunT
[1] 1.220034
> lambdasunSim<-exp(stochlambdaun$sim)
> lambdasunSim
[1] 1.22028
$sensitivities
chicos medianos grandes
[1,] 0.7090767 0.02828226 0.009504417
[2,] 1.5631786 0.06241711 0.021275004
[3,] 4.2852847 0.17104117 0.057774529
$elasticities
chicos medianos grandes
[1,] 0.80725837 0.03124044 0.024299817
[2,] 0.04698548 0.02548103 0.001153615
[3,] 0.00000000 0.01886984 0.044711409
99
Departamento de Matematica
Universidad Nacional del Comahue
> #para el caso equiprobable
> xeq<-stoch.projection(matrices, n,tmax = 10, nreps=100)
> #para el caso probabilidades distintas
> xuneq<-stoch.projection(matrices, n, tmax = 10, nreps=100,
+ prob=c(0.3,0.7))
En cada caso, R ofrece como salida una matriz donde se listan los tamanos po-
blacionales finales por categora, en una iteracion por fila. Mostramos algunos de los
elementos de esta salida con el cmando head
> head(xeq)
[,1] [,2] [,3]
[1,] 466.9161 22.76925 8.618470
[2,] 569.3201 18.90981 5.677893
[3,] 532.7046 17.65547 6.177397
[4,] 507.1682 25.01928 7.634614
[5,] 588.1950 14.94251 4.057426
[6,] 536.3023 25.68421 5.486742
> head(xuneq)
[,1] [,2] [,3]
[1,] 554.2425 25.81822 3.600351
[2,] 562.0988 26.52539 4.242825
[3,] 539.5838 26.82945 6.753096
[4,] 538.6408 25.81836 5.287973
[5,] 499.5156 24.53442 9.165383
[6,] 504.4360 23.64760 5.141194
100
Departamento de Matematica
Universidad Nacional del Comahue
> sd1<-sd(xeq[,1])
> mediaeq2 <- mean(xeq[,2])
> sd2<-sd(xeq[,2])
> mediaeq3 <- mean(xeq[,3])
> sd3<-sd(xeq[,3])
> medias<-c(mediaeq1,mediaeq2,mediaeq3)
> desvios<- c(sd1,sd2,sd3)
> medias
[1] 545.003040 20.407754 5.295302
> desvios
[1] 49.696992 4.939786 2.425870
101
Departamento de Matematica
Universidad Nacional del Comahue
obtenida para este estudio es la siguiente:
0 0 0 0 0,07
0 0 0 0 0,42
P = 0,72 0 0,76 0
0
0 0,72 0 0,9 0
0 0 0,9 0,05 0,099
A traves del comando plot( ) puede obtenerse adicionalmente una grafica de barras
de la distribucion estable de edades y del vector de valores reproductivos, y una colorida
representacion del digrafo del modelo.
Con la funcion projectn( ) se puede proyectar una poblacion inicial en el tiempo.
Este comando puede usarse tanto para el caso determinstico como estocastico. Para el
caso determinstico los argumentos a ingresar para esta funcion son los siguientes:
102
Departamento de Matematica
Universidad Nacional del Comahue
La salida dara una matriz que tiene por filas la unidad de tiempo y la abundancia
poblacional total para esa unidad de tiempo dentro de la simulacion. A partir de ella se
puede graficar la evolucion de la poblacion en el tiempo a partir de esa proyeccion, con
el comando plot. En el comando plot, la instruccion sum=FALSE produce un grafico
de la evolucion de todas las clases por separado, mientras que si sum=TRUE, el grafico
muestra solo la proyeccion de la poblacion total.
lambda: 1.02
reproductive value:
US OS UJ OJ A
1.000 0.121 1.416 0.171 4.084
sensitivities:
US OS UJ OJ A
US 0.014 0.084 0.039 0.507 0.204
OS 0.002 0.010 0.005 0.061 0.025
UJ 0.020 0.119 0.055 0.718 0.289
OJ 0.002 0.014 0.007 0.087 0.035
A 0.057 0.344 0.159 2.070 0.834
103
Departamento de Matematica
Universidad Nacional del Comahue
%
elasticities:
US OS UJ OJ A
US 0.000 0.00 0.000 0.000 0.014
OS 0.000 0.00 0.000 0.000 0.010
UJ 0.014 0.00 0.041 0.000 0.000
OJ 0.000 0.01 0.000 0.076 0.000
A 0.000 0.00 0.014 0.010 0.810
> plot(sorbus)
Figura 6.3: Digrafo del ciclo de vida (izquierda), estructura estable (centro)y valores
reproductivos (derecha) para S.aucuparia
104
Departamento de Matematica
Universidad Nacional del Comahue
Time Abundance
1 0 50
2 1 47
3 2 47
4 3 48
5 4 49
6 5 51
Un detalle a considerar es que el paquete Rramas no permite editar los ttulos de los
graficos y de los ejes, los cuales son incluidos automaticamente (por esa razon en estos
ejemplos aparecen en ingles).
105
Departamento de Matematica
Universidad Nacional del Comahue
6.4.3. El caso estocastico con Rramas
Rramas tambien permite evaluar la estocasticidad demografica y ambiental a traves
del comando projectn( ). Este comando permite correr varias (muchas) simulaciones
de una proyeccion de una cantidad de unidades de tiempo definida (en el caso que
veremos se haran 1000 simulaciones de 20 unidades de tiempo). Da como resultado un
valor mnimo, maximo, medio, y medio mas/ menos un desvo estandar de la proyeccion
de la poblacion. La funcion projectn( ) realiza proyecciones demograficas llamando
repetidamene (tantas veces como lo indica el argumento time) a project1. Si la esto-
casticidad ambiental o demografica no se requiere, project1 simplemente multiplicara
la matriz de proyeccion por el vector de estado poblacional con las abundancias en
cada clase. Si se incorpora la estocasticidad ambiental, project1 llamara a la funcion
estdemo que en cada iteracion asignara abundancias a cada clase basadas en una dis-
tribucion binomial y una poisson. El muestreo a partir de rbinom asignara chances de
supervivencia a cada individuo contabilizado en el vector de abundancias, es decir,
permitira a algunos de ellos permanecer en el mismo estado o pasar a otro. El muestreo
a partir de rpois (con media mij ) asignara al azar un numero de nuevos individuos per
capita para cada individuo del estado j por tipo de estado i. En el paquete Rramas
hay actualmente disponibles tres opciones para generar estocasticidad demografica. Por
default (stmat=NULL and fecundity1=TRUE) las probabilidades en la primera fila de la
matriz de proyeccion (es decir, mat[1,j]) se supone que representan solo fecundidades,
es decir no hay supervivencia ni otras transiciones desde otros estados, solo recluta-
miento. Esto significa que estas probabilidades solo seran usadas como la media para
el muestreo con rpois. Los elementos de las otras filas (excepto la primera) se supone
que representan solo valores de supervivencia (y por lo tanto son valores entre cero y
uno y, de acuerdo con esto, seran empleados para el muestreo con binom 6 . Si son
valores mayores o iguales que uno, se supondra que representan fecundidades y seran
empleadas para el muestreo con rpois. Esto es claramente una limitacion para estos
analisis porque, por ejemplo en el caso que presentamos de S. aucuparia hay dos filas
con valores de fecundidad y en ambos casos los valores son menores que 1. De modo
que para este ejemplo no puede usarse la funcion projectn( ) del paquete Rramas.
En esta funcion si stmat=NULL y fecundity1=FALSE, los elementos de la matriz de
proyeccion son tratados todos de la misma manera, es decir, los valores menores o igua-
les que 1 seran muestreados con binom y para los valores mayores o iguales que 1 sera
empleada rpois. Si el usuario provee una matriz stmat con todos los valores entre 0 y 1,
6
Recordemos que la distribucion binomial es una distribucion para muestreos discretos que describe el
numero de exitos en n realizaciones independientes de un experimento que tiene probabilidad de exito
p. Puede tomar cualquier valor entero entre 1 y n, lo que permitr calcular una proporcion de exitos
sobre el numero de ensayos, mientras que la distribucion poisson tiene una interpretacion analoga pero
el resultado posible es cualquier valor entero mayor o igual que 0.
106
Departamento de Matematica
Universidad Nacional del Comahue
esta sera usada para dividir los elementos de la matriz de proyeccion mat[1,j] en fecun-
didades (mat[1,j]*stmat[i,j]) y transiciones (mat[1,j]- (mat[1,j]*stmat[i,j]))
y estas matrices seran usadas para muestrear con binom y rpois respectivamente. La
implementacion actualmente disponible de estdemo supone que la reproduccion tiene
lugar antes del calculo de la probabilidad de supervivencia, de modo que aun para los
individuos que no sobreviviran (de acuerdo con la probabilidad binomial sorteada) su
descendencia se calcula y se contabiliza. Si se requiere considerar la estocasticidad am-
biental (es decir si el usuario provee una matriz matsd, project1 llamara a la funcion
estambi que para cada unidad de tiempo cambia el ijesimo elemento de la matriz de
proyeccion mat[1,j] a partir de una distribucion normal con media mat[1,j] y desvo
estandar sd=matsd[1,j]. Si equalsign=TRUE los cambios aleatorios en los elementos
de la matriz de proyeccion tendran el mismo signo y la misma magnitud (relativa a
cada elemento individual sd=matsd[1,j]). Si equalsign=FALSE cada probabilidad de
transicion cambiara independientemente. Si se quiere incluir tanto estocasticidad de-
mografica como ambiental, project1 llamara primero a estambi (es decir, primero
se considerara la estocasticidad ambiental) y, usando la matriz modificada, llamara a
estdemo (es decir, la estocasticidad demografica se incluira en segundo lugar).
Este paquete tambien permite la inclusion de parametros de manejo. Estos deben
ser provistos a traves de un vector o una matriz. En el caso mas simple (es decir,
en el que los parametros de manejo vienen dados por un vector), cada elemento del
vector sera interpretado como la accion de manejo que sera aplicada en cada paso de
tiempo a la clase correspondiente. En este vector pueden incluirse valores positivos o
negativos, que representaran respectivamente la introduccion o extraccion de individuos
en el correspondiente estado. Aquellos elementos cuyo valor absoluto sea mayor o igual
que 1 seran interpretados como la introduccion o extraccion (de acuerdo a su signo) de
un numero exacto de individuos, mientras que aquellos cuyo valor absoluto sea menor
que 1 seran interpretados como la introduccion o extraccion de un porcentaje de los
individuos presentes. Por ejemplo: si en uno de los elementos del vector ponemos 3, se
interpretara que se incorporan 3 individuos en esa categora. Si en cambio, el elemento
es 0, 1, se interpretara que se extrae el diez por ciento de los individuos presentes en
esa categora. Si las decisiones de manejo se proveen como una matriz, en cada paso de
tiempo, las acciones de manejo estaran representadas por cada columna de la matriz,
y seran aplicadas secuencialmente desde la primera hasta la ultima.
Las funciones project1, estdemo y estambi devuelven un vector de abundancias
de individiuos en cada estado de la misma longitud que v0. La funcion project1 de-
vuelve un objeto de clase rmas, basicamente una lista con cuatro elementos, vn con lon-
gitud igual a nrep (numero de simulaciones), donde cada elemento representa una repli-
ca de la simulacion que consiste en una matriz de dimensiones [length(v0), time],
representando la abundancia en cada estado en cada tiempo. Si la simulacion incluye
acciones de manejo, harvest sera una lista de longitud nrep donde cada uno de los
107
Departamento de Matematica
Universidad Nacional del Comahue
elementos representa la trayectoria de cosecha en una replica de la simulacion y con-
siste en una matriz de dimensiones [length(v0), time] que representa el numero de
individuos extrados en cada estado en cada tiempo. Los otros dos elementos, mat y
management son respectivamente la matriz de proyeccion y la matriz de manejo em-
pleadas en las simulaciones. El comando plot dibujara la trayectoria demografica de la
poblacion. Por default sum = TRUE, mean=FALSE, por lo que se graficara la abundan-
cia de la poblacion total (es decir, la suma de las abundancias en todos los estados).
Si nrep>1 dibujara juntas las trayectorias de cada replica. Si sum = TRUE, mean=TRUE
graficara la media de todas las replicas. Si sum = FALSE, mean=TRUE graficara la abun-
dancia media de todas las replicas para cada estado vs. el tiempo. El comando summary
dara una tabla con el valor maximo, mnimo, media mas / menos un desvo estandar de
la abundancia de la poblacion para todas las simulaciones y un un grafico de abundancia
en funcion del tiempo para todas las simulaciones.
Veamos un ejemplo sencillo. La matriz que utilizaremos en este ejemplo esta mo-
dificada del trabajo de de Torres Curth et al (2012) que estudian la dinamica de una
poblacion del arbusto nativo Fabiana imbricata en un ambiente temporalmente varia-
ble. El ciclo de vida de la planta fue dividido en cuatro categoras: P 1: plantulas (de
menos de un ano), P 2: plantas de entre uno y dos anos, J: Juveniles (plantas de tronco
lignificado, de mas de dos anos pero sin estructuras reproductivas) y A: Adultos. Si
bien los autores proponen cuatro matrices en el trabajo, utilizaremos una sola de ellas
para desarrollar el ejemplo.
> summary(fabiana)
transition matrix fabiana
lambda: 1.074
108
Departamento de Matematica
Universidad Nacional del Comahue
stable stage distribution:
stage.1 stage.2 stage.3 stage.4
0.770 0.143 0.070 0.017
reproductive value:
stage.1 stage.2 stage.3 stage.4
1.000 5.370 14.417 90.263
sensitivities:
stage.1 stage.2 stage.3 stage.4
stage.1 0.190 0.035 0.017 0.004
stage.2 1.021 0.190 0.093 0.022
stage.3 2.742 0.511 0.251 0.059
stage.4 17.166 3.197 1.571 0.369
elasticities:
stage.1 stage.2 stage.3 stage.4
stage.1 0.00 0.00 0.000 0.190
stage.2 0.19 0.00 0.000 0.000
stage.3 0.00 0.19 0.061 0.000
stage.4 0.00 0.00 0.190 0.179
> plot(fabiana)
Figura 6.6: Digrafo del ciclo de vida (izquierda), estructura estable (centro) y valores
reproductivos (derecha) para F. imbricata
109
Departamento de Matematica
Universidad Nacional del Comahue
Ahora corremos una simulacion para proyectar una poblacion inicial dada por el
vector v0 para 20 unidades de tiempo, y graficamos la proyeccion por clases y para la
abundancia total, con el siguente codigo:
Time Abundance
1 0 40
2 1 515
3 2 407
4 3 303
...
20 19 909
21 20 975
Las figuras siguientes muestran la proyeccion de la poblacion a partir del vector inicial
v0 por clases y total
110
Departamento de Matematica
Universidad Nacional del Comahue
> summary(simu20.ds)
Time Minimum -1 S.D. Average +1 S.D. Maximum
1 0 40 40.00 40.00 40.00 40
2 1 458 491.73 514.85 537.97 607
3 2 229 326.73 422.01 517.29 683
4 3 100 214.94 318.41 421.88 557
5 4 33 113.83 212.89 311.95 489
...
20 19 6 525.03 1033.00 1540.97 2465
21 20 1 542.05 1073.63 1605.21 2423
111
Departamento de Matematica
Universidad Nacional del Comahue
112
Departamento de Matematica
Universidad Nacional del Comahue
> summary(p1)
114
Captulo 7
Ecuaciones Diferenciales. El
paquete deSolve.
la especificacion de los tiempos en los que queremos conocer el estado del modelo,
la integracion de las ecuaciones del modelo,
la representacion grafica de los resultados del modelo.
115
Departamento de Matematica
Universidad Nacional del Comahue
7.1. Ecuaciones Diferenciales Ordinarias
En estas notas nos concentraremos en ecuaciones diferenciales (ED) ordinarias de
primer orden y en sistemas de ecuaciones diferenciales ordinarias de primer orden.
Para empezar hablemos brevemente de las soluciones. Las soluciones computacionales
a las ED son soluciones numericas, y son siempre soluciones especficas, es decir, solo
pueden ser generadas para valores particulares de los parametros y para condiciones
iniciales especficas. Obviamente, como todo metodo numerico, la solucion de ED puede
presentar problemas, como demandar tiempos computacionales grandes si las ED son
complicadas, o tener errores de redondeo en los calculos. Sin embargo, aunque no tienen
la elegancia de las soluciones analticas, muchas veces son las unicas o las mas facilmente
accesibles, y son suficientes para el objetivo que se proponen. Hay una enorme variedad
de metodos numericos para resolver ED. El paquete deSolve incorpora dos diferentes
algoritmos que se llaman con los comandos lsoda y rk4, que tienen la misma sintaxis,
aunque lsoda es mas preciso. En estas notas usaremos este comando. La sintaxis general
de lsoda es la siguiente:
donde yinit representa el estado inicial, times es una lista de los tiempos en los cuales
el algoritmo calculara el estado del sistema, func es la ecuacion diferencial y parms es
la lista de los valores de los parametros.
Al momento de escribir el codigo de la ecuacion diferencial hay que tener en cuenta
la sintaxis en la que debe estar definida la funcion:
donde times son los puntos de integracion, yinit es el estado inicial y parms es un
vector o lista de parametros. La funcion devuelve una lista cuyo primer elemento es un
vector que tiene como elementos las derivadas de la variable y con respecto a los tiempos
en times. Las derivadas deben estar definidas en el mismo orden que las variables en
el estado inicial yini. Apliquemos este comando a la solucion numerica de la ecuacion
logstica. El modelo de crecimiento logstico tiene la forma:
dy y
= r y(1 )
dt K
donde y = y(t) es el tamano de la poblacion en el instante t, r es la tasa intrnseca de
crecimiento poblacional, y K es la capacidad de carga del ambiente.
Primero debemos cargar el paquete deSolve. Esto lo podemos hacer con el comando
library(deSolve) o en la interfaz de RStudio en la pestana de paquetes.
116
Departamento de Matematica
Universidad Nacional del Comahue
Empezamos definiendo los parametros del modelo, las variables de estado con sus va-
lores iniciales. Todos estos datos deben ser definidos como vectores con sus respectivos
nombres y valores:
> library(deSolve)
> state1<-c(y=10) # Estado inicial
> times1<-seq(0,20,1/24) #20 dias en intervalos de una hora
> parameters1<-c(K=500,r=0.3) #vector con los valores de los parametros
El argumento func requiere que la funcion sea ingresada como una nueva funcion
(que aca llamaremos logistic):
> logistic<-function(times,state,parameters){
+ y<-state[1] #estado inicial
+ K<-parameters[1]
+ r<-parameters[2]
+ dy<-r*y*(1-y/K)
+ res<-dy
+ list(res)
+ }
Este formato puede ser usado para cualquier ecuacion diferencial, especificando el
modelo deseado (aca es dy<-r*y*(1-y/K). El unico recaudo que hay que tomar es
que exista coherencia entre el nombre de la variable de estado (en este caso y) y su
derivada (en este caso dy). Una vez que esto se hizo, la solucion puede ser calculada, y
almacenada en un objeto de la clase deSolve.
Es importante notar que la funcion logistic es una funcion dentro de otra fun-
cion (lsoda). Ambas usan los argumentos state, times y parms. El objeto solution
contiene una columna llamada time y una columna con el correspondiente tamano po-
blacional (aqu contiene solo el valor de la variable y). Estos numeros pueden ser usados
para graficar la solucion:
117
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 40. Modificar el script anterior para distintos valores de r, manteniendo fijo
el valor de K, y graficar todas las curvas en un mismo grafico, para analizar el efecto
de la tasa intrnseca de crecimiento poblacional sobre la forma de la curva solucion del
modelo
Ejercicio 41. Modificar el script anterior para los modelos representados por las si-
guientes ecuaciones diferenciales y graficar en un mismo grafico con distintos parametros
para hacer comparaciones:
dy
a) dt
=k
dy
b) dt
= ry
dy
c) dt
= r(K y)
Ejercicio 42. Un modelo emprico sobre el crecimiento de tumores esta regido por la
siguiente ecuacion diferencial:
dN
= k.N.eat
dt
donde a y k son constantes positivas y N representa el volumen del tumor.
a) Dar diferentes valores a los parametros k y a para ver como modifican el creci-
miento del tumor.
b) Graficar
c) Que parametro convendra modificar con farmacologa para hacer que el tumor
desaparezca?
118
Departamento de Matematica
Universidad Nacional del Comahue
7.2. Modelos con retardo
El modelo de crecimiento logstico supone que la variacion poblacional se ve amorti-
guada por el efecto de la densidad. En tanto mas proximo esta el tamano de la poblacion
de la capacidad de carga, mas chica sera la tasa instantanea de cambio de la poblacion.
Uno de los supuestos de este modelo es que la respuesta de la tasa de crecimiento de la
poblacion a la densidad es instantanea. Sin embargo, la mayora de las veces, el efecto
de la densidad (o a cualquier otro factor limitante) se muestra con un cierto tiempo de
retardo. Las ecuaciones diferenciales donde la variacion de la variable de estado y(t)
depende en cada instante t no solo de y(t) sino tambien de los valores de y en algun
tiempo anterior a t se conocen como ecuaciones diferenciales como retardo(ODER).
Otro tipo de modelos con retardo (que no veremos aqu) es aquel en el que la derivada
depende no solo del valor de la funcion sino tambien del valor de la derivada en en tiem-
pos anteriores. La teora de estos tipos de ecuaciones diferenciales es bastante compleja,
y hay varios problemas con sus soluciones. Un texto bastante amigable para ahondar en
este tema y sus complejidades es Soetaeret al. (2012). Otro texto que trabaja este tema
desde el punto de vista de los modelos en sistemas biologicos Murray(1993), un clasico
de los modelos matematicos en biologa. Consideraremos aqu modelos de la forma:
dy
= f (y(t), y(t ))
dt
donde es una constante positiva que representa el tiempo de retardo. Usualmente este
tiempo de retardo es constante (aunque podra no serlo). El problema (desde el punto
de vista matematico y numerico) es ya suficientemente complejo con tiempos de retardo
constantes, de modo que nos abocaremos solo a este tipo de modelos. Un enfoque po-
pular para la implementacion de de las soluciones numericas de ODER es simplemente
extender codigos para resolver las EDO con funciones que permitan recuperar valores
de la funcion en tiempos pasados. En R la aplicacion dede del paquete deSolve per-
mite resolver estos modelos. Para que un codigo utilizado para resolver una EDO sea
adecuado para esta tarea, tiene que ofrecer una salida que permita estimar los valores
de la variable dependiente (y/o su derivada) en puntos arbitrarios en el intervalo de
integracion. Esto es necesario para evaluar soluciones pasadas. Estos valores pasados
de la funcion y sus derivadas estaran disponibles a traves de las funciones lagvalue
y lagderivs, respectivamente. Una version simplificada de la sintaxis de esta funcion
es:
119
Departamento de Matematica
Universidad Nacional del Comahue
La funcion dede es similar a ode. El argumento t de las funciones lagvalue y
lagderiv representa los puntos en los cuales la funcion y la dervivada seran requeri-
dos, mientras que nr representa la posicion de la variable. Si nr no es especificado R
devolvera los valores de todas las variables. Consideremos el siguiente ejemplo, tomado
de Soetaeret al. (2012), Captulo 7. Se trata de la EDOR:
dy
= y(t 1)
dt
donde y(t) = 1, para t en el intervalo [1, 0]. Buscamos una funcion cuya derivada
dependa del valor de la funcion en t 1. En este caso = 1. El codigo a continuacion
permite buscar la solucion numerica de esta EDOR. El comando if-else da acceso a
los valores historicos de la funcion. La funcion lagvalue extrae los valores pasados
de la funcion en cada punto requerido.
> DDE1<-function(t,y,parms){
+ tau<-parms
+ tlag<-t-tau
+ if(tlag<=0){ ylag <- 1 } else { ylag <- lagvalue(tlag) }
+ list(dy = - ylag, ylag = ylag)
+ }
> yinit <- 1
> times <- seq(from = 0, to = 100, by = 0.1)
> yout1 <- dede(y = yinit, times = times, func = DDE1,
+ parms = 1)
> yout2 <- dede(y = yinit, times = times, func = DDE1,
+ parms = 2)
> par(mfrow=c(1,2))
> plot(yout1, lwd = 2, main = tau = 1,
+ xlab=Tiempo, ylab = "y", mfrow = NULL,
+ which = 1)
> plot(yout2, lwd = 2, main = tau = 2, xlab=Tiempo,
+ ylab = "y", mfrow = NULL, which = 1)
120
Departamento de Matematica
Universidad Nacional del Comahue
dy (y )
= r y(1 )
dt K
donde y = y(t) es el tamano de la poblacion en el instante t, r es la tasa intrnseca
de crecimiento poblacional, K es la capacidad de carga del ambiente y es el tiem-
po de retardo (recordar que debemos tener cargado el paquete deSolve). Tomemos el
siguiente ejemplo (citado en Soetaeret al.2012), que corresponde a la dinamica pobla-
cional de los lemmings, una especie de roedores que habitan en las tundras, en la taiga
y en las praderas articas. Se reproducen muy rapido y generan poblaciones muy gran-
des, y como respuesta a las altas densidades que generan migran en masa en busqueda
de otros lugares para vivir. La respuesta de la poblacion a la densidad se observa con
cierto retardo, como lo expresa la EDOR anterior. Veamos a continuacion el codigo y la
salida grafica para este ejemplo, considerando las siguientes condiciones: el valor inicial
es y = 19,001, el tiempo de retardo es = 0,74, r = 3,5 y K = 19. Para cualquier t < 0,
y(t) = 19:
121
Departamento de Matematica
Universidad Nacional del Comahue
> #resolvemos el modelo
> yout <- dede(y = yinit, times = times, func = derivada,
+ parms = NULL, atol = 1e-10)
> # graficamos los resultados
> plot(yout, which = 1, type = l, lwd = 2,
+ main = Modelo de Lemming, mfrow = c(1,2), xlab = Tiempo)
> plot(yout[,2], yout[,3], xlab = y, ylab = dy, type = l, lwd = 2)
Figura 7.3: Solucion numerica de la ecuacion logstica con retardo, para = 0,74. A la
derecha la variacion de la derivada de y(t) con respecto a y(t).
122
Departamento de Matematica
Universidad Nacional del Comahue
7.3. Sistemas de Ecuaciones Diferenciales Ordina-
rias Lineales
A diferencia de las ecuaciones diferenciales estudiadas en los las secciones anteriores,
consideremos ahora la situacion en la que disponemos de una variable independiente t
y dos o mas variables dependientes x1 = x1 (t), x2 = x2 (t),.... xn = xn (t), de manera
que tendremos el sistema descripto por las siguientes ecuaciones diferenciales:
dx1
= f1 (t, x1 , x2 , ..., xn )
dt
dx2
= f2 (t, x1 , x2 , ..., xn )
dt
...
dxn
= fn (t, x1 , x2 , ..., xn )
dt
En estos casos diremos que se trata de un sistema de ecuaciones diferenciales ordi-
narias (SEDO). Obviamente los sistemas pueden ser lineales o no, y en el segundo caso
rara vez tienen solucion analtica. Diremos que los SEDO son autonomos si dependen
solo de las variables dependientes x1 = x1 (t), x2 = x2 (t),.... xn = xn (t), y no explci-
tamente de la variable independiente t. En estas notas solo nos ocuparemos de SEDO
autonomos. En este contexto, trabajaremos con problemas de valores iniciales, es decir,
buscaremos soluciones numericas de SEDO autonomos, conocidas condiciones iniciales
para las variables.
A continuacion veremos como implementar un problema de valor inicial a traves
del ejemplo de las ecuaciones de Lorentz, un SEDO autonomo lineal. Estas ecuaciones
fueron las primeras en describir la dinamica de un sistema de caos (para detalles ver
Soetaeret al. 2012). El modelo de Lorentz describe la dinamica de un sistema represen-
tado por tres variables X, Y y Z, que se supone que representan el comportamiento
idealizado de la atmosfera terrestre.Las variables se refieren a la distribucion horizontal
y vertical de la temperatura, y el flujo convectivo respectivamente. Los parametros a,
b y c propuestos por Lorenz toman los valores 8/3, 10 y 28 respectivamente. Las
ecuaciones del modelo son las siguientes:
dX
= aX + Y Z
dt
dY
= b(Y Z)
dt
dZ
= XY + cY Z
dt
123
Departamento de Matematica
Universidad Nacional del Comahue
con las siguientes condiciones iniciales X(0) = Y (0) = Z(0) = 1, y a, b y c son los
parametros del modelo. Para buscar la solucion del modelo, primero debemos definir
los parametros que deben ser ingresados como un vector con sus respectivos nombres y
valores, al igual que los valores iniciales:
Las ecuaciones del modelo deben ser especificadas en una funcion (que en este caso
llamaremos Lorentz) que calcula la tasa de cambio de las variables de estado. Los
argumentos de la funcion son el tiempo del modelo (t), y los valores de las variables
de estado (state) y los parametros, en este orden. Esta funcion sera requerida por n
el comando ode que resuelve ecuaciones diferenciales ordinarias. Lo queremos saber del
modelo es como cambian las variables de estado con el tiempo,por lo que requeriremos
que la funcion nos devuelva esas las tasas de cambio en una lista.
> lorentz<-function(times,state,parameters){
+ # estados iniciales
+ X<-state[1]
+ Y<-state[2]
+ Z<-state[3]
+ # parametros
+ a<-parameters[1]
+ b<-parameters[2]
+ c<-parameters[3]
+ #tasas de cambio
+ dX<-a*X+Y*Z
+ dY<-b*(Y-Z)
+ dZ<--X*Y+c*Y-Z
+ # devolver tasa de cambio
+ list(c(dX,dY,dZ))
+ }
> times2<-seq(0,100,by=0.01)
Para encontrar la solucion numerica usamos la funcion ode del paquete deSolve, que
es la rutina de integracion por defecto. La funcion ode requiere como argumento:
124
Departamento de Matematica
Universidad Nacional del Comahue
y: el vector de estado,
times: los tiempos en los que queremos conocer los estados del modelo,
func: la funcion que usamos para modelar la tasa de cambio,
parms: los parametros del modelo.
La funcion ode devuelve un objeto de la clase deSolve: una matriz que contiene los
valores de las variables de estado (en las columnas) a los tiempos indicados.
> solution2<-ode(state2,times2,lorentz,parameters2)
> head(solution2)
time X Y Z
[1,] 0.00 1.0000000 1.000000 1.000000
[2,] 0.01 0.9848912 1.012567 1.259918
[3,] 0.02 0.9731148 1.048823 1.523999
[4,] 0.03 0.9651593 1.107207 1.798314
[5,] 0.04 0.9617377 1.186866 2.088545
[6,] 0.05 0.9638068 1.287555 2.400161
Para graficar los resultados en este caso en el que tenemos mas de una variable
dependiente. vamos a hacer uso de un metodo especialmente disenado para graficar
objetos de la clase deSolve, que distingue el numero de variables y genera un grafico
con respecto al tiempo para cada una de ellas, ordenandolas en filas y columnas. Como
en este caso las variables son 3 queda un espacio en el margen inferior derecho que
vamos a utilizar para graficar la variable Z con respecto a X. El comando par permite
especificar diferentes parametros del grafico, en este caso vamos a usar la opcion oma
para ensanchar el margen superior y poder escribir un ttulo al conjunto de graficos.
Para representar graficamente usamos un metodo disenado especialmente para graficar
objetos de la clase deSolve, que ordena los graficos en dos filas y dos columnas. Para
incrementar el margen superior con el comando oma de tal forma que nos permita
escribir un ttulo a los graficos con mtext. Primero todas las variables son representadas
graficamente con respecto al tiempo (time) y luego la variable Z con respecto a X.
> par(oma=c(0,0,2,0))
> plot(solution2,xlab=time,xlim=c(0,100), lty=1)
> plot(solution2[,X], solution2[,Z], pch=,, xlab=X, ylab=Z)
> mtext(outer=TRUE, side=3, Lorentz, cex=1)
125
Departamento de Matematica
Universidad Nacional del Comahue
126
Departamento de Matematica
Universidad Nacional del Comahue
el vector (F (x, y), G(x, y)) es un vector tangente a dicha orbita. El conjunto de vecto-
res (F (x, y), G(x, y)) se llama campo de direcciones del sistema. Particularmente nos
interesaran las isoclinas del sistema, aquellas curvas donde alguna de las derivadas se
anula, es decir donde dxdt
= 0 o dy
dt
= 0. Un punto (x0 , y0 ) en el plano de fases que verifica
que F (x0 , y0 ) = G(x0 , y0 ) = 0 se denomina punto crtico o un punto de equilibrio del
sistema.
Uno de los aspectos que interesan al estudio de los SEDO, es la estabilidad de
los equilibrios, es decir, como difieren las soluciones bajo pequenas perturbaciones de
las condiciones de equilibrio. Sin recurrir a definiciones formales, diremos un punto
crtico es un equilibrio estable si una trayectoria que esta cerca del punto de equilibrio,
se mantendra cerca a lo largo del tiempo, y es asintoticamente estable, cuando las
trayectorias cercanas no solo se mantienen cerca, sino que se aproximan al punto de
equilibrio a lo largo del tiempo. Cuando las trayectorias que empiezan cerca del punto de
equilibrio se alejan de este punto a lo largo del tiempo, estaremos frente a un equilibrio
inestable. Cuando todas las trayectorias tienden al punto crtico cuando t , se dice
que el punto (x0 , y0 ) es un sumidero o atractor y cuando salen de el, o sea cuando todas
las trayectorias se alejan del punto crtico cuando t , se dice que es una fuente o
repulsor. Cuando se mantienen cerca, pero sin tender asintoticamente, se llaman centros.
El analisis de equilibrios en los planos de fase tiene dos objetivos principales: estudiar
la disposicion de las trayectorias cerca del punto crtico, y estudiar la estabilidad o
inestabilidad del punto crtico. En funcion del comportamiento de las trayectorias en
relacion con el punto crtico, este se denominara: nodo, punto de silla, foco o centro.
Para la evaluacion analtica de la calidad del un equilibrio, se debe construir la
matriz Jacobiana del sistema: F F
x y
G F
x y
donde las derivadas parciales de las funciones F (x, y) y G(x, y) son evaluadas en cada
punto de equilibrio. De acuerdo a los valores de la traza y el determinante de esta matriz
y a caractersticas de sus autovalores se puede determinar de que tipo de equilibrio se
trata. Muy resumidamente digamos que si la traza de la matriz Jacobiana es negativa y
su determinante positivo, el equilibrio sera estable. Para detalles y cuestiones formales
sobre los tipos de equilibrios ver, por ejemplo Hirsh and Smale (1974).
Cada punto del plano de las fases o bien es un punto crtico o bien por el pasa
una unica trayectoria. Las propiedades cualitativas de las orbitas nos permiten ob-
tener informacion sobre el comportamiento de las soluciones del sistema. Cada tra-
yectoria del plano de fases representa infinitas soluciones del sistema autonomo: esto
es, si (x(t), y(t)) es una solucion del sistema, entonces para cada c R se tiene que
(x(t + c), y(t + c)) es otra solucion. Tambien sabemos que dos trayectorias carecen de
puntos comunes y que trayectorias cerradas corresponden a soluciones periodicas, esto
127
Departamento de Matematica
Universidad Nacional del Comahue
es que si (x(t), y(t)) es una solucion del sistema que en t0 y t0 + T toma el mismo valor,
entonces (x(t), y(t)) = (x(t + T ), y(t + T )) para todo t. Muchas veces es posible obtener
las trayectorias descriptas por las soluciones de un sistema autonomo, sin necesidad de
obtener explcitamente dichas soluciones.
Existen hoy en da muchos paquetes de software para ayudar en la solucion numerica
de los SEDO, como lo hace el paquete deSolve. Sin embargo, existen metodos como
los de diagramas o planos de fase que permiten un analisis cualitativo de las propiedades
del sistema sin la necesidad de una integracion numerica. Especficamente, es general-
mente posible determinar el comportamiento a largo plazo del sistema para cualquier
condicion inicial, a traves de un procedimiento grafico junto con un analisis algortmi-
co. Un diagrama de fases permite visualizar las soluciones de un sistema dinamico. En
particular puede ser util para ver si existen soluciones periodicas o para visualizar el
tipo de estabilidad de los puntos de equilibrio del sistema.
Actualmente hay unos pocos programas disponibles para la aplicacion de los meto-
dos de planos de fase. Varios applets de Java estan disponibles en Internet para la
ejecucion de los metodos de planos de fase. Sin embargo, varan ampliamente en cali-
dad y a menudo tienen dificultades cuando se enfrentan a sistemas complejos. En R,
esta disponible el paquete phaseR que puede utilizarse para identificar y clasificar los
puntos de equilibrio, representar que los campos de direccion, as como las isoclinas, y
permite anadir trayectorias para condiciones iniciales especificadas por el usuario, para
sistemas de ecuaciones diferenciales autonomos uni y bi dimensionales. Los sistemas
autonomos se caracterizan porque no dependen explcitamente en la variable indepen-
diente t. El paquete phaseR hace uso de paquetes de R disponibles para la busqueda de
soluciones numericas a ODEs con el fin de asegurar la maxima estabilidad de la etapa
de integracion requerido, aunque no nos ocuparemos de este aspecto en estas notas.
Analizaremos brevemente el uso de planos de fase para SEDO autonomos de una y dos
dimensiones. Tanto para sistemas uni- como bidimensionales, los metodos de planos de
fase permiten trazar trayectorias facilmente, y analizar el comportamiento a largo plazo
de un sistema, clasificacando sus equilibrios. A continuacion veremos de que manera
se puede utilizar phaseR para llevar a cabo tales analisis utilizando varios comandos
simples.
128
Departamento de Matematica
Universidad Nacional del Comahue
nullclines, que grafica las isoclinas. Tambien puede ser usado para graficar
lneas horizontales en los puntos de equilibrio para sistemas unidimensionales,
numericalSolution, que resuelve numericamente sistemas bidimensionales para
una condicion inicial dada, via el paquete deSolve, y a partir de esto grafica la
variable dependiente vs. la variable independiente. As se comporta como un atajo
para el comando deSolve facilitando su implementacion y subsequente grafico,
phasePortrait, que grafica el plano de fases para sistemas unidimensionales, es
decir la derivada vs. la variable dependiente. Ademas, agrega flechas al eje de la
variable dependiente de donde puede deducirse empricamente la estabilidad de
los equilibrios,
stability, que clasifica los puntos de equilibrio,
trajectory, que grafica trayectorias en el plano xy buscando soluciones numeri-
cas con deSolve para el sistema dado. Las condiciones iniciales pueden ser espe-
cificadas como argumento o pueden elegirse haciendo click con el cursor sobre el
grafico preexistente.
> logisticP<-function(times,y,parameters){
+ r<-parameters[1]
+ K<-parameters[2]
+ dy<-r*y*(1-y/K)
+ res<-dy
+ list(res)
+ }
129
Departamento de Matematica
Universidad Nacional del Comahue
Lo que hace esta funcion es sencillo: dados t, y y un vector de parametros, simple-
mente devuelve una lista cuyos elementos son los valores de la derivada de la funcion
ingresada, para todos los valores dados en t. A partir de esta funcion procederemos
al analisis que deseamos hacer. Para ello consideraremos el caso particular r = 1 y
K = 2. El siguiente codigo crea la figura siguiente, con el campo de direcciones, varias
trayectorias y lneas horizontales en los equilibrios:
> logistic.flowField<-
+ flowField(logisticP, x.lim=c(0,5), y.lim=c(-1,3),
+ parameters=c(1,2), points = 21,
+ system = one.dim, add=FALSE, xlab=t, ylab = y)
> grid()
> logistic.nullclines<-
+ nullclines(logisticP, x.lim = c(0,5), y.lim = c(-1,3),
+ parameters = c(1,2), system = one.dim)
> logistic.trajectory<-
+ trajectory(logisticP, y0 = c(-0.5, 0.5, 1.5, 2,5), t.end = 5,
+ parameters = c(1,2), system = one.dim, colour = rep(black, 4))
Figura 7.5: Campo de direcciones (flechas) y trayectorias (curvs negras) para el modelo
logstico con r = 1 y K = 2. Las lneas rojas (horizontales) en y = 0 e y = 2 corres-
ponden a los dos equilibrios de la ED. Las curvas corresponden a las trayectorias del
sistema para distintas condiciones iniciales (crculos blancos).
De la figura anterior, podemos deducir que hay dos puntos de equilibrio para el
sistema que son (aparentemente) y = 0 e y = 2 lo cual puede confirmarse analticamente
haciendo y 0 = 0. Segun lo que se observa, podra decirse que el equilibrio y = 0 es
inestable mientras que y = 2 es estable. Para corroborar esto, se puede utilizar el
codigo que transcribimos a continuacion, que permite construir la figura siguiente.
130
Departamento de Matematica
Universidad Nacional del Comahue
> logistic.phasePortrait <- phasePortrait(logisticP, y.lim = c(-0.5, 2.5),
+ parameters = c(1,2), points = 10)
> grid()
Esto completa el analisis del plano de fase del modelo de crecimiento logstico. Hemos
identificado con exito que para este modelo, si la condicion inicial es y0 > 0 (lo cual
debe ser ocurrir para que el modelo tenga sentido fsico), el sistema se aproximara a
la lnea y = 2, independientemente de la condicion inicial exacta. El paquete phaseR
proporciona una herramienta amigable y veloz para chequear o llevar a cabo los analisis,
utilizando unas pocas lneas de codigo, lo cual llevara tiempo hacer a mano!.
131
Departamento de Matematica
Universidad Nacional del Comahue
7.4.3. Sistemas dinamicos autonomos bidimensionales
Como mencionamos en la seccion 7.4, un sistema dinamico autonomo bidimensional
puede ser escrito como un sistema de ecuaciones diferenciales ordinarias (SEDO) como
sigue:
dx
= F (x, y)
dt
dy
= G(x, y)
dt
donde x = x(t) e y = y(t). Como ejemplo para el analisis cualitativo de este tipo
de sistemas usaremos el modelo de Lotka-Volterra, que describe la interaccion de dos
especies, una depredadora y otra presa. En esta version (de las mas simples), la presa
se supone con crecimiento exponencial en ausencia del depredador y el depredador con
decrecimiento exponencial en ausencia de la presa, y la interaccion esta descripta por el
termino que contiene el producto xy. Esto hace que el modelo sea no lineal, y no tiene
solucion analtica. Las ecuaciones que describen el modelo son:
dx
= .x .xy
dt
dy
= .x .xy)
dt
Nuevamente, primero debemos especificar las funciones, que llamamos lotkaVolterra:
132
Departamento de Matematica
Universidad Nacional del Comahue
dos derivadas y tambien acepta a y como un vector de argumentos. Ahora focalizaremos
en el caso particular = 2, = 1, = 3 y = 2. En primer lugar calcularemos las
isoclinas haciendo cero ambas derivadas y buscaremos los equilibrios (donde ambas
derivadas son simultaneamente nulas). Las isoclinas son x = 0 e y = 2 para x0 = 0,
y y = 0 y x = 2/3 para y 0 = 0. Por lo tanto los unicos equilibrios para el sistema
son los puntos (0, 0) y (2/3, 2). Evaluando el determinante de la matriz Jacobiana en
estos puntos, tenemos que (0, 0) es un punto de silla (el determinante es negativo) y
(2/3, 2) es un centro (el determinante es 0). Analogamente a lo que hicimos con el
modelo unidimensional, graficaremos las isoclinas, los campos de pendientes, y varias
trayectorias a partir del siguiente codigo, lo que conduce a la figura que ponemos a
continuacion:
Figura 7.7: Campo de pendientes (flechas), isoclinas (lneas rojas y azules)y varias
trayectorias (negras) para el modelo de Lotka- Volterra. Cada curva representa la tra-
yectoria del sistema para distintas condiciones iniciales (cruclos blancos)
133
Departamento de Matematica
Universidad Nacional del Comahue
> loktaVolterra.stability.1 <-
+ stability(loktaVolterra, y.star = c(0,0), parameters = c(2, 1, 3, 2))
dP
dt
=k
134
Departamento de Matematica
Universidad Nacional del Comahue
dP
dt
= rp
dP
dt
= r(K p)
se pide:
r1 = 1; r2 = 1; k1 = 4; k2 = 1; 11 = 4; 12 = 1, 21 = 7; 22 = 1
135
Departamento de Matematica
Universidad Nacional del Comahue
propia densidad en un tiempo previo t 1 , con capacidad de carga K. Las presas son
capturadas por los depredadores (y)a una razon per capitaa que se supone proporcional
a los valores actuales de los tamanos poblacionales de depredadores y presas. A su vez, el
depredador vara su poblacion con una tasa de mortalidad d proporcional a la densidad
actual y aumentando la variacion de su propia densidad por efecto de depredacion con
una eficiencia b, proporcional a la cantidad de individuos capturados y a los presentes
en ambas poblaciones en en un tiempo previo t 2 . El sistema de ecuaciones quedara
escrito de la siguiente manera:
dx x(t 1 )
= r x(t) 1 a x(t) y(t)
dt K
dy
= a b x(t 2 ) y(t 2 ) d y(t)
dt
El codigo a continuacion muestra la implementacion de la solucion numerica de este
sistema.
> library(deSolve)
> LVdede <- function(t, y, param) {
+ # parametros del sistema
+ r<-param[1]
+ K<-param[2]
+ a<-param[3]
+ b<-param[4]
+ d<-param[5]
+ tau1<-param[6]
+ tau2<-param[7]
+ # condiciones del retardo
+ if (t > tau1) {Lag1 <- lagvalue(t - tau1)} else {Lag1 <- yini}
+ if (t > tau2) {Lag2 <- lagvalue(t - tau2)} else {Lag2 <- yini}
+ #ecuaciones diferenciales
+ dy1 <- r * y[1] *(1 - Lag1[1]/K) - a*y[1]*y[2]
+ dy2 <- a * b * Lag2[1]*Lag2[2] - d*y[2]
+ list(c(dy1, dy2))
+ }
> # definimos los parametros, el estado inicial y los tiempos
> param<-c(r = 1, K = 1, a = 2, b = 1, d = 1,
+ tau1 = 0.2, tau2 = 0.2)
> yini <- c(y1 = 0.2, y2 = 0.1)
> times <- seq(from = 0, to = 200, by = 0.01)
> yout<- dede(func = LVdede, y = yini,
+ times = times, parms = param)
136
Departamento de Matematica
Universidad Nacional del Comahue
> #graficamos los resultados
> plot(yout[,-1], type = "l", xlab = Presa, ylab = Depredador)
137
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 47. Suponga que las siguientes ecuaciones diferenciales representan el pro-
greso de una enfermedad epidemica de acuerdo al modelo SIS, donde la poblacion de
individuos susceptibles es y1 (t) y la de infectados y2 (t):
dy1
= y1 (t).y2 (t 1) + y2 (t 10)
dt
dy2
= y1 (t).y2 (t 1) + y2 (t)
dt
y para t 0 se tiene y1 (t) = 5, e y2 (t) = 0,1.
Se pide:
138
Referencias Bibliograficas
139
Departamento de Matematica
Universidad Nacional del Comahue
Jofre LE. Dinamica poblacional de hormigas cortadoras de hojas: efecto de los sitios de
nidificacion sobre la mortalidad y el crecimiento de nidos en dos especies del genero
Acromyrmex Mayr , Tesis. Universidad Nacional del Comahue (inedita)
Lediuk KD, MA Damascos, JG Puntieri and MI de Torres Curth. 2016. Population
dynamics of an invasive tree, Sorbus aucuparia, in the understory of a Patagonian
forest. Plant Ecology, 217 (7): 899-911.
Marco DE and SA Paez. 2000. Invasion of Gleditsia triacanthos in Lithraea ternifolia
Montane Forests of Central Argentina. Environmental Management, 26: 409- 419.
Mora W. 2016. Como utilizar R en metodos numericos. Revista Digital Matematica,
Educacion e Internet, 16 (1). Disponible en URL: http://tecdigital.tec.ac.
cr/revistamatematica/.
Morris WF and DF Doak. 2002. Quantitative conservation biology: Theory and practice
of population viability analysis. Sinauer, Sunderland, Massachusetts, USA.
Murray JD. 1993. Mathematical biology. Springer, Berlin.
Navarro JA, G Galeano and R Barnal. 2011. Impact of leaf harvest on populations of
Lepidocaryum tenue, an Amazonian understory palm used for thatching, Tropical
Conservation Science Vol.4 (1):25-38.
Paradis E. 2002. R para principiantes. Institut des Sciences de lEvolution, Universit
Montpellier II. Francia. Disponible en URL: http://cran.r-project.org/doc/
contrib/rdebuts_es.pdf. Traduccion al espanol de Jorge A. Ahumada, University
of Hawaii y National Wildlife Health Center.
Stubben C, B Milligan and P Nantel. 2016. Construction and Analysis of Matrix Popu-
lation Models. Package popbio. Disponible en URL: https://cran.r-project.
org/web/packages/popbio/popbio.pdf
Stubben C and B Milligan. 2007. Estimating and Analyzing Demographic Models Using
the popbio Package in R.Journal of Statistical Software, 22(11): 1-23.
Soetaer K, T Petzoldt and RW Setzer . 2017. Solvers for Initial Value Problems of
Differential Equations (ODE, DAE, DDE) R package.Disponible en URL: http:
//desolve.r-forge.r-project.org/
R Development Core Team. 2007. R: A Language and Environment for Statistical
Computing. R Foundation for Statistical Computing, Vienna, Austria.Disponible
en URL: http://www.R-project.org/.
140
Apendice A
Paquetes
Al iniciar R los paquetes que estan cargados por defecto ademas del paquete base
son: datasets, utils, grDevices, graphics, stats y methods. Estos paquetes contienen todas
las funciones necesarias para el uso de R. Ademas de estos paquetes, R tiene una gran
cantidad de paquetes recomendados (recommended packages) que ya estan instalados
y una amplia lista de paquetes desarrollados por usuarios alrededor del mundo que se
encuentran bajo del grupo de contributed packages y deben ser descargados e instalados
por el usuario. La funcion help solo busca ayuda en los paquetes que estan cargados en
la memoria de R. La opcion try.all.packages, que por defecto tiene el valor FALSE
(falso), permite buscar en todos los paquetes disponibles si su valor se cambia a TRUE
(verdadero). Por ejemplo, si buscamos ayuda para una funcion que calcula la potencia
de una matriz \% ^ \%, salta un error, ya que esta funcion pertenece a los paquetes
basicos de R. Pero con la opcion try.all.packages=TRUE la ayuda no dice en que
paquete esta disponible.
Instalar paquetes con RStudio es muy simple, solo hace falta una coexion a Internet.
141
Departamento de Matematica
Universidad Nacional del Comahue
Por ejemplo si queremos instalar el paquete expm solo debemos seleccionar la pestana
Packages abajo del lado derecho y seleccionar Install y aparece la siguiente ventana:
>library(expm)
142
Departamento de Matematica
Universidad Nacional del Comahue
Para actualizar versiones ya instaladas de R basta con tipear en la consola los
siguientes comandos:
install.packages("installr")
setInternet2(TRUE)
installr::updateR() # actualizar R.
143
Departamento de Matematica
Universidad Nacional del Comahue
144
Apendice B
Los siguientes codigos, sirven de ejemplo como solucion de algunos ejercicios selec-
cionados.
145
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 24
> n<-7
> fac<-1
> for(i in 1:(n-1)){
+ fac<-fac*(i+1)
+ }
> fac
[1] 5040
> primitiva<-function(A){
+ neg<-0
146
Departamento de Matematica
Universidad Nacional del Comahue
+ if(ncol(A)>nrow(A)){
+ n<-ncol(A)
+ m<-nrow(A)
+ }else{
+ n<-nrow(A)
+ m<-ncol(A)
+ }
+ for(i in 1:m){
+ for(j in 1:m){
+ if(A[i,j]<0){
+ neg<-neg+1
+ }
+ }
+ }
+ if(m!=n||neg!=0){
+ #si la matriz no es cuadrada o tiene elementos negativos
+ #no puede ser primitiva
+ print(La matriz no puede ser primitiva)
+ if(m!=n){
+ print(La matriz no es cuadrada)
+ }
+ if(neg!=0){
+ print(la matriz tiene elementos negativos)
+ }
+ }else{
+ n<-ncol(A)
+ T<-n^2-3*n+2
+ check<-0
+ Ach<-A%*%A
+ for(i in 1:n){
+ for(j in 1:n){
+ if(Ach[i,j]==0){
+ check<-check+1
+ }
+ }
+ }
+ if(neg==0){
+ print(La matriz es primitiva)
+ print(el exponente)
+ print(2)
+ }else{
+ check<-0
+ Ach<-Ach%*%A
147
Departamento de Matematica
Universidad Nacional del Comahue
+ while(k<=T){
+ for(i in 1:n){
+ for(j in 1:n){
+ if(Ach[i,j]==0){
+ check<-check+1
+ }
+ }
+ }
+ if(neg==0){
+ print(La matriz es primitiva)
+ print(el exponente)
+ print(k+1)
+ break
+ }else{
+ k<-k+1
+ Ach<-Ach%*%A
+ }
+ }
+ print(La matriz no es primitiva)
+ }
+ }
+ }
> A1<-matrix(c(1,2,3,-4,5,6), ncol=3, nrow=2)
> A2<-matrix(c(1,1,1,1), ncol=2, nrow=2)
> A3<-matrix(c(0,0,0,4.665,61.896,0.675,0.703,0,0,0,10,10.047,10.657,
+ 10,10,10,10,0.019,0.682,10,10,10,10,0.61,0.8091),
+ nrow=5,ncol=5,byrow=T)
> A4<-matrix(c(1,-2,-1,1),ncol=2, nrow=2)
> A5<-matrix(c(0,0,0.1,0,0,0,0.999,0.999,0.8989), ncol=3,nrow=3)
> A6<-matrix(c(1,2,3,4,5,6), ncol=2, nrow=3)
> primitiva(A1)
[1] "La matriz no puede ser primitiva"
[1] "La matriz no es cuadrada"
[1] "la matriz tiene elementos negativos"
> primitiva(A2)
[1] "La matriz es primitiva"
[1] "el exponente"
[1] 2
> primitiva(A3)
[1] "La matriz es primitiva"
[1] "el exponente"
[1] 2
> primitiva(A4)
148
Departamento de Matematica
Universidad Nacional del Comahue
[1] "La matriz no puede ser primitiva"
[1] "la matriz tiene elementos negativos"
> primitiva(A5)
[1] "La matriz es primitiva"
[1] "el exponente"
[1] 2
> primitiva(A6)
[1] "La matriz no puede ser primitiva"
[1] "La matriz no es cuadrada"
> logistic<-function(times,state,parameters){
+ y<-state[1] #estado inicial
+ K<-parameters[1]
+ r<-parameters[2]
+ dy<-r*y*(1-y/K)
+ res<-dy
+ list(res)
+ }
> state1<-c(y=10)# Estado inicial
> times1<-seq(0,20,1/24) #20 dias en intervalos de una hora
> parameters1a<-c(K=500,r=0.3) #vector con los parametros
> solution1a<-lsoda(state1, times1, logistic, parameters1a)
> parameters1b<-c(K=500,r=0.1) #vector con los parametros
> solution1b<-lsoda(state1, times1, logistic, parameters1b)
> parameters1c<-c(K=500,r=0.5) #vector con los parametros
> solution1c<-lsoda(state1, times1, logistic, parameters1c)
> parameters1d<-c(K=500,r=0.7) #vector con los parametros
> solution1d<-lsoda(state1, times1, logistic, parameters1d)
> plot(solution1a,xlab=time, ylab=y(t))
> lines(solution1b, col=red)
> lines(solution1c, col=blue)
> lines(solution1d, col=green)
> legend(topleft, col=c(black, red, blue, green),
+ legend=c(r=0.3, r=0.1, r=0.5, r=0.7), lty=1, bty=n)
149
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 42
> state<-c(N=1)
> times<-seq(0,20,1/24)
> par1<-c(k=10,a=0.3)
> par2<-c(k=10,a=0.2)
> par3<-c(k=10,a=0.1)
> par4<-c(k=10,a=0.01)
> tumor<-function(times,state,parmeters){
+ N<-state[1]
+ k<-parmeters[1]
+ a<-parmeters[2]
+ dN<-k*N*exp(-a*times)
+ res<-dN
+ list(res)
+ }
> sol1<-lsoda(state, times, tumor, par1)
> sol2<-lsoda(state, times, tumor, par2)
> sol3<-lsoda(state, times, tumor, par3)
> sol4<-lsoda(state, times, tumor, par4)
> plot(sol1)
> lines(sol2, col=blue)
> lines(sol3, col=green)
> lines(sol4, col=red)
150
Departamento de Matematica
Universidad Nacional del Comahue
151
Departamento de Matematica
Universidad Nacional del Comahue
> #trayectorias
> y0<-matrix(c(1,2,2,5,3,1),ncol=2,nrow=3,byrow=TRUE)
> competenciaTrayectorias<-trajectory(competencia, y0 = y0, t.end = 10,
+ parameters = c(1,1,4,-1,-4,-7,1,1), colour = rep("black", 3))
Una vez que encontramos todos los equilibrios los podemos clasificar:
152
Departamento de Matematica
Universidad Nacional del Comahue
> #clasificacion del equilibrio trivial
> estabilidadTrivial<-stability(competencia, y.star = c(0,0),
+ parameters = c(1,1,4,-1,-4,-7,1,1))
153
Departamento de Matematica
Universidad Nacional del Comahue
154
Cuadernos Universitarios CRUB
13. Lopardo G. 1984. Socioecologa del mono aullador negro Alquatta caraya: un
diseno para investigacion.
155
Departamento de Matematica
Universidad Nacional del Comahue
14. Grigera D y S Rubulis. 1985. Aves de la cuenca del Ro Manso Superior (Prov.
de Ro Negro).
24. Bello MT, MF Alonso y M de L Baiz. 1996. Rendimiento en peso de los ejemplares
de tamano comercial del pejerrey patagonico.
26. Ferraris C y V Montoro. 1997. Los primos de Fermat y otros parientes aritmeticos
(taller).
156
Departamento de Matematica
Universidad Nacional del Comahue
32. de Torres Curth M. 1998. Calculo diferencial: Teora y aplicaciones.
34. Santinelli R. 1999. Los numeros reales. Racionales e irracionales. Una mirada
historica y epistemologica.
36. de Torres Curth M. 2000. El concepto de lmite, una mirada historico episte-
mologica.
40. Crivelli E. 2000. Calculo del nivel del Lago Nahuel Huapi a partir de datos me-
teorologicos del Aeropuerto Bariloche.
43. Bello MT. 2002. Los peces autoctonos de la Patagonia Argentina. Distribucion
natural.
44. Nunez M y C Quintero. 2002. Que hacer con las especies exoticas invasoras?
Problematica y tecnicas de manejo. Algunos ejemplos de especies exoticas en la
Patagonia Argentina.
48. Sineriz L y R Santinelli. 2006. Transformaciones rgidas con Cabr Geometre II:
una aproximacion a la teora axiomatica.
157
Departamento de Matematica
Universidad Nacional del Comahue
50. Secretara de Investigacion y Extension CRUB-UNC. 2006. Jornadas de Divulga-
cion de las actividades de Extension Universitaria. 16 anos de extension en el
CRUB.
53. Grigera D y A Trejo. 2009. Aves continentales de las provincias del Neuquen, Ro
Negro y Chubut; distribucion y estado de conservacion.
158