in kats/detectors/detector_consts.py [0:0]
def _ttest_multivariate(self) -> None:
num_series = self.num_series
p_value_start = np.zeros(num_series)
t_value_start = np.zeros(num_series)
n_1 = len(self.previous)
n_2 = len(self.current)
if n_1 == 1 and n_2 == 1:
self._t_score = np.inf * np.ones(num_series)
self._p_value = np.zeros(num_series)
return
elif n_1 == 1 or n_2 == 1:
t_value_start, p_value_start = self._ttest_manual()
else:
current_data = self.current.data
prev_data = self.previous.data
if current_data is None or prev_data is None:
raise ValueError("Interval data not set")
for i in range(num_series):
current_slice = current_data[:, i]
prev_slice = prev_data[:, i]
t_value_start[i], p_value_start[i] = ttest_ind(
current_slice, prev_slice, equal_var=True, nan_policy="omit"
)
# The new p-values are the old p-values rescaled so that self.alpha is still the threshold for rejection
_, self._p_value, _, _ = multitest.multipletests(
p_value_start, alpha=self.alpha, method=self.method
)
self._t_score = np.zeros(num_series)
# We are using a two-sided test here, so we take inverse_tcdf(self._p_value / 2) with df = len(self.current) + len(self.previous) - 2
_t_score: np.ndarray = self._t_score
_p_value: np.ndarray = cast(np.ndarray, self._p_value)
for i in range(self.current.num_series):
if t_value_start[i] < 0:
_t_score[i] = t.ppf(_p_value[i] / 2, self._get_df())
else:
_t_score[i] = t.ppf(1 - _p_value[i] / 2, self._get_df())
self._t_score = _t_score