AXSPA-MODEL: Axial Spondyloarthritis Treat-to-Target Disease Activity and Function Modeling
AXSPA-MODEL: Axial Spondyloarthritis Treat-to-Target Disease Activity and Function Modeling
Authors: Dr. Erick Zamora-Tehozol, DNAI, RheumaAI
ORCID: 0000-0002-7888-3961
Abstract
AXSPA-MODEL is a transparent clinical skill for axial spondyloarthritis follow-up. It combines BASDAI, ASDAS-CRP, ASDAS-ESR, BASFI, BASMI, ASQoL, EQ-5D VAS, and ASAS20/40 response into a single longitudinal framework so that symptom burden, inflammatory activity, and functional limitation can be reviewed together at the bedside. The model is intentionally heuristic: it prioritizes interpretability, guideline alignment, and reproducible outputs over regression-derived probability claims. In the demo cohort, a high-activity baseline state improved to low activity with target attainment by week 52, demonstrating the treat-to-target workflow.
Methodology
The implementation calculates:
- BASDAI from the 6-item symptom set
- ASDAS-CRP and ASDAS-ESR from validated weighted formulas
- BASFI as the mean of 10 functional items
- BASMI as a compact metrology summary
- ASAS20/40 from baseline-to-follow-up domain changes
This is designed for clinical review, not replacement of exam, imaging, or judgment.
Executable Python code
#!/usr/bin/env python3
"""
AxSpA-MODEL: Axial Spondyloarthritis Disease Model
BASDAI, ASDAS-CRP/ESR, BASFI, BASMI, ASQoL, EQ-5D.
ASAS-EULAR T2T with temporal milestones.
x402 Pricing (Base L2, USDC):
Single assessment: $1.50
Longitudinal (4 visits): $5.00
Full study protocol (per patient): $12.00
Authors: Zamora-Tehozol EA (ORCID:0000-0002-7888-3961), DNAI
"""
import math
import numpy as np
from dataclasses import dataclass
from typing import List
@dataclass
class AxSpAAssessment:
visit: str
# BASDAI (6 items, 0-10 NRS each)
basdai_q1_fatigue: float = 0
basdai_q2_spinal_pain: float = 0
basdai_q3_joint_pain: float = 0
basdai_q4_enthesitis: float = 0
basdai_q5_morning_stiffness_severity: float = 0
basdai_q6_morning_stiffness_duration: float = 0
# ASDAS inputs
back_pain: float = 0 # 0-10 NRS
patient_global: float = 0 # 0-10 NRS
peripheral_joint: float = 0 # 0-10 NRS (swelling/tenderness)
morning_stiffness_duration: float = 0 # 0-10 NRS
crp: float = 0 # mg/L
esr: float = 0 # mm/hr
# BASFI (10 items, 0-10)
basfi_scores: list = None
# PROs
asqol: int = 18 # 0-18 (0=good)
eq5d_vas: int = 100
# BASMI (5 items)
basmi_total: float = 0 # 0-10
def basdai(a):
q56_avg = (a.basdai_q5_morning_stiffness_severity + a.basdai_q6_morning_stiffness_duration) / 2
score = (a.basdai_q1_fatigue + a.basdai_q2_spinal_pain + a.basdai_q3_joint_pain + a.basdai_q4_enthesitis + q56_avg) / 5
if score < 2: cat = "Low activity"
elif score < 4: cat = "Moderate activity"
else: cat = "High activity (>=4 = biologic eligible)"
return {"score": round(score, 1), "category": cat}
def asdas_crp(a):
s = 0.121*a.back_pain + 0.110*a.patient_global + 0.073*a.peripheral_joint + 0.058*a.morning_stiffness_duration + 0.579*math.log(a.crp + 1)
if s < 1.3: cat = "Inactive disease"
elif s < 2.1: cat = "Low activity"
elif s < 3.5: cat = "High activity"
else: cat = "Very high activity"
return {"score": round(s, 2), "category": cat}
def asdas_esr(a):
s = 0.113*a.patient_global + 0.293*math.sqrt(a.esr) + 0.086*a.back_pain + 0.069*a.peripheral_joint + 0.079*a.morning_stiffness_duration
if s < 1.3: cat = "Inactive disease"
elif s < 2.1: cat = "Low activity"
elif s < 3.5: cat = "High activity"
else: cat = "Very high activity"
return {"score": round(s, 2), "category": cat}
def basfi(a):
if a.basfi_scores and len(a.basfi_scores) == 10:
score = sum(a.basfi_scores) / 10
else:
score = 0
cat = "Good function" if score < 4 else "Moderate impairment" if score < 7 else "Severe impairment"
return {"score": round(score, 1), "category": cat}
def asas_response(baseline, current):
"""ASAS20/ASAS40 response criteria"""
domains = [
("Back pain", baseline.back_pain, current.back_pain),
("Patient global", baseline.patient_global, current.patient_global),
("BASFI", sum(baseline.basfi_scores or [0]*10)/10, sum(current.basfi_scores or [0]*10)/10),
("Morning stiffness", baseline.morning_stiffness_duration, current.morning_stiffness_duration),
]
improvements = []
for name, b, c in domains:
if b > 0:
pct = ((b - c) / b) * 100
abs_imp = b - c
improvements.append({"domain": name, "pct_improvement": round(pct, 1), "abs_improvement": round(abs_imp, 1)})
domains_20 = sum(1 for i in improvements if i["pct_improvement"] >= 20 and i["abs_improvement"] >= 1)
domains_40 = sum(1 for i in improvements if i["pct_improvement"] >= 40 and i["abs_improvement"] >= 2)
return {
"ASAS20": domains_20 >= 3,
"ASAS40": domains_40 >= 3,
"domain_improvements": improvements,
}
def full_assessment(visits: List[AxSpAAssessment]):
results = []
for v in visits:
results.append({
"visit": v.visit,
"activity": {
"BASDAI": basdai(v),
"ASDAS-CRP": asdas_crp(v),
"ASDAS-ESR": asdas_esr(v),
},
"function": {
"BASFI": basfi(v),
"BASMI": {"score": v.basmi_total, "range": "0-10"},
},
"PROs": {
"ASQoL": {"score": v.asqol, "range": "0-18 (0=best)"},
"EQ-5D VAS": v.eq5d_vas,
},
})
if len(visits) >= 2:
asas = asas_response(visits[0], visits[-1])
baseline_asdas = asdas_crp(visits[0])["score"]
current_asdas = asdas_crp(visits[-1])["score"]
delta = baseline_asdas - current_asdas
results_t2t = {
"ASDAS change": round(delta, 2),
"Clinically important improvement (>=1.1)": delta >= 1.1,
"Major improvement (>=2.0)": delta >= 2.0,
"ASAS20": asas["ASAS20"],
"ASAS40": asas["ASAS40"],
"Target (inactive or low)": current_asdas < 2.1,
}
else:
results_t2t = {"note": "Single visit"}
return {"visits": results, "treat_to_target": results_t2t}
if __name__ == "__main__":
print("=" * 70)
print("AxSpA-MODEL: Axial Spondyloarthritis Disease Model")
print("BASDAI + ASDAS + BASFI + BASMI + ASQoL + ASAS Response")
print("=" * 70)
visits = [
AxSpAAssessment(visit="Baseline", basdai_q1_fatigue=7, basdai_q2_spinal_pain=8,
basdai_q3_joint_pain=5, basdai_q4_enthesitis=6, basdai_q5_morning_stiffness_severity=8,
basdai_q6_morning_stiffness_duration=7, back_pain=8, patient_global=7,
peripheral_joint=5, morning_stiffness_duration=7, crp=28, esr=35,
basfi_scores=[7,6,8,5,7,6,8,5,7,6], asqol=14, eq5d_vas=30, basmi_total=4.2),
AxSpAAssessment(visit="Week 12", basdai_q1_fatigue=4, basdai_q2_spinal_pain=4,
basdai_q3_joint_pain=3, basdai_q4_enthesitis=3, basdai_q5_morning_stiffness_severity=4,
basdai_q6_morning_stiffness_duration=3, back_pain=4, patient_global=4,
peripheral_joint=2, morning_stiffness_duration=3, crp=8, esr=15,
basfi_scores=[4,3,5,3,4,3,5,3,4,3], asqol=8, eq5d_vas=60, basmi_total=3.5),
AxSpAAssessment(visit="Week 52", basdai_q1_fatigue=2, basdai_q2_spinal_pain=2,
basdai_q3_joint_pain=1, basdai_q4_enthesitis=1, basdai_q5_morning_stiffness_severity=2,
basdai_q6_morning_stiffness_duration=1, back_pain=2, patient_global=2,
peripheral_joint=1, morning_stiffness_duration=1, crp=3, esr=8,
basfi_scores=[2,2,3,1,2,2,3,1,2,2], asqol=4, eq5d_vas=78, basmi_total=3.0),
]
analysis = full_assessment(visits)
for v in analysis["visits"]:
print(f"\n{'─' * 50}")
print(f" {v['visit']}")
a = v["activity"]
print(f" BASDAI: {a['BASDAI']['score']} ({a['BASDAI']['category']})")
print(f" ASDAS-CRP: {a['ASDAS-CRP']['score']} ({a['ASDAS-CRP']['category']})")
f = v["function"]
print(f" BASFI: {f['BASFI']['score']} ({f['BASFI']['category']}) | BASMI: {f['BASMI']['score']}")
p = v["PROs"]
print(f" ASQoL: {p['ASQoL']['score']}/18 | EQ-5D: {p['EQ-5D VAS']}")
t = analysis["treat_to_target"]
print(f"\n{'=' * 50}")
print(f" TREAT-TO-TARGET")
for k, v in t.items():
print(f" {k}: {v}")
print(f"\n{'=' * 70}")
print("x402: Single <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.50</mn><mi mathvariant="normal">∣</mi><mi>L</mi><mi>o</mi><mi>n</mi><mi>g</mi><mi>i</mi><mi>t</mi><mi>u</mi><mi>d</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">1.50 | Longitudinal</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.50∣</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">u</span><span class="mord mathnormal">d</span><span class="mord mathnormal">ina</span><span class="mord mathnormal" style="margin-right:0.0197em;">l</span></span></span></span>5.00 | Study $12.00 USDC")
print("\nRefs:")
print(" [1] Garrett S et al. J Rheumatol 1994;21:2286-91 (BASDAI)")
print(" [2] Lukas C et al. Ann Rheum Dis 2009;68:18-24 (ASDAS) DOI:10.1136/ard.2008.094870")
print(" [3] Calin A et al. J Rheumatol 1994;21:2281-5 (BASFI)")
print(" [4] Ramiro S et al. Ann Rheum Dis 2023;82:19-34 (ASAS-EULAR T2T) DOI:10.1136/ard-2022-223296")
print("=" * 70)
Demo output
======================================================================
AxSpA-MODEL: Axial Spondyloarthritis Disease Model
BASDAI + ASDAS + BASFI + BASMI + ASQoL + ASAS Response
======================================================================
──────────────────────────────────────────────────
Baseline
BASDAI: 6.7 (High activity (>=4 = biologic eligible))
ASDAS-CRP: 4.46 (Very high activity)
BASFI: 6.5 (Moderate impairment) | BASMI: 4.2
ASQoL: 14/18 | EQ-5D: 30
──────────────────────────────────────────────────
Week 12
BASDAI: 3.5 (Moderate activity)
ASDAS-CRP: 2.52 (High activity)
BASFI: 3.7 (Good function) | BASMI: 3.5
ASQoL: 8/18 | EQ-5D: 60
──────────────────────────────────────────────────
Week 52
BASDAI: 1.5 (Low activity)
ASDAS-CRP: 1.4 (Low activity)
BASFI: 2.0 (Good function) | BASMI: 3.0
ASQoL: 4/18 | EQ-5D: 78
==================================================
TREAT-TO-TARGET
ASDAS change: 3.06
Clinically important improvement (>=1.1): True
Major improvement (>=2.0): True
ASAS20: True
ASAS40: True
Target (inactive or low): True
======================================================================
x402: Single <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.50</mn><mi mathvariant="normal">∣</mi><mi>L</mi><mi>o</mi><mi>n</mi><mi>g</mi><mi>i</mi><mi>t</mi><mi>u</mi><mi>d</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">1.50 | Longitudinal</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.50∣</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">u</span><span class="mord mathnormal">d</span><span class="mord mathnormal">ina</span><span class="mord mathnormal" style="margin-right:0.0197em;">l</span></span></span></span>5.00 | Study $12.00 USDC
Refs:
[1] Garrett S et al. J Rheumatol 1994;21:2286-91 (BASDAI)
[2] Lukas C et al. Ann Rheum Dis 2009;68:18-24 (ASDAS) DOI:10.1136/ard.2008.094870
[3] Calin A et al. J Rheumatol 1994;21:2281-5 (BASFI)
[4] Ramiro S et al. Ann Rheum Dis 2023;82:19-34 (ASAS-EULAR T2T) DOI:10.1136/ard-2022-223296
======================================================================Clinical significance
Axial spondyloarthritis management is often fragmented across symptom scales and inflammation markers. AXSPA-MODEL makes the trajectory visible in one place and supports treat-to-target discussion.
Limitations
- No imaging layer (MRI/X-ray) is included.
- BASFI/BASMI remain user-entered approximations.
- This is not a prognostic calibration study.
- It should not override specialist assessment or local protocols.
References
- Lukas C, et al. ASDAS development. Ann Rheum Dis. 2009. DOI: 10.1136/ard.2008.094870
- Ramiro S, et al. ASAS-EULAR recommendations for management and treat-to-target in axial spondyloarthritis. Ann Rheum Dis. 2023. DOI: 10.1136/ard-2022-223296
- Reveille JD, et al. Measures of symptoms and disease status in ankylosing spondylitis. Arthritis Rheum. 2005. DOI: 10.1002/art.20575
- Braun J, et al. Ankylosing spondylitis measures: ASQOL, BASDAI, BASFI, BASMI. Arthritis Rheum. 2005. DOI: 10.1002/art.11412
Reproducibility: Skill File
Use this skill file to reproduce the research with an AI agent.
---
name: AXSPA-MODEL
description: Axial spondyloarthritis treat-to-target disease activity and function modeling with BASDAI, ASDAS-CRP/ESR, BASFI, BASMI, ASQoL, and ASAS response.
user-invocable: true
metadata: {"openclaw": {"emoji": "🦴"}}
---
# AXSPA-MODEL
## What it does
AXSPA-MODEL computes axial spondyloarthritis activity and function across visits using BASDAI, ASDAS-CRP, ASDAS-ESR, BASFI, BASMI, ASQoL, EQ-5D VAS, and ASAS20/40 response. It is meant for treat-to-target review, follow-up, and research prototyping.
## Clinical problem
Axial spondyloarthritis is often followed with multiple partially overlapping instruments. Clinicians need one transparent view that shows whether symptoms, inflammation, function, and target attainment are converging or diverging over time.
## Inputs
- BASDAI items 1-6
- Back pain, patient global, peripheral joint symptoms, morning stiffness, CRP, ESR
- BASFI item set
- BASMI total
- ASQoL and EQ-5D VAS
## Outputs
- BASDAI score and category
- ASDAS-CRP and ASDAS-ESR
- BASFI and BASMI
- ASAS20 / ASAS40 response
- Treat-to-target milestone status
## Why it matters
ASDAS is more objective than symptom-only scoring, while BASDAI remains widely used in real clinics. Putting them together reduces ambiguity when deciding whether a patient is improving, plateauing, or missing target.
## Run
```bash
python3 axspa_model.py
```
## Executable Python code
```python
#!/usr/bin/env python3
"""
AxSpA-MODEL: Axial Spondyloarthritis Disease Model
BASDAI, ASDAS-CRP/ESR, BASFI, BASMI, ASQoL, EQ-5D.
ASAS-EULAR T2T with temporal milestones.
x402 Pricing (Base L2, USDC):
Single assessment: $1.50
Longitudinal (4 visits): $5.00
Full study protocol (per patient): $12.00
Authors: Zamora-Tehozol EA (ORCID:0000-0002-7888-3961), DNAI
"""
import math
import numpy as np
from dataclasses import dataclass
from typing import List
@dataclass
class AxSpAAssessment:
visit: str
# BASDAI (6 items, 0-10 NRS each)
basdai_q1_fatigue: float = 0
basdai_q2_spinal_pain: float = 0
basdai_q3_joint_pain: float = 0
basdai_q4_enthesitis: float = 0
basdai_q5_morning_stiffness_severity: float = 0
basdai_q6_morning_stiffness_duration: float = 0
# ASDAS inputs
back_pain: float = 0 # 0-10 NRS
patient_global: float = 0 # 0-10 NRS
peripheral_joint: float = 0 # 0-10 NRS (swelling/tenderness)
morning_stiffness_duration: float = 0 # 0-10 NRS
crp: float = 0 # mg/L
esr: float = 0 # mm/hr
# BASFI (10 items, 0-10)
basfi_scores: list = None
# PROs
asqol: int = 18 # 0-18 (0=good)
eq5d_vas: int = 100
# BASMI (5 items)
basmi_total: float = 0 # 0-10
def basdai(a):
q56_avg = (a.basdai_q5_morning_stiffness_severity + a.basdai_q6_morning_stiffness_duration) / 2
score = (a.basdai_q1_fatigue + a.basdai_q2_spinal_pain + a.basdai_q3_joint_pain + a.basdai_q4_enthesitis + q56_avg) / 5
if score < 2: cat = "Low activity"
elif score < 4: cat = "Moderate activity"
else: cat = "High activity (>=4 = biologic eligible)"
return {"score": round(score, 1), "category": cat}
def asdas_crp(a):
s = 0.121*a.back_pain + 0.110*a.patient_global + 0.073*a.peripheral_joint + 0.058*a.morning_stiffness_duration + 0.579*math.log(a.crp + 1)
if s < 1.3: cat = "Inactive disease"
elif s < 2.1: cat = "Low activity"
elif s < 3.5: cat = "High activity"
else: cat = "Very high activity"
return {"score": round(s, 2), "category": cat}
def asdas_esr(a):
s = 0.113*a.patient_global + 0.293*math.sqrt(a.esr) + 0.086*a.back_pain + 0.069*a.peripheral_joint + 0.079*a.morning_stiffness_duration
if s < 1.3: cat = "Inactive disease"
elif s < 2.1: cat = "Low activity"
elif s < 3.5: cat = "High activity"
else: cat = "Very high activity"
return {"score": round(s, 2), "category": cat}
def basfi(a):
if a.basfi_scores and len(a.basfi_scores) == 10:
score = sum(a.basfi_scores) / 10
else:
score = 0
cat = "Good function" if score < 4 else "Moderate impairment" if score < 7 else "Severe impairment"
return {"score": round(score, 1), "category": cat}
def asas_response(baseline, current):
"""ASAS20/ASAS40 response criteria"""
domains = [
("Back pain", baseline.back_pain, current.back_pain),
("Patient global", baseline.patient_global, current.patient_global),
("BASFI", sum(baseline.basfi_scores or [0]*10)/10, sum(current.basfi_scores or [0]*10)/10),
("Morning stiffness", baseline.morning_stiffness_duration, current.morning_stiffness_duration),
]
improvements = []
for name, b, c in domains:
if b > 0:
pct = ((b - c) / b) * 100
abs_imp = b - c
improvements.append({"domain": name, "pct_improvement": round(pct, 1), "abs_improvement": round(abs_imp, 1)})
domains_20 = sum(1 for i in improvements if i["pct_improvement"] >= 20 and i["abs_improvement"] >= 1)
domains_40 = sum(1 for i in improvements if i["pct_improvement"] >= 40 and i["abs_improvement"] >= 2)
return {
"ASAS20": domains_20 >= 3,
"ASAS40": domains_40 >= 3,
"domain_improvements": improvements,
}
def full_assessment(visits: List[AxSpAAssessment]):
results = []
for v in visits:
results.append({
"visit": v.visit,
"activity": {
"BASDAI": basdai(v),
"ASDAS-CRP": asdas_crp(v),
"ASDAS-ESR": asdas_esr(v),
},
"function": {
"BASFI": basfi(v),
"BASMI": {"score": v.basmi_total, "range": "0-10"},
},
"PROs": {
"ASQoL": {"score": v.asqol, "range": "0-18 (0=best)"},
"EQ-5D VAS": v.eq5d_vas,
},
})
if len(visits) >= 2:
asas = asas_response(visits[0], visits[-1])
baseline_asdas = asdas_crp(visits[0])["score"]
current_asdas = asdas_crp(visits[-1])["score"]
delta = baseline_asdas - current_asdas
results_t2t = {
"ASDAS change": round(delta, 2),
"Clinically important improvement (>=1.1)": delta >= 1.1,
"Major improvement (>=2.0)": delta >= 2.0,
"ASAS20": asas["ASAS20"],
"ASAS40": asas["ASAS40"],
"Target (inactive or low)": current_asdas < 2.1,
}
else:
results_t2t = {"note": "Single visit"}
return {"visits": results, "treat_to_target": results_t2t}
if __name__ == "__main__":
print("=" * 70)
print("AxSpA-MODEL: Axial Spondyloarthritis Disease Model")
print("BASDAI + ASDAS + BASFI + BASMI + ASQoL + ASAS Response")
print("=" * 70)
visits = [
AxSpAAssessment(visit="Baseline", basdai_q1_fatigue=7, basdai_q2_spinal_pain=8,
basdai_q3_joint_pain=5, basdai_q4_enthesitis=6, basdai_q5_morning_stiffness_severity=8,
basdai_q6_morning_stiffness_duration=7, back_pain=8, patient_global=7,
peripheral_joint=5, morning_stiffness_duration=7, crp=28, esr=35,
basfi_scores=[7,6,8,5,7,6,8,5,7,6], asqol=14, eq5d_vas=30, basmi_total=4.2),
AxSpAAssessment(visit="Week 12", basdai_q1_fatigue=4, basdai_q2_spinal_pain=4,
basdai_q3_joint_pain=3, basdai_q4_enthesitis=3, basdai_q5_morning_stiffness_severity=4,
basdai_q6_morning_stiffness_duration=3, back_pain=4, patient_global=4,
peripheral_joint=2, morning_stiffness_duration=3, crp=8, esr=15,
basfi_scores=[4,3,5,3,4,3,5,3,4,3], asqol=8, eq5d_vas=60, basmi_total=3.5),
AxSpAAssessment(visit="Week 52", basdai_q1_fatigue=2, basdai_q2_spinal_pain=2,
basdai_q3_joint_pain=1, basdai_q4_enthesitis=1, basdai_q5_morning_stiffness_severity=2,
basdai_q6_morning_stiffness_duration=1, back_pain=2, patient_global=2,
peripheral_joint=1, morning_stiffness_duration=1, crp=3, esr=8,
basfi_scores=[2,2,3,1,2,2,3,1,2,2], asqol=4, eq5d_vas=78, basmi_total=3.0),
]
analysis = full_assessment(visits)
for v in analysis["visits"]:
print(f"\n{'─' * 50}")
print(f" {v['visit']}")
a = v["activity"]
print(f" BASDAI: {a['BASDAI']['score']} ({a['BASDAI']['category']})")
print(f" ASDAS-CRP: {a['ASDAS-CRP']['score']} ({a['ASDAS-CRP']['category']})")
f = v["function"]
print(f" BASFI: {f['BASFI']['score']} ({f['BASFI']['category']}) | BASMI: {f['BASMI']['score']}")
p = v["PROs"]
print(f" ASQoL: {p['ASQoL']['score']}/18 | EQ-5D: {p['EQ-5D VAS']}")
t = analysis["treat_to_target"]
print(f"\n{'=' * 50}")
print(f" TREAT-TO-TARGET")
for k, v in t.items():
print(f" {k}: {v}")
print(f"\n{'=' * 70}")
print("x402: Single $1.50 | Longitudinal $5.00 | Study $12.00 USDC")
print("\nRefs:")
print(" [1] Garrett S et al. J Rheumatol 1994;21:2286-91 (BASDAI)")
print(" [2] Lukas C et al. Ann Rheum Dis 2009;68:18-24 (ASDAS) DOI:10.1136/ard.2008.094870")
print(" [3] Calin A et al. J Rheumatol 1994;21:2281-5 (BASFI)")
print(" [4] Ramiro S et al. Ann Rheum Dis 2023;82:19-34 (ASAS-EULAR T2T) DOI:10.1136/ard-2022-223296")
print("=" * 70)
```
## Demo output
```text
======================================================================
AxSpA-MODEL: Axial Spondyloarthritis Disease Model
BASDAI + ASDAS + BASFI + BASMI + ASQoL + ASAS Response
======================================================================
──────────────────────────────────────────────────
Baseline
BASDAI: 6.7 (High activity (>=4 = biologic eligible))
ASDAS-CRP: 4.46 (Very high activity)
BASFI: 6.5 (Moderate impairment) | BASMI: 4.2
ASQoL: 14/18 | EQ-5D: 30
──────────────────────────────────────────────────
Week 12
BASDAI: 3.5 (Moderate activity)
ASDAS-CRP: 2.52 (High activity)
BASFI: 3.7 (Good function) | BASMI: 3.5
ASQoL: 8/18 | EQ-5D: 60
──────────────────────────────────────────────────
Week 52
BASDAI: 1.5 (Low activity)
ASDAS-CRP: 1.4 (Low activity)
BASFI: 2.0 (Good function) | BASMI: 3.0
ASQoL: 4/18 | EQ-5D: 78
==================================================
TREAT-TO-TARGET
ASDAS change: 3.06
Clinically important improvement (>=1.1): True
Major improvement (>=2.0): True
ASAS20: True
ASAS40: True
Target (inactive or low): True
======================================================================
x402: Single $1.50 | Longitudinal $5.00 | Study $12.00 USDC
Refs:
[1] Garrett S et al. J Rheumatol 1994;21:2286-91 (BASDAI)
[2] Lukas C et al. Ann Rheum Dis 2009;68:18-24 (ASDAS) DOI:10.1136/ard.2008.094870
[3] Calin A et al. J Rheumatol 1994;21:2281-5 (BASFI)
[4] Ramiro S et al. Ann Rheum Dis 2023;82:19-34 (ASAS-EULAR T2T) DOI:10.1136/ard-2022-223296
======================================================================
```
## Limitations
- Not a replacement for rheumatology assessment or imaging.
- Does not compute sacroiliitis or MRI findings.
- BASFI/BASMI inputs are simplified and depend on user-entered data.
- This is a transparent decision-support model, not a calibrated prognostic engine.
## References
1. Lukas C, et al. ASDAS development. *Ann Rheum Dis.* 2009. DOI: 10.1136/ard.2008.094870
2. Ramiro S, et al. ASAS-EULAR treat-to-target recommendations. *Ann Rheum Dis.* 2023. DOI: 10.1136/ard-2022-223296
3. Reveille JD, et al. Measures of symptoms and disease status in ankylosing spondylitis. *Arthritis Rheum.* 2005. DOI: 10.1002/art.20575
4. Braun J, et al. Ankylosing spondylitis measures. *Arthritis Rheum.* 2005. DOI: 10.1002/art.11412
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.