knitr::opts_chunk$set(echo = TRUE)
require(imarpe)

\section{Resumen}

Este documento es una introducción al uso del paquete imarpe, el cuál proporciona herramientas para la elaboración de gráficas, tablas y reportes que se realizan de manera rutinaria en las investigaciones producidas por el Instituto del Mar del Perú (IMARPE). El objetivo principal de imarpe es que los usuarios trabajen en R sin requerir conocimientos avanzados de programación, ahorrando tiempo en el procesamiento de información.

Palabras clave: R, imarpe, automatización, reportes, figuras, tablas.

\section{Introducción}

imarpe es un paquete implementado en R cuya principal función es automatizar el procesamiento de información así como automatizar la elaboración de gráficas, tablas, y reportes que son necesarios en el trabajo rutinario para el personal del Instituto del Mar del Perú (IMARPE). El diseño de este paquete es flexible, permitiendo al usuario realizar cambios sobre los parámetros de los resultados ya que tendrán a su disposición el código en R que genera los productos; adicionalmente, el diseño de este paquete permite trabajar con funciones genéricas (e.g. plot, summary, print) sobre cada clase de datos, facilitando de esta manera su utilización incluso con conocimientos mínimos de R.

\pagebreak

Las principales ventajas que proporciona imarpe son:

\subsection{Programación orientada a objetos}

R tiene tres sistemas orientados a objetos (S3, S4 y R5), y todos trabajan con los conceptos de "clase" y "método". Una clase se define como un tipo de objeto, describiendo que propiedades posee, como funciona y como este objeto se puede relacionar con otros tipos de objetos; de esta manera, cada objeto debe poseer una clase. Por otro lado, un método se define como aquella función que está asociada a un tipo particular de objetos.

S3 implementa un estilo de programación orientada a objetos llamada "función genérica OO" (o en inglés, generic-function OO). En el funcionamiento de este sistema se realizan cálculos a través de métodos y a través de un tipo especial de función llamada "función genérica", la cual decide qué método utilizar.

El uso principal de S3 en R es a través de los métodos print, summary and plot. Estos métodos permiten tener una función genérica por ejemplo de print, que mostraría el objeto de una manera especial.

Instalación de imarpe Para usar imarpe se debe tener instalado R, y se recomienda usar la interface gráfica de R Studio. Para la instalación de todo paquete de R se require contar con internet y luego de verificar esto, desde R Studio se debe intalar y cargar el paquete devtools, de la siguiente manera:

install.packages("devtools")
library("devtools")

La instalación de imarpe se realizará directamente de la cuenta github del Instituto del Mar del Peru (IMARPE) \url{https://github.com/imarpe}, lugar donde se trabaja en las mejoras y actualizaciones de los paquetes en R desarrollados por el personal del IMARPE.

En esta web también se encuentra imarpe, y su instalación se realizará usando las siguientes líneas de código. La primera línea de código instala el paquete y debe ser corrida por única vez, sin embargo, cada vez que se haga una actualización del paquete, se deberá correr nuevamente para cargar de manera automática la nueva versión de imarpe. La segunda línea de código se encargará de cargar el paquete ya instalado, esta debe ser ejecutada cada vez que se quiera hacer uso de imarpe.

install_github("imarpe/imarpe")
library(imarpe)

\section{Estructura de imarpe}

imarpe cuenta con el desarrollo del módulo de pesquería. Sin embargo, el objetivo es extender el desarrollo del paquete a tres módulos más, los cuales estén conformados por los modulos de biología, oceanografía y cruceros hidroacústicos.

\subsection{Módulo Pesquería}

Esta sección trabaja sobre información pesquera, orientada al análisis de las variables: captura y desembarque, esfuerzo y captura por unidad de esfuerzo (cpue), reproduciendo tablas, gráficas y reportes de manera automatizada. Así mismo, el Programa de Observadores a Bordo (Programa de Bitácoras de Pesca - PBP) del IMARPE también cuenta un subsección de trabajo dentro del módulo de pesquería, el cual permite obtener las principales gráficas y tablas que son requeridas en los reportes periódicos que el PBP emite.

Las principales funciones con las que cuenta imarpe son 4 y las explicaremos al detalle en las siguientes sub-secciones.

?getFishingData
?downloadDailyFishing
?getDailyReport
?getBitacoraData
?getMainResults.bitacora

\subsubsection{1. Análisis de información pesquera}

1.1 Uso de getFishingData

Esta función es usada para dos tipos de clases de datos: fishery y cpue. La primera clase de datos contiene variables pesqueras que en este caso incluye a los desembarques (landing) y al esfuerzo (effort). La segunda clase de datos incluye a la captura por unidad de esfuerzo, de ahi el nombre de la clase.

imarpe incluye una base de datos interna (fisheryData) que será usada para ejemplificar el uso de esta función. Sin embargo, toda base de datos debe poseer información sobre el tiempo (año, mes y dia), sobre la especie en estudio, sobre el tipo de flota y puertos, la información de la captura (o desembarque) así como del esfuerzo pesquero, la información de posición (latitud y longitud) es opcional.

El nombre de las columnas debe ser el mismo al de la base de datos de ejemplo, sin embargo el uso de mayúsculas y minúsculas será resuelto internamente.

En la siguiente demostración del uso de getFishingData, la función analiza los desembarques de la base de datos contenida en el archivo .csv (archivo delimitado por comas) para obtener como producto i) un archivo de clase data.frame con la base de datos analizada por puerto en resolución temporal diaria, ii) una lista con las principales características de la base de datos analizada, y iii) un resumen de la información por tipo de flota en resolución temporal mensual.

Adicionalmente, la ayuda de esta función puede ser visualizada para una mejor comprensión de los parámetros de la función.

# Cargar la base de datos
fisheryData = system.file("extdata", "fisheryData.csv", package = "imarpe")

# Usar getFishingData con la base de datos ejemplo (fisheryData) de caballa
landing  = getFishingData(file = fisheryData, type = "fisheryinfo", varType = "landing",
                          sp = "caballa")
class(landing)

dataBase = landing$data
head(dataBase)

info = landing$info
info

fleet = landing$fleeTable
head(fleet)

# Para analizar un periodo de tiempo de la base de datos
landing = getFishingData(file = fisheryData, type = "fisheryinfo", varType = "landing",
                          sp = "caballa", start = "2009-04-10", end = "2009-08-30")

# Para analizar la información de un puerto específico
landing = getFishingData(file = fisheryData, type = "fisheryinfo", varType = "landing",
                          sp = "caballa", start = "2009-04-10", end = "2009-08-30",
                          port = "PAITA")

De manera similar al análisis de los desembarques se analizará la información del esfuerzo pesquero continuando con el uso de la función getFishingData así como de la base de datos interna (fisheryData).

Para el análisis de esta variable (esfuerzo) el tipo de información (parámetro type) sigue siendo fisheryInfo pero el tipo de variable (parámetro varType) será effort; y se debe precisar que tipo de esfuerzo pesquero se analizará en el parámetro efforType. En el siguiente ejemplo se usó capacidad de bodega, pero podría ser número de viajes, número de anzuelos así como número de embarcaciones (ver ayuda de la función getFishingData para más información).

# Para analizar la información de esfuerzo con la base de datos ejemplo (fisheryData)
# de caballa
effort = getFishingData(file = fisheryData, type = "fisheryinfo", varType = "effort",
                         sp = "caballa", efforType = "capacidad_bodega")
class(effort)

dataBase = effort$data
head(dataBase)

info = effort$info
info

fleet = effort$fleeTable
head(fleet)

Finalmente, el análisis de la captura por unidad de esfuerzo (cpue) se analizará en la siguiente sección. Aquí los parámetros type y varType deben ser iguales a cpue, y se debe precisar que tipo de esfuerzo se usará (en efforType) para calcular la cpue.

# Para analizar la información de cpue con la base de datos ejemplo (fisheryData)
# de caballa
cpue = getFishingData(file = fisheryData, type = "cpue", varType = "cpue",
                      sp = "caballa", efforType = "capacidad_bodega")
class(cpue)

dataBase = cpue$data
head(dataBase)

info = cpue$info
info

fleet = cpue$fleeTable
head(fleet)

Para los dos últimos ejemplos, de esfuerzo y cpue, también se pueden usar los parámetros start y end para hacer un análisis sobre un periodo de tiempo específico, así como el parámetro port, para analizar la información de un determinado puerto.

Respecto a los métodos, se construyeron cinco métodos para cada una de las clases de datos fishery y cpue. Estos son: print, summary, print.summary, plot y report; y las ayudas para cada método debe ser llamada por el método seguido por un punto (".") y luego la clase de datos correspondiente.

Métodos de la clase fishery
# Revisar la ayuda de los métodos de la clase fishery
?print.fishery
?summary.fishery
?print.summary.fishery
?plot.fishery
?report.fishery

La descripción de cada método se dará a continuación:

Una breve ejemplificación del uso de los métodos de la clase fishery se muestra en la siguiente sección:

# Cargar la base de datos
fisheryData = system.file("extdata", "fisheryData.csv", package = "imarpe")

# Crear un objeto de la clase fishery usando la base de datos ejemplo (fisheryData) de #caballa
landing  = getFishingData(file = fisheryData, type = "fisheryinfo", varType = "landing",
                          sp = "caballa")

# Algunos ejemplos del uso de los métodos
print(landing)

sumLanding = summary(landing)
sumLanding$var

# Visualizar sólo las primeras seis filas de cada base de datos contenida en sumLanding
head(sumLanding$portDay)
head(sumLanding$day)
head(sumLanding$port)
head(sumLanding$months)
head(sumLanding$years)

# Ejemplo de gráfica diaria, mostrando en el eje x sólo los días "1"
# revisar la ayuda de plot.fishery para más información (?plot.fishery)
plot(landing, daysToPlot = "1")
# Reporte adjuntado en el Anexo
report(landing, daysToPlot = "1")
Métodos de la clase cpue
# Revisar la ayuda de los métodos de la clase cpue
?print.cpue
?summary.cpue
?print.summary.cpue
?plot.cpue
?report.cpue

La descripción de cada método se dará a continuación:

Una breve ejemplificación del uso de los métodos de la clase cpue se muestra en la siguiente sección:

# Cargar la base de datos
fisheryData = system.file("extdata", "fisheryData.csv", package = "imarpe")

# Crear un objeto de la clase cpue usando la base de datos ejemplo (fisheryData) de 
#caballa
cpue  = getFishingData(file = fisheryData, type = "cpue", varType = "cpue",
                       sp = "caballa", efforType = "capacidad_bodega")

#Algunos ejemplos del uso de los métodos
print(cpue)

sumCpue = summary(cpue)
sumCpue$effort

head(sumCpue$portDay)
head(sumCpue$day)
head(sumCpue$port)
head(sumCpue$months)
head(sumCpue$years)

# Ejemplo de gráfica mensual
# revisar la ayuda de plot.fishery para más información (?plot.fishery)
plot(cpue, ploType = "plotMonthly", language= "english", colBar = "gray")
# Reporte adjuntado en el Anexo
report(cpue, daysToPlot = "1")
Uso de combineFisheryVar

combineFisheryVar permite combinar en un sólo objeto de clase fishery la información del desembarque y esfuerzo. El método report.fishery está disponible para ser usado en este tipo de objetos, permitiendo de esta manera la producción de un reporte unificado con la información de ambas variables pesqueras.

Adicionalmente, este tipo de objetos puede ser usado por el método plot.fishery usando ploType = "joined". Esto produce una gráfica en escala temporal diaria con la información de ambas variables (desembarque y esfuerzo), el desembarque en el eje vertical izquierdo y el esfuerzo en el eje vertical derecho.

# Cargar la base de datos
fisheryData = system.file("extdata", "fisheryData.csv", package = "imarpe")

# Objeto de clase fishery para la variable tipo landing
landingOject = getFishingData(file = fisheryData, type = "fisheryinfo",
                               varType = "landing", sp = "caballa")

# Objeto de clase fishery para la variable tipo effort
effortObject = getFishingData(file = fisheryData, type = "fisheryinfo",
                              varType = "effort", sp = "caballa",
                              efforType = "capacidad_bodega")

# Uso de la función combineFisheryVar
fisheryVar = combineFisheryVar(landing = landingOject, effort = effortObject)
class(fisheryVar)

# Gráfica
plot(fisheryVar, ploType = "plotJoined", daysToPlot = "1")
# Reporte adjuntado en el Anexo
report(fisheryVar, type = "joined", daysToPlot = "1")

1.2 Uso de downloadDailyFishing

La función downloadDailyFishing fue creada con la finalidad de descargar de manera automática la información del seguimiento pesquero de anchoveta. Esta información se encuentra disponible en la página web del Instituto del Mar del Perú (IMARPE) e incluye dos variables pesqueras importantes: i) desembarque y ii) esfuerzo (por número de embarcaciones), ambas en escala temporal diaria.

downloadDailyFishing retorna una base de datos de clase data.frame con las variables (en las columnas) de: años, meses, dias, especie, tipo de flota, puerto, desembarque y embarcaciones; el cual representa al esfuerzo pesquero. Esta base de datos puede ser guardada en el directorio en el que se trabaja usando el parámetro saveFile = TRUE.

# Revisar la ayuda de downloadDailyFishing para más información
?downloadDailyFishing
# Obtener información del seguimiento pesquero
fishingInfo = downloadDailyFishing(startDate = "2017-4-20", endDate = "2017-6-19")

head(fishingInfo)

La importancia de usar downloadDailyFishing es que la base de datos que se genera y se guarda en el directorio de trabajo (con extensión .csv) puede ser usado para crear un objeto de clase fishery con ayuda de la función getFishingData. Esto permitirá observar y analizar el seguimiento pesquero de la anchoveta de una manera más sencilla.

fishingInfo = downloadDailyFishing(startDate = "2017-4-20", endDate = "2017-6-19")

# Utilizando el archivo de extensión .csv que se generó al crear fishingInfo se 
# analizará el desembarque:
dailyLanding = getFishingData(file = "dailyFishing_2017420_2017619.csv",
                              type = "fisheryinfo", varType = "landing", sp = "anchoveta",
                              toTons = FALSE)
class(dailyLanding)
print(dailyLanding)
report(dailyLanding, daysToPlot = "1")

# Utilizando el archivo de extensión .csv que se generó al crear fishingInfo se 
# analizará el esfuerzo (embarcaciones):
dailyEffort = getFishingData(file = "dataDailyReport_2017420_2017619.csv",
                             type = "fisheryinfo", varType = "effort", sp = "anchoveta",
                             efforType = "embarcaciones")
class(dailyEffort)
print(dailyEffort)
report(dailyEffort, daysToPlot = "1")

1.3 Uso de getDailyReport

getDailyReport es usada para realizar un análisis de los desembarques pesqueros de anchoveta respecto a la biomasa estimada en las cuotas de captura del recurso. Esta función tiene como finalidad descargar de manera automática los desembarques diarios de anchoveta que estan disponibles en la página web del IMARPE y en función a sus parámetros principales: fechas de análisis, información biológica de la especie, resultados del crucero para la estimación de la biomasa, la cuota oficial de biomasa; se realiza un análisis cuyos resultados serán guardados en un objeto de clase fishingMonitoring. Este objecto se guardará en el formato RData en el directorio donde se esté realizando el trabajo.

# Revisar la ayuda de getDailyReport para más información
?getDailyReport
Método de la clase fishingMonitoring

La finalidad principal de getDailyReport es la construcción del reporte diario de la pesquería de anchoveta, por lo que el método construido para los objetos de la clase fishingMonitoring es report.fishingMonitoring.

# Revisar la ayuda del método de la clase fishingMonitoring.
?report.fishingMonitoring

A continuación se incluirá un ejemplo del uso de getDailyReport. Este código servirá para comprender el formato que deben tener los datos para poder obtener un objeto de clase fishingMonitoring. El siguiente código debe ser ejecutado sólo si se cuenta con los datos de entrada necesarios.

# Correr el siguiente código solo si se cuenta con la información necesaria.

# Lista de fechas
datesList = list(startDate = "2017-4-20",
                 endDate = "2017-6-19",
                 startExploringDate = "2017-4-22",
                 endExploringDate = "2017-4-25",
                 startSeasonDate = "2017-4-22",
                 endSeasonDate = "2017-7-31")

# Frecuencia simple por talla
simpleFreqSizes = "DataTallas_2017-I.csv"

# Archivo de crucero en formato RData 
dataCruise = "cr_170304_det.RData"

#Valor de biomasa oficial (en toneladas)
officialBiomass = 7778463

# Parámetros a y b
a = 0.0034
b = 3.273

x = getDailyReport(datesList = datesList, simpleFreqSizes = simpleFreqSizes,
                   dataCruise = dataCruise, officialBiomass = officialBiomass,
                   a = a, b = b)
class(x)

# Reporte adjuntado en el Anexo
report(x)

1.4 Uso de getBitacoraData

getBitacoraData tiene como finalidad leer la información recogida por el programa de Bitácoras de Pesca (PBP) del IMARPE para realizar diversos análisis de manera automatizada y guardarlos en un objeto de clase bitacora.

La información necesaria para usar getBitacoraData es un archivo de extensión .csv (delimitado por comas) con el formato original en la que esta base de datos se descarga del IMARSIS (Sistema de Información del IMARPE). Esta base de datos será analizada y se obtendrá un objeto (de clase bitacora) con dos elementos: i) la base de datos procesada y ii) las principales características de dicha base de datos.

# Cargar la base de datos
bitacoraData = system.file("extdata", "bitacoraData.csv", package = "imarpe")

# Usar getBitacoraData con la base de datos ejemplo (bitacoraData)
bitacoraObject = getBitacoraData(file = bitacoraData)

# Revisar la clase de bitacoraObject
class(bitacoraObject)

# Obtener la base de datos filtrada y revisar las principales características de la
# base de datos
dataBase = bitacoraObject$data

info = bitacoraObject$info
info
Métodos de la clase bitacora
# Revisar la ayuda de los métodos de la clase bitacora
?print.bitacora
?summary.bitacora
?print.summary.bitacora
?plotFishingPoints.bitacora
?plotFishingPresence.bitacora
?plotSpeciesComposition.bitacora
?report.bitacora

Los métodos construidos para la clase de datos bitacora son 7 y se describirán a continuación:

Una breve ejemplificación del uso de los métodos de la clase bitacora se muestra en la siguiente sección.

# Cargar la base de datos
bitacoraData = system.file("extdata", "bitacoraData.csv", package = "imarpe")

# Crear un objeto de la clase bitacora usando la base de datos de ejemplo (bitacoraData)
bitacoraObject = getBitacoraData(file = bitacoraData)

# Algunos ejemplos del uso de los métodos
print(bitacoraObject)

sumBitacora = summary(bitacoraObject)
class(sumBitacora)

head(sumBitacora$observedTrip)
head(sumBitacora$fishingHaul)

\pagebreak

plotFishingPoints(x = bitacoraObject, language = "spanish", dataType = "dataAnch")

\pagebreak

plotFishingPresence(x = bitacoraObject, byGroup = TRUE, group = "crustaceo")

\pagebreak

plotSpeciesComposition(x = bitacoraObject, minPercentage = 0.7)
# Reporte adjuntado en el Anexo
report(bitacoraObject)

\pagebreak

Uso de getMainResults

Los resultados que se generan usando la base de datos del PBP es muy amplia, incluyendo una serie de cuadros de datos de diversos tipos. getMainResults brinda una herramienta sencilla de obtener sólo los resultados que le interesan al usuario de una manera muy sencilla. Para esto, es necesario tener un objeto de clase bitacora, indicar el idioma en el que se desean visualizar los resultados (español es el idioma por defecto), precisar la especie en estudio, y seleccionar los resultados que se querrar obtener poniendo TRUE en cada uno de ellos.

A continuación se muestra un breve ejemplo del uso de getMainResults:

# Cargar la base de datos
bitacoraData = system.file("extdata", "bitacoraData.csv", package = "imarpe")

# Crear un objeto de la clase bitacora usando la base de datos de ejemplo (bitacoraData)
bitacoraObject = getBitacoraData(file = bitacoraData)

# Uso de getMainResults.bitacora
mainBitacoraData = getMainResults.bitacora(object = bitacoraObject, language = "spanish",
                                           specie = "anchoveta",
                                           observedTrip = TRUE)
# Viajes observados
observedTrip = mainBitacoraData$observedTrip

head(observedTrip)
Uso de effortSpeciesData

El esfuerzo pesquero es una variable importante en el seguimiento de la pesquería de un recurso, y ésta también puede ser analizada con la información que el PBP recoge de manera rutinaria. Por tanto, el uso de effortSpeciesData tiene la finalidad recibir un objeto de clase bitacora y realizar un filtro de los datos para una especie, clasificando en función a ella las temporadas de pesca para cada región (norte-centro, sur, o total). El producto generado de dicha función es una data.frame con información que será util para poder estimar el esfuerzo pesquero.

Luego de obtener la base de datos filtrada se puede hacer uso de getEffort. Esta función permite estimar el esfuerzo en función a cuatro tipos de variables: (1) duración del viaje ("travelTime"), (2) al número de calas ("haulTotal"), (3) capacidad de bodega ("storageCapacity""), y (4) tiempo de búsqueda ("searchTime"); sobre el tiempo (años, meses, dias o temporadas) o sobre los puertos. Adicionalmente, el esfuerzo puede ser estimado para toda la base de datos o haciendo un filtro de algún tipo de flota en especial.

El resultado de getEffort puede ser utilizado para producir una gráfica típica de los informes de PBP, la cual relaciona los series de esfuerzo pesquero en los ejes Y (izquiero y derecho) por cada puerto en el eje X.

# Cargar la base de datos
bitacoraData = system.file("extdata", "bitacoraData.csv", package = "imarpe")

# Crear un objeto de la clase bitacora usando la base de datos de ejemplo (bitacoraData)
bitacoraObject = getBitacoraData(file = bitacoraData)

# Uso de getMainResults.bitacora 
mainBitacoraData = getMainResults.bitacora(object = bitacoraObject, language = "spanish",
                                           specie = "anchoveta", effortData = TRUE)

# Data de esfuerzo
effortData = mainBitacoraData$effortData

# Filtro de datos: datos de anchoveta para la región norte-centro
effortNC = effortSpeciesData.bitacora(data = effortData, species = "anchoveta",
                                      region = "norte-centro")

# Obtener el esfuerzo por duración  de viaje
effortNC_tt = getEffort(data = effortNC, efforType = "travelTime", effortBy = "port")
effortNC_tt

# Obtener el esfuerzo por número de calas
effortNC_hn = getEffort(data = effortNC, efforType = "haulTotal", effortBy = "port")
effortNC_hn
# Gráfico de esfuerzo
plotEffort(effort1 = effortNC_tt, effort2 = effortNC_hn, labAxis2 = "Horas de viaje",
           labAxis4 = "N\u{00FA}mero de calas", colBar="gray", colLine = "black",
           legend = c("Duracion del viaje", "N\u{00FA}mero de calas"))

Adicionalmente, imarpe cuenta con una función llamada getCpue_relative la cual permitirá obtener la captura por unidad de esfuerzo (cpue) removiendo el efecto de la capacidad de bodega. Para obtener la cpue relativa se debe contar con la base de dato generada por effortSpeciesData.bitacora. Ver el siguiente ejemplo:

effortNC = effortSpeciesData.bitacora(data = effortData, species = "anchoveta",
                                      region = "norte-centro")

# Obtener la cpue relativa
getCpue_relative(data = effortNC, efforType = "travelTime", cpueBy = "port")

getCpue_relative(data = effortNC, efforType = "travelTime", cpueBy = "time",
                 timeBy = "months")


imarpe/imarpe documentation built on Aug. 8, 2020, 8:40 p.m.