bossanova 0.1.0.dev10__tar.gz → 0.1.0.dev11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/PKG-INFO +1 -1
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/data.py +4 -4
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/display.py +9 -9
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/explore.py +3 -3
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/formula.py +2 -2
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/specs.py +2 -2
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/state.py +32 -21
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/reference.py +40 -8
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/profile.py +4 -2
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/__init__.py +12 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/compute.py +227 -33
- bossanova-0.1.0.dev11/bossanova/internal/operations/marginal/conditions.py +225 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/contrasts.py +148 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/emm.py +18 -1
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/design.py +20 -11
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/pyproject.toml +1 -1
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/.gitignore +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/LICENSE +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/README.md +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/README.md +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/advertising.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/cake.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/chickweight.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/credit.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/gammas.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/mtcars.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/penguins.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/poker.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/sleep.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic_test.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic_train.csv +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/continuous.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/discrete.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/varying.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/expressions.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/data.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/dataframes.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/results.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/specs.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/state.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/schemas.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/validators.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/dispatch.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/jax.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/numpy.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/protocol.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/batching.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/config.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/convergence.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/coding.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/names.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/z_matrix.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/differentiation.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/algebra.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/base.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/core.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/derived.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/factories.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/plotting.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/probability.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/binomial.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/create.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/gamma.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/gaussian.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/links.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/poisson.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/response.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/schema.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/tdist.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/contrasts.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/diagnostics.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/estimation.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/hypothesis.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/information_criteria.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/profile.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/sandwich.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/satterthwaite.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/wald_variance.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/welch.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/qr.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/sparse.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/svd.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/predict.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/rng.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/glm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/glmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/heuristics.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/initialization.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_builder.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_sparse.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_template.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/optimize.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/pirls_sparse.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/quadrature.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/tolerances.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/transforms.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/variance.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/weights.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/bundle.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/classify.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/factors.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/formula_utils.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/compare.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/cv.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/deviance.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/f_test.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/helpers.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/lrt.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/lrt_compare.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/refit.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/contrasts.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/convergence.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/diagnostics.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/dispatch.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/glm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/glmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/lmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/ols.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/rank.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/design.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/encoding.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate_newdata.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate_transforms.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/helpers.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parse.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/expr.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/parser.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/scanner.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/token.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/random_effects.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/asymptotic.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/bootstrap.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/cv.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/mee.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/permutation.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/prediction.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/resample_bundle.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/satterthwaite_emm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/simulation.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/explore.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/grid.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/inference.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/joint_tests.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/slopes.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/validation.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/predict.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/profile.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/rendering/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/rendering/latex.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/common.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/core.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/glm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/glmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm_bca.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm_operators.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/mixed.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/results.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/utils.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/generate.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/glm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/glmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/lm.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/lmer.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/harness.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/metrics.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/model_sim.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/transforms.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/varying.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/README.md +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/cognition.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/compare.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_data.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_protocols.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_sizing.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_viz.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/dag.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit_builders.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit_layers.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/helpers.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/lattice.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/layout.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/mem.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/params.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/predict.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/profile.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/ranef.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/relationships.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/resamples.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/resid.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/vif.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/__init__.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/core.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/summary.py +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/py.typed +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_benchmarks/bootstrap/data/README.md +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_benchmarks/insteval/data/README.md +0 -0
- {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_tests/hypothesis/README.md +0 -0
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/data.py
RENAMED
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
-
from attrs import field, frozen
|
|
8
|
+
from attrs import field, frozen, validators
|
|
9
9
|
|
|
10
10
|
from bossanova.internal.containers.validators import (
|
|
11
11
|
is_ndarray,
|
|
@@ -112,8 +112,8 @@ class RankInfo:
|
|
|
112
112
|
True
|
|
113
113
|
"""
|
|
114
114
|
|
|
115
|
-
rank: int
|
|
116
|
-
p: int
|
|
115
|
+
rank: int = field(validator=validators.instance_of(int))
|
|
116
|
+
p: int = field(validator=validators.instance_of(int))
|
|
117
117
|
kept_indices: NDArray[np.intp] = field(validator=is_ndarray)
|
|
118
118
|
dropped_indices: tuple[int, ...] = field(converter=tuple)
|
|
119
119
|
dropped_names: tuple[str, ...] = field(converter=tuple)
|
|
@@ -174,7 +174,7 @@ class DataBundle:
|
|
|
174
174
|
y_name: str
|
|
175
175
|
|
|
176
176
|
valid_mask: NDArray[np.bool_] = field(validator=is_ndarray)
|
|
177
|
-
n_total: int
|
|
177
|
+
n_total: int = field(validator=validators.instance_of(int))
|
|
178
178
|
|
|
179
179
|
# Optional fields
|
|
180
180
|
Z: sp.csc_matrix | None = field(default=None, validator=is_optional_sparse_csc)
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/display.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from attrs import field, frozen
|
|
5
|
+
from attrs import field, frozen, validators
|
|
6
6
|
|
|
7
7
|
__all__ = [
|
|
8
8
|
"MathDisplay",
|
|
@@ -24,12 +24,12 @@ class TermInfo:
|
|
|
24
24
|
explanation: Human-readable explanation string.
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
|
-
name: str
|
|
28
|
-
term_type: str
|
|
29
|
-
base_var: str
|
|
30
|
-
symbol: str
|
|
31
|
-
latex: str
|
|
32
|
-
explanation: str
|
|
27
|
+
name: str = field(validator=validators.instance_of(str))
|
|
28
|
+
term_type: str = field(validator=validators.instance_of(str))
|
|
29
|
+
base_var: str = field(validator=validators.instance_of(str))
|
|
30
|
+
symbol: str = field(validator=validators.instance_of(str))
|
|
31
|
+
latex: str = field(validator=validators.instance_of(str))
|
|
32
|
+
explanation: str = field(validator=validators.instance_of(str))
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
@frozen
|
|
@@ -50,9 +50,9 @@ class MathDisplay:
|
|
|
50
50
|
>>> display # renders in Jupyter
|
|
51
51
|
"""
|
|
52
52
|
|
|
53
|
-
equation: str
|
|
53
|
+
equation: str = field(validator=validators.instance_of(str))
|
|
54
54
|
explanations: tuple[str, ...] = field(factory=tuple)
|
|
55
|
-
model_info: str = ""
|
|
55
|
+
model_info: str = field(default="", validator=validators.instance_of(str))
|
|
56
56
|
|
|
57
57
|
def _repr_latex_(self) -> str:
|
|
58
58
|
"""LaTeX representation for Jupyter rendering."""
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/explore.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Parsing result containers for explore formulas."""
|
|
2
2
|
|
|
3
|
-
from attrs import field, frozen
|
|
3
|
+
from attrs import field, frozen, validators
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"Condition",
|
|
@@ -23,7 +23,7 @@ class Condition:
|
|
|
23
23
|
at_quantile: Number of quantile values to use.
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
var: str
|
|
26
|
+
var: str = field(validator=validators.instance_of(str))
|
|
27
27
|
at_values: tuple | None = field(default=None)
|
|
28
28
|
at_range: int | None = field(default=None)
|
|
29
29
|
at_quantile: int | None = field(default=None)
|
|
@@ -47,7 +47,7 @@ class ExploreFormula:
|
|
|
47
47
|
(e.g., from ``Days[0, 3, 6, 9]`` syntax). None means use all levels.
|
|
48
48
|
"""
|
|
49
49
|
|
|
50
|
-
focal_var: str
|
|
50
|
+
focal_var: str = field(validator=validators.instance_of(str))
|
|
51
51
|
contrast_type: str | None = field(default=None)
|
|
52
52
|
contrast_degree: int | None = field(default=None)
|
|
53
53
|
conditions: tuple[Condition, ...] = field(factory=tuple, converter=tuple)
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/formula.py
RENAMED
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
-
from attrs import field, frozen
|
|
7
|
+
from attrs import field, frozen, validators
|
|
8
8
|
|
|
9
9
|
from bossanova.internal.containers.validators import (
|
|
10
10
|
to_factor_dict,
|
|
@@ -53,7 +53,7 @@ class FormulaSpec:
|
|
|
53
53
|
"""
|
|
54
54
|
|
|
55
55
|
# --- Parsing results (from formula string) ---
|
|
56
|
-
formula: str
|
|
56
|
+
formula: str = field(validator=validators.instance_of(str))
|
|
57
57
|
response_var: str | None = field(default=None)
|
|
58
58
|
response_transform: tuple[str, ...] | None = field(default=None)
|
|
59
59
|
has_intercept: bool = field(default=True)
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/specs.py
RENAMED
|
@@ -79,8 +79,8 @@ class ModelSpec:
|
|
|
79
79
|
"""
|
|
80
80
|
|
|
81
81
|
# Required fields
|
|
82
|
-
formula: str
|
|
83
|
-
response_var: str
|
|
82
|
+
formula: str = field(validator=validators.instance_of(str))
|
|
83
|
+
response_var: str = field(validator=validators.instance_of(str))
|
|
84
84
|
fixed_terms: tuple[str, ...] = field(converter=to_tuple)
|
|
85
85
|
|
|
86
86
|
# Optional fields with defaults and validation
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/state.py
RENAMED
|
@@ -7,7 +7,7 @@ CVState, SimulationInferenceState, VaryingState, VaryingSpreadState).
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
-
from typing import TYPE_CHECKING
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
from attrs import field, frozen, validators
|
|
@@ -15,6 +15,7 @@ from attrs import field, frozen, validators
|
|
|
15
15
|
from bossanova.internal.containers.validators import (
|
|
16
16
|
is_ndarray,
|
|
17
17
|
is_optional_ndarray,
|
|
18
|
+
to_tuple,
|
|
18
19
|
)
|
|
19
20
|
|
|
20
21
|
if TYPE_CHECKING:
|
|
@@ -240,9 +241,9 @@ class MeeState:
|
|
|
240
241
|
grid: "pl.DataFrame" = field(repr=False)
|
|
241
242
|
estimate: np.ndarray = field(validator=is_ndarray)
|
|
242
243
|
|
|
243
|
-
explore_formula: str
|
|
244
|
-
focal_var: str
|
|
245
|
-
type: str
|
|
244
|
+
explore_formula: str = field(validator=validators.instance_of(str))
|
|
245
|
+
focal_var: str = field(validator=validators.instance_of(str))
|
|
246
|
+
type: str = field(validator=validators.in_(("means", "slopes", "contrasts")))
|
|
246
247
|
units: str = field(default="link", validator=validators.in_(("link", "data")))
|
|
247
248
|
|
|
248
249
|
# Design matrix for delta method inference (optional)
|
|
@@ -313,7 +314,7 @@ class JointTestState:
|
|
|
313
314
|
"""
|
|
314
315
|
|
|
315
316
|
# Required fields
|
|
316
|
-
terms: tuple[str, ...]
|
|
317
|
+
terms: tuple[str, ...] = field(converter=to_tuple)
|
|
317
318
|
df1: np.ndarray = field(validator=is_ndarray) # Numerator df per term
|
|
318
319
|
statistic: np.ndarray = field(validator=is_ndarray) # F or chi2 values
|
|
319
320
|
p_value: np.ndarray = field(validator=is_ndarray)
|
|
@@ -545,8 +546,8 @@ class SimulationInferenceState:
|
|
|
545
546
|
>>> m.sim_inference.power["x"] # Proportion of sims where p < 0.05
|
|
546
547
|
"""
|
|
547
548
|
|
|
548
|
-
sim_type: str
|
|
549
|
-
n_sims: int
|
|
549
|
+
sim_type: str = field(validator=validators.in_(("post_fit", "power_analysis")))
|
|
550
|
+
n_sims: int = field(validator=validators.instance_of(int))
|
|
550
551
|
|
|
551
552
|
# Post-fit simulation summaries (per observation)
|
|
552
553
|
sim_mean: np.ndarray | None = field(default=None)
|
|
@@ -601,9 +602,9 @@ class VaryingState:
|
|
|
601
602
|
|
|
602
603
|
# Required fields
|
|
603
604
|
grid: "pl.DataFrame" = field(repr=False)
|
|
604
|
-
effects: dict[str, np.ndarray]
|
|
605
|
-
grouping_var: str
|
|
606
|
-
n_groups: int
|
|
605
|
+
effects: dict[str, np.ndarray] = field(validator=validators.instance_of(dict))
|
|
606
|
+
grouping_var: str = field(validator=validators.instance_of(str))
|
|
607
|
+
n_groups: int = field(validator=validators.instance_of(int))
|
|
607
608
|
|
|
608
609
|
# Inference (optional, added by .infer())
|
|
609
610
|
# These are dicts: effect_name -> array of interval bounds
|
|
@@ -667,8 +668,8 @@ class VaryingSpreadState:
|
|
|
667
668
|
|
|
668
669
|
# Required fields
|
|
669
670
|
components: "pl.DataFrame" = field(repr=False)
|
|
670
|
-
sigma2: float
|
|
671
|
-
tau2: dict[str, float]
|
|
671
|
+
sigma2: float = field(validator=validators.instance_of((int, float)))
|
|
672
|
+
tau2: dict[str, float] = field(validator=validators.instance_of(dict))
|
|
672
673
|
|
|
673
674
|
# Optional fields
|
|
674
675
|
rho: dict[str, float] = field(factory=dict) # "effect1_effect2" -> correlation
|
|
@@ -727,15 +728,25 @@ class ProfileState:
|
|
|
727
728
|
"""
|
|
728
729
|
|
|
729
730
|
table: "pl.DataFrame" = field(repr=False)
|
|
730
|
-
spline_forward: dict = field(
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
731
|
+
spline_forward: dict[str, Any] = field(
|
|
732
|
+
repr=False, validator=validators.instance_of(dict)
|
|
733
|
+
)
|
|
734
|
+
spline_reverse: dict[str, Any] = field(
|
|
735
|
+
repr=False, validator=validators.instance_of(dict)
|
|
736
|
+
)
|
|
737
|
+
ci_theta: dict[str, tuple[float, float]] = field(
|
|
738
|
+
validator=validators.instance_of(dict)
|
|
739
|
+
)
|
|
740
|
+
ci_sd: dict[str, tuple[float, float]] = field(
|
|
741
|
+
validator=validators.instance_of(dict)
|
|
742
|
+
)
|
|
743
|
+
ci_lower_sd: NDArray[np.floating] = field(repr=False, validator=is_ndarray)
|
|
744
|
+
ci_upper_sd: NDArray[np.floating] = field(repr=False, validator=is_ndarray)
|
|
745
|
+
conf_level: float = field(validator=validators.instance_of((int, float)))
|
|
746
|
+
dev_opt: float = field(validator=validators.instance_of((int, float)))
|
|
747
|
+
threshold: float = field(
|
|
748
|
+
default=4.0, validator=validators.instance_of((int, float))
|
|
749
|
+
)
|
|
739
750
|
|
|
740
751
|
|
|
741
752
|
# =============================================================================
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/reference.py
RENAMED
|
@@ -19,6 +19,8 @@ def build_reference_design_matrix(
|
|
|
19
19
|
focal_var: str,
|
|
20
20
|
levels: list[str],
|
|
21
21
|
X_means: np.ndarray,
|
|
22
|
+
*,
|
|
23
|
+
set_categoricals: dict[str, str] | None = None,
|
|
22
24
|
) -> np.ndarray:
|
|
23
25
|
"""Build design matrix for reference grid points.
|
|
24
26
|
|
|
@@ -38,6 +40,10 @@ def build_reference_design_matrix(
|
|
|
38
40
|
levels: List of levels for the focal variable, defining row order.
|
|
39
41
|
X_means: Column means of the original design matrix, shape (p,).
|
|
40
42
|
Used for continuous covariate reference values.
|
|
43
|
+
set_categoricals: Optional dict mapping non-focal categorical variable
|
|
44
|
+
names to specific levels to pin them at (instead of marginalizing
|
|
45
|
+
at X_means). E.g. ``{"Ethnicity": "Asian"}`` sets the Ethnicity
|
|
46
|
+
dummies to indicator values for "Asian".
|
|
41
47
|
|
|
42
48
|
Returns:
|
|
43
49
|
Reference design matrix X_ref, shape (n_levels, p).
|
|
@@ -64,7 +70,9 @@ def build_reference_design_matrix(
|
|
|
64
70
|
X_ref = np.zeros((n_levels, p), dtype=np.float64)
|
|
65
71
|
|
|
66
72
|
for i, level in enumerate(levels):
|
|
67
|
-
X_ref[i] = build_reference_row(
|
|
73
|
+
X_ref[i] = build_reference_row(
|
|
74
|
+
X_names, focal_var, level, X_means, set_categoricals=set_categoricals
|
|
75
|
+
)
|
|
68
76
|
|
|
69
77
|
return X_ref
|
|
70
78
|
|
|
@@ -74,6 +82,8 @@ def build_reference_row(
|
|
|
74
82
|
focal_var: str,
|
|
75
83
|
focal_level: str,
|
|
76
84
|
X_means: np.ndarray,
|
|
85
|
+
*,
|
|
86
|
+
set_categoricals: dict[str, str] | None = None,
|
|
77
87
|
) -> np.ndarray:
|
|
78
88
|
"""Build a single row of the reference design matrix.
|
|
79
89
|
|
|
@@ -90,6 +100,11 @@ def build_reference_row(
|
|
|
90
100
|
focal_var: Name of the focal categorical variable.
|
|
91
101
|
focal_level: Level value to set for the focal variable.
|
|
92
102
|
X_means: Column means for continuous covariate reference values.
|
|
103
|
+
set_categoricals: Optional dict mapping non-focal categorical variable
|
|
104
|
+
names to specific levels for indicator encoding. When a non-focal
|
|
105
|
+
categorical's ``base_term`` matches a key, the dummy is set to
|
|
106
|
+
``1.0`` if the level matches, ``0.0`` otherwise (instead of using
|
|
107
|
+
the column mean for marginalization).
|
|
93
108
|
|
|
94
109
|
Returns:
|
|
95
110
|
Reference row, shape (p,).
|
|
@@ -110,10 +125,13 @@ def build_reference_row(
|
|
|
110
125
|
X_means,
|
|
111
126
|
focal_var=focal_var,
|
|
112
127
|
focal_level=focal_level,
|
|
128
|
+
set_categoricals=set_categoricals,
|
|
113
129
|
)
|
|
114
130
|
elif info.column_type == "categorical":
|
|
115
131
|
if info.base_term == focal_var:
|
|
116
132
|
row[j] = 1.0 if info.level == focal_level else 0.0
|
|
133
|
+
elif set_categoricals and info.base_term in set_categoricals:
|
|
134
|
+
row[j] = 1.0 if info.level == set_categoricals[info.base_term] else 0.0
|
|
117
135
|
else:
|
|
118
136
|
row[j] = X_means[j]
|
|
119
137
|
else:
|
|
@@ -243,12 +261,13 @@ def _resolve_interaction_value(
|
|
|
243
261
|
*,
|
|
244
262
|
focal_level: str | None = None,
|
|
245
263
|
focal_value: float | None = None,
|
|
264
|
+
set_categoricals: dict[str, str] | None = None,
|
|
246
265
|
) -> float:
|
|
247
266
|
"""Compute reference value for an interaction column.
|
|
248
267
|
|
|
249
|
-
If the interaction involves the focal variable
|
|
250
|
-
of component values
|
|
251
|
-
|
|
268
|
+
If the interaction involves the focal variable or a pinned categorical,
|
|
269
|
+
computes the product of component values. Otherwise, returns the
|
|
270
|
+
empirical column mean for marginalization.
|
|
252
271
|
|
|
253
272
|
Args:
|
|
254
273
|
col_name: Interaction column name (e.g., ``"Income:Student[Yes]"``).
|
|
@@ -259,22 +278,28 @@ def _resolve_interaction_value(
|
|
|
259
278
|
``focal_value``).
|
|
260
279
|
focal_value: Value for continuous focal (mutually exclusive with
|
|
261
280
|
``focal_level``).
|
|
281
|
+
set_categoricals: Dict mapping non-focal categorical names to
|
|
282
|
+
pinned levels. When an interaction part's base_term matches,
|
|
283
|
+
the indicator value is used instead of the column mean.
|
|
262
284
|
|
|
263
285
|
Returns:
|
|
264
286
|
Computed reference value for the interaction column.
|
|
265
287
|
"""
|
|
266
288
|
parts = col_name.split(":")
|
|
267
289
|
|
|
268
|
-
# Check if any part
|
|
290
|
+
# Check if any part involves the focal variable or a pinned categorical
|
|
269
291
|
involves_focal = any(
|
|
270
292
|
parse_design_column_name(p).base_term == focal_var for p in parts
|
|
271
293
|
)
|
|
294
|
+
involves_pinned = set_categoricals is not None and any(
|
|
295
|
+
parse_design_column_name(p).base_term in set_categoricals for p in parts
|
|
296
|
+
)
|
|
272
297
|
|
|
273
|
-
if not involves_focal:
|
|
274
|
-
# Non-focal interaction: use empirical column mean
|
|
298
|
+
if not involves_focal and not involves_pinned:
|
|
299
|
+
# Non-focal, non-pinned interaction: use empirical column mean
|
|
275
300
|
return float(X_means[X_names_list.index(col_name)])
|
|
276
301
|
|
|
277
|
-
#
|
|
302
|
+
# Decompose and compute product of component values
|
|
278
303
|
product = 1.0
|
|
279
304
|
for part in parts:
|
|
280
305
|
pinfo = parse_design_column_name(part)
|
|
@@ -286,6 +311,13 @@ def _resolve_interaction_value(
|
|
|
286
311
|
product *= focal_value
|
|
287
312
|
elif part in X_names_list:
|
|
288
313
|
product *= float(X_means[X_names_list.index(part)])
|
|
314
|
+
elif (
|
|
315
|
+
set_categoricals
|
|
316
|
+
and pinfo.column_type == "categorical"
|
|
317
|
+
and pinfo.base_term in set_categoricals
|
|
318
|
+
):
|
|
319
|
+
# Pinned categorical component: use indicator
|
|
320
|
+
product *= 1.0 if pinfo.level == set_categoricals[pinfo.base_term] else 0.0
|
|
289
321
|
elif part in X_names_list:
|
|
290
322
|
# Non-focal component: use its column mean
|
|
291
323
|
product *= float(X_means[X_names_list.index(part)])
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/profile.py
RENAMED
|
@@ -118,8 +118,10 @@ def compute_profile_inference(
|
|
|
118
118
|
from bossanova.internal.containers.structs.state import ProfileState
|
|
119
119
|
from bossanova.internal.maths.inference.profile import profile_likelihood
|
|
120
120
|
from bossanova.internal.maths.solvers.lambda_builder import build_lambda_template
|
|
121
|
-
from bossanova.internal.maths.solvers.
|
|
122
|
-
|
|
121
|
+
from bossanova.internal.maths.solvers.lmer import (
|
|
122
|
+
compute_pls_invariants,
|
|
123
|
+
lmm_deviance_sparse,
|
|
124
|
+
)
|
|
123
125
|
from bossanova.internal.operations.varying import per_factor_re_info
|
|
124
126
|
|
|
125
127
|
re_meta = bundle.re_metadata
|
{bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/__init__.py
RENAMED
|
@@ -36,8 +36,15 @@ from bossanova.internal.operations.marginal.slopes import (
|
|
|
36
36
|
from bossanova.internal.operations.marginal.compute import (
|
|
37
37
|
dispatch_marginal_computation,
|
|
38
38
|
)
|
|
39
|
+
from bossanova.internal.operations.marginal.conditions import (
|
|
40
|
+
ResolvedConditions,
|
|
41
|
+
combine_resolved,
|
|
42
|
+
merge_at_kwarg,
|
|
43
|
+
resolve_conditions,
|
|
44
|
+
)
|
|
39
45
|
from bossanova.internal.operations.marginal.contrasts import (
|
|
40
46
|
apply_contrasts,
|
|
47
|
+
apply_contrasts_grouped,
|
|
41
48
|
compute_contrasts,
|
|
42
49
|
pairwise_contrasts,
|
|
43
50
|
poly_contrasts,
|
|
@@ -56,8 +63,11 @@ __all__ = [
|
|
|
56
63
|
"Condition",
|
|
57
64
|
"ExploreFormula",
|
|
58
65
|
"ExploreFormulaError",
|
|
66
|
+
"ResolvedConditions",
|
|
59
67
|
"apply_contrasts",
|
|
68
|
+
"apply_contrasts_grouped",
|
|
60
69
|
"build_reference_grid",
|
|
70
|
+
"combine_resolved",
|
|
61
71
|
"compute_conditional_emm",
|
|
62
72
|
"compute_conditional_slopes",
|
|
63
73
|
"compute_contrasts",
|
|
@@ -69,8 +79,10 @@ __all__ = [
|
|
|
69
79
|
"compute_slopes",
|
|
70
80
|
"compute_slopes_finite_diff",
|
|
71
81
|
"dispatch_marginal_computation",
|
|
82
|
+
"merge_at_kwarg",
|
|
72
83
|
"pairwise_contrasts",
|
|
73
84
|
"parse_explore_formula",
|
|
74
85
|
"poly_contrasts",
|
|
86
|
+
"resolve_conditions",
|
|
75
87
|
"sequential_contrasts",
|
|
76
88
|
]
|