Authoring generalized linear mixed effects models from conceptual models
Project description
rTisanePy
Authoring generalized linear mixed effects models from conceptual models. Based on rTisane.
rTisanePy lets you:
- Declare variables and specify causal and relational assumptions
- Query for a statistical model from a conceptual model
- Automatically identify confounders (following Cinelli, Forney & Pearl, 2022)
- Infer random effects from nesting and repeated measures
- Select candidate family/link functions based on DV type
Installation
pip install rtisanepy
For development:
pip install -e ".[dev]"
Requires Python 3.10+ and networkx.
Quick Start
from rtisanepy import (
Unit, continuous, categories,
causes, equals, increases,
ConceptualModel,
)
# Declare variables
student = Unit("student", cardinality=100)
classroom = Unit("classroom", cardinality=10)
student = Unit("student", cardinality=100, nests_within=classroom)
tutoring = categories(unit=student, name="Tutoring", cardinality=2)
ses = categories(unit=student, name="SES", order=["lower", "middle", "upper"])
test_score = continuous(unit=student, name="TestScore")
# Build a conceptual model
cm = (
ConceptualModel()
.assume(causes(ses, test_score))
.assume(causes(ses, tutoring))
.hypothesize(causes(tutoring, test_score,
when=equals(tutoring, "in-person"),
then=increases(test_score)))
)
# Query for a statistical model
model = cm.query(iv=tutoring, dv=test_score)
print(model.formula()) # TestScore ~ Tutoring + SES + (1 | classroom)
print(model.family) # Inverse Gaussian
print(model.main_effects) # ['Tutoring', 'SES']
print(model.random_effects) # [RandomIntercept(group=classroom)]
# Override family/link
model2 = model.with_family("Gaussian", link="identity")
API Overview
Variables
| Constructor | Description |
|---|---|
Unit(name, cardinality, nests_within=None) |
Entity (participant, subject) |
Participant(name, cardinality, nests_within=None) |
Alias for Unit |
Time(name, order=None, cardinality=0) |
Time variable |
continuous(unit, name, number_of_instances=1) |
Continuous measure |
counts(unit, name, number_of_instances=1) |
Count measure |
categories(unit, name, *, cardinality=None, order=None) |
Categorical measure (ordered if order given) |
Relationships
| Function | Description |
|---|---|
causes(cause, effect, *, when=None, then=None) |
Directed causal relationship |
relates(lhs, rhs, *, when=None, then=None) |
Undirected (ambiguous) relationship |
nests(base, group) |
Nesting relationship between units |
Comparisons (for when/then annotations)
| Function | Description |
|---|---|
equals(variable, value) |
Variable equals a value |
not_equals(variable, value) |
Variable does not equal a value |
increases(variable) |
Variable increases |
decreases(variable) |
Variable decreases |
ConceptualModel
cm = ConceptualModel()
cm.assume(relationship) # Add assumed relationship (returns self)
cm.hypothesize(relationship) # Add hypothesized relationship (returns self)
cm.interacts(*vars, dv=dv) # Add interaction annotation (returns self)
cm.query(iv=iv, dv=dv) # Infer a StatisticalModel
At least one hypothesized relationship connecting iv and dv is required to query.
StatisticalModel
| Attribute / Method | Description |
|---|---|
.formula() |
R-style formula string |
.main_effects |
List of main effect variable names |
.interaction_effects |
List of interaction terms |
.random_effects |
List of RandomIntercept / RandomSlope |
.family |
Selected family function |
.link |
Selected link function |
.family_candidates |
All candidate family/link pairs |
.summary() |
Machine-readable dict |
.with_family(family, link=None) |
Copy with overridden family/link |
Running Tests
python -m pytest tests/ -v
Citation
If you use rTisanePy in your research, please cite:
@software{rtisanepy,
author = {Eunice Jun},
title = {rTisanePy: A Python Tool for Authoring Statistical Models from Conceptual Models},
url = {https://github.com/emjun/rTisanePy},
year = {2026}
}
References
- Eunice Jun, Edward Misback, Jeffrey Heer, and René Just. 2024. rTisane: Externalizing Conceptual Models for Data Analysis Prompts Reconsideration of Domain Assumptions and Facilitates Statistical Modeling. CHI 2024.
- Eunice Jun, Audrey Seo, Jeffrey Heer, and René Just. 2022. Tisane: Authoring Statistical Models via Formal Reasoning from Conceptual and Data Relationships. CHI 2022.
- Carlos Cinelli, Andrew Forney, and Judea Pearl. 2022. A Crash Course in Good and Bad Controls. Sociological Methods & Research.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rtisanepy-0.1.1.tar.gz.
File metadata
- Download URL: rtisanepy-0.1.1.tar.gz
- Upload date:
- Size: 17.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e33f0a5034b6d1900a51d9b4d55b4680e04816f7d2e4e56ebcd2faeb6e9fd4c8
|
|
| MD5 |
f272e69e074c8e097f6dcc6e33496d3a
|
|
| BLAKE2b-256 |
5a3ebcd925e70bc16d718362db33e55f6e1fcf7c2146d4e2afcbebaf07d245a6
|
File details
Details for the file rtisanepy-0.1.1-py3-none-any.whl.
File metadata
- Download URL: rtisanepy-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf368617d372c39c74359c1de4508da238c958817df23450e8fe7687fa6e35fa
|
|
| MD5 |
f9aff48e8d0cb39811811c01a60de46b
|
|
| BLAKE2b-256 |
ec99cfd915055115585ee05328fdd32e186fb5923735584f7c4cba2ff61569af
|