Skip to content

Commit 03c2a2d

Browse files
authored
Merge pull request #219 from ACCLAB/vnbdev
Bug Fix Multi paired plots omitting values #216 — Multi-group paired plots now support unequal sample sizes across groups. A new test (test_33_multi_paired_different_sizes) and baseline image were added to cover this case. New preprint added to README and docs — "Getting over ANOVA: Estimation graphics for multi-group comparisons" (bioRxiv 2026, DOI: 10.64898/2026.01.26.701654) with full author list and PDF link New blog post notebook added at nbs/blog/posts/a-dabest2-preprint/ summarizing the preprint, including a figure image README links updated (from JAnns98) nbdev3 upgrade — CI/CD workflows updated from nbdev-ci → nbdev3-ci and quarto-ghp → quarto-ghp3 Minor code changes: Warning message for NaN values in paired data slightly reworded and a dropna path removed in _dabest_object.py
2 parents ee406ce + 8990cae commit 03c2a2d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+776
-91
lines changed

.github/workflows/deploy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ on:
1111
jobs:
1212
deploy:
1313
runs-on: ubuntu-latest
14-
steps: [uses: fastai/workflows/quarto-ghp@master]
14+
steps: [uses: fastai/workflows/quarto-ghp3@master]

.github/workflows/test-nbdev.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ on: [workflow_dispatch, pull_request, push]
44
jobs:
55
test-nbdev:
66
runs-on: ubuntu-latest
7-
steps: [uses: fastai/workflows/nbdev-ci@master]
7+
steps: [uses: fastai/workflows/nbdev3-ci@master]

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,17 @@ snippets.
173173

174174
## How to cite
175175

176+
**Getting over ANOVA: Estimation graphics for multi-group comparisons**
177+
178+
*Zinan Lu, Jonathan Anns, Yishan Mai, Rou Zhang, Kahseng Lian, Nicole
179+
MynYi Lee, Shan Hashir, Lucas Wang Zhuoyu, A. Rosa Castillo Gonzalez,
180+
Joses Ho, Hyungwon Choi, Sangyu Xu, Adam Claridge-Chang*
181+
182+
bioRxiv preprint 2026.
183+
[10.64898/2026.01.26.701654](http://dx.doi.org/10.64898/2026.01.26.701654)
184+
185+
[PDF](https://www.biorxiv.org/content/10.64898/2026.01.26.701654v1.full.pdf)
186+
176187
**Moving beyond P values: Everyday data analysis with estimation plots**
177188

178189
*Joses Ho, Tayfun Tumkaya, Sameer Aryal, Hyungwon Choi, Adam

dabest/_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/API/load.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['load', 'prop_dataset']
77

8-
# %% ../nbs/API/load.ipynb 4
8+
# %% ../nbs/API/load.ipynb #218e4f14
99
def load(
1010
data,
1111
idx=None,
@@ -112,7 +112,7 @@ def load(
112112
ps_adjust,
113113
)
114114

115-
# %% ../nbs/API/load.ipynb 5
115+
# %% ../nbs/API/load.ipynb #570ff65a
116116
import numpy as np
117117
from typing import Union, Optional
118118
import pandas as pd

dabest/_bootstrap_tools.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/API/bootstrap.ipynb.
22

3-
# %% auto 0
3+
# %% auto #0
44
__all__ = ['bootstrap', 'jackknife_indexes', 'bca']
55

6-
# %% ../nbs/API/bootstrap.ipynb 3
6+
# %% ../nbs/API/bootstrap.ipynb #4231300f
77
import numpy as np
88
import pandas as pd
99
import seaborn as sns
@@ -12,7 +12,7 @@
1212
from scipy.stats import mannwhitneyu, wilcoxon, norm
1313
import warnings
1414

15-
# %% ../nbs/API/bootstrap.ipynb 4
15+
# %% ../nbs/API/bootstrap.ipynb #e86b4b8d
1616
class bootstrap:
1717
"""
1818
Computes the summary statistic and a bootstrapped confidence interval.
@@ -230,7 +230,7 @@ def __repr__(self):
230230
b = "[{} CI: {}, {}]".format(self.ci, self.bca_ci_low, self.bca_ci_high)
231231
return "\n".join([a, b])
232232

233-
# %% ../nbs/API/bootstrap.ipynb 5
233+
# %% ../nbs/API/bootstrap.ipynb #00c814b9
234234
def jackknife_indexes(data):
235235
# Taken without modification from scikits.bootstrap package.
236236
"""

dabest/_dabest_object.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/API/dabest_object.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['Dabest']
77

8-
# %% ../nbs/API/dabest_object.ipynb 5
8+
# %% ../nbs/API/dabest_object.ipynb #d3c6f47a
99
# Import standard data science libraries
1010
import warnings
1111
from numpy import array, repeat, random, issubdtype, number
@@ -14,7 +14,7 @@
1414
from scipy.stats import norm
1515
from scipy.stats import randint
1616

17-
# %% ../nbs/API/dabest_object.ipynb 7
17+
# %% ../nbs/API/dabest_object.ipynb #350b12c1
1818
class Dabest(object):
1919

2020
"""
@@ -559,14 +559,12 @@ def _check_errors(self, x, y, idx, experiment, experiment_label, x1_level):
559559
self.__x1_level = x1_level
560560

561561
if self.__is_paired and self.__output_data.isnull().values.any():
562-
warn1 = f"NaN values detected under paired setting and removed,"
562+
warn1 = f"NaN values detected under paired setting,"
563563
warn2 = f" please check your data."
564564
warnings.warn(warn1 + warn2)
565565
if x is not None and y is not None:
566566
rmname = self.__output_data[self.__output_data[y].isnull()][self.__id_col].tolist()
567567
self.__output_data = self.__output_data[~self.__output_data[self.__id_col].isin(rmname)]
568-
elif x is None and y is None:
569-
self.__output_data.dropna(inplace=True)
570568

571569
# Check if there is a typo on paired
572570
if self.__is_paired and self.__is_paired not in ("baseline", "sequential"):

dabest/_delta_objects.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/API/delta_objects.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['DeltaDelta', 'MiniMetaDelta']
77

8-
# %% ../nbs/API/delta_objects.ipynb 5
8+
# %% ../nbs/API/delta_objects.ipynb #1814896d
99
from scipy.stats import norm
1010
import pandas as pd
1111
import numpy as np
@@ -15,7 +15,7 @@
1515
import warnings
1616
import datetime as dt
1717

18-
# %% ../nbs/API/delta_objects.ipynb 6
18+
# %% ../nbs/API/delta_objects.ipynb #1bb53e06
1919
class DeltaDelta(object):
2020
r"""
2121
A class to compute and store the delta-delta statistics for experiments with a 2-by-2 arrangement where two independent variables, A and B, each have two categorical values, 1 and 2. The data is divided into two pairs of two groups, and a primary delta is first calculated as the mean difference between each of the pairs:
@@ -382,7 +382,7 @@ def results(self):
382382
self.__compute_results()
383383
return self.__results
384384

385-
# %% ../nbs/API/delta_objects.ipynb 10
385+
# %% ../nbs/API/delta_objects.ipynb #18462ec5
386386
class MiniMetaDelta(object):
387387
"""
388388
A class to compute and store the weighted delta.

dabest/_effsize_objects.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/API/effsize_objects.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['TwoGroupsEffectSize', 'EffectSizeDataFrame', 'PermutationTest']
77

8-
# %% ../nbs/API/effsize_objects.ipynb 5
8+
# %% ../nbs/API/effsize_objects.ipynb #430d4ea8
99
import pandas as pd
1010
import lqrt
1111
from scipy.stats import norm
@@ -23,7 +23,7 @@
2323
from string import Template
2424
import scipy.stats as spstats
2525

26-
# %% ../nbs/API/effsize_objects.ipynb 6
26+
# %% ../nbs/API/effsize_objects.ipynb #9d988bdd
2727
class TwoGroupsEffectSize(object):
2828

2929
"""
@@ -818,7 +818,7 @@ def bec_pct_high(self):
818818
return self.__bec_pct_high
819819

820820

821-
# %% ../nbs/API/effsize_objects.ipynb 10
821+
# %% ../nbs/API/effsize_objects.ipynb #024b1d00
822822
class EffectSizeDataFrame(object):
823823
"""A class that generates and stores the results of bootstrapped effect
824824
sizes for several comparisons."""
@@ -1658,7 +1658,7 @@ def delta2(self):
16581658
def is_delta_delta(self):
16591659
return self.__delta2
16601660

1661-
# %% ../nbs/API/effsize_objects.ipynb 29
1661+
# %% ../nbs/API/effsize_objects.ipynb #5d49f77f
16621662
class PermutationTest:
16631663
"""
16641664
A class to compute and report permutation tests.

dabest/_stats_tools/confint_1group.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/API/confint_1group.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['create_bootstrap_indexes', 'compute_1group_jackknife', 'compute_1group_acceleration', 'compute_1group_bootstraps',
77
'compute_1group_bias_correction', 'summary_ci_1group']
88

9-
# %% ../../nbs/API/confint_1group.ipynb 4
9+
# %% ../../nbs/API/confint_1group.ipynb #9181f236
1010
import numpy as np
1111
from numpy.random import PCG64, RandomState
1212
from scipy.stats import norm
1313
from numpy import sort as npsort
1414

15-
# %% ../../nbs/API/confint_1group.ipynb 5
15+
# %% ../../nbs/API/confint_1group.ipynb #bac09924
1616
def create_bootstrap_indexes(array, resamples=5000, random_seed=12345):
1717
"""Given an array-like, returns a generator of bootstrap indexes
1818
to be used for resampling.

dabest/_stats_tools/confint_2group_diff.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
# AUTOGENERATED! DO NOT EDIT! File to edit: ../../nbs/API/confint_2group_diff.ipynb.
44

5-
# %% auto 0
5+
# %% auto #0
66
__all__ = ['create_jackknife_indexes', 'create_repeated_indexes', 'compute_meandiff_jackknife', 'bootstrap_indices',
77
'compute_bootstrapped_diff', 'delta2_bootstrap_loop', 'compute_delta2_bootstrapped_diff',
88
'compute_meandiff_bias_correction', 'compute_interval_limits', 'calculate_group_var',
99
'calculate_bootstraps_var', 'calculate_weighted_delta']
1010

11-
# %% ../../nbs/API/confint_2group_diff.ipynb 4
11+
# %% ../../nbs/API/confint_2group_diff.ipynb #fa733643
1212
import numpy as np
1313
from numpy import arange, delete, errstate
1414
from numpy import mean as npmean
@@ -18,7 +18,7 @@
1818
from scipy.stats import norm
1919
from numpy import isnan
2020

21-
# %% ../../nbs/API/confint_2group_diff.ipynb 5
21+
# %% ../../nbs/API/confint_2group_diff.ipynb #8cf9b1fc
2222
@njit(cache=True, parallel=True)
2323
def create_jackknife_indexes(data):
2424
"""

0 commit comments

Comments
 (0)