Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

agroclimatico: Índices y Estadísticos Climáticos e Hidrológicos #599

Open
12 of 29 tasks
paocorrales opened this issue Jul 30, 2023 · 60 comments
Open
12 of 29 tasks

Comments

@paocorrales
Copy link
Contributor

paocorrales commented Jul 30, 2023

Nombre de la Persona Encargada: Paola Corrales
Usuario GitHub de la Persona Encargada: @paocorrales
Usuario GitHub de las Otras Autoras del Paquete: @eliocamp, @yabellini, @NatiGattinoni
Repositorio: https://github.com/AgRoMeteorologiaINTA/agroclimatico
Versión Enviada: 1.0.0
Tipo de Envio: Estándar
Editora: @Pakillo
Revisores: @VeruGHub, @pmnatural

Archivo: TBD
Versión Aceptada: TBD
Idioma: es

  • Pega el archivo DESCRIPTION completo dentro del siguiente bloque de código.
Package: agromet
Title: Índices y Estadísticos Climáticos e Hidrológicos
Version: 1.0.0
Authors@R: 
    c(person(given = "Yanina",
           family = "Bellini Saibene",
           role = c("ctb"),
           email = "[email protected]"),
      person(given = "Elio",
           family = "Campitelli",
           role = c("aut"),
           email = "[email protected]",
           comment = c(ORCID = "0000-0002-7742-9230")),
      person(given = "Paola",
           family = "Corrales",
           role = c("cre", "aut"),
           email = "[email protected]"),
      person(given = "Natalia",
           family = "Gattinoni",
           role = c("aut"),
           email = "[email protected]"),           
      person(family = "INTA",
           role = c("cph")),
      person("Ruida", "Zhong", role = "cph")
      )
Description: Conjunto de funciones para calcular índices y estadísticos climáticos 
    hidrológicos a partir de datos tidy. Incluye una función para graficar resultados 
    georeferenciados y e información cartográfica.
License: GPL-3 + file LICENSE
Encoding: UTF-8
Language: es
LazyData: true
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.2.3
URL: https://github.com/AgRoMeteorologiaINTA/agromet
BugReports: https://github.com/AgRoMeteorologiaINTA/agromet/issues
Depends: 
    R (>= 2.10)
Imports: 
    readr,
    data.table,
    scales,
    lmomco,
    sf,
    automap,
    png,
    grid,
    ggnewscale,
    tidyr,
    ggplot2,
    rappdirs,
    magrittr,
    kableExtra,
    Rcpp (>= 0.12.0),
    cli,
    SPEI (>= 1.8.1)
Suggests: 
    testthat,
    dplyr,
    vdiffr,
    lubridate,
    covr,
    knitr,
    rmarkdown
VignetteBuilder: knitr
LinkingTo: Rcpp

Alcance

  • Por favor, indica qué categoría(s) aplican a este paquete. Las puedes encontrar en nuestras políticas de inclusión de paquetes (Inglés). Por favor, tilda todas las apropiadas. Si no estás seguro, te sugerimos que comiences un pre-envío.

    • recuperación de datos (data retrieval)
    • extracción de datos (data extraction)
    • munging de datos (data munging)
    • disposición o declaración de datos (data deposition)
    • validación y prueba de datos (data validation and testing)
    • automatización de flujos de trabajo (workflow automation)
    • control de versiones (version control)
    • manejo de citas y bibliometría (citation management and bibliometrics)
    • envoltorios de software científico (scientific software wrappers)
    • herramientas para trabajo de campo y reproducibilidad (field and lab reproducibility tools)
    • ligamientos con software de base de datos (database software bindings)
    • datos geoespaciales (geospatial data)
    • análisis de texto (text analysis)
  • Explica cómo y por qué el paquete encaja dentro de estas categorías (1 a 3 oraciones):
    El paquete agromet incluye una serie de funciones para trabajar con datos meteorológicos y calcular distintos índices asociados a aplicaciones agrometeorológicas. Los datos de entrada se organizan usando la filosofía de datos ordenados (o tidy), por lo que las funciones del paquete son genéricas. Pueden aplicarse a cualquier conjunto de datos tabulares independientemente de su origen, orden o nombres de columna.

  • ¿Cuál es la audiencia esperada y las aplicaciones científicas de este paquete?
    El paquete es ampliamente utilizado por usuaries en distintas dependencias del Instituto Nacional de Tecnología Agropecuaria (INTA) que brindan servicios e información a los agricultores de Argentina. Sin embargo, les usuaries del paquete se extienden a otras instituciones y países de América Latina ya que casi todas las funciones están desarrolladas para ser de uso general e independiente de los datos recolectados por el INTA y la documentación está escrita integramente en español.

  • ¿Hay otros paquetes de R que logren el mismo objetivo? Si los hay, ¿cómo se diferencian del tuyo, o alcanzan nuestro criterio del mejor de su categoría (documento en Inglés)?

Existen algunos paquetes cómo frost y meteor que incluyen funciones para utilizar datos meteorológicos y calcular indices que en algunos casos están asociadosa la actividad agropecuaria. Otro paquete a mencionar es agroclim que según la documentación también incluye el cálculo de una serie de índices agrometeoroógicos fue archivado por CRAN en abril de este año pero el código esta disponible en un repositorio público.

agromet se diferencia de estos paquetes principalmente por 2 características. Por un lado su documentación está escrita integramente en español lo que facilita su uso en Sudamérica. Por el otro lado, sus funciones estan pensadas para ser compatibles con el ecosistema de paquetes que utilizan la filosofía "tidy", lo que facilita posterior manipulación, visualización y uso de los resultados obtenidos con agromet.

Revisiones Técnicas

Tilda los siguientes items para confirmar que los has completado:

Este paquete:

Opciones de Publicación

Opciones para MEE
  • Este paquete es novedoso y será de interés para la mayoría de lectores de la revista.
  • El manuscrito que describe el paquete no tiene más de 3000 palabras y está escrito en Inglés.
  • Tienes intenciones de archivar el código del paquete en un repositorio a largo plazo, que cumple los requerimientos de la revista (mira las Políticas de Publicación de MEE (documento en Inglés))
  • (Alcance: Considera los Objetivos y Alcance de MEE (documento en Inglés) para tu manuscrito. No otorgamos garatías de que tu manuscrito esté en el ámbito de MEE.)
  • (Aunque no es requerido, recomendamos tener un manuscrito completamente preparado y en Inglés, al momento de enviar.)
  • (Por favor, no envíes tu paquete de forma separada a Methods in Ecology and Evolution)

Código de Conducta

@ropensci-review-bot
Copy link
Collaborator

Thanks for submitting to rOpenSci, our editors and @ropensci-review-bot will reply soon. Type @ropensci-review-bot help for help.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for agromet (v1.0.0)

git hash: d537dd20

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✔️ Package coverage is 96.7%.
  • ✔️ R CMD check found no errors.
  • ✔️ R CMD check found no warnings.
  • 👀 Function names are duplicated in other packages

(Checks marked with 👀 may be optionally addressed.)

Package License: GPL-3 + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal base 243
internal agromet 62
internal utils 31
internal stats 26
internal grDevices 10
internal graphics 6
imports data.table 15
imports magrittr 7
imports ggplot2 5
imports SPEI 5
imports readr 4
imports lmomco 4
imports cli 4
imports grid 3
imports sf 2
imports automap 2
imports png 1
imports tidyr 1
imports rappdirs 1
imports scales NA
imports ggnewscale NA
imports kableExtra NA
imports Rcpp NA
suggests testthat NA
suggests dplyr NA
suggests vdiffr NA
suggests lubridate NA
suggests covr NA
suggests knitr NA
suggests rmarkdown NA
linking_to Rcpp NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

base

list (38), c (23), data.frame (18), q (14), file (9), paste0 (8), args (7), dir (6), if (6), length (6), format (5), return (5), suppressWarnings (5), file.path (4), is.finite (4), names (4), seq_along (4), kappa (3), lapply (3), max (3), mean (3), normalizePath (3), source (3), sum (3), url (3), abs (2), as.data.frame (2), call (2), cumsum (2), diff (2), for (2), gamma (2), ifelse (2), is.na (2), log (2), match.call (2), mean.Date (2), min (2), missing (2), rep (2), system.file (2), unique (2), as.character (1), deparse (1), do.call (1), drop (1), exp (1), gsub (1), match.fun (1), mode (1), pmatch (1), range (1), readLines (1), rle (1), seq (1), signif (1), sink (1), strsplit (1), substitute (1), switch (1), tempdir (1)

agromet

completar_serie (5), glo.loglik (4), spi (4), dir_mapas (3), kringe (3), pdsi_coeficientes (3), C_pdsi (2), computar_olas (2), get_mapa (2), mapa_provincias (2), resolve_resolucion (2), agromet_informe (1), anomalia_porcentual (1), borrar_cache (1), compute_breaks (1), ConvertLongitude (1), coord_argentina (1), decil (1), descargar_mapa (1), dias_promedio (1), ith (1), kable_inta (1), lat_label (1), leer_nh (1), leer_surfer (1), lon_label (1), mapa_argentina (1), mapa_argentina_limitrofes (1), mapa_departamentos (1), mapear (1), metadatos_nh (1), olas (1), parglo.maxlik (1), pdsi (1), pdsi_ac (1), pdsi_internal (1), plot.metadatos_nh (1), replace_if_null (1), scale_color_inta (1), spi_params (1), surfer_to_hex (1)

utils

data (23), read.delim (4), capture.output (2), download.file (1), unzip (1)

stats

start (10), ts (9), optim (3), end (2), ecdf (1), fitted (1)

data.table

as.data.table (4), melt (4), month (4), year (2), rbindlist (1)

grDevices

colours (5), palette (3), colorRampPalette (1), rgb (1)

magrittr

%>% (7)

graphics

par (3), points (3)

ggplot2

geom_sf (2), aes (1), geom_point (1), scale_color_brewer (1)

SPEI

spi (5)

cli

cli_abort (4)

lmomco

are.parglo.valid (4)

readr

fwf_widths (2), read_fwf (2)

grid

rasterGrob (2), unit (1)

automap

autoKrige (2)

sf

read_sf (1), st_as_sf (1)

png

readPNG (1)

rappdirs

user_data_dir (1)

tidyr

complete (1)

NOTE: Some imported packages appear to have no associated function calls; please ensure with author that these 'Imports' are listed appropriately.


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in C++ (70% in 4 files) and R (30% in 22 files)
  • 3 authors
  • 1 vignette
  • 5 internal data files
  • 17 imported packages
  • 27 exported functions (median 8 lines of code)
  • 68 non-exported functions in R (median 10 lines of code)
  • 97 R functions (median 24 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 22 83.6
files_src 4 87.0
files_vignettes 1 68.4
files_tests 11 91.7
loc_R 642 55.4
loc_src 1488 70.2
loc_vignettes 179 45.4
loc_tests 233 58.7
num_vignettes 1 64.8
data_size_total 340295 90.1
data_size_median 9699 78.9
n_fns_r 95 75.2
n_fns_r_exported 27 75.5
n_fns_r_not_exported 68 75.3
n_fns_src 97 78.9
n_fns_per_file_r 3 45.5
n_fns_per_file_src 22 94.3
num_params_per_fn 2 11.9
loc_per_fn_r 9 24.3
loc_per_fn_r_exp 8 16.3
loc_per_fn_r_not_exp 10 34.7
loc_per_fn_src 24 76.8
rel_whitespace_R 29 69.3
rel_whitespace_src 27 77.1
rel_whitespace_vignettes 50 59.8
rel_whitespace_tests 46 73.7
doclines_per_fn_exp 49 61.8
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 334 92.9

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check

GitHub Workflow Results

id name conclusion sha run_number date
5708281034 pkgcheck success d537dd 13 2023-07-30
5708281033 R-CMD-check success d537dd 117 2023-07-30
5708281035 test-coverage success d537dd 54 2023-07-30

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following check_fail:

  1. no_import_package_as_a_whole

Test coverage with covr

Package coverage: 96.73

Cyclocomplexity with cyclocomp

No functions have cyclocomplexity >= 15

Static code analyses with lintr

lintr found the following 183 potential issues:

message number of times
Avoid library() and require() calls in packages 9
Avoid trailing semicolons, they are not needed. 1
Lines should not be more than 80 characters. 172
Use <-, not =, for assignment. 1


4. Other Checks

Details of other checks (click to open)

✖️ The following 3 function names are duplicated in other packages:

    • ith from bioclim
    • spei from SPEI
    • spi from bayestestR, precintcon, SPEI


Package Versions

package version
pkgstats 0.1.3.4
pkgcheck 0.1.2.1


Editor-in-Chief Instructions:

This package is in top shape and may be passed on to a handling editor

@noamross
Copy link
Contributor

noamross commented Sep 1, 2023

@ropensci-review-bot assign @Pakillo as editor

@ropensci-review-bot
Copy link
Collaborator

Assigned! @Pakillo is now the editor

@Pakillo
Copy link
Member

Pakillo commented Sep 4, 2023

Gracias @paocorrales y colaboradoras por contribuir su paquete al proceso de revisión de rOpenSci, para el cual actuaré de editor invitado. Cualquier comentario o sugerencia que tengan durante el proceso, por favor no duden en comunicármelo.

Algunos puntos que me gustaría tratar antes de comenzar el proceso de revisión:

Alcance y solapamiento con otros paquetes

Estoy de acuerdo en la amplia utilidad del paquete. Sólo un comentario: cuando se discute el posible solapamiento con otros paquetes se menciona agroclim que "fue archivado por CRAN en abril de este año y el código no parece estar disponible en un repositorio público."

agroclim está disponible en este repositorio: https://github.com/rsnotivoli/agroclim. El motivo de expulsión de CRAN parece ser el cambio de email del autor. Parece que la intención del autor es restablecer el paquete en CRAN. En cualquier caso, aunque exista solapamiento creo que existe nicho para ambos paquetes. Pero estará bien revisar esta cuestión (sobre todo para evitar posibles duplicidades y reforzar si es posible la funcionalidad existente) durante el proceso de revisión.

Igualmente, como sugerencia más que requisito, pienso que tal vez podría ser útil estudiar la compatibilidad con paquetes como ClimInd, que calcula más de 130 índices climáticos diferentes. Por ejemplo, mostrando algunos ejemplos de cómo integrar ambos paquetes para calcular distintos índices.

Por último, veo que existe otro paquete llamado agrometR para descargar información de la Red Agroclimática Nacional de Chile (llamada agromet, https://www.agromet.cl/). ¿Piensan que la similitud en el nombre (agromet / agrometR) y tema (clima) de ambos paquetes podría ser problemático o confuso para futuros usuarios? En tal caso, ¿se plantearían un cambio de nombre del paquete? (ver guía rOpenSci).

Dependencias

El chequeo automático sugiere que "Some imported packages appear to have no associated function calls; please ensure with author that these 'Imports' are listed appropriately."

Una búsqueda rápida en el código parecen indicar que los paquetes señalados (scales, ggnewscale, kableExtra, Rcpp) sí que se emplean, por lo que creo que podemos ignorar este comentario.

Nombres de funciones

Hay algunas funciones con nombre duplicado respecto a otros paquetes:

  • ith from bioclim
  • spei from SPEI
  • spi from bayestestR, precintcon, SPEI

Me preocupa particularmente la duplicidad de nombres con el paquete SPEI (funciones spi y spei). Son funciones para calcular lo mismo, pero tanto los argumentos como el resultado (output de la función) difieren. Pienso que esto puede inducir a confusión a algunos usuarios. No es un requisito pero ¿podría plantearse un ligero cambio de nombre para evitar la confusión? ¿O piensan que mantener el mismo nombre es de hecho recomendable? Aquí están las directrices de rOpenSci al respecto.

Documentación

Creo que sería muy útil generar ya una web del paquete para facilitar el proceso de revisión. Esta web puede generarse automáticamente usando pkgdown::build_site() (ver recomendación).

En el README, el tutorial (vignette) y algunas funciones se habla de datos en formato NH y estaciones NH. Estaría bien clarificar a qué se refiere NH.

Por favor añadan unas directrices sobre cómo contribuir (ver https://devguide.ropensci.org/collaboration.html?q=contributi#contributing-guide).

Chequeo del paquete

Tras ejecutar devtools::check() parece que hay algunos problemas menores. Por favor corríjanlos para poder comenzar el proceso de revisión.

Warning: [escalas.R:16] @Format requires a value
Warning: [escalas.R:20] @Format requires a value
Warning: [escalas.R:24] @Format requires a value

Integración Continua

Por favor modifiquen su GitHub Action para chequear el paquete en la versión actual de R, la anterior, y la que viene (ver guía). E idealmente tanto en Windows como Mac como Ubuntu. Para ello podría usarse esta plantilla generada por usethis::use_github_action("check_standard").

Revisores

Por favor sugieran el nombre de varios revisores potenciales del paquete.

Muchas gracias

@Pakillo
Copy link
Member

Pakillo commented Sep 22, 2023

Buenos días @paocorrales

Sólo quería comprobar que recibieron mi mensaje anterior y saber si está todo claro. Si no es así, necesitan ayuda con algo, o simplemente necesitan más tiempo, por favor avísenme. En cuanto resolvamos estas cuestiones preliminares podremos empezar la revisión con revisores externos

Gracias y saludos

@paocorrales
Copy link
Contributor Author

Muchas gracias por los comentarios y recomendaciones @Pakillo! Me disculpo por la demora, estaba de viaje pero esta semana voy a revisar todo en detalle y hacer los cambios necesarios para comenzar con la revisión. Saludos!

@Pakillo
Copy link
Member

Pakillo commented Oct 2, 2023

¡Estupendo, gracias!

@paocorrales
Copy link
Contributor Author

Muchas gracias por los comentarios @Pakillo y perdón por la demora, respondo a cada punto entre lineas.

Alcance y solapamiento con otros paquetes

Estoy de acuerdo en la amplia utilidad del paquete. Sólo un comentario: cuando se discute el posible solapamiento con otros paquetes se menciona agroclim que "fue archivado por CRAN en abril de este año y el código no parece estar disponible en un repositorio público."

agroclim está disponible en este repositorio: https://github.com/rsnotivoli/agroclim. El motivo de expulsión de CRAN parece ser el cambio de email del autor. Parece que la intención del autor es restablecer el paquete en CRAN. En cualquier caso, aunque exista solapamiento creo que existe nicho para ambos paquetes. Pero estará bien revisar esta cuestión (sobre todo para evitar posibles duplicidades y reforzar si es posible la funcionalidad existente) durante el proceso de revisión.

Muchas gracias por mencionar esto, si bien aún no está en CRAN voy a editar mi primer mensaje incluyendo el link al repositorio para que no genere confunción.

Igualmente, como sugerencia más que requisito, pienso que tal vez podría ser útil estudiar la compatibilidad con paquetes como ClimInd, que calcula más de 130 índices climáticos diferentes. Por ejemplo, mostrando algunos ejemplos de cómo integrar ambos paquetes para calcular distintos índices.

Muchas gracias por la sugerencia! Estuvimos explorando este paquete y si bien incluye muchas funciones en varios casos vimos que las funciones son algo repetitivas (por ejemplo muchas funciones para calcular la temperatura mayor a distintos umbrales, en vez de 1 función que haga eso para cualquier umbral arbitrario). Por otro lado, la salida de estas funciones no es siempre compatible con la filosofía tidy que usamos en nuestras funciones. De todas maneras lo vamos a seguir explorando!

Por último, veo que existe otro paquete llamado agrometR para descargar información de la Red Agroclimática Nacional de Chile (llamada agromet, https://www.agromet.cl/). ¿Piensan que la similitud en el nombre (agromet / agrometR) y tema (clima) de ambos paquetes podría ser problemático o confuso para futuros usuarios? En tal caso, ¿se plantearían un cambio de nombre del paquete? (ver guía rOpenSci).

Luego de consultar con el equipo decidimos cambiar el nombre del paquete a agroclimatico. No encontramos otros paquetes de R o software con este nombre y esperamos que genere menos confución. Quedo atenta por si hay que hacer cambios en este issue.

Nombres de funciones

Hay algunas funciones con nombre duplicado respecto a otros paquetes:

  • ith from bioclim
  • spei from SPEI
  • spi from bayestestR, precintcon, SPEI

Me preocupa particularmente la duplicidad de nombres con el paquete SPEI (funciones spi y spei). Son funciones para calcular lo mismo, pero tanto los argumentos como el resultado (output de la función) difieren. Pienso que esto puede inducir a confusión a algunos usuarios. No es un requisito pero ¿podría plantearse un ligero cambio de nombre para evitar la confusión? ¿O piensan que mantener el mismo nombre es de hecho recomendable? Aquí están las directrices de rOpenSci al respecto.

Entendemos la sugerencia, spi es una función presente en varios paquetes y además es el nombre que se usa para hacer referencia al índice aún en la literatura en español. Cambiamos el nombre de la función a spi_indice que si bien es algo redundante puee ayudar a evitar la confución.

Documentación

Creo que sería muy útil generar ya una web del paquete para facilitar el proceso de revisión. Esta web puede generarse automáticamente usando pkgdown::build_site() (ver recomendación).

Gracias por la sugerencia, el paquete ahora tiene una web creada con pkgdown: https://agrometeorologiainta.github.io/agroclimatico/

En el README, el tutorial (vignette) y algunas funciones se habla de datos en formato NH y estaciones NH. Estaría bien clarificar a qué se refiere NH.

Agregamos algunas aclaraciones.

Por favor añadan unas directrices sobre cómo contribuir (ver https://devguide.ropensci.org/collaboration.html?q=contributi#contributing-guide).

Las directrices sobre como contribuir están disponibles en https://github.com/AgRoMeteorologiaINTA/agromet/blob/master/.github/CONTRIBUTING.md y linkeadas al README

Chequeo del paquete

Tras ejecutar devtools::check() parece que hay algunos problemas menores. Por favor corríjanlos para poder comenzar el proceso de revisión.

Warning: [escalas.R:16] @Format requires a value Warning: [escalas.R:20] @Format requires a value Warning: [escalas.R:24] @Format requires a value

Warnings corregidos, gracias!

Integración Continua

Por favor modifiquen su GitHub Action para chequear el paquete en la versión actual de R, la anterior, y la que viene (ver guía). E idealmente tanto en Windows como Mac como Ubuntu. Para ello podría usarse esta plantilla generada por usethis::use_github_action("check_standard").

Actualizamos la GitHub Action para chequear el paquete con distintas versiones de R y sistemas operativos. En el Caso de Mac tuvimos que skipear los test visuales porque fallan debido a una incompatibilidad entre sistemas operativos que no debería afectar a le usuarie.

Revisores

Por favor sugieran el nombre de varios revisores potenciales del paquete.

Sugerimos a Ana Laura Dietrich, ella tiene experiencia en el desarrollo de paquetes y en el área agrocliomática.

@Pakillo
Copy link
Member

Pakillo commented Dec 17, 2023

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@Pakillo
Copy link
Member

Pakillo commented Dec 17, 2023

@ropensci-review-bot help

@ropensci-review-bot
Copy link
Collaborator

Hello @Pakillo, here are the things you can ask me to do:


# Add a review's info to the ROpenSci logs
@ropensci-review-bot submit review <REVIEW_URL> time <REVIEW_HOURS(ex. 10.5)>

# List all available commands
@ropensci-review-bot help

# Show our Code of Conduct
@ropensci-review-bot code of conduct

# Checks peer-review badge is in README.md
@ropensci-review-bot check readme

# Switch to 'seeking reviewers'
@ropensci-review-bot seeking reviewers

# Approves a package. This command will close the issue.
@ropensci-review-bot approve package-name

# Invite the author of a package to the corresponding rOpenSci team. This command should be issued by the author of the package.
@ropensci-review-bot invite me to ropensci/package-name

# Adds package's repo to the rOpenSci team. This command should be issued after approval and transfer of the package.
@ropensci-review-bot finalize transfer of package-name

# Mint package as [bronze/silver/gold]
@ropensci-review-bot mint silver

# Add a user to this issue's reviewers list
@ropensci-review-bot assign xxxxx as reviewer

# Remove a user from the reviewers list
@ropensci-review-bot remove xxxxx from reviewers

# Assign a user as the editor of this submission
@ropensci-review-bot assign @username as editor

# Put the submission on hold for the next 90 days
@ropensci-review-bot put on hold

# Remove the editor assigned to this submission
@ropensci-review-bot remove editor

# Change or add a review's due date for a reviewer
@ropensci-review-bot set due date for @reviewer to YYYY-MM-DD

# Close the issue
@ropensci-review-bot out of scope

# Various package checks
@ropensci-review-bot check package

# Checks srr documentation for stats packages
@ropensci-review-bot check srr

@ropensci-review-bot
Copy link
Collaborator

Checks for agroclimatico (v1.0.0)

git hash: 2d86dbe8

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✔️ Package coverage is 96.7%.
  • ✔️ R CMD check found no errors.
  • ✔️ R CMD check found no warnings.
  • 👀 Function names are duplicated in other packages

(Checks marked with 👀 may be optionally addressed.)

Package License: GPL-3 + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal base 243
internal agroclimatico 59
internal utils 31
internal stats 26
internal grDevices 10
internal graphics 6
imports data.table 15
imports magrittr 7
imports ggplot2 5
imports SPEI 5
imports readr 4
imports lmomco 4
imports cli 4
imports grid 3
imports sf 2
imports automap 2
imports png 1
imports tidyr 1
imports rappdirs 1
imports scales NA
imports ggnewscale NA
imports kableExtra NA
imports Rcpp NA
suggests testthat NA
suggests dplyr NA
suggests vdiffr NA
suggests lubridate NA
suggests covr NA
suggests knitr NA
suggests rmarkdown NA
linking_to Rcpp NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

base

list (38), c (23), data.frame (18), q (14), file (9), paste0 (8), args (7), dir (6), if (6), length (6), format (5), return (5), suppressWarnings (5), file.path (4), is.finite (4), names (4), seq_along (4), kappa (3), lapply (3), max (3), mean (3), normalizePath (3), source (3), sum (3), url (3), abs (2), as.data.frame (2), call (2), cumsum (2), diff (2), for (2), gamma (2), ifelse (2), is.na (2), log (2), match.call (2), mean.Date (2), min (2), missing (2), rep (2), system.file (2), unique (2), as.character (1), deparse (1), do.call (1), drop (1), exp (1), gsub (1), match.fun (1), mode (1), pmatch (1), range (1), readLines (1), rle (1), seq (1), signif (1), sink (1), strsplit (1), substitute (1), switch (1), tempdir (1)

agroclimatico

completar_serie (5), glo.loglik (4), dir_mapas (3), kringe (3), pdsi_coeficientes (3), C_pdsi (2), computar_olas (2), get_mapa (2), mapa_provincias (2), resolve_resolucion (2), agromet_informe (1), anomalia_porcentual (1), borrar_cache (1), compute_breaks (1), ConvertLongitude (1), coord_argentina (1), decil (1), descargar_mapa (1), dias_promedio (1), ith (1), kable_inta (1), lat_label (1), leer_nh (1), leer_surfer (1), lon_label (1), mapa_argentina (1), mapa_argentina_limitrofes (1), mapa_departamentos (1), mapear (1), metadatos_nh (1), olas (1), parglo.maxlik (1), pdsi (1), pdsi_ac (1), pdsi_internal (1), plot.metadatos_nh (1), replace_if_null (1), scale_color_inta (1), spi_indice (1), spi_params (1), surfer_to_hex (1)

utils

data (23), read.delim (4), capture.output (2), download.file (1), unzip (1)

stats

start (10), ts (9), optim (3), end (2), ecdf (1), fitted (1)

data.table

as.data.table (4), melt (4), month (4), year (2), rbindlist (1)

grDevices

colours (5), palette (3), colorRampPalette (1), rgb (1)

magrittr

%>% (7)

graphics

par (3), points (3)

ggplot2

geom_sf (2), aes (1), geom_point (1), scale_color_brewer (1)

SPEI

spi (5)

cli

cli_abort (4)

lmomco

are.parglo.valid (4)

readr

fwf_widths (2), read_fwf (2)

grid

rasterGrob (2), unit (1)

automap

autoKrige (2)

sf

read_sf (1), st_as_sf (1)

png

readPNG (1)

rappdirs

user_data_dir (1)

tidyr

complete (1)

NOTE: Some imported packages appear to have no associated function calls; please ensure with author that these 'Imports' are listed appropriately.


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in C++ (70% in 4 files) and R (30% in 22 files)
  • 3 authors
  • 1 vignette
  • 5 internal data files
  • 17 imported packages
  • 27 exported functions (median 8 lines of code)
  • 68 non-exported functions in R (median 10 lines of code)
  • 97 R functions (median 24 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 22 83.6
files_src 4 87.0
files_vignettes 1 68.4
files_tests 11 91.7
loc_R 642 55.4
loc_src 1488 70.2
loc_vignettes 179 45.4
loc_tests 233 58.7
num_vignettes 1 64.8
data_size_total 340295 90.1
data_size_median 9699 78.9
n_fns_r 95 75.2
n_fns_r_exported 27 75.5
n_fns_r_not_exported 68 75.3
n_fns_src 97 78.9
n_fns_per_file_r 3 45.5
n_fns_per_file_src 22 94.3
num_params_per_fn 2 11.9
loc_per_fn_r 9 24.3
loc_per_fn_r_exp 8 16.3
loc_per_fn_r_not_exp 10 34.7
loc_per_fn_src 24 76.8
rel_whitespace_R 29 69.3
rel_whitespace_src 27 77.1
rel_whitespace_vignettes 50 59.8
rel_whitespace_tests 46 73.7
doclines_per_fn_exp 49 61.8
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 333 92.9

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check

GitHub Workflow Results

id name conclusion sha run_number date
7095108109 pages build and deployment success f43114 10 2023-12-05
7095086203 pkgcheck success 2d86db 21 2023-12-05
7095086206 pkgdown success 2d86db 8 2023-12-05
7095086213 R-CMD-check success 2d86db 125 2023-12-05
7095086208 test-coverage success 2d86db 62 2023-12-05

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following check_fail:

  1. no_import_package_as_a_whole

Test coverage with covr

Package coverage: 96.73

Cyclocomplexity with cyclocomp

No functions have cyclocomplexity >= 15

Static code analyses with lintr

lintr found the following 190 potential issues:

message number of times
Avoid library() and require() calls in packages 9
Avoid trailing semicolons, they are not needed. 1
Lines should not be more than 80 characters. 179
Use <-, not =, for assignment. 1


4. Other Checks

Details of other checks (click to open)

✖️ The following function name is duplicated in other packages:

    • ith from bioclim


Package Versions

package version
pkgstats 0.1.3.9
pkgcheck 0.1.2.11


Editor-in-Chief Instructions:

This package is in top shape and may be passed on to a handling editor

@Pakillo
Copy link
Member

Pakillo commented Dec 18, 2023

Muchas gracias por la respuesta y todas las mejoras al paquete @paocorrales et al. Yo creo que está casi listo para pasar a revisión.

Solo tres pequeños detalles por ahora:

  • El fichero ejemplos.Rmd (y su resultado ejemplos.md), ambos en el directorio raíz, parecen obsoletos. ¿Se pueden eliminar?

  • El ejemplo con dias_promedio en el README (https://github.com/AgRoMeteorologiaINTA/agroclimatico?tab=readme-ov-file#d%C3%ADas-promedio) da un warning debido a los últimos cambios en dplyr. ¿Podrían sustituir summarise por reframe como sugiere el warning?

  • El chequeo automático avisa también de que hay una línea con punto y coma al final. Esto no tiene ninguna importancia ni afecta al funcionamiento, pero sugiere su eliminación.

Procedo a continuación a buscar revisores. Si pueden arreglar estos pequeños detalles mientras tanto, estupendo.

@Pakillo
Copy link
Member

Pakillo commented Dec 18, 2023

Editor checks:

  • Documentation: The package has sufficient documentation available online (README, pkgdown docs) to allow for an assessment of functionality and scope without installing the package. In particular,
    • Is the case for the package well made?
    • Is the reference index page clear (grouped by topic if necessary)?
    • Are vignettes readable, sufficiently detailed and not just perfunctory?
  • Fit: The package meets criteria for fit and overlap.
  • Installation instructions: Are installation instructions clear enough for human users?
  • Tests: If the package has some interactivity / HTTP / plot production etc. are the tests using state-of-the-art tooling?
  • Contributing information: Is the documentation for contribution clear enough e.g. tokens for tests, playgrounds?
  • License: The package has a CRAN or OSI accepted license.
  • Project management: Are the issue and PR trackers in a good shape, e.g. are there outstanding bugs, is it clear when feature requests are meant to be tackled?

Editor comments

¿Algunos issues parecen obsoletos y se podrían cerrar? Sería bueno cerrar lo que ya esté resuelto para indicar claramente a los revisores y usuarios/as del paquete el estado actual del paquete y cuáles son los temas abiertos.

¡Gracias!


@Pakillo
Copy link
Member

Pakillo commented Dec 18, 2023

@ropensci-review-bot seeking reviewers

@ropensci-review-bot
Copy link
Collaborator

Please add this badge to the README of your package repository:

[![Status at rOpenSci Software Peer Review](https://badges.ropensci.org/599_status.svg)](https://github.com/ropensci/software-review/issues/599)

Furthermore, if your package does not have a NEWS.md file yet, please create one to capture the changes made during the review process. See https://devguide.ropensci.org/releasing.html#news

@Pakillo Pakillo changed the title agromet: Índices y Estadísticos Climáticos e Hidrológicos agroclimatico: Índices y Estadísticos Climáticos e Hidrológicos Dec 19, 2023
@paocorrales
Copy link
Contributor Author

Muchas gracias @Pakillo, resolví todos los detalles mencionados 😃

@Pakillo
Copy link
Member

Pakillo commented Dec 19, 2023

Estupendo, muchas gracias @paocorrales

@Pakillo
Copy link
Member

Pakillo commented Dec 19, 2023

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@VeruGHub
Copy link

@Pakillo estoy con la revisión hoy. Disculpad la demora

@Pakillo
Copy link
Member

Pakillo commented Jan 29, 2024

Estupendo. Gracias @VeruGHub. ¿Crees que podrás enviar la revisión esta semana?

@ropensci-review-bot
Copy link
Collaborator

📆 @pmnatural you have 2 days left before the due date for your review (2024-02-06).

@pmnatural
Copy link

Con algunos problemas al tener que cambiar de equipo. Estoy rehaciendo la revision en una maquina distinta y con mala internet. Espero subir el reporte mas tarde.

@pmnatural
Copy link

pmnatural commented Feb 7, 2024

Revisión del paquete Agroclimatico

Por favor describe cualquier relación de trabajo que tengas/hayas tenido con los autores del paquete)

No he tenido ninguna relacion de trabajo con los autores del paquete.

  • Como revisor confirmo que no tengo conflictos de interés para poder hacer la revisión de este trabajo (si no estas segura si tienes un conflicto por favor entra en contacto con tu editor antes de arrancar con la revisión.

Documentación

El paquete incluye todos los siguiente tipos de documentación:

  • Una declaración de necesidades que claramente describe las necesidades que el software esta diseñado a resolver y el publico que busca atender en el archivo README
  • Instrucciones de instalación de la versión en desarrollo del paquete incluyendo cualquier dependencia no-estándar en el archivo README
  • Viñeta(s) demostrando la funcionalidad principal que ademas corren localmente
  • Documentación de las funciones exportadas
  • Ejemplos (que corren localmente) para todas las funciones exportadas
  • Directrices comunitarias incluyendo una guia de contribución en el archivo README o el archivo CONTRIBUTING y un archivo DESCRIPTION que incluye URL, BugReports and Maintainer (todas en inglés por convención y para que puedan ser autogeneradas con Authors@R).

Funcionalidad

  • Instalación: La instalación se completa con éxito tal como fue documentada.
  • Funcionalidad: Toda afirmación de funcionalidad del software se confirma como existente.
  • Desempeño: Toda afirmación de desempeño del software se confirma como alcanzada.
  • Pruebas automáticas: Hay pruebas unitarias que cubren las funciones esenciales dentro del paquete con un rango razonable de entradas y condiciones. Todas las pruebas corren en la maquina local.
  • Directrices de empaque: El paquete cumple con las directrices de empaque de rOpenSci.

Estimación de horas dedicadas a la revisión:

  • Si la o las persona(s) autora(s) lo considera(n) apropiado, yo estoy de acuerdo con que me reconozcan como revisor del paquete (el rol "rev') en la el archivo DESCRIPTION del paquete.

Comentarios de la revisión

Los items sin tildar no han sido objeto de esta revision

Seria util que despues de la descripcion inicial del paquete haya una lista de todas las funciones disponibles a la fecha de la version. Segun la viñeta estas serian:

En la viñeta estan:
leer_nh
metadatos_nh
dias_promedio
anomalia_porcentual
decil
pdsi_ac
spi_indice
umbrales
completar_serie
olas
mapear
escalas
leer_surfer

En los man pages se suman estas ;
agromet_informe
ith
kable_inta
mapa_argentina
mapa_provincias
mapa_departamentos

Segun la descripcion del paquete, se asume que es solo para personal del INTA aunque otros usuarios externos podrian tambien beneficiarse. Para ello seria importante, si lo consideran conveniente los autores, incluir un breve comentarios sobre el tipo de archivo, estructura de datos y nombres de columnas que deberian tener estos datos.

@Pakillo
Copy link
Member

Pakillo commented Feb 7, 2024

¡ Muchas gracias por su revisión @pmnatural !

Antes de continuar, ¿podría indicar una estimación del tiempo (horas) dedicado a la revisión? Para efectos puramente estadísticos del programa de revisión de rOpenSci

Gracias

@paocorrales
Copy link
Contributor Author

Gracias Priscilla por la revisión!

Respecto a tu comentario te consulto si la propuesta sería incorporar toda la lista de funciones en el README. Ahora no son muchas funciones y se podría hacer pero con suerte en el futuro espero sumar más y creo que quedaría muy largo. Una alternativa que se me ocurre es linkear desde el README al índice de la web del paquete donde está la lista de funciones: https://agrometeorologiainta.github.io/agroclimatico/reference/index.html

Te parece una alternativa posible?

@VeruGHub
Copy link

VeruGHub commented Feb 9, 2024

Revisión de un paquete

No tengo ninguna relación de trabajo con los autores

  • Como revisor confirmo que no tengo conflictos de interés para poder hacer la revisión de este trabajo (si no estas segura si tienes un conflicto por favor entra en contacto con tu editor antes de arrancar con la revisión.

Documentación

El paquete incluye todos los siguiente tipos de documentación:

  • Una declaración de necesidades que claramente describe las necesidades que el software esta diseñado a resolver y el public meta que busca atender en el archivo README
  • Instrucciones de instalación de la versión en desarrollo del paquete incluyendo cualquier dependencia no-estándar en el archivo README
  • Viñeta(s) demostrando la funcionalidad principal que ademas corren localmente
  • Documentación de las funciones exportadas
  • Ejemplos (que corren localmente) para todas las funciones exportadas
  • Directrices comunitarias incluyendo una guia de contribución en el archivo README o el archivo CONTRIBUTING y un archivo DESCRIPTION que incluye URL, BugReports and Maintainer (todas en inglés por concenvión y para que puedan ser autogeneradas con Authors@R).

Funcionalidad

  • Instalación: La instalación se completa con éxito tal como fue documentada.
  • Funcionalidad: Toda afirmación de funcionalidad del software se confirma como existente.
  • Desempeño: Toda afirmación de desempeño del software se confirma como alcanzada.
  • Pruebas automáticas: Hay pruebas unitarias que cubren las funciones esenciales dentro del paquete con un rango razonable de entradas y condiciones. Todas las pruebas corren en la maquina local.
  • Directrices de empaque: El paquete cumple con las directrices de empaque de rOpenSci.

Estimación de horas dedicadas a la revisión: 8

  • Si la o las persona(s) autora(s) lo considera(n) apropiado, yo estoy de acuerdo con que me reconozcan como revisor del paquete (el rol "rev') en la el archivo DESCRIPTION del paquete.

Comentarios de la revisión

En primer lugar, quiero agradecer la oportunidad de revisar este paquete y espero que los comentarios sirvan para mejorar en los puntos que los autores consideren oportunos. Creo que los autores han hecho un gran trabajo compilando las funciones relacionadas con la gestión de datos climáticos que son útiles para el INTA.

He revisado el paquete desde el punto de vista de un usuario y tengo algunos comentarios generales y también específicos de cada función. Incluyo en la revisión código que he ido ejecutando y con comentarios en partes que no han funcionado correctamente y reflexiones.

Creo que algunos aspectos formales de la documentación pueden ser mejorados. Para empezar, la funcionalidad del paquete no está completamente definida en la documentación (Readme). El paquete calcula índices y estadísticos climáticos e hidrológicos a partir de datos tidy, pero también permite representar esta información y otra en mapas en Argentina, y permite leer datos climáticos en el formato del INTA. Creo que toda esta información debería de estar incluida en el Readme. En varios puntos de la documentación de las funciones (ver debajo) he detectado que no se especifica el formato concreto en el que los argumentos deben declararse y también argumentos cuya descripción es confusa. Mejorar estas descripciones e incluir programación defensiva relativa a los argumentos (en general faltante) ayudaría mucho a los usuarios.

Creo que la funcionalidad de spi_indice y spei_indice está ya contenida en el paquete SPEI. A menos que se aclare cual es la novedad de las funciones escritas para agroclimático, sugiero eliminar estas funciones. Además, no he conseguido correr las funciones scale_color/fill_inta y pdsi/pdsi_ac (ver debajo los comentarios).

Finalmente, en el logotipo del paquete pone "AgroMET" lo que es un poco raro si el paquete se llama "agroclimatico".

library(agroclimatico)
library(dplyr)

vignette("estadisticas-e-indices-climaticos", "agroclimatico") #no me funciona
archivo <- system.file("extdata", "NH0358.DAT", package = "agroclimatico")
datos <- leer_nh(archivo)
data(NH0358)

dias_promedio

No calcula ningun estadístico meteorológico como dice la descripción si no que extrae dia, mes y dia juliano de un set de datos. Previamente el usuario puede haber extraido los días que representan un evento meteorológico de interés, pero no tiene por qué.

La descripción de la funcionalidad no es clara en la ayuda. Sugiero poner "Calcula el valor promedio anual del primer y ultimo dia para una serie de fechas dada". En los ejemplos habría que cambiar "summarise" por "reframe" como aparece en el Readme. En "Value" se dice que el output tiene "variables extras en el caso de hacer el cálculo para distintos grupos", pero ¿cómo se puede especificar para qué grupos quieres el cálculo?

Erratas en la documentación: "seria de fechas"


dias_promedio(datos$fecha) #Ok
dias_promedio(NH0358$fecha) #Ok

helada <- NH0358 |> 
  filter(t_min <= 0) 

dias_promedio(helada$fecha) #Ok

helada |> summarise(dias_promedio(fecha)) #En un pipe, solo si la funcion se escribe dentro de un summarise o reframe se consigue la funcionalidad descrita

#La función no devuelve un output que encaje bien con la filosofía de tidyverse y es difícil de utilizar en un pipe: 

helada |> dias_promedio(fechas = fecha)
helada |> mutate(diasprom = dias_promedio(fecha))

completar_serie

No se especifica el formato del vector fecha ni de rango en la documentación.


#Ejecuto el ejemplo #Ok
ejemplo <- data.frame(fechas = seq(as.Date("1985-01-01"), as.Date("2015-12-01"),
                             by = "1 month"),
                    pp = 1)

set.seed(42)
datos_perdidos <- sample(nrow(ejemplo), nrow(ejemplo)/10)
ejemplo$pp[datos_perdidos] <- NA
datos_incompletos <- na.omit(ejemplo) 

completar_serie(datos_incompletos, fechas, resolucion = "1 mes")

#No funciona, pero sigue las instrucciones de la documentación:
completar_serie(datos = datos, 
                fecha = fecha, 
                resolucion = "día",
                rango = as.Date(c("1951-01-01", "1952-12-31")))

decil y anomalia_porcentual

En la descripción se necesita incluir una definición más técnica de qué valores se devuelven, es decir, que hace la función decil y la anomalia_porcentual y referencias. En estadística, los deciles de una serie de datos son estadísticos descriptivos que representan los valores que limitan la serie de datos en 10 partes. Al aplicar la función sin tener mucho detalle en la descripción yo hubiera esperado obtener eso. Sin embargo, en el ejemplo ejecutado debajo obtengo un vector de igual longitud de la serie de datos. Sugiero mejorar la descripción en este sentido. La anomalía porcentual ¿respecto a qué valor de la serie de referencia se calcula? Debería especificarse. ¿Por qué para calcular la anomalia es necesario especificar que no se consideren los NA, pero para decil no? Parece una cuestión de inconsistencia en cómo están escritas las funciones.


decil(datos$t_max) #Ok

anomalia_porcentual(datos$t_max, na.rm = TRUE) #Ok

scala_temp/pp_XXX

La documentación está incompleta. No hay ejemplos de uso ni se entiende bien que hacen estas funciones. Tampoco se especifica qué valores retorna.

ith

Funciona correctamente y está bien documentada.


NH0358 <- NH0358 %>% #Ok
  mutate(t_media = (t_max + t_min)/2) %>%
  mutate(ith = ith(t_media, hr))

hist(NH0358$ith)

metadatos_nh

Para facilitar la comprensión a los usuarios convendría especificar que son "estaciones NH". La descripción es incompleta en el sentido de que sólo se especifica una parte de la información que devuelve la función.

Erratas en la documentación: "provincia o provincia", "especificar" debería ser "específicas".


metadatos_nh(codigo = c("0001", "0011")) #Ok
metadatos_nh(provincia ="Chaco") #Ok
metadatos_nh(organismo = "SMN") #Ok
metadatos_nh(lat = c(-30, -20), lon = c(-65, -55)) #Ok

kable_inta

Sustituir "Setear" por "Formatear" o similar. Funciona correctamente.


kable_inta(datos[1:10,1:5]) #Ok
kable_inta(metadatos_nh(provincia ="Chaco")) #Ok

leer_surfer

En el ejemplo se sobreescribe un objeto con el nombre de otra función implementada en el paquete (scala_temp/pp_XXX). Debería estar explicado en algún sitio cual es el link entre ambas.

Erratas en la documentación: "laeer".


escala <- system.file("extdata", "escala_pp_mensual.lvl", package = "agroclimatico")

escala_prueba <- leer_surfer(escala) #Ok
scales::show_col(escala_prueba$colores)

mapa_XXX

Añadiría en la descripción los posibles valores para el argumento "provincias".


ggplot() +
  geom_sf(data = mapa_argentina()) #Ok

ggplot() +
  geom_sf(data = mapa_provincias()) #Ok

ggplot() +
  geom_sf(data = mapa_provincias(provincias = "Chaco", departamentos =  TRUE)) #Ok

ggplot() +
  geom_sf(data = mapa_provincias(provincias = "Rio Negro", departamentos = FALSE)) #Ok

ggplot() +
  geom_sf(data = mapa_argentina_limitrofes()) #Ok

ggplot() +
  geom_sf(data = mapa_departamentos(provincias = "Chaco")) #Ok

mapear

Erratas en la documentación: "veriable", "a el", "masyores", "1500m".

El argumento "breaks" no está bien definido. Habría que especificar que se refiere a que hay que introducir valores (¿uno o varios?) en el rango del argumento "valor".

No se explican las funciones coord_argentina ni theme_inta_mapa en ningún sitio. ¿Se utilizan sólo internamente? En ese caso no deberían estar exportadas.


prueba <- metadatos_nh()

mapear(prueba$altura, #Ok
       prueba$lon, 
       prueba$lat, 
       breaks = c(0, 100, 400, 1000, 1500), 
       cordillera = 1400,
       variable = "mm")

olas y umbrales

No se explica en la documentación como hay que especificar los umbrales. Es poco habitual que se pueda poner cualquier palabra como nombre de un argumento y una mala praxis porque se puede sobreescribir algo importante en la función. Sería más adecuado que hubiera un argumento para los umbrales y que éstos se pudieran introducir en forma de lista con nombres (ej. umbral = list(calor = "t_max > 20"))

Corregir algunas erratas en la documentación de olas: "mbral", "drtn"

Corregir algunas erratas en la documentación de umbrales: "⁠N`` (numérico) ocurrencia del evento *⁠prop' "


olas(datos$fecha, heatwave = datos$t_max > 20) #Ok

umbrales(heatwave = datos$t_max > 20) #Ok

pdsi/pdsi_ac

No funciona indicandole los argumentos no definidos por defecto.

Habría que incluir en la documentación las referencias que se citan e incluir las unidades de la precipitacion y la etp. Es redundante incluir un argumento para los coeficientes en forma de lista y luego argumentos para cada coeficiente por separado. Sugiero eliminar una de las dos formas.

Corregir algunas erratas de la ayuda: "list de coeficientes", "El el cálculo".


pdsi(precipitacion = c(500, 600), #No funciona
     etp = c(1000, 1200)) 

pdsi_ac(precipitacion = c(500, 600), #No funciona
     etp = c(1000, 1200)) 

scale_color/fill_inta pdsi/pdsi_ac

El ejemplo no funciona. Tampoco funciona otro ejemplo que he creado siguiendo las instrucciones de la documentación.

Corregir erratas en la documentación: "escala.)", "tiene prioridad por sobre", "deinidos"


prueba <- metadatos_nh()
prueba$altura <- as.numeric(prueba$altura)

ggplot(prueba) + #No funciona
  geom_point(aes(x = lon, y = lat, color = altura)) +
  scale_color_inta(escala = escala_pp_diaria)


set.seed(496) #El ejemplo no funciona
datos_aleatorios <- subset(metadatos_nh())
datos_aleatorios <- data.frame(datos_aleatorios,
pp = rgamma(nrow(datos_aleatorios), 0.5, scale = 1)*70)

ggplot(datos_aleatorios, aes(lon, lat)) +
geom_contour(aes(z = pp, fill = after_stat(level))) +
scale_fill_inta(escala = escala_pp_diaria)

spei_indice/spi_indice

La funcionalidad está repetida respecto a las funciones spi y spei del paquete SPEI. A menos que se aclare qué aporta esta función sugiero eliminarla y crear una viñeta que incluya cómo se usa el paquete SPEI con datos en el formato del INTA. Si he entendido bien, las fechas deben introducirse como meses ¿no? Por favor, especificar esto si se mantiene la función. En la documentación no se entiende bien que es el argumento "escalas" y no se cita el paquete SPEI.



prueba <- data.frame(fecha = seq(as.Date("1985-01-01"), as.Date("2015-12-01"), by = "1 month"))
set.seed(42)
prueba$pp <- rgamma(nrow(prueba), shape = 2, scale = 10)

spi_indice(prueba$fecha, prueba$pp, escalas = 1)


#Misma funcionalidad que en paquete SPEI:
spi_agro <- spi_indice(fecha = prueba$fecha, precipitacion = prueba$pp, escalas = 1)

spi_spei <- SPEI::spi(data = prueba$pp, scale = 1)

identical(spi_agro$spi, as.vector(spi_spei$fitted))

@Pakillo
Copy link
Member

Pakillo commented Feb 12, 2024

¡Muchas gracias @VeruGHub por su detallada revisión! Seguro que será muy útil.

@Pakillo
Copy link
Member

Pakillo commented Feb 12, 2024

@ropensci-review-bot submit review #599 (comment) time 8

@ropensci-review-bot
Copy link
Collaborator

Logged review for VeruGHub (hours: 8)

@Pakillo
Copy link
Member

Pakillo commented Feb 12, 2024

@ropensci-review-bot submit review #599 (comment)

@ropensci-review-bot
Copy link
Collaborator

I'm sorry human, I don't understand that. You can see what commands I support by typing:

@ropensci-review-bot help

@Pakillo
Copy link
Member

Pakillo commented Feb 13, 2024

@ropensci-review-bot submit review #599 (comment) time NA

@ropensci-review-bot
Copy link
Collaborator

Logged review for pmnatural (hours: NA)

@Pakillo
Copy link
Member

Pakillo commented Feb 13, 2024

Estimada @paocorrales y coautores:

Ya tenemos las revisiones de @pmnatural y @VeruGHub, a quienes agradezco su esfuerzo. Espero que sus comentarios sean útiles. Añado algunos comentarios al respecto:

README

Ambas revisoras comentan que les gustaría ver más información sobre el paquete ahí. Yo la veo correcta (sobre todo al contar con un magnífico tutorial complementario (vignette)), pero tal vez se pueda añadir algo más o re-estructurar la información del README para que quede más claro, al menos en cuanto a los grandes bloques de funcionalidad del paquete (lectura de datos INTA, indicadores, mapeo, etc). Una sugerencia para que quede más clara la funcionalidad global del paquete es agrupar las funciones en el índice por temáticas (ver https://r-pkgs.org/website.html#index-organization).

En el primer párrafo del Readme hay una errata (dias_promedios() cuando la función se llama dias_promedio()). También sugiero poner 'tidy' entre comillas, y tal vez enlazar esa palabra con algún documento que explique qué significa tidy data para los que no estén familiarizados con el concepto (por ejemplo, https://es.r4ds.hadley.nz/12-tidy.html en español, o https://tidyr.tidyverse.org/articles/tidy-data.html o http://www.jstatsoft.org/v59/i10/paper en inglés).

En el segundo párrafo del Readme, la función spi se llama ahora spi_indice.

En el tercer párrafo se menciona por primera vez el INTA. Es posible que muchos no conozcan a qué se refiere el acrónimo, por lo que añadiría el nombre completo del instituto y un enlace a la web oficial.

Es cierto que el logo refleja el antiguo nombre del paquete (agromet), ¿tal vez sea buena idea modificarlo?

La 'vignette' a mí si me funciona, siempre que se especifique build_vignettes = TRUE al instalar, como explica el README. Por cierto, gran tutorial mostrando las distintas funciones del paquete.

dias_promedio

En esta y otras funciones, como indica @VeruGHub, sería conveniente reemplazar summarise por reframe en todos los ejemplos donde aparece tal warning. Coincido también en que no está claro cómo utilizar esta función con datos agrupados (dado que el único argumento de la función es un vector de fechas).

decil

En la función decil, pienso que sería útil dar la opción de devolver tanto el número del decil (1, 2, 3, ...) como el valor numérico (ej. 7.7 correspondente al decil 1, etc). Por ejemplo viendo el ejemplo en https://agrometeorologiainta.github.io/agroclimatico/articles/estadisticas-e-indices-climaticos.html#deciles no me queda claro cómo interpretar en qué decil nos encontramos simplemente viendo el valor de la columna 'decil'.

mapear

Esta función me parece muy útil pero me pregunto si podría rediseñarse para que el primer argumento sea un data.frame o tibble, siguiendo la costumbre en tidyverse. Esto permitiría llamarla directamente dentro de un pipe, p. ej.:

datos_aleatorios |> 
  mapear(pp, lon, lat, 
       cordillera = TRUE,
       escala = escala_pp_diaria,
       variable = "mm",
       titulo = "Precipitación aleatoria",
       fuente = "Fuente: datos de ejemplo")

olas y umbrales

Estas funciones también me gustan mucho y me parecen muy útiles, pero igualmente me pregunto (a modo de reflexión) si el primer argumento podría ser un data.frame o tibble, dado que se usan varias variables del mismo para calcular las olas. Esto podría permitir además que no fuese necesario usar summarise/reframe, p. ej:

olas(NH0358, calor = t_max > 20, frio = t_min <= 0)

SPI, SPEI

También aquí me planteo si no sería conveniente (siguiendo la filosofía tidyverse) que el primer argumento fuera siempre un data.frame o tibble. De ese modo no habría que usar with, como en el ejemplo.

Estoy de acuerdo con @VeruGHub en que sería bueno explicar la utilidad de estas funciones y en qué difiere esta implementación de la del paquete SPEI (utilizado internamente).

General

En los ejemplos sería conveniente simplificar los datasets al máximo, dejando solamente lo necesario para mostrar lo que hace la función. Por ejemplo, en la función decil se usa el dataset NH0358 completo, y el objeto generado es muy grande (filas y columnas) y difícil de leer, hasta el punto de que cuesta ver el resultado de aplicar la función. Sería recomendable reducir el número de filas y columnas al mínimo imprescindible (o mostrar solo una selección de filas cuando ello sea suficiente, ej. en metadatos_nh). También se aplica a los ejemplos de otras funciones como completar_serie, ith, olas, pi_indice, etc.

Erratas

Hay algunas erratas en la documentación. Podría usarse el paquete spelling o herramientas similares para facilitar su detección y corrección.

Nada más por ahora. Espero que mis comentarios, unidos a los de las revisoras, sean útiles para revisar el paquete. Por favor no duden en comentar cualquier duda o discrepancia que puedan tener. Muchos de los cambios propuestos son sugerencias o invitaciones a la reflexión. Quedo pues a la espera de su revisión.

Saludos cordiales

Paco

@ropensci-review-bot
Copy link
Collaborator

@paocorrales, @eliocamp, @yabellini, @NatiGattinoni: please post your response with @ropensci-review-bot submit response <url to issue comment> if you haven't done so already (this is an automatic reminder).

Here's the author guide for response. https://devguide.ropensci.org/authors-guide.html

@Pakillo
Copy link
Member

Pakillo commented May 17, 2024

Estimadas @paocorrales, @eliocamp, @yabellini, @NatiGattinoni:

Espero que vaya todo bien. Me preguntaba cómo iba avanzando la revisión del paquete. Si puedo ayudar en algún aspecto o tienen cualquier duda o comentario no duden en decirlo.

Gracias

@paocorrales
Copy link
Contributor Author

Hola!

En primer lugar, muchas gracias @pmnatural y @VeruGHub por la revisión y los comentarios, y a @Pakillo por ordenarlos y organizar todo.

Incorporé los comentarios y sugerencias al paquete. El detalle fino de los cambios se puede seguir en los issues del repositorio del paquete (1 issue por función o familia de funciones).

Respondiendo a los comentarios específicos:

dias_promedio

No calcula ningun estadístico meteorológico como dice la descripción si no que extrae dia, mes y dia juliano de un set de datos. Previamente el usuario puede haber extraido los días que representan un evento meteorológico de interés, pero no tiene por qué.

La descripción de la funcionalidad no es clara en la ayuda. Sugiero poner "Calcula el valor promedio anual del primer y ultimo dia para una serie de fechas dada". En los ejemplos habría que cambiar "summarise" por "reframe" como aparece en el Readme. En "Value" se dice que el output tiene "variables extras en el caso de hacer el cálculo para distintos grupos", pero ¿cómo se puede especificar para qué grupos quieres el cálculo?

Erratas en la documentación: "seria de fechas"

dias_promedio(datos$fecha) #Ok
dias_promedio(NH0358$fecha) #Ok

helada <- NH0358 |> 
  filter(t_min <= 0) 

dias_promedio(helada$fecha) #Ok

helada |> summarise(dias_promedio(fecha)) #En un pipe, solo si la funcion se escribe dentro de un summarise o reframe se consigue la funcionalidad descrita

#La función no devuelve un output que encaje bien con la filosofía de tidyverse y es difícil de utilizar en un pipe: 

helada |> dias_promedio(fechas = fecha)
helada |> mutate(diasprom = dias_promedio(fecha))

Mejoré la documentación para explicar mejor el uso de la función junto con los verbos de dplyr. Corregí errores en los ejemplos (ahora usa reframe()). Incorporé un nuevo ejemplo que muestra como usar la función agrupando datos. Para esto el paquete tiene un nuevo set de datos que corresponde a una serie temporal de una estación meteorológica similar al que ya se estaba usando.

completar_serie

No se especifica el formato del vector fecha ni de rango en la documentación.

> #Ejecuto el ejemplo #Ok
ejemplo <- data.frame(fechas = seq(as.Date("1985-01-01"), as.Date("2015-12-01"),
                             by = "1 month"),
                    pp = 1)

set.seed(42)
datos_perdidos <- sample(nrow(ejemplo), nrow(ejemplo)/10)
ejemplo$pp[datos_perdidos] <- NA
datos_incompletos <- na.omit(ejemplo) 

completar_serie(datos_incompletos, fechas, resolucion = "1 mes")

#No funciona, pero sigue las instrucciones de la documentación:
completar_serie(datos = datos, 
                fecha = fecha, 
                resolucion = "día",
                rango = as.Date(c("1951-01-01", "1952-12-31")))

Había un error en el código. Ahora funciona tanto si la resolución es "dia" o "1 dia". Mejoré la documentación agregando los detalles a los argumentos mencionados.

decil y anomalia_porcentual

En la descripción se necesita incluir una definición más técnica de qué valores se devuelven, es decir, que hace la función decil y la anomalia_porcentual y referencias. En estadística, los deciles de una serie de datos son estadísticos descriptivos que representan los valores que limitan la serie de datos en 10 partes. Al aplicar la función sin tener mucho detalle en la descripción yo hubiera esperado obtener eso. Sin embargo, en el ejemplo ejecutado debajo obtengo un vector de igual longitud de la serie de datos. Sugiero mejorar la descripción en este sentido. La anomalía porcentual ¿respecto a qué valor de la serie de referencia se calcula? Debería especificarse. ¿Por qué para calcular la anomalia es necesario especificar que no se consideren los NA, pero para decil no? Parece una cuestión de inconsistencia en cómo están escritas las funciones.

decil(datos$t_max) #Ok

anomalia_porcentual(datos$t_max, na.rm = TRUE) #Ok

Mejore la documentación para explicar mejor la salida de la función. Respecto a la diferencia entre las funciones, efectivamente ambas son internamente distintas y deciles() no requiere el argumento na.rm. Las documentamos en conjunto ya que se suelen usar en conjunto y encontramos muchos ejemplos donde funciones documentadas como "familia" comparten algunos pero no todos los argumentos documentados.

scala_temp/pp_XXX

La documentación está incompleta. No hay ejemplos de uso ni se entiende bien que hacen estas funciones. Tampoco se especifica qué valores retorna.

Agregue ejemplos en la documentación y lo que devuelve. Los ejemplos usan los nuevos datos del paquete y son mas simples.

ith

Funciona correctamente y está bien documentada.

NH0358 <- NH0358 %>% #Ok
  mutate(t_media = (t_max + t_min)/2) %>%
  mutate(ith = ith(t_media, hr))

hist(NH0358$ith)

Para esta y otras funciones revisé el output de los ejemplos y cuando eran muy largos ahora solo muestra las primeras 10 lineas.

metadatos_nh

Para facilitar la comprensión a los usuarios convendría especificar que son "estaciones NH". La descripción es incompleta en el sentido de que sólo se especifica una parte de la información que devuelve la función.

Erratas en la documentación: "provincia o provincia", "especificar" debería ser "específicas".


metadatos_nh(codigo = c("0001", "0011")) #Ok
metadatos_nh(provincia ="Chaco") #Ok
metadatos_nh(organismo = "SMN") #Ok
metadatos_nh(lat = c(-30, -20), lon = c(-65, -55)) #Ok

Arreglé los errores de tipeo y extendí la documentación para incluir información sobre metadatos.

kable_inta

Sustituir "Setear" por "Formatear" o similar. Funciona correctamente.


kable_inta(datos[1:10,1:5]) #Ok
kable_inta(metadatos_nh(provincia ="Chaco")) #Ok

Documetación arreglada.

leer_surfer

En el ejemplo se sobreescribe un objeto con el nombre de otra función implementada en el paquete (scala_temp/pp_XXX). Debería estar explicado en algún sitio cual es el link entre ambas.

Erratas en la documentación: "laeer".


escala <- system.file("extdata", "escala_pp_mensual.lvl", package = "agroclimatico")

escala_prueba <- leer_surfer(escala) #Ok
scales::show_col(escala_prueba$colores)

Documentación arreglada y mejores ejemplos (asociadas a las funciones scale_*())

mapa_XXX

Añadiría en la descripción los posibles valores para el argumento "provincias".


ggplot() +
  geom_sf(data = mapa_argentina()) #Ok

ggplot() +
  geom_sf(data = mapa_provincias()) #Ok

ggplot() +
  geom_sf(data = mapa_provincias(provincias = "Chaco", departamentos =  TRUE)) #Ok

ggplot() +
  geom_sf(data = mapa_provincias(provincias = "Rio Negro", departamentos = FALSE)) #Ok

ggplot() +
  geom_sf(data = mapa_argentina_limitrofes()) #Ok

ggplot() +
  geom_sf(data = mapa_departamentos(provincias = "Chaco")) #Ok

Gracias por la sugerencia, ahora incluye la lista de provincias.

mapear

Erratas en la documentación: "veriable", "a el", "masyores", "1500m".

El argumento "breaks" no está bien definido. Habría que especificar que se refiere a que hay que introducir valores (¿uno o varios?) en el rango del argumento "valor".

No se explican las funciones coord_argentina ni theme_inta_mapa en ningún sitio. ¿Se utilizan sólo internamente? En ese caso no deberían estar exportadas.


prueba <- metadatos_nh()

mapear(prueba$altura, #Ok
       prueba$lon, 
       prueba$lat, 
       breaks = c(0, 100, 400, 1000, 1500), 
       cordillera = 1400,
       variable = "mm")

Arreglé los errores de tipeo e incluí las aclaraciones pedidas. Además ahora la función mapear() acepta el data.frame de datos como primer argumento. Las funciones secundarias coord_argentina y theme_inta_mapa ahora tienen documentación.

olas y umbrales

No se explica en la documentación como hay que especificar los umbrales. Es poco habitual que se pueda poner cualquier palabra como nombre de un argumento y una mala praxis porque se puede sobreescribir algo importante en la función. Sería más adecuado que hubiera un argumento para los umbrales y que éstos se pudieran introducir en forma de lista con nombres (ej. umbral = list(calor = "t_max > 20"))

Corregir algunas erratas en la documentación de olas: "mbral", "drtn"

Corregir algunas erratas en la documentación de umbrales: " ⁠N (numérico) ocurrencia del evento *⁠ ``prop' "

olas(datos$fecha, heatwave = datos$t_max > 20) #Ok

umbrales(heatwave = datos$t_max > 20) #Ok

Corregí los errores de tipeo (drtn es un tipo de dato que representa diferencia entre tiempos). No cambié el comportamiento de las funciones olas() y umbrales(), siguen aceptando nombres de columnas como argumentos. Si bien entiendo el comentario de @VeruGHub, cuando desarrollamos estas funciones lo tuvimos en cuenta y decidimos mantener este comportamiento ya que hay muchas otras funciones de R que lo usan (por ejemplo data.frame() o summarise()). Por esto y teniendo en cuenta que las funciones no tienen otros argumentos definidos, consideramos que no hay riesgo de sobrescritura.

pdsi/pdsi_ac

No funciona indicandole los argumentos no definidos por defecto.

Habría que incluir en la documentación las referencias que se citan e incluir las unidades de la precipitacion y la etp. Es redundante incluir un argumento para los coeficientes en forma de lista y luego argumentos para cada coeficiente por separado. Sugiero eliminar una de las dos formas.

Corregir algunas erratas de la ayuda: "list de coeficientes", "El el cálculo".


pdsi(precipitacion = c(500, 600), #No funciona
     etp = c(1000, 1200)) 

pdsi_ac(precipitacion = c(500, 600), #No funciona
     etp = c(1000, 1200)) 

Extendí la documentación con todo lo mencionado. Además incluí la necesidad de tener una serie larga de datos para calcular el indice (no es suficiente con 2 datos). La función pdsi_coeficientes() ahora se documenta aparte para no generar confución.

scale_color/fill_inta pdsi/pdsi_ac

El ejemplo no funciona. Tampoco funciona otro ejemplo que he creado siguiendo las instrucciones de la documentación.

Corregir erratas en la documentación: "escala.)", "tiene prioridad por sobre", "deinidos"


prueba <- metadatos_nh()
prueba$altura <- as.numeric(prueba$altura)

ggplot(prueba) + #No funciona
  geom_point(aes(x = lon, y = lat, color = altura)) +
  scale_color_inta(escala = escala_pp_diaria)


set.seed(496) #El ejemplo no funciona
datos_aleatorios <- subset(metadatos_nh())
datos_aleatorios <- data.frame(datos_aleatorios,
pp = rgamma(nrow(datos_aleatorios), 0.5, scale = 1)*70)

ggplot(datos_aleatorios, aes(lon, lat)) +
geom_contour(aes(z = pp, fill = after_stat(level))) +
scale_fill_inta(escala = escala_pp_diaria)

Mejoré la documentación de esta familia de funciones, en primer lugar indicando que son escalas de colores para variables discretas (no estaba explicito) y mejoré los ejemplos usando un nuevo set de datos con valores de precipitación mensual. Esto simplifica los ejemplos y son más realistas.

spei_indice/spi_indice

La funcionalidad está repetida respecto a las funciones spi y spei del paquete SPEI. A menos que se aclare qué aporta esta función sugiero eliminarla y crear una viñeta que incluya cómo se usa el paquete SPEI con datos en el formato del INTA. Si he entendido bien, las fechas deben introducirse como meses ¿no? Por favor, especificar esto si se mantiene la función. En la documentación no se entiende bien que es el argumento "escalas" y no se cita el paquete SPEI.

prueba <- data.frame(fecha = seq(as.Date("1985-01-01"), as.Date("2015-12-01"), by = "1 month"))
set.seed(42)
prueba$pp <- rgamma(nrow(prueba), shape = 2, scale = 10)

spi_indice(prueba$fecha, prueba$pp, escalas = 1)


#Misma funcionalidad que en paquete SPEI:
spi_agro <- spi_indice(fecha = prueba$fecha, precipitacion = prueba$pp, escalas = 1)

spi_spei <- SPEI::spi(data = prueba$pp, scale = 1)

identical(spi_agro$spi, as.vector(spi_spei$fitted))

Modifiqué la documentaición incluyendo lo solicitado. Una de las ventajas principales de estas funciones y que justifican su existencia es que devuelven el resultado como un data.frame que se puede usar de manera directa para el análisis de datos con dplyr.

Además de lo mencionado anteriormente:

  • Apliqué los comentarios al README y actualicé lo necesario en base a los cambios en el código y nuevos datos. El logo ahora refleja el nuevo nombre del paquete.

  • Actualicé la viñeta del paquete para que refleje los cambios hechos y aproveche los datos disponibles.

  • El listado de funciones en la web del paquete ahora se ordena por temas.

  • Hice una revisión de errores de tipeo en todo el paquete.

Espero no haberme olvidado de nada, aguardo sus comentarios!

@Pakillo
Copy link
Member

Pakillo commented Jun 12, 2024

Muchas gracias @paocorrales !

Estoy revisando todos los cambios. Me parece que la página web del paquete no está actualizada a la última versión, ¿cierto? Veo que el GitHub Actions de pkgdown está desactivado. Por favor actívelo o regenere la web con pkgdown manualmente. Nos ayudaría ver la web actualizada para la revisión

¡Gracias!

@paocorrales
Copy link
Contributor Author

La web ahora está actualizada y la GitHub action activada. Gracias!

@Pakillo
Copy link
Member

Pakillo commented Jun 16, 2024

¡Muchas gracias @paocorrales por la revisión! Creo que el paquete y la documentación han mejorado muchísimo. Algunos comentarios a la última versión:

decil

Es posible que no esté entendiendo bien esta función, pero encuentro su valor de salida un poco confuso. Por ejemplo, en este caso, decil devuelve el decil (de 1 a 10) en que se encuentra cada valor concreto de la variable:

x = 1:10
decil(x)
##  [1]  1  2  3  4  5  6  7  8  9 10

Pero en este caso devuelve valores con decimales desde 0 hasta 10:

x <- seq(0, 19.5, 0.5)
decil(x)
##  [1]  0.25  0.50  0.75  1.00  1.25  1.50  1.75  2.00  2.25  2.50  2.75  3.00
## [13]  3.25  3.50  3.75  4.00  4.25  4.50  4.75  5.00  5.25  5.50  5.75  6.00
## [25]  6.25  6.50  6.75  7.00  7.25  7.50  7.75  8.00  8.25  8.50  8.75  9.00
## [37]  9.25  9.50  9.75 10.00

Pienso que estos valores con decimales podrían generar confusión. Por ejemplo, alguien que quiera saber en qué decil cae cada dato podría intentar hacer un round de estos valores, obteniendo esto:

round(decil(x))
##  [1]  0  0  1  1  1  2  2  2  2  2  3  3  3  4  4  4  4  4  5  5  5  6  6  6  6
## [26]  6  7  7  7  8  8  8  8  8  9  9  9 10 10 10

cuando probablemente necesite ejecutar

ceiling(decil(x))
##  [1]  1  1  1  1  2  2  2  2  3  3  3  3  4  4  4  4  5  5  5  5  6  6  6  6  7
## [26]  7  7  7  8  8  8  8  9  9  9  9 10 10 10 10

¿Cuál es la ventaja de devolver números decimales como salida de decil? ¿Pienso que tal vez sería deseable devolver el decil como número entero comprendido entre 1 y 10? Creo que @VeruGHub apuntaba hacia la misma sugerencia en su revisión.

@VeruGHub también planteaba esta cuestión: ¿Por qué para calcular la anomalia es necesario especificar que no se consideren los NA, pero para decil no? Entiendo que la función decil ignora los NA por defecto, pero tal vez eso debería ser una opción que eligiera el usuario (esto es, añadir un argumento na.rm).

Por ejemplo, la función quantile da un error si le pedimos los deciles de un vector con NA:

x <- 1:10
x[1] <- NA
quantile(x, probs = seq(0, 1, 0.1))
## Error in quantile.default(x, probs = seq(0, 1, 0.1)): missing values and NaN's not allowed if 'na.rm' is FALSE

Si especificamos na.rm = TRUE entonces sí funciona:

quantile(x, probs = seq(0, 1, 0.1), na.rm = TRUE)
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##  2.0  2.8  3.6  4.4  5.2  6.0  6.8  7.6  8.4  9.2 10.0

Al igual que @VeruGHub, pienso que la función decil podría/debería incorporar este argumento por consistencia con quantile y anomalia_porcentual y para mayor control de los usuarios. Si no, la función decil siempre arroja un resultado que podría ser poco robusto si la variable contiene muchos NA.

dias_promedio

Esta función ha quedado muy bien, y la documentación y los ejemplos son muy claros. ¡Gracias!

umbrales

El último ejemplo requiere cambiar de summarise a reframe.

olas

Creo que sería bueno incluir un argumento na.rm o similar para evitar inconsistencias y que el usuario pueda elegir qué hacer con los datos faltantes.

Por ejemplo, esta ola de calor de 22 días de duración:

data(NH0358)
NH0358 %>%
  reframe(olas(fecha, calor = t_max > 20)) %>%
  slice_head(n = 1)
##     ola     inicio        fin longitud
## 1 calor 1951-01-01 1951-01-22  22 days

se transforma en otra de 19 días de duración si falta el dato de temperatura del 20 de enero:

NH0358 %>%
  mutate(t_max = if_else(fecha == "1951-01-20", NA, t_max)) |>
  reframe(olas(fecha, calor = t_max > 20)) %>%
  slice_head(n = 1)
##     ola     inicio        fin longitud
## 1 calor 1951-01-01 1951-01-19  19 days

pero vuelve a tener 22 días de duración si falta la fila completa del 20 de enero (cuando en realidad ese día la temperatura pudo ser <20ºC):

NH0358 %>%
  filter(fecha != "1951-01-20") |> 
  reframe(olas(fecha, calor = t_max > 20)) %>%
  slice_head(n = 1)
##     ola     inicio        fin longitud
## 1 calor 1951-01-01 1951-01-22  22 days

Pienso que para evitar posibles inconsistencias, podría añadirse un nuevo argumento na.rm o similar, de manera que los usuarios puedan elegir qué hacer con los datos faltantes, y que el resultado sea consistente. Si el usuario quiere que los NA se tengan en cuenta, pienso que la función debería devolver NA como fecha de inicio, fin, o duración, cuando sea imposible determinar el día concreto de inicio o fin (por haber datos faltantes).

Por otro lado, es una decisión de los autores, pero como sugerencia, ¿tal vez utilizar “duración” en lugar de “longitud” para especificar la duración (en días) de la ola?

ith

El ejemplo devuelve todos los valores de ith como NA, dado que hr es NA en las 10 primeras filas. Tal vez podemos filtrar primero:

NH0358 %>%
  filter(!is.na(hr)) |> 
  mutate(t_media = (t_max + t_min)/2) %>%
  mutate(ith = ith(t_media, hr)) %>%
  slice_head(n = 10)
##    codigo codigo_nh      fecha t_max t_min precip lluvia_datos lluvia llovizna
## 1      50      0358 1960-01-01  24.4  10.3    0.0            0      0        0
## 2      50      0358 1960-01-02  26.2  11.8    0.0            0      0        0
## 3      50      0358 1960-01-03  30.3  10.8    0.0            0      0        0
## 4      50      0358 1960-01-04  33.5  16.4    0.0            0      0        0
## 5      50      0358 1960-01-05  29.1  19.0    7.7            1      1        1
## 6      50      0358 1960-01-06  31.4  15.3    0.0            0      0        0
## 7      50      0358 1960-01-07  31.9  16.1    0.0            0      0        0
## 8      50      0358 1960-01-08  33.8  17.4    0.0            0      0        0
## 9      50      0358 1960-01-09  32.8  18.3    0.0            0      0        0
## 10     50      0358 1960-01-10  33.1  18.9    0.0            0      0        0
##    granizo nieve t_aire_max t_aire_min t_suelo_max t_suelo_min heliofania_efec
## 1        0     0        7.7         NA          NA          NA            11.5
## 2        0     0        8.0         NA          NA          NA             6.4
## 3        0     0       11.4         NA          NA          NA            10.7
## 4        0     0       11.1         NA          NA          NA            10.8
## 5        0     0       15.9         NA          NA          NA             0.2
## 6        0     0       13.2         NA          NA          NA            11.0
## 7        0     0       11.5         NA          NA          NA            11.5
## 8        0     0       13.9         NA          NA          NA            11.1
## 9        0     0       15.4         NA          NA          NA            11.4
## 10       0     0       14.1         NA          NA          NA            11.3
##    heliofania_rel p_vapor hr   td rocio viento_10m viento_2m  rad etp t_media
## 1              80     9.2 56  5.8     0          3       2.4 27.9 4.8   17.35
## 2              45    11.1 56  8.5     0          2       1.6 19.1 3.9   19.00
## 3              75    10.4 45  7.5     0         10       8.0 26.5 5.9   20.55
## 4              75    10.7 41  8.0     0          4       3.2 26.6 5.7   24.95
## 5               1    15.7 74 13.7     0          1       0.8  8.4 2.8   24.05
## 6              77    13.0 58 10.9     0          0       0.0 26.9 5.0   23.35
## 7              80    11.4 45  8.9     1          6       4.8 27.8 6.1   24.00
## 8              78    12.3 42 10.0     0          7       5.6 27.1 6.4   25.60
## 9              80    16.1 59 14.1     0         11       8.8 27.6 6.9   25.55
## 10             79    12.4 48 10.1     0         13      10.4 27.4 7.4   26.00
##         ith
## 1  61.96434
## 2  64.21560
## 3  65.66553
## 4  70.77370
## 5  72.81753
## 6  70.32707
## 7  69.99700
## 8  71.67448
## 9  73.48225
## 10 72.85120

PDSI

El ejemplo usa with y $ para crear variables, pero en coherencia con la filosofía ‘tidy’ del paquete ¿tal vez sea preferible utilizar código más tipico del tidyverse?

datos <- data.frame(fecha = seq(as.Date("1985-01-01"), 
                                as.Date("2015-12-01"), 
                                by = "1 month"))
set.seed(42)
datos |> 
  mutate(pp = rgamma(nrow(datos), shape = 2, scale = 10),
         etp = rgamma(nrow(datos), shape = 1, scale = 3),
         pdsi_ac = pdsi(pp, etp)) |> 
  slice_head(n = 10)
##         fecha        pp       etp    pdsi_ac
## 1  1985-01-01 36.489561 4.4884365  0.6035107
## 2  1985-02-01  8.881098 2.4454927 -0.6361097
## 3  1985-03-01 15.592198 0.6427609 -0.6008359
## 4  1985-04-01  4.521825 2.1359691 -1.1479653
## 5  1985-05-01 13.728401 4.8577625 -1.2702747
## 6  1985-06-01  8.028043 3.8066111 -1.7626929
## 7  1985-07-01 49.905627 0.4327422  1.5345299
## 8  1985-08-01 14.241745 1.6288137 -0.1455719
## 9  1985-09-01  4.646857 1.4363694 -0.5643165
## 10 1985-10-01  2.812335 4.3753527 -1.2851817

(modificar también el ejemplo de pdsi_coeficientes).

SPI

Creo que sería bueno que los ejemplos de esta función siguieran el estilo utilizado en el tutorial, esto es, usando reframe en lugar de with.

He corregido algunas erratas en este pull request.

Espero que mis comentarios/sugerencias sean claros y fáciles de solucionar. Quedo a la espera de estos cambios, ¡y ya casi estaríamos!

Gracias

@paocorrales
Copy link
Contributor Author

Hola @Pakillo! Gracias por los comentarios. Respondo a cada uno por separado. En el caso de olas(), la función incluye ahora los cambios pedidos y además se resuelve un error que surgió de los ejemplos. La función decil() no tiene cambios aún pero con @eliocamp damos más detalles abajo y quedo atenta a sus respuestas.

decil()

La función decil() lo que hace es una transformación en la que reemplaza cada valor por su cuantil asociado en base a la densidad de probabilidad acumulada de los datos.
Es decir, no es una función que discretice los datos en intervalos. Esto es así porque la distribución de una variables es continua.
Se llama decil porque el resultado se multiplica por 10 para que el máximo sea 10 en vez de 1.
(decil(1:10) devuelve valores redondos porque justo los datos de entrada coinciden exactamente con los límites de los deciles).

Este tipo de transformación es útil en ciertas comparaciones entre observaciones y modelos o entre múltiples modelos, ya que muchas veces los modelos tienen algún sesgo en la media o la varianza pero aún así representan bien la variabilidad relativa.

Cambiar el valor de retorno a valores redondeados implicaría cambiar la función de una transformación a una discretización, perdiendo información.
La discretización se puede realizar luego con el nivel de precisión que le usuarie requiera según su criterio (cantidad de datos, facilidad de visualización, consistencia con otros métodos, etc.)

decil_x <- decil(rnorm(100))
cut(decil_x, seq(0, 10, by = 1))    # discretizar a deciles
cut(decil_x, seq(0, 10, by = 0.1))  # discretizar a percentiles
cut(decil_x, seq(0, 10, by = 2))    # discretizar a quintiles

La función no requiere trato especial de los valores faltantes porque al estimar la curva de densidad de probabilidad acumulado, éstos se descartan automáticamente (ver ?ecdf).
Otras metodologías para estimar la densidad de probabilidad acumulada sí podrían ser sensibles a los datos faltantes (por ejemplo, se podría asumir que la distribución es normal y estimar sus parámetros con mean() y sd()).

También se podría devolver todo NA si algún valor es NA y agregar un argumento na.rm para controlar ese comportamiento.
No sé si eso solucionaría el problema de que la estimación de la CDF sea poco robusta, ya que fallaría aún en caso de que haya un único NA que no afectaría significativamente la estimación, y quien la use podría usar el na.rm = TRUE y obtener un resultado sin tener en cuenta la cantidad de datos que tiene.

umbrales()

Ejemplo arreglado

olas()

El ejemplo que presentas es muy interesante porque detecta un problema que no habíamos tenido en cuenta. La inconsistencia que detectas no se debe a la presencia de NAs explicitos, si no que se debe a un dato faltante implicito, la falta de un día dentro de la serie de datos.
No habiamos tenido en cuenta esta situación y al calcular la diferencia entre las fechas de fin y de inicio obtenemos el mismo resultado aún si faltan dias en el medio.

Agregamos un test dentro de la función que chequea que la serie que recibe está completa. Si no está completa devuelve un error.

Respecto al comportamiento para NAs, sumamos un argumento remplaza.na que por defecto sigue devolviendo el mismo resultado. Esto es consistente con la función rle() de base. Sin embargo si es TRUE, la función reemplazara los NA por el valor previo en la serie "sumando" ese valor a la ola o persistencia.

ith()

Gracias, ejemplo arreglado.

PDSI

Gracias por la recomendación!

SPI

Estos ejemplos también están actualizados

@Pakillo
Copy link
Member

Pakillo commented Aug 7, 2024

¡Muchas gracias por la respuesta y los cambios implementados! Me alegro de que todo haya tenido fácil solución.

Gracias también por explicar lo que hace la función decil. Ahora lo entiendo (creo): para cada valor, devuelve el cuantil basado en una función de probabilidad acumulada (pero en lugar de devolver directamente el cuantil, multiplica el valor por 10). Claramente no había entendido bien su finalidad (y pienso que @VeruGHub tal vez tampoco, a juzgar por sus comentarios). Ello me lleva a proponer un cambio de nombre de esta función, pues pienso que al igual que a nosotros, puede confundir a otras personas en el futuro, que piensen que la función decil les va a devolver los deciles (cuando no es así). No sé si cuantil podría ser un nombre más adecuado, menos propenso a confusión. También me pregunto sobre la conveniencia de devolver los valores multiplicados por 10, en lugar de usar una escala de 0 a 1? Por otro lado, pienso que sería bueno mejorar la ayuda de la función con las explicaciones dadas más arriba: "reemplaza cada valor por su cuantil asociado en base a la densidad de probabilidad acumulada de los datos". Esta misma explicación sugiere que "cuantil" podría ser un buen nombre para esta función.

Tras esta propuesta para su consideración parte de los autores, invito de nuevo a @pmnatural y @VeruGHub a revisar el paquete y los cambios aquí discutidos. Por favor, comuniquen si tienen más observaciones que hacer o si no manifiesten su conformidad usando esta plantilla.

¡Gracias!

@Pakillo
Copy link
Member

Pakillo commented Sep 20, 2024

Hola @pmnatural @VeruGHub

Cuando puedan por favor revisen si están conformes con los cambios realizados en el paquete y manifiesten su conformidad usando esta plantilla.

Gracias

@VeruGHub
Copy link

Hola @paocorrales et al:

Muchas gracias por considerar los cambios propuestos. El readme y la documentación y ejemplos de las funciones han mejorado mucho y los cambios realizados han aclarado mis dudas. Disculpad @Pakillo y @paocorrales la tardanza de mi respuesta.

He detectado algunos puntos más que se pueden mejorar, por si se quieren considerar:

  • En el readme sería mejor poner el enlace a la definición de datos tidy la primera vez que aparece este concepto.
  • decil(): no habia entendido su funcionalidad como apunta @Pakillo. Coincido con él en que si el objetivo no es dar los deciles en que se encuentran los datos o los valores de la variable que marcan los límites de los deciles , un nombre mucho más adecuado sería "cuantil" o "cuantil10". La descripción del output que se da en "value", ya que hay dos funciones en la ayuda, se puede mejorar indicando claramente al inicio "Para el cálculo de los deciles, ...", al igual que luego se habla de las anomalías porcentuales. Estaría muy bien añadir un ejemplo para la función anomalia_porcentual().
  • En la función olas() sugiero que el resultado de la duración esté en español como el resto de la salida (es decir, cambiar "days" por "dias" y lo mismo si hay otras unidades de medida en inglés. En el ejemplo, estaría bien que se vieran las olas de frio. Por ejemplo, se puede separar el cálculo de olas de calor y de frío en dos líneas de código:
data(NH0358)
library(dplyr)
NH0358 %>%
  reframe(olas(fecha, calor = t_max > 20)) %>%
  slice_head(n = 10)

NH0358 %>%
  reframe(olas(fecha, frio = t_min <= 0)) %>%
  slice_head(n = 10) 
  • pdsi()/pdsi_ac(): si el error que me salia se debe a que se necesita una serie de datos "larga" debería indicarse cuanto de largos tienen que ser los vectores de entrada o definir de alguna manera mejor estos argumentos.
  • spi_indice()/spei_indice(): aunque se hace una alusión a la funcionalidad de ordenar en "details", añadiría en la descripción la funcionalidad completa, es decir, que calcula el SPI/SPEI y ordena los datos. Esta segunda parte es la principal novedad de la función y no aparece.

Eso es todo por mi parte, enhorabuena por el paquete.

Un saludo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants