siegelslopes#
- scipy.stats.siegelslopes(y, x=None, метод='hierarchical', *, ось=None, nan_policy='propagate', keepdims=False)[источник]#
Вычисляет оценку Сигеля для набора точек (x, y).
siegelslopesреализует метод робастной линейной регрессии с использованием повторных медиан (см. [1]) для подгонки линии к точкам (x, y). Метод устойчив к выбросам с асимптотической точкой срыва 50%.- Параметры:
- yarray_like
Зависимая переменная.
- xarray_like или None, необязательный
Независимая переменная. Если None, используется
arange(len(y))вместо этого.- метод{‘hierarchical’, ‘separate’}
Если 'hierarchical', оценить пересечение с использованием оцененного наклона
slope(опция по умолчанию). Если 'separate', оценить свободный член независимо от оцененного наклона. Подробности см. в примечаниях.- осьint или None, по умолчанию: None
Если это целое число, ось входных данных, по которой вычисляется статистика. Статистика каждого среза по оси (например, строки) входных данных появится в соответствующем элементе вывода. Если
None, вход будет сведён в одномерный массив перед вычислением статистики.- nan_policy{‘propagate’, ‘omit’, ‘raise’}
Определяет, как обрабатывать входные значения NaN.
propagate: если NaN присутствует в срезе оси (например, строке), вдоль которой вычисляется статистика, соответствующая запись вывода будет NaN.omit: NaN будут пропущены при выполнении расчета. Если в срезе оси, вдоль которого вычисляется статистика, остается недостаточно данных, соответствующая запись вывода будет NaN.raise: если присутствует NaN, тоValueErrorбудет вызвано исключение.
- keepdimsbool, по умолчанию: False
Если установлено значение True, оси, которые были сокращены, остаются в результате как размерности с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.
- Возвращает:
- результат
SiegelslopesResultэкземпляр Возвращаемое значение — объект со следующими атрибутами:
- slopefloat
Оценка наклона линии регрессии.
- interceptfloat
Оценка пересечения линии регрессии.
- результат
Смотрите также
theilslopesаналогичная техника без повторных медиан
Примечания
С
n = len(y), вычислитьm_jкак медиана наклонов от точки(x[j], y[j])ко всем остальным n-1 точки.slopeзатем является медианой всех наклоновm_j. Даны два способа оценки пересечения в [1] который можно выбрать через параметрmethod. Иерархический подход использует оценённый наклонslopeи вычисляетinterceptкак медианаy - slope*x. Другой подход оценивает точку пересечения отдельно следующим образом: для каждой точки(x[j], y[j]), вычисляет точки пересечения всех n-1 линии через оставшиеся точки и взять медиануi_j.interceptявляется медианойi_j.Реализация вычисляет n раз медиана вектора размера n что может быть медленно для больших векторов. Существуют более эффективные алгоритмы (см. [2]), которые здесь не реализованы.
Для совместимости со старыми версиями SciPy возвращаемое значение ведёт себя как
namedtupleдлины 2, с полямиslopeиintercept, поэтому можно продолжать писать:slope, intercept = siegelslopes(y, x)
Начиная с SciPy 1.9,
np.matrixвходные данные (не рекомендуется для нового кода) преобразуются вnp.ndarrayперед выполнением вычисления. В этом случае результатом будет скаляр илиnp.ndarrayподходящей формы вместо 2Dnp.matrix. Аналогично, хотя маскированные элементы маскированных массивов игнорируются, результатом будет скаляр илиnp.ndarrayвместо маскированного массива сmask=False.Ссылки
[1] (1,2)A. Siegel, "Robust Regression Using Repeated Medians", Biometrika, Vol. 69, pp. 242-244, 1982.
[2]A. Stein and M. Werman, “Finding the repeated median regression line”, Proceedings of the Third Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 409-413, 1992.
Примеры
>>> import numpy as np >>> from scipy import stats >>> import matplotlib.pyplot as plt
>>> x = np.linspace(-5, 5, num=150) >>> y = x + np.random.normal(size=x.size) >>> y[11:15] += 10 # add outliers >>> y[-5:] -= 7
Вычислить наклон и пересечение. Для сравнения также вычислить наименьшие квадраты с
linregress:>>> res = stats.siegelslopes(y, x) >>> lsq_res = stats.linregress(x, y)
Построить результаты. Линия регрессии Сигеля показана красным. Зеленая линия показывает наименьшие квадраты для сравнения.
>>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> ax.plot(x, y, 'b.') >>> ax.plot(x, res[1] + res[0] * x, 'r-') >>> ax.plot(x, lsq_res[1] + lsq_res[0] * x, 'g-') >>> plt.show()