diff --git a/lifelines/fitters/__init__.py b/lifelines/fitters/__init__.py index d9f96d12c..8c9df2243 100644 --- a/lifelines/fitters/__init__.py +++ b/lifelines/fitters/__init__.py @@ -1948,6 +1948,9 @@ def _fit_model( if _initial_point.shape[0] != Xs.columns.size: raise ValueError("initial_point is not the correct shape.") + scipy_fit_options = {**self._scipy_fit_options, **fit_options} + bounds = scipy_fit_options.pop("bounds", getattr(self, "_bounds", None)) + with warnings.catch_warnings(): warnings.simplefilter("ignore") results = minimize( @@ -1957,7 +1960,8 @@ def _fit_model( method=self._scipy_fit_method, jac=True, args=(Ts, E, weights, entries, utils.DataframeSlicer(Xs)), - options={**{"disp": show_progress}, **self._scipy_fit_options, **fit_options}, + bounds=bounds, + options={**{"disp": show_progress}, **scipy_fit_options}, callback=self._scipy_fit_callback, ) diff --git a/lifelines/tests/test_estimation.py b/lifelines/tests/test_estimation.py index 00c366086..ed2788d60 100644 --- a/lifelines/tests/test_estimation.py +++ b/lifelines/tests/test_estimation.py @@ -2201,6 +2201,15 @@ def test_print_summary(self): pew = PiecewiseExponentialRegressionFitter(breakpoints=[25, 40]).fit(df, "week", "arrest") pew.print_summary() + def test_fit_options_bounds_are_passed_to_minimize(self): + df = pd.DataFrame({"T": [1.0, 2.0, 3.0, 4.0], "E": [1, 1, 0, 1]}) + model = PiecewiseExponentialRegressionFitter(breakpoints=[2.0]) + bounds = [(0.0, None)] * len(model._fitted_parameter_names) + + fitted = model.fit(df, "T", "E", fit_options={"bounds": bounds}) + + assert fitted.params_.shape[0] == len(model._fitted_parameter_names) + def test_inference(self): N, d = 80000, 2