DHI / DHI/modelskill

Investigate: is lin_slope really a metric?

Open
#649 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
56
Forks
9
Avg merge
57m
Merged PRs (30d)
3

Description

Surfaced during the [ADR-012 refactor](https://github.com/DHI/modelskill/pull/648). `lin_slope` is the only metric in `src/modelskill/metrics.py` that requires a regression computation; every other metric is pure aggregation. As a side effect, the regression helper has to live in a shared internal module (`modelskill/_utils.py:linear_regression`) because both `lin_slope` and `plotting/_scatter.py` need it.

## Why it's worth questioning

- **Slope alone is an incomplete skill summary.** A perfect slope of 1 with a non-zero intercept is still a biased model. Users wanting linearity diagnostics typically want slope + intercept + r² together.
- **It's the lone cross-module pull.** Without `lin_slope`, the regression helper would live next to its only other user — the scatter trend line in `plotting/_misc.py`.
- **The exposure feels incidental.** `lin_slope` reads more like "we already needed this for plotting, let's surface the slope as a bonus number" than like a deliberate skill metric choice.

## Current usage

- Definition: `src/modelskill/metrics.py:711`
- Registered with `@metric(best=1, has_units=False)`
- Public docs: `docs/api/metrics.qmd:46,686`
- Tested: `tests/test_aggregated_skill.py:312` (`cc2.skill(metrics=[\"bias\", \"rmse\", \"lin_slope\", \"si\"])`)

## Options to consider

1. **Inline `scipy.stats.linregress` inside `lin_slope`** and move `linear_regression` to `plotting/_misc.py`. Smallest change, no public API impact, removes the last reason `_utils.py` holds a regression helper.
2. **Deprecate `lin_slope` and replace with a richer regression diagnostic** (e.g. `Comparer.regression()` returning slope/intercept/r²). Cleaner conceptually, breaking-change scope.
3. **Leave it.** It works and is published; the cross-module helper is fine.

No action needed in #648 — this issue exists so the discussion isn't lost.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.