Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.event_observed = np.asarray(event_observed, dtype=int) if event_observed is not None else np.ones(n)
self.entry = np.asarray(entry) if entry is not None else np.zeros(n)
self.weights = np.asarray(weights) if weights is not None else np.ones(n)
if timeline is not None:
self.timeline = np.sort(np.asarray(timeline).astype(float))
else:
self.timeline = np.linspace(utils.coalesce(*Ts).min(), utils.coalesce(*Ts).max(), n)
self._label = utils.coalesce(label, self._label)
self._ci_labels = ci_labels
self.alpha = utils.coalesce(alpha, self.alpha)
# create some initial values, and test them in the hazard.
self._initial_values = utils.coalesce(
initial_point, self._create_initial_point(Ts, self.event_observed, self.entry, self.weights)
)
self._check_bounds_initial_point_names_shape()
if not hasattr(self, "_compare_to_values"):
self._compare_to_values = self._initial_values
if not self._KNOWN_MODEL:
self._check_cumulative_hazard_is_monotone_and_positive(utils.coalesce(*Ts), self._initial_values)
# estimation
self._fitted_parameters_, self.log_likelihood_, self._hessian_ = self._fit_model(
Ts, self.event_observed.astype(bool), self.entry, self.weights, show_progress=show_progress
)
if not self._KNOWN_MODEL:
n = len(utils.coalesce(*Ts))
if event_observed is not None:
utils.check_nans_or_infs(event_observed)
self.event_observed = np.asarray(event_observed, dtype=int) if event_observed is not None else np.ones(n)
self.entry = np.asarray(entry) if entry is not None else np.zeros(n)
self.weights = np.asarray(weights) if weights is not None else np.ones(n)
if timeline is not None:
self.timeline = np.sort(np.asarray(timeline).astype(float))
else:
self.timeline = np.linspace(utils.coalesce(*Ts).min(), utils.coalesce(*Ts).max(), n)
self._label = utils.coalesce(label, self._label)
self._ci_labels = ci_labels
self.alpha = utils.coalesce(alpha, self.alpha)
# create some initial values, and test them in the hazard.
self._initial_values = utils.coalesce(
initial_point, self._create_initial_point(Ts, self.event_observed, self.entry, self.weights)
)
self._check_bounds_initial_point_names_shape()
if not hasattr(self, "_compare_to_values"):
self._compare_to_values = self._initial_values
if not self._KNOWN_MODEL:
self._check_cumulative_hazard_is_monotone_and_positive(utils.coalesce(*Ts), self._initial_values)
# estimation
times: iterable, optional
an iterable of increasing times to predict the cumulative hazard at. Default
is the set of all durations (observed and unobserved).
conditional_after: iterable, optional
Must be equal is size to df.shape[0] (denoted `n` above). An iterable (array, list, series) of possibly non-zero values that represent how long the
subject has already lived for. Ex: if :math:`T` is the unknown event time, then this represents
:math:`T | T > s`. This is useful for knowing the *remaining* hazard/survival of censored subjects.
The new timeline is the remaining duration of the subject, i.e. normalized back to starting at 0.
See Also
--------
predict_percentile, predict_expectation, predict_survival_function
"""
df = df.copy().astype(float)
times = utils.coalesce(times, self.timeline)
times = np.atleast_1d(times).astype(float)
if isinstance(df, pd.Series):
df = df.to_frame().T
n = df.shape[0]
if isinstance(ancillary_df, pd.DataFrame):
assert ancillary_df.shape[0] == df.shape[0], "ancillary_df must be the same shape[0] as df"
for c in ancillary_df.columns.difference(df.columns):
df[c] = ancillary_df[c]
if self.fit_intercept:
df["_intercept"] = 1.0
Xs = self._create_Xs_dict(df)
self._label = utils.coalesce(label, self._label)
self._ci_labels = ci_labels
self.alpha = utils.coalesce(alpha, self.alpha)
# create some initial values, and test them in the hazard.
self._initial_values = utils.coalesce(
initial_point, self._create_initial_point(Ts, self.event_observed, self.entry, self.weights)
)
self._check_bounds_initial_point_names_shape()
if not hasattr(self, "_compare_to_values"):
self._compare_to_values = self._initial_values
if not self._KNOWN_MODEL:
self._check_cumulative_hazard_is_monotone_and_positive(utils.coalesce(*Ts), self._initial_values)
# estimation
self._fitted_parameters_, self.log_likelihood_, self._hessian_ = self._fit_model(
Ts, self.event_observed.astype(bool), self.entry, self.weights, show_progress=show_progress
)
if not self._KNOWN_MODEL:
self._check_cumulative_hazard_is_monotone_and_positive(utils.coalesce(*Ts), self._fitted_parameters_)
for param_name, fitted_value in zip(self._fitted_parameter_names, self._fitted_parameters_):
setattr(self, param_name, fitted_value)
try:
self.variance_matrix_ = inv(self._hessian_)
except np.linalg.LinAlgError:
self.variance_matrix_ = pinv(self._hessian_)
warning_text = dedent(
>>> })
>>>
>>> aft = WeibullAFTFitter()
>>> aft.fit_interval_censoring(df, 'start', 'stop', 'E')
>>> aft.print_summary()
>>> aft.predict_median(df)
>>>
>>> aft = WeibullAFTFitter()
>>> aft.fit_interval_censoring(df, 'start', 'stop', 'E', ancillary_df=df)
>>> aft.print_summary()
>>> aft.predict_median(df)
"""
self.lower_bound_col = lower_bound_col
self.upper_bound_col = upper_bound_col
self.fit_intercept = utils.coalesce(fit_intercept, self.fit_intercept)
self._time_cols = [lower_bound_col, upper_bound_col]
df = df.copy()
lower_bound = utils.pass_for_numeric_dtypes_or_raise_array(df.pop(lower_bound_col)).astype(float)
upper_bound = utils.pass_for_numeric_dtypes_or_raise_array(df.pop(upper_bound_col)).astype(float)
if event_col is None:
event_col = "E_lifelines_added"
df[event_col] = lower_bound == upper_bound
if ((lower_bound == upper_bound) != df[event_col]).any():
raise ValueError(
"For all rows, lower_bound == upper_bound if and only if event observed = 1 (uncensored). Likewise, lower_bound < upper_bound if and only if event observed = 0 (censored)"
)
if (lower_bound > upper_bound).any():
label = utils.coalesce(label, self._class_name.replace("Fitter", "") + "_estimate")
n = len(utils.coalesce(*Ts))
if event_observed is not None:
utils.check_nans_or_infs(event_observed)
self.event_observed = np.asarray(event_observed, dtype=int) if event_observed is not None else np.ones(n)
self.entry = np.asarray(entry) if entry is not None else np.zeros(n)
self.weights = np.asarray(weights) if weights is not None else np.ones(n)
if timeline is not None:
self.timeline = np.sort(np.asarray(timeline).astype(float))
else:
self.timeline = np.linspace(utils.coalesce(*Ts).min(), utils.coalesce(*Ts).max(), n)
self._label = utils.coalesce(label, self._label)
self._ci_labels = ci_labels
self.alpha = utils.coalesce(alpha, self.alpha)
# create some initial values, and test them in the hazard.
self._initial_values = utils.coalesce(
initial_point, self._create_initial_point(Ts, self.event_observed, self.entry, self.weights)
)
self._check_bounds_initial_point_names_shape()
if not hasattr(self, "_compare_to_values"):
self._compare_to_values = self._initial_values
if not self._KNOWN_MODEL:
self._check_cumulative_hazard_is_monotone_and_positive(utils.coalesce(*Ts), self._initial_values)
def set_kwargs_color(kwargs):
kwargs["color"] = coalesce(kwargs.get("c"), kwargs.get("color"), kwargs["ax"]._get_lines.get_next_color())