Вы находитесь на странице: 1из 159

ISSN 0325 6308

CUADERNOS UNIVERSITARIOS

Universidad Nacional del Comahue

Centro Regional Universitario Bariloche

N 61 Agosto de 2017

Matrices y Ecuaciones Diferenciales Ordinarias con R.


Operaciones, Clculos y Aplicaciones.

Mnica I. de Torres Curth y Astrid D. Koennecke


Matrices y Ecuaciones Diferenciales Ordinarias con R
Operaciones, Calculos y Aplicaciones

Monica de Torres Curth


Astrid Koennecke

2017
Resumen

Estas notas estan dirigidas a quienes deseen comenzar a utilizar el lenguaje de


programacion R, cuyo uso en las ciencias es cada vez mas extendido, no solo por su
versatilidad sino por su filosofa, ya que se trata de un lenguaje de acceso libre y desa-
rrollo comunitario. El material se focaliza en el uso de este lenguaje 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 Re-
gional Universitario 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 plan-
tean en esta asignatura. Asimismo, 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 es-
pecficos relacionados con matrices y de ecuaciones diferenciales, aplicadas a problemas
biologicos
4
Evelyn Hall: I would like to know how (if ) I can extract some of the information from
the summary of my nlme.
Simon Blomberg: This is R. There is no if. Only how. 1
Evelyn Hall and Simon Yoda Blomberg R.help (Abril 2005)

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

3.1.3. Productos de matrices . . . . . . . . . . . . . . . . . . . . . . . 30


3.1.4. Potencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1.5. Trasposicion de matrices . . . . . . . . . . . . . . . . . . . . . . 33
3.2. Otras cosas utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3. Determinante, inversa y rango . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.1. Determinante . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.2. Inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.3. Rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4. Calculo de autovalores y autovectores . . . . . . . . . . . . . . . . . . . 39
3.5. Matrices elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6. Sistemas de ecuaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4. Condiciones, Bucles y Funciones 43


4.1. Operadores Logicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2. Condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.2.1. El comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.2.2. El comando if /else . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.2.3. Condiciones multiples . . . . . . . . . . . . . . . . . . . . . . . 47
4.3. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.3.1. El comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3.2. El comando while . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5. La familia de funciones apply . . . . . . . . . . . . . . . . . . . . . . . 58

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

5.4. El comando layout() . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

6. Los paquetes Popbio y Rramas 79


6.1. Modelos discretos. Poblaciones estructuradas . . . . . . . . . . . . . . . 80
6.2. Modelos determinsiticos y estocasticos . . . . . . . . . . . . . . . . . . 82
6.2.1. El caso determinstico . . . . . . . . . . . . . . . . . . . . . . . 82
6.2.2. Que informacion nos da la matriz de proyeccion . . . . . . . . . 84
6.2.3. El caso estocastico . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2.4. Que informacion podemos obtener en el caso estocastico . . . . 86
6.3. El paquete PopBio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.3.1. El caso determinstico con PopBio . . . . . . . . . . . . . . . . . 87
6.3.2. Analisis basico y proyeccion poblacional con PopBio . . . . . . 88
6.3.3. El caso estocastico con PopBio . . . . . . . . . . . . . . . . . . . 92
6.4. El paquete Rramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.4.1. El caso determinstico con Rramas . . . . . . . . . . . . . . . . . 99
6.4.2. Analisis basico y proyeccion poblacional con Rramas . . . . . . . 100
6.4.3. El caso estocastico con Rramas . . . . . . . . . . . . . . . . . . . 104

7. Ecuaciones Diferenciales. El paquete deSolve. 113


7.1. Ecuaciones Diferenciales Ordinarias . . . . . . . . . . . . . . . . . . . . 114
7.2. Modelos con retardo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7.3. Sistemas de Ecuaciones Diferenciales Ordinarias Lineales . . . . . . . . 121
7.4. Analisis cualitativo de sistemas no lineales . . . . . . . . . . . . . . . . 124
7.4.1. Funciones clave . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.4.2. Sistemas dinamicos autonomos unidimensionales . . . . . . . . . 127
7.4.3. Sistemas dinamicos autonomos bidimensionales . . . . . . . . . 130
7.5. Sistemas de Ecuaciones Diferenciales Ordinarias Lineales con retardo . 133

Referencias bibligraficas 136

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

En un mundo en el que las nuevas tecnologas de la informacion no dejan de evolucio-


nar, el aprendizaje de lenguajes de programacion es un adicional sumamente atractivo
en el mundo profesional. Aprender a programar en cualquier lenguaje ayuda a desarro-
llar el pensamiento logico y a aprender a pensar computacionalmente.
El desempeno profesional en un futuro no muy lejano y en casi cualquier disciplina
cientfica, demandara no solo programadores sino personas que dominen el pensamiento
computacional y lo sepan llevar a sus campos de especialidad, ya sea la biologa, la fsica,
la qumica, el diseno o las artes.
La programacion es el proceso de disenar, codificar, depurar y mantener el codigo
fuente de programas computacionales. Esta presente en todo medio que cumpla procesos
especficos y que posea un software y un hardware, desde un lavarropas o un auto hasta
un celular o una computadora. El codigo fuente o programa es escrito en un lenguaje
de programacion.
Las computadoras (que es lo que nos interesa) son una herramienta esencial en
muchas areas de nuestra vida cotidiana, particularmente la ciencia y la educacion. Pero
sin una lista de instrucciones a seguir, las computadoras son virtualmente inutiles. Los
lenguajes de programacion nos permiten escribir esos programas (codigos fuente) y
por consiguiente comunicarnos con las computadoras para que hagan lo que queremos
que hagan. Concentrandonos en el contexto que nos interesa que es el aprendizaje
de la ciencia y la investigacion cientfica, programar consiste en escribir una serie de
instrucciones en un lenguaje adecuado para que la computadora ejecute la tarea que
deseamos.
En la ciencia, la programacion tiene como principal funcion conseguir que trabajos
que antes hacamos de forma manual y con un alto costo, puedan ser ejecutados por
una computadora con un ahorro significativo de tiempo y esfuerzo. No solo eso, sino
tambien la manipulacion de grandes cantidades de informacion.
Si bien el objeto de estas notas es abrir las puertas de la programacion (mas que
ensenar a programar) presentandola como una herramienta mas de trabajo, es impor-
tante mencionar que creemos que aprender a programar es una herramienta util para

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

1.1. Que es y para que sirve R


El proyecto R fue iniciado por Robert Gentleman y Ross Ihaka (de donde se deriva el
nombre R) del Departamento de Estadstica de la Universidad de Auckland, en 1995.
Actualmente R es mantenido por un grupo internacional de desarrolladores voluntarios
Core Development Team. La pagina web del proyecto R es www.r-project.org. Este
es el sitio principal donde se puede encontrar toda la informacion relativa a R, en el
que se encuentra disponible toda la documentacion y se pueden consultar las preguntas
mas frecuentes, FAQs (FAQ son las iniciales de Frequently Asked Questions). Por las
caractersticas de este proyecto, hay en la web infinidad de sitios y foros (en distintos
idiomas) donde los usuarios plantean sus dificultades y otros usuarios discuten y pro-
ponen soluciones. R consta de un sistema base y de paquetes adicionales1 que extienden
su funcionalidad. Pueden descargarse2 de un CRAN adecuado. En Argentina, se reco-
mienda el de la Universidad Nacional de La Plata. Actualmente la ultima version de R
es la 3.3.13 . .
La capacidad de R para realizar graficos es muy sofisticada y mejor que la de la ma-
yora de los paquetes estadsticos. R cuenta con varios paquetes graficos especializados.
Tambien existen paqueteras que permiten manipular y crear datos en distintos forma-
tos como Matlab y Excel, entre otros. Cabe senalar que, ademas del paquete base de R,
existen mas de 4.000 paquetes que han sido desarrollados por usuarios y programadores
alrededor del mundo, esto sin contar los paquetes disponibles en redes personales. R
1
Al iniciar R los paquetes que estan cargados por defecto ademas del paquete base son: datasets, utils,
grDevices, graphics, stats y methods.
2
En el Apendice A hay un instructivo para cargar e instalar paquetes.
3
Para actualizar una version ya instalada ver en el Apendice A

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.

1.2. RStudio: una interfaz de trabajo con R


Una vez instalado, aunque se puede trabajar directamente con R, es aconsejable usar
una interfaz grafica que nos facilite su uso. Para esta introduccion vamos a trabajar con
una de las muchas interfaces que existen, RStudio. RStudio es una GUI, Graphical
user interface, un entorno de desarrollo integrado (IDE) para R. Es software libre con
licencia GPLv3 y se puede ejecutar sobre distintas plataformas (Windows, Mac, or
Linux) o incluso desde la web usando RStudio Server.
Por defecto esta interfaz muestra en pantalla cuatro sectores: Arriba a la izquierda
se encuentra la consola donde escribiremos las lneas de codigo para decirle a R lo
que queremos que haga, y donde se encuentran todos los archivos que tenemos abiertos.
Abajo a la izquierda, esta la consola de R propiamente dicha, que permite ir viendo
las lneas de comando ejecutadas y los resultados buscados. Esta disposicion de las
pantallas de puede cambiar si el usuario as lo desea. Arriba a la derecha hay una
pequena pantalla Workspace-History, que muestra informacion sobre los datos que estan
cargados y el historial de acciones. Por ultimo, abajo a la derecha hay una consola Files-
Plots-Packages-Help que contiene la lista de paquetes instalados, los graficos realizados,
y ayudas, que fundamentalmente usaremos para remitirnos a los graficos que hemos
generado.
4
La funcion help solo busca en los paquetes que estan cargados en memoria. Para buscar en todos los
paquetes ver el apendice A.

14
Departamento de Matematica
Universidad Nacional del Comahue

Figura 1.1: Interfaz de trabajo con RStudio

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

1.3. Algunos detalles iniciales


Antes de empezar a escribir, hay algunas cosas que hay que saber:

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

Para ver el valor de una variable, basta con tipear su nombre6 .

Una cosa importante a tener en cuenta es que antes de empezar a trabajar es


recomendable setear el directorio de trabajo donde RStudio buscara los archivos a
leer y eventualmente guardara los resultados y los graficos (esto para evitar tener que
tipear cada vez el directorio de trabajo). Para ello, en la consola principal de RSutdio
hay que seleccionar el directorio como indica la figura.

Figura 1.2: Elegir directorio de trabajo

1.4. R como calculadora


R puede usarse con una enorme versatilidad. En su uso mas basico se puede usar
como calculadora, y aunque es uno de sus usos menos potentes, es util para empezar
a amigarse con la interfaz. El lenguaje R incluye los operadores aritmeticos usuales: la
suma +,la resta -,el producto *, el cociente /, y la potencia ^.
Veamos algunos ejemplos:
6
Si es una lista de objetos o una base de datos puede ser conveniente utilizar el comando View( )

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

Tabla 1.1: Operaciones basicas con R

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

Volveremos sobre el ingreso de datos de esta forma en el proximo captulo. Mientras


tanto, podemos anticipar algunas funciones utiles que atanen a vectores:

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)

Tabla 1.2: Operaciones relativas a vectores

Por ejemplo, ingresamos el vector v y obtenemos informacion a partir de el:

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:

2+2 La raz cuadrada de 10. |22 32 |


1
El factorial de 7 El producto 2 3 4. e2

La circunferencia de la tierra en el Ecuador en km ( radio = 6378 km).


El producto de los numeros naturales entre 27 y 35 (pensar).
2, 38 + log(7, 5) cos(30) (Ojo: 30 esta expresado en grados sexagesimales).
Ingresar un vector de angulos 0, 30, 45, 60, 90. Convertirlos a radianes y calcular
el seno.
Inventarse algunas cuentitas y hacerlas, como para ir perdiendo el miedo.
Ingresar un vector y calcular su longitud, la suma y el producto de sus compo-
nentes, la suma y producto acumulado de sus componentes y la diferencia entre
componentes consecutivas.

18
Captulo 2

Ingresar datos a R

Destinaremos este captulo revisar brevemente la forma de ingresar datos a R para


su uso posterior. Un apunte detallado y en castellano para profundizar en esto es R
para Principiantes (Paradis 2002)

2.1. Ingresando matrices


Hay basicamente dos formas de ingresar una matriz. La primera (util cuando es una
matriz de dimensiones reducidas) es tipear los elementos que la constituyen (ya veremos
como), y la segunda es importar los datos de otra fuente (por ejemplo de un notepad,
de Excel, etc.)1 .
Para ingresar una matriz a mano necesitamos definir varias cosas: en primer lugar,
cuantas filas y cuantas columnas tendra la matriz (el numero de elementos ingresados
debera ser coherente con esa decision) y si R leera los elementos ingresados como ele-
mentos de las filas o las columnas de la matriz. Por default R lee las matrices por
columnas, de modo que si queremos ingresar la matriz por filas, es necesario advertirlo.
Para ello utilizamos en R el comando matrix() con la siguiente sintaxis basica:

matrix(data , nrow = , ncol = , byrow = , dimnames = )

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.

Supongamos que queremos ingresar la siguiente matriz de orden 3 4:



1 0 3 1
A= 2 2 1 0
1 2 0 3

Para ello tenemos que escribir en R:

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

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


[1,] 1 0 3 -1
[2,] 2 2 1 0
[3,] -1 -2 0 3

Ejercicio 2. Ingresar dos matrices arbitrarias de numeros reales A y B de orden 4 3


y una matriz C de orden 4 5 que despues seran usadas para algunas operaciones

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"

2.2. Asignar nombres a las filas y columnas de una


matriz
Las funciones colnames y rownames permiten asignarle un nombre a las columnas y
filas de una matriz. Por ejemplo la siguiente matriz contiene la edad, el peso y la altura
de dos personas:

>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

> rownames(datos)<-c("Ana", "Juan")


> colnames(datos)<-c("edad", "peso", "altura")
> datos
edad peso altura
Ana 20 65 174
Juan 22 70 180

2.3. Extraer partes de una matriz


A veces necesitamos extraer informacion de una matriz. Tres herramientas seran
utiles:

1. Extraer un elemento de una matriz.


2. Extraer una fila de una matriz.

21
Departamento de Matematica
Universidad Nacional del Comahue
3. Extraer una columna de una matriz.

La siguiente tabla muestra su implementacion en R:

A[1,2] extrae el elemento de la matriz A en la posicion (1, 2),


A[2, ] extrae la segunda fila de la matriz A,
A[ ,3] extrae la tercera columna de la matriz A (pero la muestra como un vector fila).

Veamos esto ingresando las lneas de codigo en R:

> 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

Ejercicio 3. Para las matrices A y B ingresadas en el ejercicio anterior, extraer dos


elementos, una fila y una columna

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<-list(nombre="Pedro", esposa= "Mara", no.hijos=3, edad.hijos=c(4,7,9))

Las listas se ven de la siguiente forma en R

> 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

Como el cuarto componente de la lista es un vector, podemos referirnos a su primer


elemento de la siguiente forma

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

En el caso de que los componentes de la lista no tengan asignado un nombre co-


mo en nuestro caso, la funcion names devuelve NULL. Cuando los componentes de
una lista llevan un nombre podemos acceder a ellos mediante el comando de la for-
ma nombre_de_lista$nombre_de_componente. De esta forma Lista1[[1]] equivale a
Lista1$nombre. Por ejemplo:

>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

2.4.2. Hojas de datos (data frames)


Las hojas de datos (data frames) son una estructura de datos que generaliza las
matrices, en el sentido de que las columnas (usualmente las variables) pueden ser de
diferente tipo entre s (pueden ser algunas cualitativas y otras cuantitativas, por ejem-
plo). Sin embargo, todos los elementos de una misma columna deben ser del mismo
tipo. Al igual que las filas y las columnas de una matriz, todos los elementos de un data

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:

> provincia<-c("Ro Negro", "Cordoba")


> datos2<-cbind(datos,provincia)
> datos2

edad peso altura provincia


Ana "20" "65" "174" "Ro Negro"
Juan "22" "70" "180" "Cordoba"

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

edad peso altura provincia


Ana 20 65 174 Ro Negro
Juan 22 70 180 Cordoba

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

Figura 2.1: Importar datos con RStudio

Una vez que importamos los datos, estos aparecen en la ventana arriba a la izquierda,
donde podemos chequearlos.

Figura 2.2: Base de datos importada

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.

2.5.1. Corregir los datos importados


Suele ocurrir con frecuencia que el data frame contiene columnas vacas. Si queremos
eliminarlas podemos hacerlo con el comando -c() de la siguiente manera:

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

Tambien podemos cambiar el nombre de las variables de la siguiente forma:

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

2.5.2. Clase de objeto en los datos importados2


Como mencionamos anteriormente, los datos importados se almacenan en R como
un data frame. Recordemos que los objetos de la clase data.frame tienen una estructura
parecida a la de las matrices pero mucho mas generalizada, ya que las variables (osea las
columnas) pueden ser de diferentes clases entre s. R se se encarga de analizar los datos
importados y designar que clase de objeto es el mas apropiado para cada columna. Para
ver de que clase de objeto usamos la funcion class( ), que nos devuelve la clase a la
que pertenece el objeto.

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

Si queremos cambiar la clase de alguna de las variables, usamos la funcion as.__ .


Por ejemplo si queremos cambiar la clase de la variable DES de factor a numeric
procedemos de la siguiente manera:

> BaseDatos$DES<-as.numeric(BaseDatos$DES)
> class(BaseDatos$DES)
[1] "numeric"

Clases de objetos en R

En la seccion 2.5.2 hablamos sobre clases de objetos. No queremos aqu entrar en


detalle, pero podemos decir que la clase de un objeto se refiere a los atributos propios
del mismo. Por ejemplo, una matriz ademas de estar formada por elementos numericos,
tiene un orden (dado por la cantidad de filas y de columnas). Algunas de las clases de
objetos mas importantes en R son:

Clase Breve descripcion


numeric numeros de doble precision, es identica a la clase double
interger subclase de numeric, acepta solo numeros enteros
logical formato logico: sus valores son TRUE y FALSE
character formato: letras
factor formato de variables categoricas con un numero finito de valores

30
Captulo 3

Matrices

Destinaremos este captulo a la operatoria basica con matrices, calculo de determi-


nantes, rango, matrices inversas, resolucion de sistemas de ecuaciones lineales escritos
en forma matricial y el calculo de autovalores y autovectores.

3.1. Operaciones con matrices


Las operaciones con matrices son muy sencillas en R. A continuacion definiremos la
suma, el producto por un numero real, conocido como producto externo, dos productos y
dos potencias. Para ejemplificar estas operaciones ingresaremos las siguientes matrices:

> A<-matrix(c(1,0,3,2,2,1,0,-1, -2), ncol=3, nrow=3, byrow = T)


> B<-matrix(c(3,-1,1,1,-2,3,-1,-1, 3), ncol=3, nrow=3, byrow = T)

> 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

3.1.2. Multiplicar matrices por un numero real


La multiplicacion de una matriz por un escalar es igualmente sencilla. Las siguientes
lneas de codigo permiten multiplicar por = 2 la matriz A ingresada anteriormente y
denomina D al resultado de este producto externo que se muestra a continuacion.

> D<-2*A
> D
[,1] [,2] [,3]
[1,] 2 0 6
[2,] 4 4 2
[3,] 0 -2 -4

Ejercicio 4. Ingresar dos matrices A y B de orden 4 4 y calcular:

1. A + B 3. 2 A 5. 4 B 2 A
2. A B 4. 4 B 6. 3 A + 3 B

3.1.3. Productos de matrices


En el algebra de matrices se definen dos tipos de producto: el producto elemento
a elemento y el producto de matrices propiamente dicho. Estos productos tienen re-
querimientos diferentes en cuanto a las matrices a usar, y, por supuesto, resultados y
usos distintos. El operador * da como resultado el producto elemento a elemento de

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

En terminos generales, el producto de matrices A B (el usual) requiere para su


calculo que la matriz B tenga el mismo numero de filas que columnas tiene A, es decir
que si la matriz A es de orden m n, la matriz B debera ser de orden n r. La matriz
producto P = A B sera de orden m r, y se calcula como:
n
X
pij = aik bkj
k=1

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:

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


[1,] 0 -4 10
[2,] 7 -7 11
[3,] 1 4 -9
1
En este caso, si el orden de las matrices no coincide, R dara un mensaje de error.
2
El numero de columnas de la primera matriz debe coincidir con el numero de filas de la segunda.

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)

(Para calcular las potencias de A y B calcule los productos correspondientes)

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

Ejercicio 7. Ingresar dos matrices A y B de 5 5. Instalar y cargar el paquete exmp


para calcular:

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)

j) f (A), donde f (x) = 4x6 + 3x5 4x4 + 5x4 + x3 4x2 + 5x + 1

3.1.5. Trasposicion de matrices


Una cosa mas que necesitamos saber es trasponer matrices. Dada una matriz cual-
quiera A, su traspuesta (usualmente denotada como AT ) es aquella que tiene por co-
lumnas las filas de A. El comando de trasposicion es sencillo: basta con escribir t(A) y
R devolvera la matriz traspuesta.

> 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

3.2. Otras cosas utiles


Hay varias cosas utiles para algunas cuentas que necesitaremos hacer con matrices y
vectores (el ingreso de vectores es aun mas simple que el de matrices, ya que se ingresan
como una fila, sin necesidad de indicar otra cosa)

Los comandos dim( ) y length( ) devuelven el orden de una matriz y la longitud


de un vector respectivamente.

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( ) forma un arreglo combinando columnas, mientras que el


comando rbind( ) hace lo mismo con filas
> c1<-c(1,2,3,4)
> c2<-c(5,1,5,2)
> c3<-c(1,1,5,2)
> x<-cbind(c1,c2,c3)
> y<-rbind(c1,c2,c3)
> x
c1 c2 c3
[1,] 1 5 1
[2,] 2 1 1
[3,] 3 5 5
[4,] 4 2 2
> y
[,1] [,2] [,3] [,4]
c1 1 2 3 4
c2 5 1 5 2
c3 1 1 5 2

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

Los comandos numeric(n) y double(n) 4 generan un vector de longitud n donde


todos sus elementos son iguales a cero.
El comando seq( ) genera una secuencia. Los argumentos a ingresar en este
comando son:

from, variable que indica el primer valor de la secuencia


to, variable que indica el ultimo valor de la secuencia.
by, es el paso entre elementos de la secuencia,
length.out longitud deseada de la secuencia

Si se dan el valor inicial, el final y la longitud de la secuencia, R calcula el incre-


mento de la secuencia mediante la siguiente formula:
to f rom
length.out 1
Si se dan el valor inicial, el final y el incremento, R genera una secuencia de la
longitud necesaria para esto. Si se indican solamente el valor inicial y final, R
construye una secuencia de la longitud adecuada con un incremento de 1 o 1
segun si el valor inicial es menor o mayor que el final, respectivamente.
Por ejemplo:
4
Los comandos numeric y double son identicos.

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

Con el comando rep( ) podemos repetir argumentos. La sintaxis general es:


rep(x, times = 1, length.out = NA, each = 1)
> x<-rep(1,10)
> x
[1] 1 1 1 1 1 1 1 1 1 1
> y<-rep(seq(1,4),3)
> y
[1] 1 2 3 4 1 2 3 4 1 2 3 4
> z<-rep(seq(1,3),times=5,length.out=10)
> z
[1] 1 2 3 1 2 3 1 2 3 1

Con el argumento times determinamos cuantas veces queremos que el objeto se


repita, y con el argumento length.out determinamos la longitud del vector.
Se puede asignar un nombre a las columnas o filas, por ejemplo: c2 <- A[,2]
llama c2 a la segunda columna de la matriz A, mientras que f1<-A[1,] llama f1
a la primera fila de A.
Para crear una lista creciente o decreciente de numeros enteros podemos poner
0:10 o 20:8. Este comando es equivalente a la funcion seq cuando el incremento
es uno.
El comando diag(n) construye una matriz identidad de orden n. Por ejemplo:
> diag(4)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1

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. Determinante, inversa y rango


Tanto el determinante como la inversa de una matriz, solo se definen para matrices
cuadradas. El rango, en cambio, puede calcularse para matrices de cualquier orden.
Veamos a continuacion como se realizan estos calculos en R.

3.3.1. Determinante
El comando para el calculo del determinante de una matriz es det(A).

> A<-matrix(c(1,0,3,-1,2,2,1,0,-1,-2,0,3,1,2,3,0),ncol=4, nrow=4,byrow=T)


> det(A)
[1] -36

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:

> A<-matrix(c(1,0,3,-1,2,0,6,-2,-1, .2, 0,3,1,2,3,0),ncol=4,


nrow=4,byrow=T)
> Ai<-solve(A)
Error in solve.default(A) :
Lapack routine dgesv: system is exactly singular: U[4,4] = 0
Ejercicio 11. Ingresar una matriz cuadrada, verificar que su determinante es distinto
de cero y calcular su inversa. Luego verificar que A A 1 = A 1 A = I. Es posible que
no de muy as... ya que la matriz inversa que produce R es una buena aproximacion
de la matriz inversa, pero con los decimales truncados en alguna parte, por lo cual
debera dar como resultado algo bastante parecido a la identidad. De todas maneras
a los fines practicos, el calculo obtenido es bastante bueno.

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

3.4. Calculo de autovalores y autovectores


Por default R calcula todos los autovalores (reales y complejos) y los autovectores
correspondientes. Para ello, se usa el comando eigen(A)5 . Para la matriz A ingresada
en la primera seccion calculamos sus autovalores y los autovectores correspondientes:

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

> eigen(A,only.values = TRUE)


$values
[1] 3.0000+0.0000i -2.4348+0.0000i 1.2174+1.8564i 1.2174-1.8564i
Ejercicio 13. Calcular los autovalores y los autovectores de las matrices ingresadas en
el Ejercicio 12.

3.5. Matrices elementales


Las matrices elementales son matrices obtenidas de la matriz identidad aplicando
una de las siguientes operaciones:
5
Cabe resaltar que los autovectores que devuelve R son solo una eleccion especifica (de longitud uno)
de cada familia infinita de autovectores.

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 .

Las matrices elementales (del orden adecuado) multiplicadas a izquierda de una


matriz cualquiera A, producen el mismo efecto en las filas de dicha matriz, mientras
que si se multiplican a derecha (podra requerirse que sean de orden distinto de las que
se multiplican a izquierda), producen el efecto por columnas.

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

E1 : la matriz elemental de tipo 1: p13


E2 : la matriz elemental de tipo 2: m2 (3)
E3 : la matriz elemental de tipo 3: t23 (1)

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 16. Construir una matriz B de orden 4 4 de siguiente manera: primero


elija tres vectores cualesquiera de 4 componentes, llamarlos v1 , v2 y v3 . Luego armar un
nuevo vector v4 que sea una combinacion lineal de los tres anteriores. Armar la matriz
B concatenando los cuatro vectores anteriores (los tres inventados y su combinacion
lineal.

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:

Dada A, obtener otra matriz con dos filas intercambiadas:


A[c(i,j), ] = A[c(j,i), ]
Por ejemplo para interambiar las filas F1 y F2 escribimos
> A<-matrix(c(1,0,3,2,2,1,0,-1, -2), ncol=3, nrow=3, byrow = T)
> A
> A[c(1,3), ] <- A[c(3,1), ]
> A

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


[1,] 1 0 3 [1,] 0 -1 -2
[2,] 2 2 1 [2,] 2 2 1
[3,] 0 -1 -2 [3,] 1 0 3

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:

>N<- matrix(c(1,1,-1,0,2,2,3,2,4),ncol=3, nrow=3, byrow=T)


>b<-c(1,1,2)
> solve(N,b)
[1] 0.3750 0.5625 -0.0625

Si la matriz del sistema no es cuadrada o si siendo cuadrada es singular, R dara un


mensaje de error.

Ejercicio 19. Encontrar la solucion de los sistemas siguientes de la forma A x = b,


donde x es un vector de las dimensiones adecuadas:

4 0 1 1 x 5
3 1 3 1 y 6
0 1 2 0 z = 13

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

Condiciones, Bucles y Funciones

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.

4.1. Operadores Logicos


Las condiciones que se utilizan en las estructuras de control son el resultado de
una operacion logica, as que tienen el valor TRUE o FALSE (que en logica se conocen
como valores de verdad de las proposiciones). Para entender mejor vamos unos ejemplos
sencillos.

> 3>2 # tres es mayor que dos?


[1] TRUE
> 3<2 # tres es menor que dos?
[1] FALSE
> 3==2 # tres es igual a dos?
[1] FALSE
> 3!=2 # tres es distinto a dos?
[1] TRUE

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

Veamos algunos ejemplos:

Ingresamos algunas proposiciones y verificamos su valor de verdad


> !(3>2)
[1] FALSE
> !(3==2)
[1] TRUE

Vinculamos dos (o mas) proposiciones con el conectivo logico (recordar que la


proposicion compuesta pq es verdadera si lo es al menos una de las proposiciones
que la componen)
> 3 > 2 || 4/5 < 7/8
[1] TRUE
> 3 > 2 || 4/5 == 7/8
[1] TRUE
> 1 > 2 || 4/5 == 7/8
[1] FALSE

Vinculamos dos (o mas) proposiciones con el conectivo logico (recordar que la


proposicion compuesta p q es verdadera si son verdaderas las dos proposiciones
que la componen).
condicion1 && condicion2
> 3 > 2 && 4/5 < 7/8
[1] TRUE
> 3 > 2 && 4/5 == 7/8
[1] FALSE

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

>cond1 <- 3 > 2


>cond2 <- 4/5 < 7/8
>cond1 & cond2
[1] TRUE
>cond1 && cond2
[1] TRUE

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

Veremos cada uno en detalle a continuacion.

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:

Figura 4.1: Diagrama de flujo para el condicional if

En este caso, si se cumple la condicion se ejecuta una accion, pero si la condicion


no se cumple, el codigo simplemente saltea esos pasos.
Por ejemplo, supongamos que en un proceso estamos trabajando con varias matrices
y nos interesa obtener sus inversas. Sabemos que si el determinante es cero, la inversa
no existe. Podemos hacer un condicional de esta manera: Calculamos x = det(A). Si
x = 0 entonces la inversa no se calcula y pasamos a la siguiente matriz

4.2.2. El comando if /else


Para el caso de aquellos condicionales que, consistiendo en una condicion, si esta
se cumple se desencadena una accion y si no se cumple se desencadena otra, en R se
trabaja con el comando if/else, que consiste en un esquema como el siguiente:

48
Departamento de Matematica
Universidad Nacional del Comahue

Figura 4.2: Diagrama de flujo para el condicional if /else

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:

Figura 4.3: Ejemplo de diagrama de flujo para el condicional if /else

Si se cumple la condicion b2 4ac 0 se indica al programa que calcule las races,


si no se cumple, se pide que emita una advertencia senalando la inexistencia de races
reales.

4.2.3. Condiciones multiples


En este caso,se trata de una secuencia en la que se chequean varias condiciones
encadenadamente y la accion depende de cual de ellas es verdadera. Consiste en un
esquema como el siguiente:

49
Departamento de Matematica
Universidad Nacional del Comahue

Figura 4.4: Ejemplo de diagrama de flijo para condiciones multiples

El recurso de los diagramas de flujo es un recurso util para pensar la logica de un


script, especialmente cuando hay condicionales o bucles. Es un buen ejercicio pensar
en el papel lo que uno quiere hacer antes de sentarse a programar el codigo. Veremos
algunos ejemplos.
Los comandos if como if/else ejecutan un comando si se cumple una condicion.
La estructura basica del comando if es: if (condicion) {comando}. El comando se
ejecuta solamente si la condicion se cumple, o sea, si la expresion en condicion tiene
el valor TRUE. Por ejemplo:

> if(3>2){print(Correcto)}
[1] "Correcto"
> if(3<2){print(Incorrecto)}

Como 3 no es menor que 2 la condicion 3 < 2 tiene el valor FALSE y el comando


print(Incorrecto) no se ejecuta. En cambio la condicion 3 > 2 tiene al valor TRUE
y el comando print(Correcto) es ejecutado.

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

La estructura basica del comando if/else es if(condicion) {comando1} else {comando2}.


El comando1 se ejecuta si la condicion tiene el valor TRUE y el comando2 se ejecuta si
la condicion tiene el valor FALSE Por ejemplo,

> if(3>2){print(Correcto)} else{print(Incorrecto)}


[1] "Correcto"
> if(3<2){print(Correcto)} else{print(Incorrecto)}
[1] "Incorrecto"

Un ejemplo un poco mas complicado:

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

if (condicion1) {comando1} else if (condicion2) {comando2} else {comando3}

Entonces el comando1 se ejecuta si la condicion1 se cumple (tiene el valor TRUE).


En el caso de no cumplirse, R verifica si se cumple la condicion2. Si la condicion2
se cumple (tiene el valor TRUE) R ejecuta el comando2, si no se cumple (tiene el valor
FALSE, como la condicion1) R ejecuta el comando3. Veamos un ejemplo a continuacion.

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:

Chequear que sea cuadrada

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.

Ejercicio 24. Escribir un codigo para ejecutar el siguiente condicional:


Ingresar una matriz A y un vector b:

Chequear que sea cuadrada


Si no es cuadrada escribir el mensaje La matriz ingresada no es cuadrada
Si es cuadrada, calcular el determinante.
Si el determinante es cero, escribir el mensaje El determinante es 0, el sistema
no tiene solucion unica
Si el determinante es distinto de cero, chequear si b tiene la dimension adecuada
para resolver el sistema
Si la dimension no es adecuada, escribir el mensaje La dimension de b no es
adecuada para resolver el sistema
Chequear que b no sea cero.
Si b es cero, escribir el mensaje La solucion buscada es la trivial
Si b no es cero, calcular la solucion y escribirla

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.

4.3.1. El comando for


Si conocemos a priori el numero de iteraciones el comando a utilizar es el comando
for. La construccion basica del bucle for es:

for(variable in secuencia) {
comando1
comando2
...
}

R ejecuta el comando1, comando2,... n veces, donde n es igual a la longitud de la


secuencia (n=length(secuencia)), y en cada iteracion el valor de variable va cam-
biando, recorriendo los valores de secuencia. Por ejemplo:

> for(i in 1:10){


+ print(i^2)
+ }
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36
[1] 49
[1] 64
[1] 81
[1] 100
> i
[1] 10

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.

Ejercicio 25. Ingresar en R el siguiente codigo, ejecutarlo e interpretar lo que hace:

x<-c(1,2,3,4,5)
for(i in 1:(length(x)-1)){
y<-x[i]+x[i+1]
print(y)
}

Ejercicio 26. En R existe el comando factorial(n) para calcular el factorial n! =


1 2 3 n. Escriba un codigo en R para calcular el factorial de un numero natural sin
usar el comando factorial( ).

4.3.2. El comando while


Cuando no conocemos el numero de iteraciones el comando a utilizar es while. La
construccion basica de un bucle while es como sigue:

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

La variable x tiene al comienzo el valor 1. Mientras se cumpla la condicion x < 11 en


cada paso de la iteracion se imprime el valor de x y se aumenta en una unidad. Notar
que al salir del bucle la variable x tiene el valor 11

Ejercicio 27. La sucesion


xn1
xn =
xn
tiende a cero cuando n . Para implementarla en R escribir el siguiente codigo:

f<-5
n<-0
while(f>0.001){
n<-n+1
f<-f/n
print(f)
}

a) Analizar el codigo y ver que hace cada paso.


b) Cual es el valor inicial de la sucesion?.
c) A que numero llego?.
d) Cuantas iteraciones fueron necesarias?.
e) Estudiar la dependencia del numero de iteraciones necesarias cambiando el valor
inicial de la sucesion.

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

Probar que el script funciona ingresando varias matrices (primitivas y no primitivas)

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:

nombre_fun <- function(arg1,arg2,...) {


# codigo ...
instrucc-1
instrucc-2
# ...
return(salida) #valor que devuelve (o la ultima instruccion, si devuelve algo)
}

Con el comando function la funcion nombre_fun es definida (pero no ejecutada).


Una vez ejecutada, la nueva funcion nombre ejecuta las instrucciones en funcion de los
argumentos arg1, arg2,... provistos y devolvera posteriormente una salida.
Por ejemplo:

> 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

a) los argumentos son de distinto tipo, por ejemplo un numero y un vector.


b) los argumentos son dos vectores de distinta longitud.
c) los argumentos son dos matrices de distinto orden.

R devuelve al usuario el resultado del ultimo comando ejecutado en la funcion. El


comando return( ) es de gran utilidad, para indicarle a R que resultados queremos
que R devuelva al ejecutar la funcion.

> funcion<-function(a){
+ doble<-2*a
+ triple<-3*a
+ a1<-doble+triple
+ a2<-doble-triple
+ return(a1)
+ }
> funcion(4)
[1] 20

En el ejemplo anterior la funcion calcula muchas cosas: el doble y el triple de un


numero, as como la suma y la diferencia de estos. Sin embargo el valor que entrega no
es el del ultimo calculo a2<-doble-triple sino el de la suma a1<-doble+triple ya
que el ultimo comando que R ejecuta es return(a1).

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

Escribir el codigo en R y ejecutarlo. Ejecutar la funcion raicesCuad y explicar que


es lo que hace. Cuales son los argumentos? Que es lo que devuelve? Cuando se genera
un error?.
Ejercicio 31. Escribir una funcion vec1 con dos argumentos n y m que devuelva un
vector x de longitud n y cumpla con la siguientes condiciones:
(
xi = 0 si i m
xi = 1 si i > m

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 33. Escribir la funcion sist.eq.lin con los argumentos A y b, (donde A


una matriz cualquiera y b, un vector cualquiera) que verifique si el sistema Ax = b tiene
solucion. Elija A y b y calcule la solucion del sistema.

Ejercicio 34. Escribir la funcion primitiva, que verifique si una matriz es primitiva.

4.5. La familia de funciones apply


Cuando trabajamos con datos estructurados en forma de matrices, listas o data
frames existe una funcion que permite aplicar una funcion a todos los elementos de una
columna o de una linea sin necesidad de tener que escribir un bucle. Esto es incluso
mucho mas prolijo y efectivo. La funcion que permite hacer esto es la funcion apply.
La sintaxis general es:

apply(X, MARGIN, FUN, ...)

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.

> A<-matrix(c(1,0,3,2,2,1,0,-1, -2), ncol=3, nrow=3, byrow = T)


> filas.suma <- apply(A, 1, sum) #filas.suma = vector con las sumas de filas
> col.suma <- apply(A, 2, sum) #col.suma = vector con las sumas de columnas
> A
[,1] [,2] [,3]
[1,] 1 0 3
[2,] 2 2 1
[3,] 0 -1 -2

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:

> prom.filas <- apply(A, 1, mean)


> prom.columnas<- apply(A, 2, mean)
> prom.general<- apply(A, c(1,2), mean)
> prom.filas
[1] 1.333333 1.666667 -1.000000
> prom.columnas
[1] 1.0000000 0.3333333 0.6666667
> prom.general
[,1] [,2] [,3]
[1,] 1 0 3
[2,] 2 2 1
[3,] 0 -1 -2

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

Los graficos disponibles en R son de gran variedad, calidad y versatilidad. Exis-


te un demo que permite hacerse una idea de esta variedad, tipeando simplemente
demo("graphics"). El paquete graphics contiene las funciones graficas basicas. Este
paquete se abre cada vez que iniciamos R y posee muchsimas utilidades. Los distintos
paquetes de R suelen incorporar funciones graficas especficas para el paquete, pero
existen paquetes especficos creados para generar graficas mas especializadas.
En RStudio cuando se ejecuta un grafico, estara disponible en la ventana inferior
izquierda de la pantalla en la pestana plots, desde donde se pueden exportar en distintos
formatos. La mayor parte de los graficos de R pueden ser exportados o guardados en
formato post script, metafile, jpeg, Tiff o mapa de bits. Los dos primeros son graficos
vectorizados, por lo que son preferidos para las publicaciones por su calidad.
Hay mucho escrito sobre como construir graficos y hacerles toda la cosmetica que
uno desee, por lo cual no daremos aca mas que detalles basicos para poder usar despues
algunas formas de representacion grafica. En castellano puede consultarse el texto de
Paradis (2002) o, para una lectura mas completa, a Correa y Gonzalez (2002).

5.1. Graficos basicos en R


Como ya mencionamos antes, el paquete graphics es el paquete base de R para
realizar graficos. Con este paquete es posible realizar graficos de puntos, de lneas,
histogramas, de torta, de barras y boxplots, entre otros.

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:

Comandos graficos de alto nivel


Comando Utilidad
plot(x) graficar los valores de x (en el eje y) ordenados en el eje horizontal
plot(x,y) grafico bivariado de pares de valores x e y
boxplot(x) grafico tipo box-and-whiskers
pairs(x) si x es una matriz dibuja todas las graficas bivariadas entre las columnas
de x
hist(x) histograma de las frecuencias de x
pie(x) grafico de torta con los valores de x
barplot(x) histograma de los valores de x

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.

Algunas opciones para los comandos graficos


Parametro Utilidad
axes Si TRUE (por defecto) dibuja los ejes, si FALSE, no los dibuja
bty Tipo de caja: \o", \l", \7", \u", \ou", \n" (no dibuja caja)
col Controla el color1 de los puntos o lneas
pch Permite seleccionar el smbolo para marcar los puntos2
type puntos (p), lnea (l), puntos conectados por lneas (b), lneas sobre
los puntos (o), lneas verticales (h), en escalera (s)
xlim, ylim, zlim Define los lmites de los ejes, por ejemplo xlim=c(0,12)
xlab, ylab, zlab Define la leyenda de los ejes, por ejemplo xlab=Tiempo
main Define el ttulo principal del grafico
lwd Controla el grosor de las lneas
lty Tipo de lnea: solida(1), lnea(2), punteada(3), etc.
font Tipo de fuente: normal (1), italica (2), negrita (3), negrita italica(4)
cex Controla el tamano de los smbolos
bg Controla el color del fondo

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

Supongamos ahora que estamos estudiando la memoria de las personas mediante


un test que asigna un puntaje, y que queremos ver cual es la relacion entre el puntaje
obtenido en el test y la edad de la persona. Para eso se realizo el test a 17 personas, se
les pregunto su edad y se les asigno un puntaje. Podemos realizar un grafico de puntos.

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

que produce el siguiente grafico:

Figura 5.2: Grafico simple con el comando plot()

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)

lo cual genera el siguiente grafico:

Figura 5.3: Grafico obtenido con el comando plot() agregando detalles

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

Figura 5.4: Grafico de lneas obtenido con el comando plot()

El comando hist()

Un histograma es una representacion grafica de las frecuencias (absolutas o relativas)


con que aparecen las mediciones (datos) agrupadas en ciertos rangos o intervalos. La
frecuencia de datos que en cada rango es representada mediante una barra cuya altura es
proporcional a la frecuencia. La funcion hist( ) es la que permite construir histogramas
y comparte la mayora de sus parametros con el comando plot(). Consideremos los
siguientes datos que corresponden a un estudio llevado en la estepa norpatagonica,
donde se compara la cobertura vegetal del suelo en un sitio postfuego, y en un sitio
testigo (no quemado). Cada dato corresponde a la cobertura total (suma de todas las
especies). Se tomaron muestras en tres transectas, separadas entre s por un mnimo de
30 metros, y en cada transecta se ubicaron cuadrados de 1m2 . Cada dato corresponde a
una replica de la medida (como un porcentaje del cuadrado) (Ghermandi et al., datos
no publicados). Los datos siguientes corresponden a la cobertura en el sitio testigo.

> 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

Figura 5.5: Grafico obtenido con el comando hist()

Si no se realiza una especificacion, el comando hist( ) realiza una division au-


tomatica del rango de variacion de los datos en categoras utilizando para ello el al-
goritmo de Sturges (el numero de clases c se calcula el numero entero mas cercano a
c = 1+3,322log N , donde N es la cantidad de datos ingresados). En el caso anterior, el
histograma tiene 10 categoras. El comando hist() tiene algunos parametros especfi-
cos, por ejemplo el parametro breaks permite controlar el numero de categoras en las
que se dividira el rango de variacion de los datos (o sea la cantidad de barras a utili-
zar). Por ejemplo, para obtener un grafico en cinco categoras con los datos anteriores
hacemos:

> hist(cobertura, breaks = 5, col = lightblue, xlab = Cobertura,


+ ylab = Frecuencia, main = Cobertura sitio testigo)

Figura 5.6: Grafico obtenido con hist() eligiendo en numero de categoras

Tambien podemos expresar de otra manera el criterio de division de las categoras.


En el siguiente ejemplo pondremos un borde azul a las barras y dividiremos el rango
de variacion de a cinco unidades. Sin embargo, de esta forma hay que tener cuidado en
que la division sea posible, si no, saltara un mensaje de error.

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

En los graficos anteriores, se muestran las frecuencias absolutas de datos. Muchas


veces es preferible utilizar frecuencias relativas (o densidad), para lo cual es necesario
agregar el argumento freq = FALSE, con lo cual obtendremos un histograma donde la
suma de las frecuencias (relativas ahora) es uno.

El comando barplot()

En un grafico de barras se muestran las frecuencias de datos por categoras prees-


tablecidas por el usuario, que es lo que los distingue de los histogramas (donde las
categoras son rangos de datos). El comando en R para generar graficos de barras es
barpot(). El siguiente grafico corresponde a las respuestas de ninos acerca de la marca
de galletita preferida, realizada en una muestra de 15 ninos. Se muestran las frecuencias
absolutas de ninos que eligen cada marca.

> galletita.preferida<-c(Melba= 4, Sonrisas= 2, Pepitos= 6,


+ Boca de dama= 3)
> barplot(galletita.preferida, col=c(red, blue, green, yellow),

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?

Figura 5.8: Grafico obtenido con barplot()

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

Tabla 5.1: Frecuencia de consumo relativa a las horas frente al televisor

Los datos recolectados muestran la distribucion de frecuencias de las respuestas de


los ninos segun la cantidad de horas que miran television, y la categora de alimentos
elegidos para comprar con su dinero. Como todos los datos son numericos podemos
guardarlos en R como una matriz:

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

> producto.elegido<-apply(consumoTV,2,sum) # suma de las columnas


> pie(producto.elegido, labels = columnas, col=rainbow(5), main=NULL)

71
Departamento de Matematica
Universidad Nacional del Comahue

Figura 5.9: Grafico obtenido con pie()

El comando boxplot()

Un grafico ampliamente utilizado para comparar datos agrupados en categoras son


los box plots, cuyo nombre en castellano es la graciosa expresion graficos de cajas y
bigotes. Estos graficos permiten visualizar informacion de estadsticos basicos de con-
junto de datos: los valores mnimo y maximo, el primer y el tercer cuartil, y la mediana
(el segundo cuartil). Los boxplot tambien permiten identificar outliers, valores atpicos
dentro del conjunto de datos que distan considerablemente del resto. En R el comando
para generar boxplots es boxplot() y puede recibir como parametros datos agrupados
por categoras.
Supongamos que tenemos los siguientes datos que corresponden a las mediciones
de la altura de 30 mujeres y hombres. El siguiente codigo genera un boxplot para esos
datos.

> 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

Figura 5.10: Grafico obtenido con boxplot()

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.

5.1.2. Comandos de bajo nivel


As como existen comandos de alto nivel, en R tambien existen comando de bajo
nivel que son aquellos que agregan mas informacion a un grafico ya existente, como
puntos extra, lneas, funciones y leyendas.
En la tabla que mostramos a continuacion, ofrecemis algunos comandos de bajo
nivel y comentamos brevemente su uso.

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

A continuacion agregamos algunas cosa a los graficos generados anteriormente uti-


lizando los comando bajo nivel.
Con el siguiente codigo generamos un histograma de frecuencias relativas, y agrega-
mos con lines la curva de la densidad estimada con el comando density():

> hist(cobertura, breaks = seq(from=0, to=100, by=5), col = violet,


+ border = blue, xlab = Cobertura, ylab = Frecuencia,
+ main = Cobertura sitio testigo, freq = F)
> lines(density(cobertura))

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:

expr: una ecuacion escrita como funcion de x


from, to: el rango sobre el cual la funcion sera graficada
add: argumento logico ; si TRUE el grafico se agrega al existente ( el grafico de
la funcion sera superpuesto al grafico que se encuentra en la ventana activa)

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

> curve(sin(x), from = -1, to = 10, xlab = x, ylab= y, col = red)


> curve(1-exp(-0.5*x), from = -1, to = 10, col = blue, add = TRUE)

Figura 5.12: Grafico obtenido con curve()

5.3. El comando par()


Esta funcion permite modificar los parametros graficos para todos los graficos sub-
secuentes. Hay mas de 70 parametros que pueden modificarse. Mencionaremos solo
algunos.

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)

y cuando queremos reestablecer los comando originales:

par(oldpar)

Veamos en un ejemplo como implementar el comando par. Tomamos los datos de


los productos consumidos en el kiosco segun las horas que los ninos pasan frente al
televisor, contenidos en la Tabla 5.1, para generar varios graficos en una misma imagen
y jugamos un poco con el aspecto visual.

> par(mfrow=c(2,3),fg=green, font=2, col.main=violet)


> barplot(consumoTV[,snacks], names.arg = filas,
+ col=rainbow(4,start = 0, end = 0.2), main=snacks)
> barplot(consumoTV[,bebidas], names.arg = filas,
+ col=rainbow(4, start= 0.2, end = 0.4), main=bebidas)
> barplot(consumoTV[,lacteos], names.arg = filas,
+ col= rainbow(4, start = 0.4, end = 0.6), main=lacteos)
> barplot(consumoTV[,golosinas], names.arg = filas,
+ col=rainbow(4, start = 0.6, end = 0.8), main=golosinas)
> barplot(consumoTV[,otros], names.arg = filas,
+ col=rainbow(4, start = 0.8, end = 1), main=otors)
> par(col.main=red, font=4)
> total.horas<-apply(consumoTV, 1,sum) #suma de las filas
> barplot(total.horas, names.arg = filas, main=total de horas frente a la TV,
+ col=rainbow(5))

produce los siguientes graficos en una misma ventana

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)

barplot(consumoTV[1,], names.arg = categorias)


title(menos de una hora frente a la TV)

barplot(consumoTV[2,], names.arg = categorias)


title(una a dos horas frente a la TV)

barplot(consumoTV[3,], names.arg = categorias)


title(tres a cuarto horas frente a la TV )

barplot(consumoTV[4,], names.arg = categorias)


title(cinco o mas horas frente a la TV)

layout(1)

R produce el siguiente grafico:

78
Departamento de Matematica
Universidad Nacional del Comahue

Otros argumentos utiles para el comando layout() son los siguientes:

widths: vector con el que se establecen los anchos de las columnas, y

heights: vector con el que se establecen las alturas de las filas.

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:

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


> layout(m, widths = c(1,3), heights = c(3,1))
> layout.show(4)
> layout (1)

79
Departamento de Matematica
Universidad Nacional del Comahue

> m<- matrix(c(1, 1, 2, 1), 2, 2)


> layout(m, widths = c(2,1), heights = c(1,2))
> layout.show(2)

Hay mucho para aprender en cuanto a la construccion de graficos en R, y ademas,


pueden crearse graficos adecuados para cada situacion particular.La pagina web www.
r-graph-gallery.com/ (en ingles) es un sitio colaborativo donde los usuarios proponen
o requieren graficos para la mejor visualizacion de los datos o la informacion que quieren
presentar. Ademas, en concordancia con la filosofa de R, hay disponibles cientos de
graficos para los cuales puede accederse a las lneas de codigo para su construccion y
adaptacion a los propios datos.

80
Captulo 6

Los paquetes Popbio y Rramas

En este captulo nos concentraremos en analizar herramientas provistas por los


paquetes Popbio (Stubben et al.) 2016)y Rramas (de la Cruz M 2015), cuyo objetivo es la
construccion y analisis de modelos matriciales de dinamica demografica de poblaciones.
El paquete Popbio, cuyos autores son Chris Stubben, Brook Milligan y Patrick Nantel,
es una traduccion a R del codigo en Matlab desarrollado en Caswell (2001) y Morris y
Doak (2002). Rramas, es un paquete desarrollado por M. de la Cruz, de la Universidad
Politecnica de Madrid, que, al igual que PopBio puede utilizarse para analizar y predecir
la dinamica de poblaciones a partir de una o varias matrices de proyeccion. Esta basado
en el software Ramas Stage (que no es de acceso libre). Ambos permiten calcular, entre
otras muchas cosas, el autovalor dominante de la matriz de proyeccion, distribucion
estable, valores reproductivos, matrices se sensibilidades y elasticidades, proyecciones
demograficas, en los casos determinsiticos y estocasticos, y ofrecen salidas graficas de
los resultados, aunque con variantes propias.
El analisis que permiten estos paquetes es muy completo y complejo. Nos centra-
remos aca en algunos aspectos que nos van a resultar utiles en el analisis de modelos
sencillos, como son el calculo de tasas de crecimiento / decrecimiento poblacional, es-
tructuras estables de edad, valores repoductivos, proyecciones poblacionales y matrices
de sensibilidades y elasticidades. Dentro de la variedad y complejidad de los modelos
demograficos, trabajaremos con modelos determinsticos (aquellos para los cuales las
tasas vitales son invariantes) y algunos modelos estocasticos sencillos. Abunda la bi-
bliografa donde estos modelos son aplicados, y ambos paquetes tienen un manual de
uso extenso y completo.
Daremos previamente un breve repaso del algunos aspectos teoricos basicos de estos
modelos para luego analizar los usos de estos paquetes.

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.

6.2. Modelos determinsiticos y estocasticos

6.2.1. El caso determinstico


Si los parametros demograficos involucrados en el el modelo se consideran invariantes
en el tiempo (es decir, si el modelo se construye bajo el supuesto de que fluctuaciones de
las condiciones ambientales y la densidad poblacional no los afectan significativamente),
estaremos frente a un modelo determinstico. En este caso, el modelo estara descripto
por la ecuacion matricial:
nt+1 = M nt
donde M es una matriz de parametros constantes y es la misma en todo el desarrollo
del modelo.
En el caso determinstico todo el analisis de la dinamica de la poblacion se basa en
una unica matriz: la matriz de proyeccion. Una vez construida a partir de los datos, de

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:

Una matriz es no negativa si cada uno de sus elementos es mayor o igual a 0.


Una matriz es positiva si todos sus elementos son estrictamente mayores que 0.
Una matriz no negativa se dice irreducible s y solo s el digrafo que representa
contiene un circuito que une todos los nodos.
Una matriz no negativa irreducible se dice primitiva si se transforma en positiva
cuando es elevada una potencia suficientemente alta.

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:

A es irreducible si y solo si (I + A)n1 es positiva,


Sea c la longitud del mnimo ciclo en el dgrafo de A. Entonces A es primitiva
An+c(n2) > 0, Nota: Ya que el exponente crece con c esto puede ser aplicado a la
longitud de cualquier ciclo.
2 3n+2
A es primitiva si y solo si An > 0.

Basandose en este teorema, es facil probar la primitividad e irreducibilidad de una


matriz simplemente haciendo un calculo de una potencia (adecuada). Por ejemplo si la
matriz de proyeccion es de orden 5, bastara con evaluar si (I + A)4 es positiva para ver
si es irreducible, y si A12 es positiva para decidir si es primitiva.

6.2.2. Que informacion nos da la matriz de proyeccion


Los teoremas anteriores nos dicen que informacion basica puede extraerse de la
matriz de proyeccion en el caso determinstico y que relacion tienen estos dos calculos
(el autovalor dominante y su autovector asociado) con la dinamica de la poblacion.
Hay otros calculos que pueden hacerse a partir de la misma matriz y que son muy
informativos dentro del contexto del analisis demografico. En total tenemos seis tems
que podemos extraer a partir de calculos basados en la matriz de proyeccion:

la tasa de crecimiento poblacional, dada por el autovalor dominante de la matriz,


la estructura estable, dada por el autovector asociado al autovalor dominante, que
usualmente se presenta escalado a 1,
el vector de valores reproductivos, un vector donde cada componente representa
el valor potencial que un individuo de cada clase tiene en relacion a la futura per-
formance de la poblacion, y que corresponde al autovalor a izquierda de la matriz
de proyeccion (o el autovalor a derecha de la matriz traspuesta). Usualmente se
presenta con el valor de la primera componente del vector igual a 1 y los demas
valores se presentan en relacion a este,
la matriz de sensibilidades, una matriz donde cada elemento mide (a traves de
una derivada) la sensibilidad de la tasa de crecimiento poblacional a pequenas
perturbaciones en los parametros no nulos de la matriz2 ,
2
Por definiciones ver Caswell( 2001)

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.

6.2.3. El caso estocastico


Las fluctuaciones en el medio ambiente producen fluctuaciones temporales en las
tasas vitales que hacen que la estructura de la poblacion y las tasas de crecimiento varen
en el tiempo. Una pregunta central es: como proyectamos y describimos el crecimiento
y la estructura de la poblacion cuando las condiciones ambientales provocan cambios
en las tasas vitales ? Hay muchas formas en la que se puede introducir estocasticidad
en los modelos demograficos y abundan en la bibliografa ejemplos de estudios en los
que se incluye estocasticidad. Aqu discutiremos algunas formas sencillas.
En este caso los parametros de la matriz varan en el tiempo, y se tratara de un
modelo estocastico descrito por la ecuacion

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.

6.2.4. Que informacion podemos obtener en el caso estocastico


Analogo a lo que ocurre con el caso determinstico, en el caso estocastico pueden
obtenerse varios resultados que describen la dinamica poblacional a traves de la seleccion
estocastica de matrices o parametros. A continuacion presentamos los principales:

la tasa estocastica de crecimiento poblacional, normalmente denotada con S , y


de interpretacion analoga al autovalor dominante de la matriz en el caso deter-
minstico. Dependiendo del paquete utilizado puede obtenerse por distintos meto-
dos, generalmente arrojando resultados muy similares. Estos metodos estiman
log(S ).
un intervalo de confianza para log(S ),
la matriz de sensibilidades, de interpretacion analoga al caso determinstico,
la matriz de elasticidades, de interpretacion analoga al caso determinstico,
la proyeccion poblacional para las distintas simulaciones.

El valor de los modelos estocasticos en dinamica de poblaciones reside en que pro-


porcionan informacion valiosa para explorar y comparar la respuesta de una poblacion
ante diferentes grados de variabilidad ambiental, simulando diferentes escenarios (reales
o no) que evaluen la respuesta de las poblaciones a diversos conjuntos de condiciones
ambientales.
La teora de modelos matriciales estocasticos ha sido ampliamente desarrollada por
Cohen(1987), Tuljapurkar y Orzack (1980) y Tuljapurkar (1990). El libro de Morris
y Doak (2002) es una excelente gua para quienes deseen abordar un estudio de estas
caractersticas, y cuenta con los codigos en R para el desarrollo de los ejemplos. Tambien
han sido aplicados a una enormidad de estudios poblacionales.

88
Departamento de Matematica
Universidad Nacional del Comahue
6.3. El paquete PopBio

6.3.1. El caso determinstico con PopBio


Para el desarrollo de esta seccion tomaremos como ejemplo un modelo desarrolla-
do por Farji-Brener et al. (2003) para una especie de hormigas cortadoras de hojas
Acromyrmex lobicornis en base a datos tomados en la estepa del noroeste de la Pa-
tagonia. En el trabajo de referencia se ofrecen dos matrices para distintos sitios de
nidificacion de la hormiga, pero en este ejemplo tomaremos uno solo, el caso de ni-
dos construidos sobre plantas. Acromyrmex lobicornis es la unica especie de hormiga
cortadora de hojas en Argentina cuya distribucion alcanza ambientes climaticamente
rigurosos como la Patagonia. Esta buena adaptabilidad para colonizar estos ambientes
ha sido adjudicada, en parte, a que construyen, como parte del hormiguero, un domo
externo que minimiza la variabilidad climatica ambiental. Esta regulacion de la tem-
peratura interna del nido facilitada por el domo es importante para la supervivencia
y crecimiento del hongo del cual se alimenta la mayora de la colonia. Los datos sobre
los que se construyo el modelo corresponden a censos anuales, por lo que la unidad
de tiempo utilizada en el modelo es un ano. En cada censo se midio el diametro del
domo y se determino si el nido estaba activo o inactivo. Varios estudios en hormigas
han demostrado que el tamano del domo es un buen estimador tanto del tamano de la
colonia como de la produccion de individuos reproductivos, avalando el analisis de la
dinamica de las colonias a traves de la dinamica de los hormigueros. Los hormigueros
fueron separados en categoras de acuerdo al tamano del domo, utilizando como criterio
de clasificacion su diametro (), estableciendose tres clases diametricas: 1, nidos chicos
( 70cm); 2, nidos medianos (70cm < < 100cm) y 3, nidos grandes ( 100cm).
Los elementos de la matriz de proyeccion fueron estimados en base a datos de campo
y completados con datos de la bibliografa. La dinamica de esta poblacion fue descripta
por una matriz que resulta de la suma de dos matrices que involucran los procesos de
crecimiento/decrecimiento de diametro del domo, y la produccion de nuevos nidos:

0, 4 0 0 0, 5 1 2
T = 0, 3 0, 56 0, 33 F = 0 0 0
0, 2 0, 25 0, 33 0 0 0

La matriz de proyeccion M que se utiliza en los analisis se muestra a continuacion:



0, 9 1 2
M = 0, 3 0, 56 0, 33
0, 2 0, 25 0, 33

Los elementos de la primera fila de la matriz M representan los aportes compuestos

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.

6.3.2. Analisis basico y proyeccion poblacional con PopBio


El comando eigen.analysis( ) del paquete Popbio permite realizar un analisis
basico completo para el caso determinsitico. Los argumentos para esta funcion son:
una matriz cuadrada A (la matriz de proyeccion) y zero=TRUE que pone en cero los
elementos de la matriz que son ceros observados (ceros estructurales)4 . . La salida da
como resultado una lista de seis tems:

lambda, el autovalor dominante de la matriz ingresada,


stable.stage, la estructura estable que se presenta escalada a 1,
sensitivities, la matriz de sensibilidades,
elasticities, la matriz de elasticidades,
repro.value, el vector de valores reproductivos, que se presenta con la primera
componente igual a 1 y las demas proporcionales a este valor,
damping.ratio.

Una matriz de orden n n tendra n autovalores reales o complejos. El comando


eigen.analysis da solo el autovalor dominante, cuya existencia depende de algunas
caractersticas de la matriz de proyeccion. Si uno no esta interesado en conocer los
4
Como las sensibilidades y elasticidades son derivadas, podra ocurrir que pequenas perturbaciones en
los parametros den valores de las derivadas distintos de cero, por lo que este argumento obliga a valer
0 a los elementos de la matriz que son 0

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:

stage.vectors, un listado de los vectores poblacionales a lo largo de la proyec-


cion,
pop.sizes, un listado de la abundancia total de la poblacion en cada paso,
pop.changes, la proporcion en la que cambia el total de la poblacion de un paso
al siguiente.

En ocasiones es util construir un grafico para explorar la dinamica de convergencia de


los vectores poblacionales hacia la estructura estable, lo cual puede realizarse mediante
el comando stage.vector.plot, que dara el grafico de la proyeccion de las clases en t.

El codigo y la salida para nuestro ejemplo

Veamos las lneas de codigo y la salida para este ejemplo:

> #Ingresamos los nombres de las clases y la matriz de proyeccion


> clases<- c("chicos", "medianos", "grandes")
> M<-matrix(c(0.9,1,2,0.3,0.56,0.33,0.2,0.25,0.33), ncol=3, nrow=3,
+ byrow=T, dimnames = list(clases,clases))
> M #Vemos la matriz de proyeccion
chicos medianos grandes
chicos 0.9 1.00 2.00
medianos 0.3 0.56 0.33
grandes 0.2 0.25 0.33
> #realizamos el analisis basico de la matriz
> eigen.analysis(M, zero = T )
$lambda1
[1] 1.662296

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

> #ingresamos un vector inicial y proyectamos a 15 unidades de tiempo


> n <- c(5, 5, 5)
> p <- pop.projection(M, n, 15)
> p #mostramos la proyeccion
$lambda
[1] 1.662296

$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

> #graficamos la evolucion de la poblacion


> stage.vector.plot(p$stage.vectors, col = 2:4,
+ xlab=Tiempo,
+ ylab=Proporciones) #col=2:4 elige colores de lneas

La grafica a continuacion muestra el resultado del comando stage.vector.plot

Figura 6.2: Proyeccion en el tiempo para las clases de A. lobicornis

Ejercicio 36. Thymus loscosii Willk. (Lamiaceae) es un tomillo endemico de la Depre-


sion del Ebro en la Pennsula Iberica, que aparece en comunidades abiertas de matorral.
En un estudio de su dinamica poblacional (Garca 2007) se consideraron 4 clases en fun-
cion del tamano de la planta: P (pequenas): hasta 20cm2 de superficie; M (medianas):
hasta 100cm2 ; G (grandes): hasta 500cm2 ; y XG (extragrandes): superior a 500cm2 ,
resultando el siguiente dgrafo:

93
Departamento de Matematica
Universidad Nacional del Comahue

a) Ingresar la matriz de proyeccion de la poblacion,


b) Estudiar su primitividad e irreducibilidad,
c) Hacer un analisis basico de la dinamica poblacional incluyendo matrices de elas-
ticidades y sensibilidades,

100 100
0 100
d) Proyectar dos poblaciones iniciales 0 y 100 a largo plazo y evaluar

0 100
similitudes y diferencias.

6.3.3. El caso estocastico con PopBio


Como ya hemos mencionado, cuando en los modelos demograficos nos referimos a
la estocasticidad estamos refiriendonos a que los parametros demograficos considerados
en el modelo no son invariantes en el tiempo. Tambien mencionamos que podemos
encontrarnos ante (por lo menos) dos situaciones: una de ellas se genera cuando la
variabilidad observada es producto de la influencia de las condiciones del ambiente
sobre los parametros demograficos (estocasticidad ambiental), y la otra cuando en los
muestreos detectamos variacion que no podemos explicar por la variacion de los factores
ambientales (estocasticidad demografica).
El paquete PopBio permite hacer lo primero. Una de las funciones de las que se
dispone en este paquete es stoch.growth.rate( ) que da una estimacion de la tasa
de crecimiento estocastica mediante dos calculos diferentes: la aproximacion de Tulja-
purkar5 . y la aproximacion por simulacion. Los argumentos que ingresan en la funcion
stoch.growth.rate( ) son los siguientes:
5
Para detalles puede consultarse el Captulo 7 de Morris and Doak (2002).

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

Como resultado, el programa da tres tems:

approx, estimacion del ln(S ) segun la aproximacion de Tuljapurkar.


sim, estimacion del ln(S ) por simulacion.
sim.CI, lmites inferior y superior del intervalo de confianza de la estimacion
anterior.

Tambien es posible calcular matrices de sensibilidades y elasticidades, que se calculan


con la funcion stoch.sens( ). Los argumentos que ingresan en esta funcion son:

matrices, una lista de dos o mas matrices de proyeccion.


tlimit, tiempo lmite, por default = 100.

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:

matrices, lista de dos o mas matrices de proyeccion.


n0, vector de condiciones iniciales.
tmax, numero de pasos de tiempo para la proyeccion. Por default tmax=50.
nreps, numero de repeticiones.

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

El codigo y la salida para nuestro ejemplo

Veamos como ingresar el codigo y los resultados que produce (recordar que es nece-
sario tener cargado el paquete popbio):

> #nombramos las clases


> clases<- c("chicos", "medianos", "grandes")
> #Ingresamos las matrices y realizamos
> #un analisis exploratorio basico de cada una
> M1<-matrix(c(1.0714, 1.2, 2.611, 0.0476, 0.2, 0, 0, 0.2, 0.77),
+ ncol=3, nrow=3, byrow=T, dimnames = list(clases,clases))
> eigen.analysis(M1,zero=T)[[1]]
[1] 1.18911
> M2<-matrix(c(1.214, 1 ,2.5 ,0.01, 0.64, 0.11, 0, 0.01, 0.778),
+ ncol=3, nrow=3, byrow=T, dimnames = list(clases,clases))
> eigen.analysis(M2,zero=T)[[1]]
[1] 1.231899

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:

> matrices <-list(M1, M2) # lista de matrices


> n = c(10,10,10) # vector de condiciones iniciales
> # Calculamos la tasa de crecimiento poblacional
> # estimando su logaritmo

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

La funcion stoch.growth.rate nos devuelve


Para calcular el valor estimado de S utilizamos la funcion exp sobre los objetos
approx y sim que devuelve el comando stoch.growth.rate de la siguiente manera:

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

> stochlambdaun <-stoch.growth.rate(matrices, prob = c(0.2,0.8),


+ maxt = 50000, verbose=F)
> stochlambdaun
$approx
[1] 0.1988785

$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

Ahora calcularemos las matrices de sensibilidades y elasticidades con la funcion


stoch.sens( ) para el caso de eleccion equiprobable de las matrices M1 y M2 :

> sensibilidades<-stoch.sens(matrices,tlimit = 100)


> sensibilidades

La salida nos da dos matrices:

$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

Calculamos ahora la proyeccion estocastica de la poblacion partiendo de un vector


inicial, en dos casos: a) de seleccion equiprobable de las matrices, para lo cual no es
necesario incluir el vector de probabilidades ya que esta es la condicion por default,
y b) con probabilidades diferentes, para lo cual, como vimos, hay que incluir como
argumento el vector con las probabilidades asignadas a cada matriz para su seleccion
(lo haremos con prob=c(0.3,0.7)). Suponemos ya ingresadas las matrices en una
lista y el vector de condiciones iniciales n. Haremos 100 repeticiones de cada simulacion,
para un tiempo lmite de 50 unidades de tiempo. Este valor es el default de la funcion.
Si se desea cambiar el numero de unidades de tiempo hay que agregar el argumento
tmax = ( ) en la funcion stoch.projection.

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

Es decir, en la primera iteracion (primera fila) se esperan al cabo de 10 anos aproxima-


damente 467 nidos de tamano chico (466, 9), 23 (22, 7) de tamano mediano, y 9 (8, 6) de
tamano grande. Las demas filas corresponden a los resultados de las otras simulaciones.
Para el segundo caso (distinta probabilidad de seleccion de las matrices), la salida es la
siguiente:

> 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

con identica interpretacion.


Como estas salidas son matrices, uno puede usar esta informacion para graficar lo
que desee. Por ejemplo, podemos calcular para cada clase la media y el desvo estandar
de los numeros finales de cada clase para las 100 repeticiones. Mostramos el codigo y
resultados para el caso de probabilidades iguales.

> #Media y desvo estandar para probabilidades iguales


> mediaeq1 <- mean(xeq[,1])

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

En el link https://cran.r-project.org/web/packages/popbio/popbio.pdf pue-


de encontrarse el manual completo del paquete PopBio.

6.4. El paquete Rramas

6.4.1. El caso determinstico con Rramas


Tomaremos como ejemplo la matriz de proyeccion para Sorbus aucuparia, tomada de
Lediuk et al. (2016). Se trata de un arbol deciduo originario de Europa y Asia, tolerante
a la sombra, introducido en la zona norpatagonica como planta ornamental. Produce
frutos carnosos con 5 a 6 semillas cada uno semillas que son dispersadas por aves. La baja
tasa de crecimiento que presentan las especies tolerantes a la sombra en el sotobosque
hace que pasen desapercibidos y sea ignorado su impacto potencial a largo plazo en los
ecosistemas de bosque. Los autores estudiaron la dinamica poblacional de esta especie
con el fin de identificar procesos demograficos crticos para el crecimiento poblacional
que permitieran formular recomendaciones de manejo para regular la invasion de S.
aucuparia en los bosques nativos del noroeste de la Patagonia.
En este trabajo se considero el ciclo de vida de un organismo de especie dividido en
3 categoras: plantulas, juveniles y adultos, y a su vez las clases de plantulas y juveniles
se dividieron en dos categoras segun si el organismo de desarrolla en areas bajo dosel
o en areas abiertas, debido a que varios de los parametros demograficos considerados
en el modelo varan en funcion de las condiciones de sitio. Esto conduce a una matriz
de proyeccion de 5 5. Los nombres de las categoras son: US: plantulas que crecen
bajo dosel, OS: plantulas que crecen en areas abiertas, UJ: juveniles que crecen bajo
dosel, OJ: juveniles que crecen en areas abiertas, y A: Adultos. La matriz de proyeccion

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

6.4.2. Analisis basico y proyeccion poblacional con Rramas


Para el caso determinstico, Rramas tiene comandos analogos a los de PopBio, con
algunos detalles adicionales como veremos a continuacion. Un detalle no menor, es que
Rramas debe reconocer a la matriz ingresada como matriz de proyeccion. El comando
as.tmatrix interpreta un conjunto de datos ingresados como tabla, como matriz de
proyeccion. Una vez que la matriz es leda como matriz de proyeccion, el comando
summary(), dara como resultado el analisis basico de la matriz de proyeccion. El unico
argumento para este comando es la matriz, y dara como salida los siguientes tems:

transition matrix, muestra la matriz de proyeccion,


lambda, autovalor dominante de la matriz de proyeccion,
stable stage distribution, estructura estable (autovector a derechade la ma-
triz de proyeccion),
reproductive value, vector de valores reproductivos (autovector a izquierda),
sensitivities, matriz de sensibilidades,
elasticities, matriz de elasticidades.

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:

v0, un vector de condiciones iniciales,


mat, la matriz de proyeccion ya ingresada como objeto de Rramas,
time, la cantidad de unidades de tiempo sobre la que se hara la proyeccion.

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.

El codigo y la salida para nuestro ejemplo

Veamos las lneas de codigo y la salida para el ejemplo de S.aucuparia

> matriz <- read.table("sorbus.txt")


> sorbus<- as.tmatrix(matriz, names.st =NULL)
> sorbus #vemos la matriz de proyeccion
transition matrix:
US OS UJ OJ A
US 0.00 0.00 0.00 0.000 0.07
OS 0.00 0.00 0.00 0.000 0.42
UJ 0.72 0.00 0.76 0.000 0.00
OJ 0.00 0.72 0.00 0.900 0.00
A 0.00 0.00 0.09 0.005 0.99

> summary(sorbus) #analisis basico de la matriz de proyeccion


transition matrix sorbus

lambda: 1.02

stable stage distribution:


US OS UJ OJ A
0.017 0.099 0.046 0.598 0.241

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

El comando plot( ) grafica la distribucion estable, los valores reproductivos para


cada clase y el digrafo correspondiente a la matriz de proyeccion:

> plot(sorbus)

Figura 6.3: Digrafo del ciclo de vida (izquierda), estructura estable (centro)y valores
reproductivos (derecha) para S.aucuparia

Con la funcion projectn( ) proyectamos una poblacion inicial en el tiempo para


un vector inicial c(10, 10, 10, 10, 10) para veinte unidades de tiempo. La salida dara una
matriz que tiene por filas la unidad de tiempo y la abundancia poblacional total para
esa unidad de tiempo. Podemos graficar la evolucion de las clases y del total de la
poblacion, utilizando el comando plot.

> v0 <- c(10,10,10,10,10)


> simulacion20 <- projectn(v0=v0, mat=sorbus, time = 20)
> plot(simulacion20, sum=FALSE)
> head(summary(simulacion20)

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

Figura 6.4: Proyeccion de la poblacion de Figura 6.5: Proyeccion de la abundancia


por clase. poblacional total.

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

Ejercicio 37. En un estudio en las sierras de Cordoba se estudio la dinamica poblacio-


nal de Gleditsia triachanthos, un arbol exotico que se encuentra generalmente en suelos
humedos (Marco & Paez 2000). Se consideraron 4 clases: Semillas, Plantulas, Juveniles
y Adultos, obteniendose la siguiente matriz de proyeccion:

0 0 0 2800
0, 017 0 0 0
D= 0

0, 05 0, 03 0
0 0 0, 04 0, 60

a) Construir el dgrafo del ciclo de vida de la poblacion usando Rramas,

b) Realizar un estudio basico completo incluyendo sensibilidades y elasticidades,

c) Realizar una proyeccion de la poblacion para una distribucion inicial cualquiera.

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.

El codigo y la salida para nuestro ejemplo

Ingresamos la matriz de proyeccion y realizamos un analisis basico:

> matriz <- read.table("fabiana.txt")


> fabiana<- as.tmatrix(matriz, names.st =NULL)
> fabiana
transition matrix:
stage.1 stage.2 stage.3 stage.4
stage.1 0.0 0.0 0.00 50.00
stage.2 0.2 0.0 0.00 0.00
stage.3 0.0 0.4 0.26 0.00
stage.4 0.0 0.0 0.13 0.52

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

> # simulacion determinstica de 20 a~


nos a partir de
> # un estado incial dado por el vector v0:
> v0 <- c(10,10,10,10)
> simu20 <- projectn(v0=v0, mat=fabiana, time = 20)
> plot(simu20, sum=FALSE)
> head(summary(simu20))

Los resultados son:

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

Figura 6.7: Proyeccion de la abundancia por clases de F. imbricata

110
Departamento de Matematica
Universidad Nacional del Comahue

Figura 6.8: Proyeccion de abundancia poblacional de F. imbricata

A continuacion haremos 100 simulaciones de 20 anos considerando estocasticidad


demografica. Suponemos previamente ingresada la matriz:

> simu20.ds <- projectn(v0= c(10,10,10,10), mat=fabiana,


+ time = 20, estdem=TRUE, nrep=100)
> plot(simu20.ds)

Los resultados, numericos y graficos se muestran a continuacion:

> 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

Figura 6.9: Proyeccion de abundancia poblacional de F. imbricata con estocasticidad


demografica

Realizaremos ahora 100 simulaciones de 20 anos con estocasticidad ambiental y de-


mografica simultaneamente. Para eso, debemos primero generar la matriz que describe
la estocasticidad ambiental y luego haremos las simulaciones. Suponemos previamente
ingresada la matriz:

> sdenv <- fabiana/20


> sdenv
transition matrix:
P1 P2 J A
P1 0.00 0.00 0.0000 2.500
P2 0.01 0.00 0.0000 0.000
J 0.00 0.02 0.0130 0.000
A 0.00 0.00 0.0065 0.026
> simu20.eds <- projectn(v0=c(10,10,10,10), mat=fabiana,
+ matsd =sdenv, time = 20,
+ estdem=TRUE,estamb=TRUE, nrep=100)
> plot(simu20.eds)
> summary(simu20.eds)
Time Minimum -1 S.D. Average +1 S.D. Maximum
1 0 40 40.00 40.00 40.00 40
2 1 442 480.53 516.35 552.17 615
3 2 199 339.17 437.63 536.09 772
4 3 84 201.34 314.33 427.32 664
...
20 19 111 566.51 1164.13 1761.75 3233
21 20 175 611.74 1299.63 1987.52 3722

112
Departamento de Matematica
Universidad Nacional del Comahue

Figura 6.10: Proyeccion de abundancia poblacional de F. imbricata con estocasticidad


demografica y ambiental

Por ultimo, consideraremos un escenario con acciones de manejo. En cada paso de


tiempo 10 individuos seran agregados a las primeras tres categoras y 30 por ciento de
los individuos adultos seran removidos.

man <- c(10, 10, 10, -0.3)


p1 <- projectn(v0 = c(100, 100,100, 100), mat= fabiana , management=man)
summary(p1)
summary(p1, harvest=T) # resumen de la historia de manejo

Los resultados, numericos y graficos se muestran a continuacion. A la izquierda, el


resumen de la trayectoria poblacion y a la derecha el resumen de la historia de manejo:

> summary(p1)

Time Abundance Time Abundance


1 0 400 1 0 NA
2 1 5161 2 1 20
3 2 3327 3 2 20
4 3 1548 4 3 12
5 4 493 5 4 20
6 5 1956 6 5 20
7 6 2344 7 6 20
8 7 1521 8 7 17
9 8 425 9 8 20
10 9 276 10 9 20
11 10 498 11 10 20
113
Departamento de Matematica
Universidad Nacional del Comahue

Figura 6.11: Abundancia poblacional de F. imbricata con acciones de manejo

Figura 6.12: Trayecroria de manejo para la poblacion de F. imbricata

En el link https://cran.r-project.org/web/packages/Rramas/Rramas.pdf pue-


de encontrarse el manual completo del paquete Rramas.

Ejercicio 38. Introduzca estocasticidad en la matriz del Ejercicio 36 y realice un anali-


sis completo.

Ejercicio 39. Introduzca estocasticidad en la matriz del Ejercicio 37 y realice un anali-


sis completo.

114
Captulo 7

Ecuaciones Diferenciales. El
paquete deSolve.

El paquete deSolve, desarrollado por K. Soetaert, R. W. Setzer y T. Petzoldt,


permite resolver problemas de valor inicial de:

ecuaciones diferenciales ordinarias (EDO),


ecuaciones diferenciales algebraicas (EDA),
ecuaciones diferenciales en derivadas parciales (EDP).

La implementacion de un problema de valor inicial de una ecuacion diferencial or-


dinaria en R se puede dividir en dos partes:
La especificacion del modelo, que a su vez consta de los siguientes pasos:

la especificacion de los parametros del modelo y sus valores,


la definicion del estado del modelo y de sus valores iniciales,
la implementacion de las ecuaciones del modelo que calculan la tasa de cambio
(es decir dX
dt
) de las variables de estado.

y la aplicacion del modelo que consta de:

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.

Veremos a continuacion como implementar estos conceptos en EDO y luego en


sistemas de EDO

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:

lsoda(yinit, times, func, parms)

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:

func<-function(times, yinit, parms, ... ){ codigo }

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.

> solution1<-lsoda(state1, times1, logistic, parameters1)

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:

> plot(solution1,xlab=tiempo, ylab=y(t))

El resultado es el grafico que se muestra a continuacion:

117
Departamento de Matematica
Universidad Nacional del Comahue

Figura 7.1: Solucion numerica de la ecuacion de crecimiento logstico para r = 0,3 y


K = 500

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:

dede (y, times, func, parms, method, ...)


lagvalue (t, nr)
lagderiv (t, nr)

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)

Vamos a graficar ambas simulaciones en un mismo grafico, para eso usamos el


parametro mfrow. Como el comando plot que usamos en este caso es el del paque-
te deSolve debemos definir el parametro mfrow=NULL ya que en este paquete, por
default tiene el valor c(3,3). Como el resultado de la funcion dede es una matriz de la
clase deSolve que ademas de la variable y contiene la informacion del retardo debemos
indicar con la opcion which = 1 que solo queremos visualizar los valores de y.

> 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

Figura 7.2: Solucion numerica de la ecuacion diferencial con retardo, para = 1 y = 2

Veamos el caso de la ecuacion de crecimiento logstico donde se introduce un retardo


en la respuesta. La ecuacion es la siguiente:

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:

#definimos la funcion derivada


> derivada <- function(t, y, parms) {
+ if (t < 0) { lag <- 19} else {lag <- lagvalue(t - 0.74)}
+ dy <- r * y * (1 - lag/m)
+ list(dy, dy = dy)
+ }
> #definimos los parametros y los valores iniciales
> r <- 3.5; m <- 19
> yinit <- c(y = 19.001)
> times <- seq(-0.74, 40, by = 0.01)

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)

La grafica de la izquierda muestra el resultado de la solucion numerica de la ecuacion


logstica con retardo y la de la derecha la variacion de la derivada de y(t) respecto de
los valores de y(t):

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

Ejercicio 43. Modificar el script anterior para distintos valores de y estudiar su


efecto sobre la solucion.

Ejercicio 44. Implementar el problema descrito por la siguiente ecuacion diferencial


con retardo:
dy
= .y(t 1)(1 + y(t))
dt
en el intervalor [0, 20] con y(t) = t para t 0, explorando los valores de : 1,5, 2, 2,5
y 3.

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:

> parameters2<-c(a=-8/3, b=-10, c=28)


> state2<-c(X=1, Y=1, Z=1)

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

Imaginemos que queremos implementar el modelo a lo largo de 100 das y ver la


evolucion en intervalos diarios de 0, 01. Para esto usamos el comando seq() de R para
crear la secuencia de tiempos:

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

R generara entonces los siguientes graficos:

125
Departamento de Matematica
Universidad Nacional del Comahue

Figura 7.4: Soluciones numericas de las Ecuaciones de Lorentz

7.4. Analisis cualitativo de sistemas no lineales


En muchas ocasiones, los SEDO no pueden ser resueltos analticamente. Esto es
particularmente cierto en el caso no lineal, que habitualmente surge (por desgracia)
cuando se modelan sistemas fsicos o naturales. Es comun que la integracion numerica
sea la unica manera para analizar las propiedades del sistema.
Para no hacer engorrosa la notacion a continuacion daremos las definiciones para
un SEDO bindimensional no lineal autonomo, que tiene la forma general:
dx
= F (x, y)
dt
dy
= G(x, y)
dt
Las variables dependientes del sistema, x(t) e y(t) se llaman variables de estado.
Una solucion de tal sistema es un par de funciones x(t) e y(t) que definen una curva
C en el plano xy, que se conoce como plano de fases. Cada punto de la curva C de-
termina el estado del sistema en un instante t correspondiente a condiciones iniciales
determinadas. Por ello es de especial interes conocer las formas de estas curvas, que se
denominan trayectorias u orbitas del sistema. En cada punto (x, y) de una trayectoria,

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.

7.4.1. Funciones clave


El paquete phaseR (Grayling 2016) emplea seis funciones clave para el analisis de
planos de fase:

flowField, que grafica los campos de direcciones para sistemas autonomos de


una o dos dimensiones,

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.

7.4.2. Sistemas dinamicos autonomos unidimensionales


Un sistema dinamico autonomo unidimensional puede ser escrito como una EDO
del tipo:
dy
= f (y)
dt
donde y = y(t). Como ejemplo para este tipo de sistemas usaremos el modelo de creci-
miento logstico, que es un modelo no lineal que analizamos en la seccion 7.1. Aunque
el modelo tiene solucion analtica, lo utilizamos como ejemplo para ilustrar todos los
pasos requeridos en el analisis cualitativo de las soluciones y los equilibrios.
En primer lugar debemos presentar la funcion. La sintaxis de la funcion es parecida
a la de la seccion anterior, solamente que para el uso con el paquete PhaseR no debemos
determinar una condicion inicial. El siguiente script define la ecuacion de crecimiento
logstico:

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

Figura 7.6: Diagrama de fases para el modelo logstico con r = 1 y K = 2. El equilibrio


y = 0 es inestable mientras que y = 2 es estable

La conclusion respecto de la estabilidad de los equilibrios puede corroborarse tam-


bien por medio del siguiente codigo, que utiliza el comando stability:

> logistic.stability.1 <-


+ stability(logisticP, y.star = 0, parameters = c(1,2), system = one.dim)
Discriminant: 0.9999999 Classification: Unstable

> logistic.stability.2 <-


+ stability(logisticP, y.star = 2, parameters = c(1,2), system = one.dim)
Discriminant: -1 Classification: Stable

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:

> loktaVolterra <- function(t, y, parameters){


+ #variables
+ x <- y[1]
+ y <- y[2]
+ # parametros
+ lambda <- parameters[1]
+ epsilon <- parameters[2]
+ eta <- parameters[3]
+ delta<- parameters[4]
+ # definimos las ecuaciones diferenciales
+ dy <- numeric(2)
+ dy[1] <- lambda*x - epsilon*x*y
+ dy[2] <- eta*x*y - delta*y
+ list(dy)
+ }

El paquete deSolve requiere nuevamente de la creacion de una funcion que tome


valores en t, pero aqu nos devuelve una lista cuyo primer elemento en un vector con las

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:

> loktaVolterra.flowField <-


+ flowField(loktaVolterra, x.lim = c(0,5), y.lim = c(0,10),
+ parameters = c(2, 1, 3, 2), points = 19, add = FALSE)
> grid()
> loktaVolterra.nullclines <-
+ nullclines(loktaVolterra, x.lim = c(-1,5), y.lim = c(-1,10),
+ parameters = c(2, 1, 3, 2), points = 500)
> y0<- matrix(c(1, 2, 2, 2, 3, 4), ncol = 2, nrow = 3, byrow = TRUE)
> loktaVolterra.trajectory<-
+ trajectory(loktaVolterra, y0 = y0, t.end = 10,
+ parameters = c(2, 1, 3, 2), colour = rep(black,3))

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)

Finalmente podemos verificar que lo que vemos respecto de la estabilidad de los


equilibrios es correcto:

133
Departamento de Matematica
Universidad Nacional del Comahue
> loktaVolterra.stability.1 <-
+ stability(loktaVolterra, y.star = c(0,0), parameters = c(2, 1, 3, 2))

T: 0 Delta: -4 Discriminant: 16 Classification: Saddle


> loktabolverra.stability.2 <-
+ stability(loktaVolterra, y.star = c(2/3, 2), parameters = c(2, 1, 3, 2))

T: 0 Delta: 4 Discriminant: -16 Classification: Centre

Lo que podemos observar en el grafico es que independientemente de la condicion


inicial que tomemos (con tal de que sea x > 0 e y > 0) el sistema quedara oscilando
en una trayectoria cerrada alrededor del punto de equilibrio ( 23 , 2) . Alternativamente
estas oscilaciones pueden ser vistas graficando cada variable dependiente x y y vs. la
variable independiente t usando el siguiente codigo:

> loktaVolterra.numericalSolution <-


+ numericalSolution(loktaVolterra, y0 = c(3,4), t.end = 10, type = one,
+ parameters = c(2, 1, 3, 2), colour = c(green, orange),
+ ylab = x, y, ylim = c(0, 10))
> legend( bottomright, col = c(green, orange), legend = c(x, y), lty = 1)

Figura 7.8: Soluciones numericas para el modelo de Lotka- Volterra

Ejercicio 45. Para las siguientes ecuaciones diferenciales

dP
dt
=k

134
Departamento de Matematica
Universidad Nacional del Comahue
dP
dt
= rp
dP
dt
= r(K p)

se pide:

a) Encontrar analticamente los puntos de equilibrio


b) Dibujar el campo de pendientes
c) Dibujar varias trayectorias y los equilibrios
d) Dibujar los diagramas de fase
e) Evaluar numericamente la estabilidad de los equilibrios

Ejercicio 46. Considerar el siguiente sistema dinamico de competencia de dos especies


x1(t) y x2(t) :
dx1
= r1 x1 (k1 11 x 12 y)
dt
dx2
= r2 x2 (k2 21 x 22 y)
dt
donde r1 , r2 , k1 , k2 , 11 , 12 , 21 , 22 son los parametros del sistema.
Considerar los siguientes valores para los parametros:

r1 = 1; r2 = 1; k1 = 4; k2 = 1; 11 = 4; 12 = 1, 21 = 7; 22 = 1

a) Graficar las isoclinas y las trayectorias


b) Encontrar todos los puntos de equilibrio.
c) Clasificar los puntos de equilibrio
d) Graficar las soluciones numericas de las ecuaciones para algunas condiciones ini-
ciales

7.5. Sistemas de Ecuaciones Diferenciales Ordina-


rias Lineales con retardo
As como se puede introducir una respuesta retardada de la variable dependiente a
efectos limitantes en el caso de una EDO, puede hacerse lo mismo cuando se trata de
sistemas de EDO. Mostraremos a traves de un ejemplo, como usar la funcion dede del
paquete deSolve permite resolver estos modelos. Este modelo describe la dinamica de
un sistema de depredador y presa donde la densidad de la presa (x) es regulada por su

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)

Figura 7.9: Solucion numerica del sistema depredador-presa con retardo

Ahora graficamos cada poblacion en funcion del tiempo:

def.par <- par(no.readonly = TRUE)


plot(yout[,2], type = "l", lwd = 2,ylab = "Presa", xlab = "Tiempo")
plot(yout[,3], ylab = "Depredador", xlab = "Tiempo", type = "l", lwd = 2)
layout(1)

Figura 7.10: Variacion de las poblaciones de depredadores y presas en el modelo con


retardo

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:

a) Interpretar las ecuaciones del sistema.


b) Encontrar la solucion para el intervalo [0, 40].
c) Graficar.

138
Referencias Bibliograficas

Caswel H. 2001. Matrix population models: Construction, analysis, and interpretation.


Second edition. Sinauer, Sunderland, Massachusetts, USA.
Cohen JE, SW Christensen and CP Goodyear. 1983. A Stochastic Age-Structured Po-
pulation Model of Striped Bass ( Morone sexatilis) in the Potomac River. Canadian
Journal of Fisheries and Aquatic Sciences, 40:2170-2183
Correa JC y N Gonzalez. 2002. Graficos Estadsticos con R. Universidad Nacional-
Sede Medelln. Colombia. Disponible en URL: https://cran.r-project.org/
doc/contrib/grafi3.pdf
de la Cruz M. 2015. Rramas: Matrix population models. Disponible en URL: https:
//cran.r-project.org/web/packages/Rramas/Rramas.pdf
de Torres Curth MI, L Ghermandi and C Biscayart. 2012. Are Fabiana imbricata sh-
rublands advancing over northwestern patagonian Grasslands? A population dy-
namics study involving fire and precipitation. Journal of Arid Environments, 83:
78-85.
Farji-Brener AG, MI de Torres Curth, PV Casanovas y PN Naim. 2003. Consecuencias
demograficas del sitio de nidificacion de la hormiga cortadora de hojas Acromyrmex
lobicornis: un enfoque utilizando modelos matriciales. Ecologa Austral, 13: 183-194.
Gantmacher F. 1959. Matrix Theory. Chelsea Publishing Company, New York.
Garca MB. 2007. Demografa y viabilidad de poblaciones perifericas del tomillo san-
juanero (Thymus loscosii Willk.), endemismo del Valle del Ebro. Ecosistemas 16
(1): 58-68.
Grayling MJ. 2016. phaseR: Phase Plane Analysis of One and Two Dimensional Autono-
mous ODE Systems. Disponible en URL: https://CRAN.R-project.org/package=
phaseR.
Hirsh MW and S Smale. 1974. Differential Equations, Dynamical Systems and Linear
Algebra. Academic Press.

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:

donde escribimos el paquete que queremos instalar, en este caso expm.


Una vez instalado el paquete debemos cargarlo a la memoria de R. Esto se puede
hacer ingresando

>library(expm)

en la consola, o seleccionando el paquete deseado en la pestana Packages:

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.

Con la instruccion UpdateR () se detectara si hay una nueva version R disponible,


y si es as se descargara e instalara.
En el sitio www.r-statistics.com hay un intstructivo (en ingles pero con imagenes)
paso a paso para este procedimiento

143
Departamento de Matematica
Universidad Nacional del Comahue

144
Apendice B

Solucion ejercicios seleccionados

Los siguientes codigos, sirven de ejemplo como solucion de algunos ejercicios selec-
cionados.

B.1. Captulo 4: Condiciones, Bucles y Funciones

B.1.1. 4.2: Condicionales


Ejercicio 23

> C<-matrix(c(1,2,0,4,0,6,7,8,9),ncol=3, nrow=3)


> if(ncol(C)!=nrow(C)){
+ print(La matriz ingresada no es cuadrada)
+ }else if(det(C)==0){
+ print(La matriz tiene determinante cero por lo tanto no tiene inversa)
+ }else {
+ print(El determinante de la matriz es:)
+ print(det(C));
+ print(y su inversa es:)
+ print(solve(C))
+ }
[1] "el determinante de la matriz es:"
[1] -36
[1] "y su inversa es:"
[,1] [,2] [,3]
[1,] 1.3333333 -0.1666667 -0.8888889
[2,] 0.5000000 -0.2500000 -0.1666667
[3,] -0.3333333 0.1666667 0.2222222

145
Departamento de Matematica
Universidad Nacional del Comahue
Ejercicio 24

> A<-matrix(c(0,2,3,0,0,4,0,0,0), ncol=3, nrow=3)


> b<-c(0,0,0)
> if(ncol(A)!=nrow(A)){
+ print(La matriz ingresada no es cuadrada)
+ }else{
+ d<-det(A)
+ if(d==0){
+ print(El determinante es 0, el sistema no tiene solucion unica)
+ }else if(length(b)!=nrow(A)){
+ print(La dimension de b no es adecuada para resolver el sistema)
+ }else{
+ if(b==integer(nrow(A))){
+ print(La solucion buscada es la trivial)
+ }else{
+ sol<-solve(A,b)
+ print(sol)
+ }
+ }
+ }
[1] "El determinante es 0, por lo tanto el sistema no tiene solucion unica"

B.1.2. 4.3: Bucles


Ejercicio 26

> n<-7
> fac<-1
> for(i in 1:(n-1)){
+ fac<-fac*(i+1)
+ }
> fac
[1] 5040

B.1.3. 4.4 Funciones


Ejercicio 34

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

B.2. Captulo 7: Ecuaciones Diferenciales. El pa-


quete deSolve

B.2.1. 7.1: Ecuaciones Diferenciales Ordinarias


Ejercicio 40

> 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

Figura B.1: Grafico del ejercicio 40

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

Figura B.2: Grafico del ejercicio 42

B.2.2. 7.4: Analisis cualitativo de sistemas no lineales


Ejercicio 46

> #ecuaciones diferenciales


> competencia<-function (t, y, parameters){
+ x <-y[1]
+ y <-y[2]
+ #parametros
+ r1<-parameters[1]
+ r2<-parameters[2]
+ k1<-parameters[3]
+ k2<-parameters[4]
+ a11<-parameters[5]
+ a21<-parameters[6]
+ a12<-parameters[7]
+ a22<-parameters[8]
+ dy<-numeric(2)
+ #tazas de cambio
+ dy[1] <- r1*x*(k1-a11*x-a12*y)
+ dy[2] <- r2*y*(k2-a21*x-a22*y)
+ list(dy)
+ }
> #isoclinas
> competenciaIsoclinas <-
+ nullclines(competencia, x.lim = c(-0.5, 5), y.lim = c(-0.5, 20),
+ parameters = c(1,1,4,-1,-4,-7,1,1), points = 500,add= F)
> grid()

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

Figura B.3: Grafico de las iscolinas y trayectorias del ejercicio 46

Las ecuaciones diferenciales son en este caso:


dx
= x(4 +4x y)
dt
dy
= y(1 + 7 y)
dt
Para encontrar el equilibrio no trivial debemos resolver
    
4 1 x 4
=
7 1 y 1

> #puntos de equilibrio no triviales


> A<-matrix(c(4, -1, 7, -1),ncol=2, nrow=2, byrow=TRUE)
> b<-c(-4,1)
> solve(A,b)
[1] 1.666667 10.666667

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

T: 3 Delta: -4.000001 Discriminant: 25.00001 Classification: Saddle


> #clasificacion equilibrio no trivaial encontrado con solve
> estabilidadNoTrivial<-stability(competencia, y.star = c(1.666667,10.666667),
+ parameters = c(1,1,4,-1,-4,-7,1,1))

T: -3.999996 Delta: 53.33334 Discriminant: -197.3334


Classification: Stable focus

Graficamos ahora la solucion numerica para el estado inicial: (x0 , y0 ) = (3, 4)

> #solucion numerica


> competenciaSolucionNumerica<-
+ numericalSolution(competencia, y0 = c(3,4), t.end = 6, type = one,
+ parameters = c(1,1,4,-1,-4,-7,1,1),
+ colour = c(violet, blue),
+ ylab = x, y, ylim = c(0, 20))
> legend(topright, col = c(violet, blue), legend = c(x, y), lty = 1)

Figura B.4: Grafico de la solucion numerica 46

153
Departamento de Matematica
Universidad Nacional del Comahue

154
Cuadernos Universitarios CRUB

1. Nudler, O. 1974. Introduccion al problema de la fundamentacion de la Aritmetica.

2. Buch T. 1974. Los carbones.

3. Buch . 1974. Uniones qumicas: La teora electronica de la valencia.

4. Barreiro T. 1975. Etica, individuo y sociedad.

5. Hernandez E. 1975. Positivismo y cientificismo en la Argentina.

6. Porta de Bressan AM. 1976. Sistemas y Bases de numeracion. Algunas propieda-


des numericas en distintas bases.

7. Sanchez y Julia E. 1976. Sociedad indgena y conquista del desierto. Norpatagonia.


Etnohistoria.

8. Guala J y A Bastianciq. 1977. Las cantidades y sus medidas.

9. Daleo GR. 1977. Mecanismos moleculares en memoria y aprendizaje.

10. Bressan AM y M de la Cruz.1977. Piaget y la ensenanza del tiempo en nuestra


escuela.

11. de la Cruz M, T Barreiro y AM Sorocinschi. 1982. Una experiencia del perfec-


cionamiento docente universitario centrada en el factor humano y la dinamica
grupal.

12. Barreiro T. 1983. Escuela, aprendizaje y afectividad.

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

15. Grigera D, C Romero y A Ramassotto. 1986. Los problemas ambientales de Ba-


riloche: su deteccion por medio de una encuesta a un sector de la comunidad.

16. El ADN: su descubrimiento, organizacion y manipulacion. Conferencia dada por


el Dr. James Watson en el Centro Regional Universitario Bariloche, Universidad
Nacional del Comahue. Julio 1986

17. Panorama actual de la Acuicultura en la Argentina. Primera Reunion Argentina


de Acuicultura, Bariloche, 19 al 24 de abril de 1987. Secretara de Investigacion,
CRUB - UNC.

18. Bianchi E. 1987. Estudio Ecologico de la Pampa de Huenuleo (San Carlos de


Bariloche, Prov. Ro Negro) Parte 1: Geomorfologa.

19. de la Cruz M y MS Lolich. 1987. Confrontacion cultural y fracaso escolar.

20. Ferraris C. 1993. Orientacion en el plano y en el espacio.

21. de Torres Curth M y V Montoro. 1993. Teora de Matrices, aplicacion a la Biologa.

22. Sineriz L. 1994. Metodos y heursticas de resolucion de problemas.

23. Ferraris C.1995. Construcciones con regla y compas.

24. Bello MT, MF Alonso y M de L Baiz. 1996. Rendimiento en peso de los ejemplares
de tamano comercial del pejerrey patagonico.

25. Montoro, V. 1997. Elementos de logica proposicional.

26. Ferraris C y V Montoro. 1997. Los primos de Fermat y otros parientes aritmeticos
(taller).

27. Ferraris C. 1997. Una definicion geometrica de angulos. Ordenamiento - suma -


aplicacion a rotaciones.

28. Ferraris C. 1997. Espacios vectoriales y transformaciones lineales.

29. Baiz M de L y MT Bello. 1997. Desplazamientos de Oncorhynchus mykiss (Walb.)


y de Salmo trutta L. (Pisces, Salmonidae) en el Lago Nahuel Huapi.

30. Crivelli E. 1998. Aportes para el conocimiento del comportamiento hdrico de la


cuenca del Ro Manso Superior.

31. Riestra D. 1998. La reensenanza de la escritura como problema multidisciplinario.

156
Departamento de Matematica
Universidad Nacional del Comahue
32. de Torres Curth M. 1998. Calculo diferencial: Teora y aplicaciones.

33. Montoro V. 1999. La teora de conjuntos. Una mirada historica y epistemologica.

34. Santinelli R. 1999. Los numeros reales. Racionales e irracionales. Una mirada
historica y epistemologica.

35. Di Pasquale C. 1999. Modelos matematicos en poblaciones dinamicas.

36. de Torres Curth M. 2000. El concepto de lmite, una mirada historico episte-
mologica.

37. Montoro V y MT Juan. 2000. Numeros complejos.

38. Montoro V. 2000. Anillo de Polinomios.

39. Biscayart C y M Ferrero. 2000. Particularidades sobre la estructura algebraica de


modulo.

40. Crivelli E. 2000. Calculo del nivel del Lago Nahuel Huapi a partir de datos me-
teorologicos del Aeropuerto Bariloche.

41. Di Pasquale C y C Biscayart. 2001. Un camino a la optimizacion. La programacion


dinamica.

42. Grigera D y M Palacio. 2002. La percepcion de los problemas ambientales de las


ciudades de S. C. de Bariloche y de Neuquen por parte de un sector social de su
poblacion.

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.

45. Ferraris C. 2002. Siempre hay un espacio para un problema.

46. Montoro V y MT Juan. 2003. Introduccion a la teora de grafos.

47. Ferraris C y M Ferrero. 2003. Geometra para armar.

48. Sineriz L y R Santinelli. 2006. Transformaciones rgidas con Cabr Geometre II:
una aproximacion a la teora axiomatica.

49. de Torres Curth M, C Biscayart y AM Fernandez. 2006. Logica informal.

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.

51. Baccala N y V Montoro. 2008. Introduccion al analisis multivariado.

52. Juan MT y M Ferrero. 2008. Estudio de conicas.

53. Grigera D y A Trejo. 2009. Aves continentales de las provincias del Neuquen, Ro
Negro y Chubut; distribucion y estado de conservacion.

54. Montoro V. 2010. Estructuras algebraicas: grupos finitos.

55. Sineriz L, C Ferraris y M Ferrero. 2010. Aspectos heursticos en el proceso de


demostracion. La trastienda de la matematica.

56. de la Cruz M, N Scheuer y A Pedrazzini. 2012 Asesoramiento y capacitacion a dis-


tancia para investigadores en Ciencias Sociales en el uso de analisis multivariados.
Volumen 1: La lexicometra.

57. Baccala N y V Montoro. 2013. Lexicometra; tecnicas y estadsticas para analisis


de textos escritos, orales y preguntas abiertas.

58. Montoro V y M de la T Quijano. 2014. Estructura algebraica de grupo, guas de


estudio.

59. Garibotti G. 2016. Probabilidad y estadstica.

60. Garibotti G. 2016. Introduccion al paquete estadstico R.

61. de Torres Curth M y A Koennecke. 2017. Matrices y ecuaciones diferenciales


ordinarias con R. Operaciones, calculos y aplicaciones.

158

Вам также может понравиться