Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

`pk.calc.time_above()` with lin-up/log-down silently drops segments that end at a negative value

Abierto Apto para principiantes
#697 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
79/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
r
Área
data

Línea de trabajo

Empieza por localizar pk.calc.time_above() y su clasificación de segmentos lin-up/log-down; compara esa lógica con el fallback lineal del cálculo de AUC. Añade pruebas para los dos ejemplos con valores negativos, los resultados sin cambios para valores todos positivos y un segmento que termina en cero. Se considera terminado cuando cada segmento que cruza cero se cuenta una sola vez y los totales reportados coinciden con los ejemplos.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary

In the lin-up/log-down branch, a segment that crosses from above to below the threshold is classified as linear_down only when conc2 == 0, and as log_down only when conc2 > 0. When conc2 < 0 it is neither, so the segment adds nothing to the total.

This matters for PD data: change from baseline, or effects with negative values. The only signal is the generic "Negative concentrations found" warning. A negative threshold over all-negative data returns 0.

Reprex
library(PKNCA)
# Exact (linear interpolation): 1/3 + 3/5 + 3/4 = 1.6833
suppressWarnings(pk.calc.time_above(conc = c(1, -2, 3, -1), time = 0:3, conc_above = 0, method = "linear"))
#> 1.683333
suppressWarnings(pk.calc.time_above(conc = c(1, -2, 3, -1), time = 0:3, conc_above = 0, method = "lin up/log down"))
#> 0.6        # only the rising segment is counted

# Negative threshold, both values negative; exact 0.5
suppressWarnings(pk.calc.time_above(conc = c(-1, -3), time = 0:1, conc_above = -2, method = "lin up/log down"))
#> 0
Proposed fix

Use log interpolation only where it is defined, conc1 > conc2 > 0, and linear interpolation for every other falling segment. That matches how the AUC calculation falls back to linear:

log_down    <- conc2 > 0 & conc1 > 0 & conc2 < conc1
linear_down <- !log_down

Then apply mask_first & linear_down and mask_first & log_down, so every crossing segment falls into exactly one branch. An internal check that each mask_first and mask_second segment is counted once would catch regressions of this kind.

Tests to add
  • The two examples above under lin-up/log-down: 1.6833 and 0.5.
  • Results for all-positive data are unchanged.
  • A segment ending exactly at 0 still uses linear interpolation.
Lenguaje dominante
R
Estrellas
86
Forks
32
Merge medio
14 h 17 min
PR fusionados (30 d)
50

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de humanpred/pknca

Todos los issues de humanpred/pknca

Issues similares

Más issues de R

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.