Causal Inference: Ruxolitinib
0. Individual Metric Treatment Response
| Metric | Pre-Rux Mean | Post-Rux Mean | Change | Cohen's d | Mann-Whitney | 95% CI (diff) |
|---|---|---|---|---|---|---|
| HRV (RMSSD) | 10.00 ms | 26.21 ms | +16.21 ms | +1.95 (large) | Sig p<0.001 | [+14.73, +17.68] |
| Lowest HR | 76.72 bpm | 60.72 bpm | -16.00 bpm | -2.18 (large) | Sig p<0.001 | [-17.84, -14.26] |
| Average HR | 85.17 bpm | 69.54 bpm | -15.63 bpm | -2.04 (large) | Sig p<0.001 | [-17.70, -13.65] |
| Sleep Efficiency | 78.62 % | 83.07 % | +4.45 % | +0.83 (large) | Sig p<0.001 | [+3.33, +5.66] |
0b. Confounder Analysis: Beta-Blocker Separation
| Metric | Pre Mean | Jakavi-only Mean | Change | Cohen's d | p-value |
|---|---|---|---|---|---|
| HRV (RMSSD) | 10.0 ms (n=67) | 10.9 ms (n=22) | +0.9 ms | +0.40 (small) | p=0.076 |
| Lowest HR | 76.7 bpm (n=64) | 72.9 bpm (n=19) | -3.8 bpm | -0.77 (medium) | p=0.0093 |
| Average HR | 85.2 bpm (n=64) | 81.4 bpm (n=19) | -3.7 bpm | -0.66 (medium) | p=0.0119 |
| Sleep Efficiency | 78.6 % (n=64) | 79.9 % (n=19) | +1.3 % | +0.36 (small) | p=0.102 |
| Metric | Jakavi-only Mean | Jakavi+BB Mean | Change | p-value |
|---|---|---|---|---|
| HRV (RMSSD) | 10.9 ms (n=22) | 28.1 ms (n=181) | +17.1 ms | p=0.0000 |
| Lowest HR | 72.9 bpm (n=19) | 59.4 bpm (n=178) | -13.5 bpm | p=0.0000 |
| Average HR | 81.4 bpm (n=19) | 68.3 bpm (n=178) | -13.2 bpm | p=0.0000 |
| Sleep Efficiency | 79.9 % (n=19) | 83.4 % (n=178) | +3.5 % | p=0.0001 |
- Ruxolitinib alone produces a statistically significant reduction in heart rate, independent of beta-blocker.
- HRV improvement during Jakavi-only period does not reach significance - the HRV signal strengthens after beta-blocker addition.
- Beta-blocker addition produces a significant further HRV increase on top of Jakavi.
1. CausalImpact - Bayesian Structural Time Series Analysis
| Stream | Actual (post) | Counterfactual | Causal effect | Relative | 95% CI | p-value | q-value (BH) |
|---|---|---|---|---|---|---|---|
| REM sleep duration (s) LOW CONFIDENCE | 4316.12 | 3194.16 | +1121.96 s | +35.1% | [-1867.05, +4110.98] | 0.0000 | 0.0000 Sig (FDR) |
| REM sleep fraction (%) LOW CONFIDENCE | 17.55 | 15.06 | +2.49 % | +16.6% | [-7.97, +12.95] | 0.0000 | 0.0000 Sig (FDR) |
| Total sleep (hours) LOW CONFIDENCE | 6.80 | 5.93 | +0.86 h | +14.6% | [-1.11, +2.83] | 0.0000 | 0.0000 Sig (FDR) |
| Deep sleep duration (s) LOW CONFIDENCE | 4678.90 | 4067.59 | +611.31 s | +15.0% | [-1688.74, +2911.37] | 0.0040 | 0.0044 Sig (FDR) |
| HRV mean RMSSD (ms) | 26.13 | 10.15 | +15.97 ms | — | [+10.90, +21.05] | 0.0000 | 0.0000 Sig (FDR) |
| HRV max RMSSD (ms) | 63.13 | 26.74 | +36.39 ms | — | [+15.34, +57.44] | 0.0000 | 0.0000 Sig (FDR) |
| Lowest heart rate (bpm) | 61.10 | 76.66 | -15.55 bpm | -20.3% | [-27.67, -3.44] | 0.0000 | 0.0000 Sig (FDR) |
| Average heart rate (bpm) LOW CONFIDENCE | 81.83 | 92.42 | -10.58 bpm | -11.4% | [-24.22, +3.06] | 0.0000 | 0.0000 Sig (FDR) |
| Respiratory rate (br/min) LOW CONFIDENCE | 15.09 | 13.94 | +1.16 br/min | +8.3% | [-0.45, +2.76] | 0.0000 | 0.0000 Sig (FDR) |
| SpO2 (%) LOW CONFIDENCE | 95.46 | 96.10 | -0.64 % | -0.7% | [-1.79, +0.52] | 0.0000 | 0.0000 Sig (FDR) |
| Temperature deviation (°C) LOW CONFIDENCE | 0.03 | 0.08 | -0.05 °C | -62.7% | [-0.60, +0.50] | 0.1259 | 0.1259 NS (FDR) |
1a. Statistical Power & Interpretation
REM sleep duration (s) is the strongest hypothesis-generating raw p-value signal (p<0.001, q=0.000) but remains significant after Benjamini-Hochberg correction.
| Metric | Direction | Absolute effect | Relative effect | Raw p-value | BH q-value | Significance |
|---|---|---|---|---|---|---|
| REM sleep duration (s) | ↑ increased | +1121.96 s | +35.1% | 0.0000 | 0.0000 | FDR significant |
| REM sleep fraction (%) | ↑ increased | +2.49 % | +16.6% | 0.0000 | 0.0000 | FDR significant |
| Total sleep (hours) | ↑ increased | +0.86 h | +14.6% | 0.0000 | 0.0000 | FDR significant |
| HRV mean RMSSD (ms) | ↑ increased | +15.97 ms | — | 0.0000 | 0.0000 | FDR significant |
| HRV max RMSSD (ms) | ↑ increased | +36.39 ms | — | 0.0000 | 0.0000 | FDR significant |
| Lowest heart rate (bpm) | ↓ decreased | -15.55 bpm | -20.3% | 0.0000 | 0.0000 | FDR significant |
| Average heart rate (bpm) | ↓ decreased | -10.58 bpm | -11.4% | 0.0000 | 0.0000 | FDR significant |
| Respiratory rate (br/min) | ↑ increased | +1.16 br/min | +8.3% | 0.0000 | 0.0000 | FDR significant |
| SpO2 (%) | ↓ decreased | -0.64 % | -0.7% | 0.0000 | 0.0000 | FDR significant |
| Deep sleep duration (s) | ↑ increased | +611.31 s | +15.0% | 0.0040 | 0.0044 | FDR significant |
| Temperature deviation (°C) | ↓ decreased | -0.05 °C | -62.7% | 0.1259 | 0.1259 | Not significant |
Placebo test summary
| Placebo date | Metric | p-value | Significant? |
|---|---|---|---|
| 2026-01-28 | REM sleep duration (s) | 0.1129 | No |
| 2026-01-28 | REM sleep fraction (%) | 0.0000 | Yes |
| 2026-01-28 | Total sleep (hours) | 0.0230 | Yes |
| 2026-02-10 | REM sleep duration (s) | 0.1199 | No |
| 2026-02-10 | REM sleep fraction (%) | 0.1109 | No |
| 2026-02-10 | Total sleep (hours) | 0.3686 | No |
| 2026-02-23 | REM sleep duration (s) | 0.4935 | No |
| 2026-02-23 | REM sleep fraction (%) | 0.4505 | No |
| 2026-02-23 | Total sleep (hours) | 0.3477 | No |
2/9 placebo tests reached significance. This tempers the March 16 signal and keeps the current result in the hypothesis-generating category.
1b. Placebo tests (intervention date falsification)
Metrics tested: REM sleep duration (s) (q=0.0000), REM sleep fraction (%) (q=0.0000), Total sleep (hours) (q=0.0000)
Placebo dates: 2026-01-28, 2026-02-10, 2026-02-23
| Placebo date | Metric | N pre | N post | Effect | p-value | Result |
|---|---|---|---|---|---|---|
| 2026-01-28 | REM sleep duration (s) | 20 | 47 | +223.701 | 0.1129 | NS (expected) |
| 2026-01-28 | REM sleep fraction (%) | 20 | 47 | +2.895 | 0.0000 | Sig (false alarm) |
| 2026-01-28 | Total sleep (hours) | 20 | 47 | -0.605 | 0.0230 | Sig (false alarm) |
| 2026-02-10 | REM sleep duration (s) | 33 | 34 | +295.599 | 0.1199 | NS (expected) |
| 2026-02-10 | REM sleep fraction (%) | 33 | 34 | +1.542 | 0.1109 | NS (expected) |
| 2026-02-10 | Total sleep (hours) | 33 | 34 | -0.093 | 0.3686 | NS (expected) |
| 2026-02-23 | REM sleep duration (s) | 46 | 21 | +4.338 | 0.4935 | NS (expected) |
| 2026-02-23 | REM sleep fraction (%) | 46 | 21 | +0.224 | 0.4505 | NS (expected) |
| 2026-02-23 | Total sleep (hours) | 46 | 21 | -0.108 | 0.3477 | NS (expected) |
2. Granger Causality Network (PCMCI+)
Full period (271 days, 141 significant links)
| Source | Target | Lag | Correlation | p-value |
|---|---|---|---|---|
| REMdur | REMpct | 0 days | +0.831 | 0.0000 |
| REMpct | REMdur | 0 days | +0.831 | 0.0000 |
| RMSSD | RMSSDmax | 0 days | +0.638 | 0.0000 |
| RMSSDmax | RMSSD | 0 days | +0.638 | 0.0000 |
| REMdur | TotalSleep | 0 days | +0.520 | 0.0000 |
| TotalSleep | REMdur | 0 days | +0.520 | 0.0000 |
| AvgHR | LowestHR | 1 days | +0.464 | 0.0000 |
| LowestHR | TempDev | 0 days | +0.393 | 0.0000 |
| TempDev | LowestHR | 0 days | +0.393 | 0.0000 |
| SpO2 | SpO2 | 1 days | +0.385 | 0.0000 |
Pre-ruxolitinib (67 days, 65 significant links)
| Source | Target | Lag | Correlation | p-value |
|---|---|---|---|---|
| REMdur | REMpct | 0 days | +0.750 | 0.0000 |
| REMpct | REMdur | 0 days | +0.750 | 0.0000 |
| AvgHR | LowestHR | 1 days | +0.647 | 0.0000 |
| LowestHR | TempDev | 0 days | +0.621 | 0.0000 |
| TempDev | LowestHR | 0 days | +0.621 | 0.0000 |
| RMSSD | LowestHR | 0 days | -0.571 | 0.0000 |
| LowestHR | RMSSD | 0 days | -0.571 | 0.0000 |
| AvgHR | RMSSD | 1 days | -0.496 | 0.0002 |
| RMSSD | RMSSD | 1 days | +0.494 | 0.0003 |
| TotalSleep | DeepDur | 3 days | +0.457 | 0.0007 |
Network change after ruxolitinib
New links: RMSSD->TotalSleep(lag=0), DeepDur->TempDev(lag=0), SpO2->REMpct(lag=2), LowestHR->RMSSDmax(lag=1), RMSSD->REMdur(lag=2), REMpct->REMpct(lag=1), RMSSDmax->TotalSleep(lag=6), TotalSleep->TempDev(lag=0), AvgHR->REMdur(lag=0), LowestHR->AvgHR(lag=0), AvgHR->TempDev(lag=6), REMdur->TempDev(lag=2), SpO2->TempDev(lag=0), TempDev->TempDev(lag=7), RMSSDmax->AvgHR(lag=0), TotalSleep->RMSSD(lag=2), RespRate->RespRate(lag=2), LowestHR->LowestHR(lag=2), RMSSD->RMSSD(lag=3), REMdur->TotalSleep(lag=7), REMdur->DeepDur(lag=0), LowestHR->DeepDur(lag=0), AvgHR->TotalSleep(lag=4), TotalSleep->SpO2(lag=0), TempDev->LowestHR(lag=7), REMpct->RMSSD(lag=0), DeepDur->LowestHR(lag=1), RespRate->LowestHR(lag=7), REMdur->DeepDur(lag=2), RMSSD->AvgHR(lag=0), AvgHR->RMSSD(lag=0), RespRate->SpO2(lag=4), TempDev->SpO2(lag=0), TempDev->REMpct(lag=0), DeepDur->RespRate(lag=0), DeepDur->TotalSleep(lag=5), REMdur->REMdur(lag=2), LowestHR->RMSSDmax(lag=0), REMpct->RMSSD(lag=2), AvgHR->REMpct(lag=1), SpO2->AvgHR(lag=4), RMSSD->RMSSD(lag=7), AvgHR->RMSSDmax(lag=0), RMSSDmax->LowestHR(lag=0), LowestHR->RMSSD(lag=1), REMpct->RMSSDmax(lag=2), RMSSD->REMpct(lag=5), REMdur->TempDev(lag=1), RMSSDmax->RMSSD(lag=1), TempDev->DeepDur(lag=0), TempDev->RMSSD(lag=3), TempDev->TotalSleep(lag=0), TotalSleep->LowestHR(lag=0), TotalSleep->RMSSDmax(lag=6), RespRate->DeepDur(lag=0), REMdur->RMSSD(lag=0), DeepDur->TotalSleep(lag=0), TotalSleep->TempDev(lag=1), RMSSD->LowestHR(lag=1), RespRate->RespRate(lag=1), DeepDur->REMdur(lag=0), RespRate->RMSSD(lag=0), SpO2->LowestHR(lag=2), AvgHR->SpO2(lag=5), TempDev->TotalSleep(lag=2), REMpct->TempDev(lag=0), RMSSDmax->RMSSDmax(lag=1), REMdur->RMSSD(lag=2), TotalSleep->DeepDur(lag=0), DeepDur->RMSSD(lag=5), RMSSD->REMpct(lag=0), AvgHR->TempDev(lag=0), TempDev->AvgHR(lag=3), RespRate->RMSSD(lag=2), SpO2->TotalSleep(lag=0), TempDev->RMSSD(lag=7), REMdur->AvgHR(lag=0), REMpct->TempDev(lag=2), TempDev->TempDev(lag=1), AvgHR->DeepDur(lag=1), AvgHR->REMpct(lag=0), RMSSD->RespRate(lag=7), REMdur->TotalSleep(lag=1), RMSSD->SpO2(lag=5), SpO2->REMdur(lag=2), TempDev->LowestHR(lag=1), AvgHR->AvgHR(lag=2), LowestHR->TotalSleep(lag=0), RMSSD->RespRate(lag=0), REMpct->LowestHR(lag=7), SpO2->TotalSleep(lag=4), RMSSD->REMdur(lag=5), RMSSDmax->TotalSleep(lag=0), RMSSD->SpO2(lag=7), TotalSleep->RespRate(lag=1), TotalSleep->RMSSD(lag=0), TempDev->AvgHR(lag=0), LowestHR->TotalSleep(lag=2), LowestHR->SpO2(lag=7), DeepDur->TempDev(lag=5), RespRate->TempDev(lag=2), REMpct->AvgHR(lag=0), DeepDur->LowestHR(lag=0), RespRate->AvgHR(lag=6), AvgHR->LowestHR(lag=0), DeepDur->SpO2(lag=6), AvgHR->AvgHR(lag=6), RMSSD->REMdur(lag=0), TotalSleep->RMSSDmax(lag=0), DeepDur->LowestHR(lag=2), DeepDur->REMpct(lag=5), REMpct->TotalSleep(lag=7), REMdur->DeepDur(lag=3)
Lost links: DeepDur->DeepDur(lag=3), RMSSDmax->AvgHR(lag=2), TotalSleep->TotalSleep(lag=1), REMpct->RMSSDmax(lag=7), RespRate->RespRate(lag=7), REMdur->LowestHR(lag=1), TempDev->DeepDur(lag=2), REMpct->TotalSleep(lag=0), LowestHR->TempDev(lag=3), RespRate->TotalSleep(lag=3), SpO2->REMdur(lag=1), RMSSD->SpO2(lag=1), RespRate->AvgHR(lag=7), TempDev->RMSSDmax(lag=3), DeepDur->DeepDur(lag=2), DeepDur->SpO2(lag=4), TotalSleep->DeepDur(lag=3), TempDev->LowestHR(lag=3), RespRate->RMSSDmax(lag=0), REMpct->REMpct(lag=6), RespRate->LowestHR(lag=6), LowestHR->RMSSDmax(lag=6), REMdur->TotalSleep(lag=2), RMSSD->RMSSD(lag=1), RMSSDmax->TotalSleep(lag=5), RMSSDmax->RespRate(lag=0), DeepDur->TotalSleep(lag=4), RMSSD->RMSSDmax(lag=5), AvgHR->AvgHR(lag=3), RespRate->RMSSDmax(lag=2), DeepDur->TempDev(lag=1), DeepDur->RMSSDmax(lag=5), REMdur->TempDev(lag=7), RMSSDmax->REMpct(lag=5), TotalSleep->REMpct(lag=0), RMSSD->RMSSD(lag=6), DeepDur->SpO2(lag=2)
3. Transfer Entropy
Full period (271 days)
| Source | Target | TE (bits) | Net TE |
|---|---|---|---|
| AvgHR | REMdur | 1.1150 | +0.0414 |
| DeepDur | RMSSDmax | 1.1145 | +0.0907 |
| TempDev | RMSSDmax | 1.1145 | +0.0321 |
| DeepDur | SpO2 | 1.1116 | +0.0728 |
| TempDev | SpO2 | 1.1116 | +0.0441 |
| TempDev | RespRate | 1.1084 | +0.0484 |
| DeepDur | REMdur | 1.1076 | +0.0688 |
| TempDev | REMdur | 1.1076 | +0.0401 |
Pre-ruxolitinib (67 days)
| Source | Target | TE (bits) | Net TE |
|---|---|---|---|
| REMdur | RespRate | 0.5564 | +0.1891 |
| TotalSleep | RespRate | 0.5564 | +0.3064 |
| DeepDur | RespRate | 0.5564 | +0.2439 |
| RMSSDmax | RespRate | 0.5564 | +0.3689 |
| LowestHR | RespRate | 0.5564 | +0.2127 |
| AvgHR | RespRate | 0.5564 | +0.1071 |
| SpO2 | RespRate | 0.5564 | +0.1132 |
| REMpct | RespRate | 0.5252 | +0.0835 |
Change in information flow
Largest increase: DeepDur -> RMSSDmax (+0.9270 bits)
Largest decrease: REMdur -> REMdur (+0.0000 bits)
4. Intervention Response Decomposition
| Pathway | Mediator (pre->post) | a (T->M) | b (M->Y) | Indirect effect [95% CI] | % mediated | p-value |
|---|---|---|---|---|---|---|
| Direct cardiac Ruxolitinib -> HR change -> Readiness | 92.57 -> 81.69 | -0.946 | -0.393 | +0.3715 [+0.2219, +0.5450] | 37.0% | 0.0000 Sig |
| Autonomic Ruxolitinib -> HRV change -> Readiness | 10.00 -> 26.38 | +1.510 | +0.604 | +0.9127 [+0.7131, +1.1128] | 91.0% | 0.0000 Sig |
| Sleep-mediated Ruxolitinib -> Sleep efficiency -> Readiness | 78.62 -> 83.07 | +0.787 | +0.455 | +0.3583 [+0.2367, +0.5036] | 35.0% | 0.0000 Sig |
| Inflammatory Ruxolitinib -> Temperature deviation -> Readiness | 0.06 -> 0.03 | -0.095 | -0.339 | +0.0321 [-0.0490, +0.1216] | 3.2% | 0.4250 NS |
5. Clinical Interpretation
Executive summary
- REM sleep duration (s): strongest hypothesis-generating raw p-value signal (p=0.0000, q=0.0000). It survives FDR correction, so confirmation still depends on more post-treatment follow-up.
- CausalImpact: 10 of 11 biometric streams show significant causal change (p < 0.05). After Benjamini-Hochberg FDR correction: 10 of 11 remain significant (q < 0.05).
- Placebo validation: FAIL - 2/9 placebo tests reached significance. This keeps the result vulnerable to false positives rather than establishing a confirmed intervention effect.
- PCMCI+: 141 significant time-lagged causal links identified in the biometric network
- Mediation analysis: 3 of 4 mediating pathways show significant indirect effect
Limitations
- Short post-period (205 days): All results are preliminary. Minimum 14-21 days of post-intervention data recommended for robust causal inference.
- Confounders: Linear methods cannot capture non-linear interactions. Seasonal variation, activity level, and other medications are not controlled for.
- Wearable data: Oura Ring is not a medical device. Measurements have inherent noise that can affect causal estimates.
- Single patient: N=1 study without control group. Causality cannot be definitively established, but Bayesian posterior probability of effect provides a strength measure.
- HEV diagnosis: HEV was diagnosed 2026-03-18 (2 days after ruxolitinib start). Hepatitis may confound biometric changes.
Recommendations
- Repeat analysis after 2-3 weeks of ruxolitinib treatment for robust causal inference
- Add HEV-related biomarkers (ALT, bilirubin) as time-varying covariates
- Consider synthetic control method when longer time series are available
- Combine with clinical endpoints (GVHD scoring, ferritin) for multimodal analysis