Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"ValueError: Information ratio must be monotonically increasing" What does it mean? #102

Open
scottee opened this issue Jul 16, 2024 · 2 comments

Comments

@scottee
Copy link

scottee commented Jul 16, 2024

I'm trying to use the lib for the first time, for a sequential test. I'm getting an exception "ValueError: Information ratio must be monotonically increasing", but I don't know what it means. I've tried digesting the code, but this is buried more levels deep than I understand. Can you educate me?

Here's the snipped exception:

File [~/deepsea/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/confidence_computers/z_test_computer.py:135](https://escott-dsc3099.dev.de.gcp.rokulabs.net/lab/tree/notebooks/nba/nco/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/confidence_computers/z_test_computer.py#line=134), in compute_sequential_adjusted_alpha.<locals>.adjusted_alphas_for_group(grp)
    133 def adjusted_alphas_for_group(grp: DataFrame) -> Series:
    134     return (
--> 135         sequential_bounds(
    136             t=grp["sample_size_proportions"].values,
    137             alpha=grp[ALPHA].values[0] [/](https://escott-dsc3099.dev.de.gcp.rokulabs.net/) n_comparisons,
    138             sides=2 if (grp[PREFERENCE_TEST] == TWO_SIDED).all() else 1,
    139         )
    140         .df.set_index(grp.index)
    141         .assign(
    142             **{
    143                 ADJUSTED_ALPHA: lambda df: df.apply(
    144                     lambda row: 2 * (1 - st.norm.cdf(row["zb"]))
    145                     if (grp[PREFERENCE_TEST] == TWO_SIDED).all()
    146                     else 1 - st.norm.cdf(row["zb"]),
    147                     axis=1,
    148                 )
    149             }
    150         )
    151     )[["zb", ADJUSTED_ALPHA]]

File [~/deepsea/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/confidence_computers/z_test_computer.py:53](https://escott-dsc3099.dev.de.gcp.rokulabs.net/lab/tree/notebooks/nba/nco/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/confidence_computers/z_test_computer.py#line=52), in sequential_bounds(t, alpha, sides, state)
     52 def sequential_bounds(t: np.array, alpha: float, sides: int, state: DataFrame = None):
---> 53     return bounds(t, alpha, rho=2, ztrun=8, sides=sides, max_nints=1000, state=state)

File [~/deepsea/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/sequential_bound_solver.py:343](https://escott-dsc3099.dev.de.gcp.rokulabs.net/lab/tree/notebooks/nba/nco/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/sequential_bound_solver.py#line=342), in bounds(t, alpha, rho, ztrun, sides, state, max_nints)
    341     raise ValueError(f"Information ratio must must not be zero, {get_input_str()}")
    342 if any(t[i] > t[i + 1] for i in range(len(t) - 1)):
--> 343     raise ValueError(f"Information ratio must be monotonically increasing, {get_input_str()}")
    344 if not (sides == 1 or sides == 2):
    345     raise ValueError(f"sides must either be one a zero, {get_input_str()}")

File [~/deepsea/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/sequential_bound_solver.py:337](https://escott-dsc3099.dev.de.gcp.rokulabs.net/lab/tree/notebooks/nba/nco/notebooks/nba/nco/confidence-master/spotify_confidence/analysis/frequentist/sequential_bound_solver.py#line=336), in bounds.<locals>.get_input_str()
    334 def get_input_str():
    335     return (
    336         f"input params: t={t}, alpha={alpha}, sides={sides}, rho={rho}, ztrun={ztrun},"
--> 337         f"state_df={state.df.to_json()}, state_fcab={state.last_fcab}, max_nints={max_nints}"
    338     )

AttributeError: 'NoneType' object has no attribute 'df'

And here's the setup I did, trying to follow the example notebook:

test = conf.ZTest(
    metrics_df,
    numerator_column='metric1',
    numerator_sum_squares_column='metric1_sumsq',
    denominator_column='user_cnt',
    categorical_group_columns=['bucket'],
    ordinal_group_column='date'
)
# This call goes boom!
result = test.multiple_difference(
    level='control',
    groupby=['date'],
    level_as_reference=True,
    final_expected_sample_size_column='expected_users',
    non_inferiority_margins = (None, 'increase'),
    absolute=False
)
@iampelle
Copy link
Contributor

iampelle commented Jul 16, 2024 via email

@scottee
Copy link
Author

scottee commented Jul 16, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants