Skip to main content

Python port of the sensR package for Thurstonian models in sensory discrimination

Project description

sensPy

A Python port of the R package sensR for Thurstonian models in sensory discrimination analysis.

CI codecov Python 3.10+ License: GPL v2


About

sensPy provides a comprehensive Python implementation of sensR, the R package for sensory discrimination methods. This project ensures:

  • Numerical parity with sensR (validated against R outputs)
  • Modern Python practices (type hints, dataclasses, NumPy/SciPy integration)
  • Full test coverage with 500+ tests

Installation

# Install with pip
pip install senspy

# Or install from source
git clone https://github.com/aigorahub/sensPy.git
cd sensPy
pip install -e .

Features

Discrimination Protocols

All standard protocols with single and double variants:

Protocol Single Double
Triangle
Duo-Trio
2-AFC
3-AFC
Tetrad
Hexad -
2-out-of-5 -

Statistical Models

  • discrim() - D-prime estimation with confidence intervals and p-values
  • betabin() - Beta-binomial model for overdispersed data
  • twoac() - 2-Alternative Certainty model
  • samediff() - Same-different model
  • dod() - Degree-of-difference model
  • anota() - A-not-A signal detection model

Power & Sample Size

  • discrim_power(), dprime_power() - Power analysis
  • discrim_sample_size(), dprime_sample_size() - Sample size calculation
  • samediff_power() - Same-different power (simulation-based)
  • twoac_power() - 2-AC exact power
  • dod_power() - DOD power analysis

Inference & Comparison

  • dprime_test() - Test d-prime hypotheses
  • dprime_compare() - Compare d-primes across groups
  • posthoc() - Post-hoc pairwise comparisons

ROC & Signal Detection

  • roc() - ROC curve computation
  • auc() - Area under the ROC curve
  • sdt() - Signal detection theory transforms

Simulation

  • discrim_sim() - Simulate discrimination experiments
  • samediff_sim() - Simulate same-different data
  • dod_sim() - Simulate DOD data

Visualization

  • plot_psychometric() - Psychometric functions
  • plot_roc() - ROC curves
  • plot_power_curve() - Power curves
  • plot_profile_likelihood() - Profile likelihood

Quick Start

from senspy import discrim, discrim_power

# Analyze a Triangle test result (80 correct out of 100)
result = discrim(correct=80, total=100, method="triangle")
print(f"d-prime: {result.d_prime:.3f}")
print(f"95% CI: [{result.ci_lower:.3f}, {result.ci_upper:.3f}]")
print(f"p-value: {result.p_value:.4g}")

# Calculate power for a future test
power = discrim_power(d_prime=1.5, sample_size=100, method="triangle")
print(f"Power: {power:.1%}")
from senspy import samediff, dprime_compare

# Same-different analysis
sd = samediff(nsamesame=45, ndiffsame=5, nsamediff=20, ndiffdiff=30)
print(f"delta: {sd.delta:.3f}, tau: {sd.tau:.3f}")

# Compare d-primes across products
result = dprime_compare(
    correct=[80, 65, 90],
    total=[100, 100, 100],
    method="triangle"
)
print(f"Chi-square: {result.statistic:.2f}, p={result.p_value:.4f}")

Disclaimer

Beta Release — sensPy is currently in beta. While we strive for numerical accuracy and validate results against the original sensR package, this software is provided "as is", without warranty of any kind. Aigora assumes no liability for any decisions, outcomes, or consequences arising from the use of this software. Users are responsible for independently verifying results before relying on them in production, regulatory, or research contexts.

License

This project is licensed under the GNU General Public License version 2.0 or later. See LICENSE for details.

Citation

If you use sensPy in your research, please cite:

@software{senspy,
  title = {sensPy: Python port of sensR for Thurstonian models},
  author = {Aigora},
  year = {2025},
  url = {https://github.com/aigorahub/sensPy}
}

Acknowledgments

This package is a port of sensR by Per Bruun Brockhoff and Rune Haubo Bojesen Christensen.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

senspy-0.2.0.tar.gz (73.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

senspy-0.2.0-py3-none-any.whl (84.9 kB view details)

Uploaded Python 3

File details

Details for the file senspy-0.2.0.tar.gz.

File metadata

  • Download URL: senspy-0.2.0.tar.gz
  • Upload date:
  • Size: 73.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for senspy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ce6a794215184c033bca258805dc89b3d1af5bace46384cd4627454ef24c0b01
MD5 06eabb7ca64fe2f1eb98ca1d8d642f1c
BLAKE2b-256 595b716eb35c9f1449fc8af68ea569b300a199b4bde9e8f6f89000b3ceb7b047

See more details on using hashes here.

Provenance

The following attestation bundles were made for senspy-0.2.0.tar.gz:

Publisher: publish.yml on aigorahub/sensPy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file senspy-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: senspy-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 84.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for senspy-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c5a50a095b62640ed17326e5a9adab0338e5c7e8e489390f0aed8b05a8bfd272
MD5 b63c195dd643b5f289b19b8cd682922f
BLAKE2b-256 41ee7e68dc4f1ccc973efdc8e7883421264d9e0513a3857705bd52c4f89724bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for senspy-0.2.0-py3-none-any.whl:

Publisher: publish.yml on aigorahub/sensPy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page