Стандартная ошибка ols

АКТУАЛЬНОСТЬ ТЕМЫ

Общие положения

Про регрессионный анализ вообще, и его применение в DataScience написано очень много. Есть множество учебников, монографий, справочников и статей по прикладной статистике, огромное количество информации в интернете, примеров расчетов. Можно найти множество кейсов, реализованных с использованием средств Python. Казалось бы — что тут еще можно добавить?

Однако, как всегда, есть нюансы:

1. Регрессионный анализ — это прежде всего процесс, набор действий исследователя по определенному алгоритму: «подготовка исходных данных — построение модели — анализ модели — прогнозирование с помощью модели». Это ключевая особенность. Не представляет особой сложности сформировать DataFrame исходных данных и построить модель, запустить процедуру из библиотеки statsmodels. Однако подготовка исходных данных и последующий анализ модели требуют гораздо больших затрат человеко-часов специалиста и строк программного кода, чем, собственно, построение модели. На этих этапах часто приходится возвращаться назад, корректировать модель или исходные данные. Этому, к сожалению, во многих источниках, не удаляется достойного внимания, а иногда — и совсем не уделяется внимания, что приводит к превратному представлению о регрессионном анализе.

2. Далеко не во всех источниках уделяется должное внимание интерпретации промежуточных и финальных результатов. Специалист должен уметь интерпретировать каждую цифру, полученную в ходе работы над моделью.

3. Далеко не все процедуры на этапах подготовки исходных данных или анализа модели в источниках разобраны подробно. Например, про проверку значимости коэффициента детерминации найти информацию не представляет труда, а вот про проверку адекватности модели, построение доверительных интервалов регрессии или про специфические процедуры (например, тест Уайта на гетероскедастичность) информации гораздо меньше.

4. Своеобразная сложность может возникнуть с проверкой статистических гипотез: для отечественной литературы по прикладной статистике больше характерно проверять гипотезы путем сравнения расчетного значения критерия с табличным, а в иностранных источниках чаще определяется расчетный уровень значимости и сравнивается с заданным (чаще всего 0.05 = 1-0.95). В разных источниках информации реализованы разные подходы. Инструменты python (прежде всего библиотеки scipy и statsmodels) также в основном оперируют с расчетным уровнем значимости.

5. Ну и, наконец, нельзя не отметить, что техническая документация библиотеки statsmodels составлена, на мой взгляд, далеко не идеально: информация излагается путано, изобилует повторами и пропусками, описание классов, функций и свойств выполнено фрагментарно и количество примеров расчетов — явно недостаточно.

Поэтому я решил написать ряд обзоров по регрессионному анализу средствами Python, в которых акцент будет сделан на практических примерах, алгоритме действий исследователя, интерпретации всех полученных результатов, конкретных методических рекомендациях. Буду стараться по возможности избегать теории (хотя совсем без нее получится) — все-таки предполагается, что специалист DataScience должен знать теорию вероятностей и математическую статистику, хотя бы в рамках курса высшей математики для технического или экономического вуза.

В данном статье остановимся на самои простом, классическом, стереотипном случае — простой линейной регрессии (simple linear regression), или как ее еще принято называть — парной линейной регрессионной модели (ПЛРМ) — в ситуации, когда исследователя не подстерегают никакие подводные камни и каверзы — исходные данные подчиняются нормальному закону, в выборке отсутствуют аномальные значения, отсутствует ложная корреляция. Более сложные случаи рассмотрим в дальнейшем.

Для построение регрессионной модели будем пользоваться библиотекой statsmodels.

В данной статье мы рассмотрим по возможности полный набор статистических процедур. Некоторые из них (например, дескриптивная статистика или дисперсионный анализ регрессионной модели) могут показаться избыточными. Все так, но эти процедуры улучшают наше представление о процессе и об исходных данных, поэтому в разбор я их включил, а каждый исследователь сам вправе для себя определить, потребуются ему эти процедуры или нет.

Краткий обзор источников

Источников информации по корреляционному и регрессионному анализу огромное количество, в них можно просто утонуть. Поэтому позволю себе просто порекомендовать ряд источников, на мой взгляд, наиболее полезных:

  1. Кобзарь А.И. Прикладная математическая статистика. Для инженеров и научных работников. — М.: ФИЗМАТЛИТ, 2006. — 816 с.

  2. Львовский Е.Н. Статистические методы построения эмпирических формул. — М.: Высшая школа, 1988. — 239 с.

  3. Фёрстер Э., Рёнц Б. Методы корреляционного и регрессионного анализа / пер с нем. — М.: Финансы и статистика, 1983. — 302 с.

  4. Афифи А., Эйзен С. Статистический анализ. Подход с использованием ЭВМ / пер с англ. — М.: Мир, 1982. — 488 с.

  5. Дрейпер Н., Смит Г. Прикладной регрессионный анализ. Книга 1 / пер.с англ. — М.: Финансы и статистика, 1986. — 366 с.

  6. Айвазян С.А. и др. Прикладная статистика: Исследование зависимостей. — М.: Финансы и статистика, 1985. — 487 с.

  7. Прикладная статистика. Основы эконометрики: В 2 т. 2-е изд., испр. — Т.2: Айвазян С.А. Основы эконометрики. — М.: ЮНИТИ-ДАНА, 2001. — 432 с.

  8. Магнус Я.Р. и др. Эконометрика. Начальный курс — М.: Дело, 2004. — 576 с.

  9. Носко В.П. Эконометрика. Книга 1. — М.: Издательский дом «Дело» РАНХиГС, 2011. — 672 с.

  10. Брюс П. Практическая статистика для специалистов Data Science / пер. с англ. — СПб.: БХВ-Петербург, 2018. — 304 с.

  11. Уатт Дж. и др. Машинное обучение: основы, алгоритмы и практика применения / пер. с англ. — СПб.: БХВ-Петербург, 2022. — 640 с.

Прежде всего следует упомянуть справочник Кобзаря А.И. [1] — это безусловно выдающийся труд. Ничего подобного даже близко не издавалось. Всем рекомендую иметь под рукой.

Есть очень хорошее практическое пособие [2] — для начинающих и практиков.>

Добротная работа немецких авторов [3]. Все разобрано подробно, обстоятельно, с примерами — очень хорошая книга. Примеры приведены из области экономики.

Еще одна добротная работа — [4], с примерами медико-биологического характера.

Работа [5] считается одним из наиболее полных изложений прикладного регрессионного анализа.

Более сложные работы — [6] (классика жанра), [7], [8], [9] — выдержаны на достаточно высоком математическом уровне, примеры из экономической области.

Свежие работы [10] (с примерами на языке R) и [11] (с примерами на python).

Cтатьи

Статей про регрессионный анализ в DataScience очень много, обращаю внимание на некоторые весьма полезные из них.

Серия статей «Python, корреляция и регрессия», охватывающая весь процесс регрессионного анализа:

  • первичная обработка данных, визуализация и корреляционный анализ;

  • регрессия;

  • теория матриц в регрессионном анализе, проверка  адекватности, мультиколлинеарность;

  • прогнозирование с помощью регрессионных моделей.

Очень хороший обзор «Интерпретация summary из statsmodels для линейной регрессии». В этой статье даны очень полезные ссылки:

  • Statistical Models

  • Interpreting Linear Regression Through statsmodels .summary()

Статья «Регрессионные модели в Python».

Основные предпосылки (гипотезы) регрессионного анализа

Очень кратко — об этом написано тысячи страниц в учебниках — но все же вспомним некоторые основы теории.

Проверка исходных предпосылок является очень важным моментом при статистическом анализе регрессионной модели. Если мы рассматриваем классическую линейную регрессионную модель вида:

то основными предпосылками при использовании обычного метода наименьших квадратов (МНК) для оценки ее параметров являются:

  1. Среднее значение (математическое ожидание) случайной составляющей равно нулю:

  1. Дисперсия случайной составляющей является постоянной:

В случае нарушения данного условия мы сталкиваемся с явлением гетероскедастичности.

  1. Значения случайной составляющей статистически независимы (некоррелированы) между собой:

В случае нарушения данного условия мы сталкиваемся с явлением автокорреляции.

  1. Условие существования обратной матрицы

что эквивалентно одному из двух следующих условий:

то есть число наблюдений должно превышать число параметров.

  1. Значения случайной составляющей некоррелированы со значениями независимых переменных:

  1. Случайная составляющая имеет нормальный закон распределения (с математическим ожиданием равным нулю — следует из условия 1):

Более подробно — см.: [3, с.90], [4, с.147], [5, с.122], [6, с.208], [7, с.49], [8, с.68], [9, с.88].

Кроме гетероскедастичности и автокорреляции возможно возникновение и других статистических аномалий — мультиколлинеарности, ложной корреляции и т.д.

Доказано, что оценки параметров, полученные с помощью МНК, обладают наилучшими свойствами (несмещенность, состоятельность, эффективность) при соблюдении ряда условий:

  • выполнение приведенных выше исходных предпосылок регрессионного анализа;

  • число наблюдений на одну независимую переменную должно быть не менее 5-6;

  • должны отсутствовать аномальные значения (выбросы).

Кроме обычного МНК существуют и другие его разновидности (взвешенный МНК, обобщенный МНК), которые применяются при наличии статистических аномалий. Кроме МНК применяются и другие методы оценки параметров моделей. В этом обзоре мы эти вопросы рассматривать не будем.

Алгоритм проведения регрессионного анализа

Алгоритм действий исследователя при построении регрессионной модели (полевые работы мы, по понятным причинам, не рассматриваем — считаем, что исходные данные уже получены):

  1. Подготовительный этап — постановка целей и задач исследования.

  2. Первичная обработка исходных данных — об этом много написано в учебниках и пособиях по DataScience, сюда могут относится:

  • выявление нерелевантных признаков (признаков, которые не несут полезной информации), нетипичных данных (выбросов), неинформативных признаков (имеющих большое количество одинаковых значений) и работа с ними (удаление/преобразование);

  • выделение категориальных признаков;

  • работа с пропущенными значениями;

  • преобразование признаков-дат в формат datetime и т.д.

  1. Визуализация исходных данных — предварительный графический анализ.

  2. Дескриптивная (описательная) статистика — расчет выборочных характеристик и предварительные выводы о свойствах исходных данных.

  3. Исследование закона распределения исходных данных и, при необходимости, преобразование исходных данных к нормальному закону распределения.

  4. Выявление статистически аномальных значений (выбросов), принятие решения об их исключении.

    Этапы 4, 5 и 6 могут быть при необходимости объединены.

  5. Корреляционный анализ — исследование корреляционных связей между исходными данными; это разведка перед проведением регрессионного анализа.

  6. Построение регрессионной модели:

  • выбор моделей;

  • выбор методов;

  • оценка параметров модели.

  1. Статистический анализ регрессионной модели:  

  • оценка ошибок аппроксимации (error metrics);

  • анализ остатков (проверка нормальности распределения остатков и гипотезы о равенстве нулю среднего значения остатков);

  • проверка адекватности модели;

  • проверка значимости коэффициента детерминации;

  • проверка значимости коэффициентов регрессии;

  • проверка мультиколлинеарности (для множественных регрессионных моделей; вообще мультиколлинеарные переменные выявляются еще на стадии корреляционного анализа);

  • проверка автокорреляции;

  • проверка гетероскедастичности.

   Этапы 8 и 9 могут быть при необходимости повторяться несколько раз.

  1. Сравнительный анализ нескольких регрессионных моделей, выбор наилучшей (при необходимости).

  2. Прогнозирование с помощью регрессионной модели и оценка качества прогноза.

  3. Выводы и рекомендации.

Само собой, этот алгоритм не есть истина в последней инстанции — в зависимости от особенностей исходных данных и вида модели могут возникать дополнительные задачи.

Применение пользовательских функций

Далее в обзоре мной будут использованы несколько пользовательских функций для решения разнообразных задач. Все эти функции созданы для облегчения работы и уменьшения размера программного кода. Данные функции загружается из пользовательского модуля my_module__stat.py, который доступен в моем репозитории на GitHub. Лично мне так удобнее работать, хотя каждый исследователь сам формирует себе инструменты по душе — особенно в части визуализации. Желающие могут пользоваться этими функциями, либо создать свои.

Итак, вот перечень данных функций:

  • graph_scatterplot_sns — функция позволяет построить точечную диаграмму средствами seaborn и сохранить график в виде png-файла;

  • graph_hist_boxplot_probplot_XY_sns  — функция позволяет визуализировать исходные данные для простой линейной регрессии путем одновременного построения гистограммы, коробчатой диаграммы и вероятностного графика (для переменных X и Y) средствами seaborn и сохранить график в виде png-файла; имеется возможность выбирать, какие графики строить (h — hist, b — boxplot, p — probplot);

  • descriptive_characteristics — функция возвращает в виде DataFrame набор статистических характеристики выборки, их ошибок и доверительных интервалов;

  • detecting_outliers_mad_test — функция выполняет проверку наличия аномальных значений (выбросов) по критерию наибольшего абсолютного отклонения (более подробно — см.[1, с.547]);

  • norm_distr_check — проверка нормальности распределения исходных данных с использованием набора из нескольких статистических тестов;

  • corr_coef_check — функция выполняет расчет коэффициента линейной корреляции Пирсона, проверку его значимости и расчет доверительных интервалов; об этой функции я писал в своей статье.

  • graph_regression_plot_sns —  — функция позволяет построить график регрессионной модели.

Ряд пользовательских функций мы создаем в процессе данного обзора (они тоже включены в пользовательский модуль my_module__stat.py):

  • regression_error_metrics — расчет ошибок аппроксимации регрессионной модели;

  • ANOVA_table_regression_model — вывод таблицы дисперсионного анализа регрессионной модели;

  • regression_model_adequacy_check — проверка адекватности регрессионной модели по критерию Фишера;

  • determination_coef_check — проверка значимости коэффициента детерминации по критерию Фишера;

  • regression_coef_check — проверка значимости коэффициентов регрессии по критеирю Стьюдента;

  • Goldfeld_Quandt_test, Breush_Pagan_test, White_test — проверка гетероскедастичности с использование тестов Голдфелда-Квандта, Бриша-Пэгана и Уайта соответственно;

  • regression_pair_predict — функция для прогнозирования с помощью парной регрессионной модели: рассчитывает прогнозируемое значение переменной Y по заданной модели, а также доверительные интервалы среднего и индивидуального значения для полученного прогнозируемого значения Y;

  • graph_regression_pair_predict_plot_sns — прогнозирование: построение графика регрессионной модели (с доверительными интервалами) и вывод расчетной таблицы с данными для заданной области значений X.

ПОСТАНОВКА ЗАДАЧИ

В качестве примера рассмотрим практическую задачу из области экспертизы промышленной безопасности — калибровку ультразвукового прибора для определения прочности бетона.

Итак, суть задачи: при обследовании несущих конструкций зданий и сооружений эксперт определяет прочность бетона с использованием ультразвукового прибора «ПУЛЬСАР-2.1», для которого необходимо предварительно построить градуировочную зависимость. Заключается это в следующем — производятся замеры с фиксацией следующих показателей:

  • X — показания ультразвукового прибора «ПУЛЬСАР-2.1» (м/с)

  • Y — результаты замера прочности бетона (методом отрыва со скалыванием) склерометром ИПС-МГ4.03.

Предполагается, что между показателями X и Y имеется линейная регрессионная зависимость, которая позволит прогнозировать прочность бетона на основании измерений, проведенных прибором «ПУЛЬСАР-2.1».

Были выполнены замеры фактической прочности бетона конструкций для бетонов одного вида с одним типом крупного заполнителя, с единой технологией производства. Для построения были выбраны 14 участков (не менее 12), включая участки, в которых значение косвенного показателя максимальное, минимальное и имеет промежуточные значения.

Настройка заголовков отчета:

# Общий заголовок проекта
Task_Project = 'Калибровка ультразвукового прибора "ПУЛЬСАР-2.1" nдля определения прочности бетона'

# Заголовок, фиксирующий момент времени
AsOfTheDate = ""

  # Заголовок раздела проекта
Task_Theme = ""

# Общий заголовок проекта для графиков
Title_String = f"{Task_Project}n{AsOfTheDate}"

# Наименования переменных
Variable_Name_X = "Скорость УЗК (м/с)"
Variable_Name_Y = "Прочность бетона (МПа)"

# Константы
INCH = 25.4    # мм/дюйм
  DecPlace = 5    # number of decimal places - число знаков после запятой

# Доверительная вероятность и уровень значимости:
p_level = 0.95
a_level = 1 - p_level   

Подключение модулей и библиотек:

# Стандартные модули и библиотеки

import os    # загрузка модуля для работы с операционной системой
import sys
import platform
print('{:<35}{:^0}'.format("Текущая версия Python: ", platform.python_version()), 'n')

import math
from math import *    # подключаем все содержимое модуля math, используем без псевдонимов

import numpy as np
#print ("Текущая версия модуля numpy: ", np.__version__)
print('{:<35}{:^0}'.format("Текущая версия модуля numpy: ", np.__version__))
from numpy import nan

import scipy as sci
print('{:<35}{:^0}'.format("Текущая версия модуля scipy: ", sci.__version__))
import scipy.stats as sps

import pandas as pd
print('{:<35}{:^0}'.format("Текущая версия модуля pandas: ", pd.__version__))

import matplotlib as mpl
print('{:<35}{:^0}'.format("Текущая версия модуля matplotlib: ", mpl.__version__))
import matplotlib.pyplot as plt

import seaborn as sns
print('{:<35}{:^0}'.format("Текущая версия модуля seaborn: ", sns.__version__))

import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.graphics.api as smg
import statsmodels.stats.api as sms
from statsmodels.compat import lzip
print('{:<35}{:^0}'.format("Текущая версия модуля statsmodels: ", sm.__version__))

import statistics as stat    # module 'statistics' has no attribute '__version__'

import sympy as sym
print('{:<35}{:^0}'.format("Текущая версия модуля sympy: ", sym.__version__))

# Настройки numpy
np.set_printoptions(precision = 4, floatmode='fixed')

# Настройки Pandas
pd.set_option('display.max_colwidth', None)    # текст в ячейке отражался полностью вне зависимости от длины
pd.set_option('display.float_format', lambda x: '%.4f' % x)

# Настройки seaborn
sns.set_style("darkgrid")
sns.set_context(context='paper', font_scale=1, rc=None)    # 'paper', 'notebook', 'talk', 'poster', None

# Настройки Mathplotlib
f_size = 8    # пользовательская переменная для задания базового размера шрифта
plt.rcParams['figure.titlesize'] = f_size + 12    # шрифт заголовка
plt.rcParams['axes.titlesize'] = f_size + 10      # шрифт заголовка
plt.rcParams['axes.labelsize'] = f_size + 6       # шрифт подписей осей
plt.rcParams['xtick.labelsize'] = f_size + 4      # шрифт подписей меток
plt.rcParams['ytick.labelsize'] = f_size + 4
plt.rcParams['legend.fontsize'] = f_size + 6      # шрифт легенды

# Пользовательские модули и библиотеки

Text1 = os.getcwd()    # вывод пути к текущему каталогу
#print(f"Текущий каталог: {Text1}")

sys.path.insert(1, "D:REPOSITORYMyModulePython")

from my_module__stat import *

ФОРМИРОВАНИЕ ИСХОДНЫХ ДАННЫХ

Показания ультразвукового прибора «ПУЛЬСАР-2.1» (м/с):

X = np.array([
    4416, 4211, 4113, 4110, 4122,
    4427, 4535, 4311, 4511, 4475,
    3980, 4490, 4007, 4426
    ])

Результаты замера прочности бетона (методом отрыва со скалыванием) прибором ИПС-МГ4.03:

Y = np.array([
    34.2, 35.1, 31.5, 30.8, 30.0,
    34.0, 35.4, 35.8, 38.0, 37.7,
    30.0, 37.8, 31.0, 35.2
    ])

Запишем данные в DataFrame:

calibrarion_df = pd.DataFrame({
    'X': X,
    'Y': Y})
display(calibrarion_df)
calibrarion_df.info()

Сохраняем данные в csv-файл:

calibrarion_df.to_csv(
    path_or_buf='data/calibrarion_df.csv',
    mode='w+',
    sep=';')

Cоздаем копию исходной таблицы для работы:

dataset_df = calibrarion_df.copy()

ВИЗУАЛИЗАЦИЯ ДАННЫХ

Границы значений переменных (при построении графиков):

(Xmin_graph, Xmax_graph) = (3800, 4800)
(Ymin_graph, Ymax_graph) = (25, 45)
# Пользовательская функция
graph_scatterplot_sns(
    X, Y,
    Xmin=Xmin_graph, Xmax=Xmax_graph,
    Ymin=Ymin_graph, Ymax=Ymax_graph,
    color='orange',
    title_figure=Task_Project,
    x_label=Variable_Name_X,
    y_label=Variable_Name_Y,
    s=100,
    file_name='graph/scatterplot_XY_sns.png')

Существует универсальный набор графиков — гистограмма, коробчатая диаграмма, вероятностный график — которые позволяют исследователю сделать предварительные выводы о свойствах исходных данных.

Так как объем выборки невелик (n=14), строить гистограммы распределения переменных X и Y не имеет смысла, поэтому ограничимся построением коробчатых диаграмм и вероятностных графиков:

# Пользовательская функция
graph_hist_boxplot_probplot_XY_sns(
    data_X=X, data_Y=Y,
    data_X_min=Xmin_graph, data_X_max=Xmax_graph,
    data_Y_min=Ymin_graph, data_Y_max=Ymax_graph,  
    graph_inclusion='bp',    # выбираем для построения виды графиков: b - boxplot, p - probplot)
    data_X_label=Variable_Name_X,
    data_Y_label=Variable_Name_Y,
    title_figure=Task_Project,
    file_name='graph/hist_boxplot_probplot_XY_sns.png')    

Для сравнения характера распределений переменных X и Y возможно также построить совмещенную коробчатую диаграмму по стандартизованным данным:

# стандартизуем исходные данные
standardize_df = lambda X: ((X - np.mean(X))/np.std(X))

dataset_df_standardize = dataset_df.copy()
dataset_df_standardize = dataset_df_standardize.apply(standardize_df)
display(dataset_df_standardize)

# построим график
fig, axes = plt.subplots(figsize=(210/INCH, 297/INCH/2))
axes.set_title("Распределение стандартизованных переменных X и Y", fontsize = 16)
sns.boxplot(
    data=dataset_df_standardize,    
    orient='h',
    width=0.5,
    ax=axes)
plt.show()

Графический анализ позволяет сделать следующие выводы:

  1. Отсутствие выбросов на коробчатых диаграммах свидетельствует об однородности распределения переменных.

  2. Смещение медианы вправо на коробчатых диаграммах свидетельствует о левосторонней асимметрии распределения.

ДЕСКРИПТИВНАЯ (ОПИСАТЕЛЬНАЯ СТАТИСТИКА)

Собственно говоря, данный этап требуется проводить далеко не всегда, однако с помощью статистических характеристик выборки мы тоже можем сделать полезные выводы.

Описательная статистика исходных данных средствами библиотеки Pandas — самый простой вариант:

dataset_df.describe()

Описательная статистика исходных данных средствами библиотеки statsmodels — более развернутый вариант, с большим количеством показателей:

from statsmodels.stats.descriptivestats import Description
result = Description(
    dataset_df,
    stats=["nobs", "missing", "mean", "std_err", "ci", "ci", "std", "iqr", "mad", "coef_var", "range", "max", "min", "skew", "kurtosis", "mode",
           "median", "percentiles", "distinct", "top", "freq"],
    alpha=a_level,
    use_t=True)
display(result.summary())

Описательная статистика исходных данных с помощью пользовательской функции descriptive_characteristics:

# Пользовательская функция
descriptive_characteristics(X)

Выводы:

  1. Сравнение показателей среднего арифметического (mean) и медианы (median) свидетельствует о левосторонней асимметрии (т.к.mean < median).

  2. Значение коэффициента вариации CV = 0.0445 и доверительный интервал для него 0.0336 ≤ CV ≤ 0.0657 свидетельствует об однородности исходных данных (т.к. CV ≤ 0.33).

  3. Значение показателя асимметрии skew (As) = -0.3101 свидетельствует об умеренной левосторонней асимметрии распределении (т.к. |As| ≤ 0.5, As < 0).

  4. Значение показателя эксцесса kurtosis (Es) = -1.4551 свидетельствует о плосковершинном распределении (platykurtic distribution) (т.к. Es < 0).

# Пользовательская функция
descriptive_characteristics(Y)

Выводы:

  1. Сравнение показателей среднего арифметического (mean) и медианы (median) свидетельствует о левосторонней асимметрии (т.к.mean < median).

  2. Значение коэффициента вариации CV = 0.0822 и доверительный интервал для него 0.06202 ≤ CV ≤ 0.1217 свидетельствует об однородности исходных данных (т.к. CV ≤ 0.33).

  3. Значение показателя асимметрии skew (As) = -0.1109 свидетельствует о приблизительно симметричном распределении (т.к. |As| ≤ 0.25).

  4. Значение показателя эксцесса kurtosis (Es) = -1.3526 свидетельствует о плосковершинном распределении (platykurtic distribution) (т.к. Es < 0).

ПРОВЕРКА НОРМАЛЬНОСТИ РАСПРЕДЕЛЕНИЯ

Для проверки нормальности распределения использована пользовательская функция norm_distr_check, которая объединяет в себе набор стандартных статистических тестов проверки нормальности. Все тесты относятся к стандартному инструментарию Pyton (библиотека scipy, модуль stats), за исключением теста Эппса-Палли (Epps-Pulley test); о том, как реализовать этот тест средствами Pyton я писал в своей статье https://habr.com/ru/post/685582/.

Примечание: для использования функции norm_distr_check в каталог с ipynb-файлом необходимо поместить папку table c файлом Tep_table.csv, который содержит табличные значения статистики критерия Эппса-Палли.

# пользовательская функция
norm_distr_check(X)

# Пользовательская функция
norm_distr_check (Y)

Вывод: большинство статистических тестов позволяют принять гипотезу о нормальности распределения переменных X и Y.

ПРОВЕРКА АНОМАЛЬНЫХ ЗНАЧЕНИЙ (ВЫБРОСОВ)

Статистическую проверку аномальных значений (выбросов) не стоит путать с проверкой выбросов, которая проводится на этапе первичной обработки результатов наблюдений. Последняя проводится с целью отсеять явные ошибочные данные (например, в результате неправильно поставленной запятой величина показателя может увеличиться/уменьшиться на порядок); здесь же мы говорим о статистической проверке данных, которые уже прошли этап первичной обработки.

Имеется довольно много критериев для проверки аномальных значений (подробнее см.[1]); вообще данная процедура довольно неоднозначная:

  • критерии зависят от вида распределения;

  • мало данных о сравнительной мощности этих критериев;

  • даже в случае принятии гипотезы о нормальном распределении в выборке могут быть обнаружены аномальные значения и пр.

Кроме существует дилемма: если какие-то значения в выборке признаны выбросами — стоит или не стоит исследователю исключать их? Ведь каждое значение несет в себе информацию, причем иногда весьма ценную, а сильно отклоняющиеся от основного массива данные (которые не являются выбросами в смысле первичной обработки, но являются статистическим значимыми аномальными значениями) могут кардинально изменить статистический вывод.

В общем, о задаче выявления аномальных значений (выбросов) можно написать отдельно, а пока, в данном разборе, ограничимся проверкой аномальных значений по критерию наибольшего максимального отклонения (см.[1, с.547]) с помощью пользовательской функции detecting_outliers_mad_test. Данные функция возвращает DataFrame, которые включает список аномальных значений со следующими признаками:

  • value — проверяемое значение из выборки;

  • mad_calc и mad_table — расчетное и табличное значение статистики критерия;

  • outlier_conclusion — вывод (выброс или нет).

Обращаю внимание, что критерий наибольшего максимального отклонения можно использовать только для нормально распределенных данных.

# пользовательская функция
print("Проверка наличия выбросов переменной X:n")
result = detecting_outliers_mad_test(X)
mask = (result['outlier_conclusion'] == 'outlier')
display(result[mask])

# пользовательская функция
print("Проверка наличия выбросов переменной Y:n")
result = detecting_outliers_mad_test(Y)
mask = (result['outlier_conclusion'] == 'outlier')
display(result[mask])

Вывод: в случае обеих переменных X и Y список пуст, следовательно, аномальных значений (выбросов) не выявлено.

КОРРЕЛЯЦИОННЫЙ АНАЛИЗ

Корреляционный анализ — это разведка перед построением регрессионной модели.

Выполним расчет коэффициента линейной корреляции Пирсона, проверку его значимости и построение доверительных интервалов с помощью пользовательской функции corr_coef_check (про эту функцию более подробно написано в моей статье https://habr.com/ru/post/683442/):

# пользовательская функция
display(corr_coef_check(X, Y, scale='Evans'))

Выводы:

  1. Значение коэффициента корреляции coef_value = 0.8900 свидетельствует о весьма сильной корреляционной связи (по шкале Эванса).

  2. Коэффициент корреляции значим по критерию Стьюдента: t_calc ≥ t_table, a_calc ≤ a_level.

  3. Доверительный интервал для коэффициента корреляции: 0.6621 ≤ coef_value ≤ 0.9625.

РЕГРЕССИОННЫЙ АНАЛИЗ

Предварительная визуализация

python позволяет выполнить предварительную визуализацию, например, с помощью функции jointplot библиотеки seaborn:

fig = plt.figure(figsize=(297/INCH, 210/INCH))
axes = sns.jointplot(
    x=X, y=Y,
    kind='reg',
    ci=95)
plt.show()

Построение модели

Выполним оценку параметров и анализ простой линейной регрессии (simple linear regression), используя библиотеку statsmodels (https://www.statsmodels.org/) и входящий в нее модуль линейной регрессии Linear Regression (https://www.statsmodels.org/stable/regression.html).

Данный модуль включает в себя классы, реализующие различные методы оценки параметров моделей линейной регрессии, в том числе:

  • класс OLS (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.html#statsmodels.regression.linear_model.OLS) — Ordinary Least Squares (обычный метод наименьших квадратов).

  • класс WLS (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.WLS.html#statsmodels.regression.linear_model.WLS) — Weighted Least Squares (метод взвешенных наименьших квадратов) (https://en.wikipedia.org/wiki/Weighted_least_squares), применяется, если имеет место гетероскедастичность данных (https://ru.wikipedia.org/wiki/Гетероскедастичность).

  • класс GLS (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.GLS.html#statsmodels.regression.linear_model.GLS) — Generalized Least Squares (обобщенный метод наименьших квадратов) (https://en.wikipedia.org/wiki/Generalized_least_squares), применяется, если существует определенная степень корреляции между остатками в модели регрессии.

  • класс GLSAR (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.GLSAR.html#statsmodels.regression.linear_model.GLSAR) — Generalized Least Squares with AR covariance structure (обобщенный метод наименьших квадратов, ковариационная структура с автокорреляцией — экспериментальный метод)

  • класс RecurciveLS (https://www.statsmodels.org/stable/examples/notebooks/generated/recursive_ls.html) — Recursive least squares (рекурсивный метод наименьших квадратов) (https://en.wikipedia.org/wiki/Recursive_least_squares_filter)

  • классы RollingOLS (https://www.statsmodels.org/stable/generated/statsmodels.regression.rolling.RollingOLS.html#statsmodels.regression.rolling.RollingOLS) и RollingWLS (https://www.statsmodels.org/stable/generated/statsmodels.regression.rolling.RollingWLS.html#statsmodels.regression.rolling.RollingWLS) — скользящая регрессия (https://www.statsmodels.org/stable/examples/notebooks/generated/rolling_ls.html, https://help.fsight.ru/ru/mergedProjects/lib/01_regression_models/rolling_regression.htm)

    и т.д.

Так как исходные данные подчиняются нормальному закону распределения и аномальные значения (выбросы) отсутствуют, воспользуемся для оценки параметров обычным методом наименьших квадратов (класс OLS):

model_linear_ols = smf.ols(formula='Y ~ X', data=dataset_df)
result_linear_ols = model_linear_ols.fit()
print(result_linear_ols.summary())

Альтернативная форма выдачи результатов:

print(result_linear_ols.summary2())

Результаты построения модели мы получаем как класс statsmodels.regression.linear_model.RegressionResults (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.html#statsmodels.regression.linear_model.RegressionResults).

Экспресс-выводы, которые мы можем сразу сделать из результатов построения модели:

  1. Коэффициенты регрессии модели Y = b0 + b1∙X:

    • Intercept = b0 = -21.3741

    • b1 = 0.0129

  2. Коэффициент детерминации R-squared = 0.776, его скорректированная оценка Adj. R-squared = 0.757 — это означает, что регрессионная модуль объясняет 75.75% вариации переменной Y.

  3. Проверка значимости коэффициента детерминации:

    • расчетное значение статистики критерия Фишера: F-statistic = 41.61

    • расчетный уровень значимости Prob (F-statistic) = 3.16e-05

    • так как значение Prob (F-statistic) < 0.05, то нулевая гипотеза R-squared = 0 НЕ ПРИНИМАЕТСЯ, т.е. коэффициент детерминации ЗНАЧИМ

  4. Проверка значимости коэффициентов регрессии:

    • расчетный уровень значимости P>|t| не превышает 0.05 — это означает, что оба коэффициента регрессии значимы

    • об этом же свидетельствует то, что доверительный интервал для обоих коэффициентов регрессии ([0.025; 0.975]) не включает в себя точку 0

    Также в таблице результатов содержится прочая информация по коэффициентам регрессии: стандартная ошибка Std.Err. расчетное значение статистики критерия Стьюдента t для проверки гипотезы о значимости.

  5. Анализ остатков модели:

    • Тест Omnibus — про этот тест подробно написано в https://en.wikipedia.org/wiki/Omnibus_test, https://medium.com/swlh/interpreting-linear-regression-through-statsmodels-summary-4796d359035a, http://work.thaslwanter.at/Stats/html/statsModels.html.

      Расчетное значение статистики критерия Omnibus = 3.466 — по сути расчетное значение F-критерия (см. https://en.wikipedia.org/wiki/Omnibus_test).

      Prob(Omnibus) = 0.177 — показывает вероятность нормального распределения остатков (значение 1 указывает на совершенно нормальное распределение).

      Учитывая, что в дальнейшем мы проверим нормальность распределения остатков по совокупности различных тестов, в том числе с достаточно высокой мощностью, и все тесты позволят принять гипотезу о нормальном распределении — в данном случае к тесту Omnibus возникают вопросы. С этим тестом нужно разбираться отдельно.

    • Skew = 0.014 и Kurtosis = 1.587 — показатели асимметрии и эксцесса остатков свидетельствуют, что распределение остатков практически симметричное, островершинное.

    • проверка нормальности распределения остатков по критерию Харке-Бера: расчетное значение статистики критерия Jarque-Bera (JB) = 1.164 и расчетный уровень значимости Prob(JB) = 0.559. К данным результатам также возникают вопросы, особенно, если учесть, что критерий Харке-Бера является асимптотическим, расчетное значение имеет распределение хи-квадрат, поэтому данный критерий рекомендуют применять только для больших выборок (см. https://en.wikipedia.org/wiki/Jarque–Bera_test). Проверку нормальности распределения остатков модели лучше проводить с использованием набора стандартных статистических тестов python (см. далее).

  6. Проверка автокорреляции по критерию Дарбина-Уотсона: Durbin-Watson = 1.443.

    Мы не будем здесь разбирать данный критерий, так как явление автокорреляции больше характерно для данных, выражаемых в виде временных рядов. Однако, для грубой оценки считается, что при расчетном значении статистики криетрия Дарбина=Уотсона а интервале [1; 2] автокорреляция отсутствует (см.https://en.wikipedia.org/wiki/Durbin–Watson_statistic).

    Более подробно про критерий Дарбина-Уотсона — см. [1, с.659].

Прочая информация, которую можно извлечь из результатов построения модели:

  1. Covariance Type — тип ковариации, подробнее см. https://habr.com/ru/post/681218/, https://towardsdatascience.com/simple-explanation-of-statsmodel-linear-regression-model-summary-35961919868b#:~:text=Covariance type is typically nonrobust,with respect to each other.

  2. Scale — масштабный коэффициент для ковариационной матрицы (https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.scale.html#statsmodels.regression.linear_model.RegressionResults.scale), равен величине Mean squared error (MSE) (cреднеквадратической ошибке), об подробнее см. далее, в разделе про ошибки аппроксимации моделей.

  3. Показатели сравнения качества различных моделей:

    • Log-Likelihood — логарифмическая функция правдоподобия, подробнее см. https://en.wikipedia.org/wiki/Likelihood_function#Log-likelihood, https://habr.com/ru/post/433804/

    • AIC — информационный критерий Акаике (Akaike information criterion), подробнее см. https://en.wikipedia.org/wiki/Akaike_information_criterion

    • BIC — информационный критерий Байеса (Bayesian information criterion), подробнее см. https://en.wikipedia.org/wiki/Bayesian_information_criterion

    В данной статье мы эти показатели рассматривать не будем, так как задача выбора одной модели из нескольких перед нами не стоит.

  4. Число обусловленности Cond. No = 96792 используется для проверки мультиколлинеарности (считается, что мультиколлинеарность есть, если значение Cond. No > 30) (см. http://work.thaslwanter.at/Stats/html/statsModels.html). В нашем случае парной регрессионной модели о мультиколлинеарности речь не идет.

Далее будем извлекать данные из стандартного набора выдачи результатов и анализировать их более подробно. Последующие этапы вовсе не обязательно проводить в полном объеме при решении задач, но здесь мы рассмотрим их подробно.

Параметры и уравнение регрессионной модели

Извлечем параметры полученной модели — как свойство params модели:

print('Параметры модели: n', result_linear_ols.params, type(result_linear_ols.params))

Имея параметры модели, можем формализовать уравнение модели Y = b0 + b1*X:

b0 = result_linear_ols.params['Intercept']
b1 = result_linear_ols.params['X']
Y_calc = lambda x: b0 + b1*x

График регрессионной модели

Для построения графиков регрессионных моделей можно воспользоваться стандартными возможностями библиотек statsmodels, seaborn, либо создать пользовательскую функцию — на усмотрение исследователя:

1. Построение графиков регрессионных моделей с использованием библиотеки statsmodels

С помощью функции statsmodels.graphics.plot_fit (https://www.statsmodels.org/stable/generated/statsmodels.graphics.regressionplots.plot_fit.html#statsmodels.graphics.regressionplots.plot_fit) — отображается график Y and Fitted vs.X (фактические и расчетные значения Y с доверительным интервалом для каждого значения Y):

fig, ax = plt.subplots(figsize=(297/INCH, 210/INCH))
fig = sm.graphics.plot_fit(
    result_linear_ols, 'X',
    vlines=True,    # это параметр отвечает за отображение доверительных интервалов для Y
    ax=ax)
ax.set_ylabel(Variable_Name_Y)
ax.set_xlabel(Variable_Name_X)
ax.set_title(Task_Project)
plt.show()

С помощью функции statsmodels.graphics.plot_regress_exog (https://www.statsmodels.org/stable/generated/statsmodels.graphics.regressionplots.plot_regress_exog.html#statsmodels.graphics.regressionplots.plot_regress_exog) — отображается область 2х2, которая содержит:

  • предыдущий график Y and Fitted vs.X;

  • график остатков Residuals versus X;

  • график Partial regression plot — график частичной регрессии, пытается показать эффект добавления другой переменной в модель, которая уже имеет одну или несколько независимых переменных (более подробно см. https://en.wikipedia.org/wiki/Partial_regression_plot);

  • график CCPR Plot (Component-Component plus Residual Plot) — еще один способ оценить влияние одной независимой переменной на переменную отклика, принимая во внимание влияние других независимых переменных (более подробно — см. https://towardsdatascience.com/calculating-price-elasticity-of-demand-statistical-modeling-with-python-6adb2fa7824d, https://www.kirenz.com/post/2021-11-14-linear-regression-diagnostics-in-python/linear-regression-diagnostics-in-python/).

fig = plt.figure(figsize=(297/INCH, 210/INCH))
sm.graphics.plot_regress_exog(result_linear_ols, 'X', fig=fig)
plt.show()

2. Построение графиков регрессионных моделей с использованием библиотеки seaborn

Воспользуемся модулем regplot библиотеки seaborn (https://seaborn.pydata.org/generated/seaborn.regplot.html). Данный модуль позволяет визуализировать различные виды регрессии:

  • линейную

  • полиномиальную

  • логистическую

  • взвешенную локальную регрессию (LOWESS — Locally Weighted Scatterplot Smoothing) (см. http://www.machinelearning.ru/wiki/index.php?title=Алгоритм_LOWESS, https://www.statsmodels.org/stable/generated/statsmodels.nonparametric.smoothers_lowess.lowess.html)

Более подробно про модуль regplot можно прочитать в статье: https://pyprog.pro/sns/sns_8_regression_models.html.

Есть более совершенный модуль lmplot (https://seaborn.pydata.org/generated/seaborn.lmplot.html), который объединяет в себе regplot и FacetGrid, но мы его здесь рассматривать не будем.

# создание рисунка (Figure) и области рисования (Axes)
fig = plt.figure(figsize=(297/INCH, 420/INCH/1.5))
ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
# заголовок рисунка (Figure)
title_figure = Task_Project
fig.suptitle(title_figure, fontsize = 18)
# заголовок области рисования (Axes)
title_axes_1 = 'Линейная регрессионная модель'
ax1.set_title(title_axes_1, fontsize = 16)
# график регрессионной модели
order_mod = 1    # порядок модели
#label_legend_regr_model = 'фактические данные'
sns.regplot(
    #data=dataset_df,
    x=X, y=Y,
    #x_estimator=np.mean,
    order=order_mod,
    logistic=False,
    lowess=False,
    robust=False,
    logx=False,
    ci=95,
    scatter_kws={'s': 30, 'color': 'red'},
    line_kws={'color': 'blue'},
    #label=label_legend_regr_model,
    ax=ax1)
ax1.set_ylabel(Variable_Name_Y)
ax1.legend()
# график остатков
title_axes_2 = 'График остатков'
ax2.set_title(title_axes_2, fontsize = 16)
sns.residplot(
    #data=dataset_df,
    x=X, y=Y,
    order=order_mod,
    lowess=False,
    robust=False,
    scatter_kws={'s': 30, 'color': 'darkorange'},
    ax=ax2)
ax2.set_xlabel(Variable_Name_X)

plt.show()

3. Построение графиков регрессионных моделей с помощью пользовательской функции

# Пользовательская функция
graph_regression_plot_sns(
    X, Y,
    regression_model=Y_calc,
    Xmin=Xmin_graph, Xmax=Xmax_graph,
    Ymin=Ymin_graph, Ymax=Ymax_graph,
    title_figure=Task_Project,
    x_label=Variable_Name_X,
    y_label=Variable_Name_Y,
    label_legend_regr_model=f'линейная регрессия Y = {b0:.3f} + {b1:.4f}*X',
    s=80,
    file_name='graph/regression_plot_lin.png')

Статистический анализ регрессионной модели

1. Расчет ошибки аппроксимации (Error Metrics)

Ошибки аппроксимации (Error Metrics) позволяют получить общее представление о качестве модели, а также позволяют сравнивать между собой различные модели.

Создадим пользовательскую функцию, которая рассчитывает основные ошибки аппроксимации для заданной модели:

  • Mean squared error (MSE) или Mean squared deviation (MSD) — среднеквадратическая ошибка (https://en.wikipedia.org/wiki/Mean_squared_error):

  • Root mean square error (RMSE) или Root mean square deviation (RMSD) — квадратный корень из MSE (https://en.wikipedia.org/wiki/Root-mean-square_deviation):

  • Mean absolute error (MAE) — средняя абсолютная ошибка (https://en.wikipedia.org/wiki/Mean_absolute_error):

  • Mean squared prediction error (MSPE) — среднеквадратическая ошибка прогноза (среднеквадратическая ошибка в процентах) (https://en.wikipedia.org/wiki/Mean_squared_prediction_error):

  • Mean absolute percentage error (MAPE) — средняя абсолютная ошибка в процентах (https://en.wikipedia.org/wiki/Mean_absolute_percentage_error):

Про выбор метрики см. также https://machinelearningmastery.ru/how-to-select-the-right-evaluation-metric-for-machine-learning-models-part-2-regression-metrics-d4a1a9ba3d74/.

# Пользовательская функция
def regression_error_metrics(model, model_name=''):
    model_fit = model.fit()
    Ycalc = model_fit.predict()
    n_fit = model_fit.nobs
    Y = model.endog
    
    MSE = (1/n_fit) * np.sum((Y-Ycalc)**2)
    RMSE = sqrt(MSE)
    MAE = (1/n_fit) * np.sum(abs(Y-Ycalc))
    MSPE = (1/n_fit) *  np.sum(((Y-Ycalc)/Y)**2)
    MAPE = (1/n_fit) *  np.sum(abs((Y-Ycalc)/Y))
        
    model_error_metrics = {
        'MSE': MSE,
        'RMSE': RMSE,
        'MAE': MAE,
        'MSPE': MSPE,
        'MAPE': MAPE}
    
    result = pd.DataFrame({
        'MSE': MSE,
        'RMSE': RMSE,
        'MAE': MAE,
        'MSPE': "{:.3%}".format(MSPE),
        'MAPE': "{:.3%}".format(MAPE)},
        index=[model_name])        
        
    return model_error_metrics, result

(model_error_metrics, result) = regression_error_metrics(model_linear_ols, model_name='linear_ols')
display(result)

В литературе по прикладной статистике нет единого мнения о допустимом размере относительных ошибок аппроксимации: в одних источниках допустимой считается ошибка 5-7%, в других она может быть увеличена до 8-10%, и даже до 15%.

Вывод: модель хорошо аппроксимирует фактические данные (относительная ошибка аппроксимации MAPE = 3.405% < 10%).

2. Дисперсионный анализ регрессионной модели (ДАРМ)

ДАРМ не входит в стандартную форму выдачи результатов Regression Results, однако я решил написать здесь о нем по двум причинам:

  1. Именно анализ дисперсии регрессионной модели, разложение этой дисперсии на составляющие дает фундаментальное представление о сути регрессии, а термины, используемые при ДАРМ, применяются на последующих этапах анализа.

  2. С терминами ДАРМ в литературе по прикладной статистике имеется некоторая путаница, в разных источниках они могут именоваться по-разному (см., например, [8, с.52]), поэтому, чтобы двигаться дальше, необходимо определиться с понятиями.

При ДАРМ общую вариацию результативного признака (Y) принято разделять на две составляющие — вариация, обусловленная регрессией и вариация, обусловленная отклонениями от регрессии (остаток), при этом в разных источниках эти термины могут именоваться и обозначаться по-разному, например:

  1. Вариация, обусловленная регрессией — может называться Explained sum of squares (ESS), Sum of Squared Regression (SSR) (https://en.wikipedia.org/wiki/Explained_sum_of_squares, https://towardsdatascience.com/anova-for-regression-fdb49cf5d684), Sum of squared deviations (SSD).

  2. Вариация, обусловленная отклонениями от регрессии (остаток) — может называться Residual sum of squares (RSS), Sum of squared residuals (SSR), Squared estimate of errors, Sum of Squared Error (SSE) (https://en.wikipedia.org/wiki/Residual_sum_of_squares, https://towardsdatascience.com/anova-for-regression-fdb49cf5d684); в отчественной практике также применяется термин остаточная дисперсия.

  3. Общая (полная) вариация — может называться Total sum of squares (TSS), Sum of Squared Total (SST) (https://en.wikipedia.org/wiki/Partition_of_sums_of_squares, https://towardsdatascience.com/anova-for-regression-fdb49cf5d684).

Как видим, путаница знатная:

  • в разных источниках под SSR могут подразумеваться различные показатели;

  • легко перепутать показатели ESS и SSE;

  • в библиотеке statsmodel также есть смешение терминов: для показателя Explained sum of squares используется свойство ess, а для показателя Sum of squared (whitened) residuals — свойство ssr.

Мы будем пользоваться системой обозначений, принятой в большинстве источников — SSR (Sum of Squared Regression), SSE (Sum of Squared Error), SST (Sum of Squared Total). Стандартная таблица ДАРМ в этом случае имеет вид:

Примечания:

  1. Здесь приведена таблица ДАРМ для множественной линейной регрессионной модели (МЛРМ), в нашем случае при ПЛРМ мы имеем частный случай p=1.

  2. Показатели Fcalc-ad и Fcalc-det — расчетные значения статистики критерия Фишера при проверке адекватности модели и значимости коэффициента детерминации (об этом — см.далее).

Более подробно про дисперсионный анализ регрессионной модели — см.[4, глава 3].

Класс statsmodels.regression.linear_model.RegressionResults позволяет нам получить данные для ANOVA (см. https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.html#statsmodels.regression.linear_model.RegressionResults) как свойства класса:

  1. Сумма квадратов, обусловленная регрессией / SSR (Sum of Squared Regression) — свойство ess.

  2. Сумма квадратов, обусловленная отклонением от регрессии / SSE (Sum of Squared Error) — свойство ssr.

  3. Общая (полная) сумма квадратов / SST (Sum of Squared Total) — свойство centered_tss.

  4. Кол-во наблюдений / Number of observations — свойство nobs.

  5. Число степеней свободы модели / Model degrees of freedom — равно числу переменных модели (за исключением константы, если она присутствует — свойство df_model.

  6. Среднеквадратичная ошибка модели / Mean squared error the model — сумма квадратов, объясненная регрессией, деленная на число степеней свободы регрессии — свойство mse_model.

  7. Среднеквадратичная ошибка остатков / Mean squared error of the residuals — сумма квадратов остатков, деленная на остаточные степени свободы — свойство mse_resid.

  8. Общая среднеквадратичная ошибка / Total mean squared error — общая сумма квадратов, деленная на количество наблюдений — свойство mse_total.

Также имеется модуль statsmodels.stats.anova.anova_lm, который позволяет получить результаты ДАРМ (нескольких типов — 1, 2, 3):

# тип 1
print('The type of Anova test: 1')
display(sm.stats.anova_lm(result_linear_ols, typ=1))

# тип 2
print('The type of Anova test: 2')
display(sm.stats.anova_lm(result_linear_ols, typ=2))

# тип 3
print('The type of Anova test: 3')
display(sm.stats.anova_lm(result_linear_ols, typ=3))

На мой взгляд, форма таблица результатов statsmodels.stats.anova.anova_lm не вполне удобна, поэтому сформируем ее самостоятельно, для чего создадим пользовательскую функцию ANOVA_table_regression_model:

# Пользовательская функция
def ANOVA_table_regression_model(model_fit):
    n = int(model_fit.nobs)
    p = int(model_fit.df_model)
    SSR = model_fit.ess
    SSE = model_fit.ssr
    SST = model_fit.centered_tss

    result = pd.DataFrame({
        'sources_of_variation': ('regression (SSR)', 'deviation from regression (SSE)', 'total (SST)'),
        'sum_of_squares': (SSR, SSE, SST),
        'degrees_of_freedom': (p, n-p-1, n-1)})
    result['squared_error'] = result['sum_of_squares'] / result['degrees_of_freedom']
    R2 = 1 - result.loc[1, 'sum_of_squares'] / result.loc[2, 'sum_of_squares']
    F_calc_adequacy = result.loc[2, 'squared_error'] / result.loc[1, 'squared_error']
    F_calc_determ_check = result.loc[0, 'squared_error'] / result.loc[1, 'squared_error']
    result['F-ratio'] = (F_calc_determ_check, F_calc_adequacy, '')
    
    return result

result = ANOVA_table_regression_model(result_linear_ols)
display(result)
print(f"R2 = 1 - SSE/SST = {1 - result.loc[1, 'sum_of_squares'] / result.loc[2, 'sum_of_squares']}")
print(f"F_calc_adequacy = MST / MSE = {result.loc[2, 'squared_error'] / result.loc[1, 'squared_error']}")
print(f"F_calc_determ_check = MSR / MSE = {result.loc[0, 'squared_error'] / result.loc[1, 'squared_error']}")

ДАРМ позволяет визуализировать вариацию:

fig, axes = plt.subplots(figsize=(210/INCH, 297/INCH/1.5))
axes.pie(
    (result.loc[0, 'sum_of_squares'], result.loc[1, 'sum_of_squares']), 
    labels=(result.loc[0, 'sources_of_variation'], result.loc[1, 'sources_of_variation']),
    autopct='%.1f%%',
    startangle=60)
plt.show()

На основании данных ДАРМ мы рассчитали ряд показателей (R2, Fcalc-ad и Fcalc-det), которые будут использоваться в дальнейшем.

3. Анализ остатков (проверка нормальности распределения остатков и гипотезы о равенстве нулю среднего значения остатков)

Проверка нормальности распределения остатков — один их важнейших этапов анализа регрессионной модели. Требование нормальности распределения остатков не требуется для отыскания параметров модели, но необходимо в дальнейшем для проверки статистических гипотез с использованием критериев Фишера и Стьюдента (проверка адекватности модели, значимости коэффициента детерминации, значимости коэффициентов регрессии) и построения доверительных интервалов [5, с.122].

Остатки регрессионной модели:

print('Остатки регрессионной модели:n', result_linear_ols.resid, type(result_linear_ols.resid))
res_Y = np.array(result_linear_ols.resid)

statsmodels может выдавать различные преобразованные виды остатков (см. https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.resid_pearson.html, https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.wresid.html).

График остатков:

# Пользовательская функция
graph_scatterplot_sns(
    X, res_Y,
    Xmin=Xmin_graph, Xmax=Xmax_graph,
    Ymin=-3.0, Ymax=3.0,
    color='red',
    #title_figure=Task_Project,
    title_axes='Остатки линейной регрессионной модели', title_axes_fontsize=18,
    x_label=Variable_Name_X,
    y_label='ΔY = Y - Ycalc',
    s=75,
    file_name='graph/residuals_plot_sns.png')

Проверка нормальности распределения остатков:

# Пользовательская функция
graph_hist_boxplot_probplot_sns(
    data=res_Y,
    data_min=-2.5, data_max=2.5,
    graph_inclusion='bp',
    data_label='ΔY = Y - Ycalc',
    #title_figure=Task_Project,
    title_axes='Остатки линейной регрессионной модели', title_axes_fontsize=16,
    file_name='graph/residuals_hist_boxplot_probplot_sns.png')    

norm_distr_check(res_Y)

Вывод: большинство статистических тестов позволяют принять гипотезу о нормальности распределения остатков.

Проверка гипотезы о равенстве нулю среднего значения остатков — так как остатки имеют нормальное распределение, воспользуемся критерием Стьюдента (функция scipy.stats.ttest_1samp, https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html):

sps.ttest_1samp(res_Y, popmean=0)

Вывод: так как расчетный уровень значимости превышает заданный (0.05), то нулевая гипотеза о равенстве нулю остатков ПРИНИМАЕТСЯ.

4. Проверка адекватности модели

Суть проверки адекватности регрессионной модели заключается в сравнении полной дисперсии MST и остаточной дисперсии MSE — проверяется гипотеза о равенстве этих дисперсий по критерию Фишера. Если дисперсии различаются значимо, то модель считается адекватной. Более подробно про проверку адекватности регрессионной — см.[1, с.658], [2, с.49], [4, с.154].

Для проверки адекватности регрессионной модели создадим пользовательскую функцию regression_model_adequacy_check:

def regression_model_adequacy_check(
    model_fit,
    p_level: float=0.95,
    model_name=''):
    
    n = int(model_fit.nobs)
    p = int(model_fit.df_model)    # Число степеней свободы регрессии, равно числу переменных модели (за исключением константы, если она присутствует)
    
    SST = model_fit.centered_tss    # SST (Sum of Squared Total)
    dfT = n-1
    MST = SST / dfT

    SSE = model_fit.ssr    # SSE (Sum of Squared Error)
    dfE = n - p - 1
    MSE = SSE / dfE
    
    F_calc = MST / MSE
    F_table = sci.stats.f.ppf(p_level, dfT, dfE, loc=0, scale=1)
    a_calc = 1 - sci.stats.f.cdf(F_calc, dfT, dfE, loc=0, scale=1)
    conclusion_model_adequacy_check = 'adequacy' if F_calc >= F_table else 'adequacy'
    
    # формируем результат            
    result = pd.DataFrame({
        'SST': (SST),
        'SSE': (SSE),
        'dfT': (dfT),
        'dfE': (dfE),
        'MST': (MST),
        'MSE': (MSE),
        'p_level': (p_level),
        'a_level': (a_level),
        'F_calc': (F_calc),
        'F_table': (F_table),
        'F_calc >= F_table': (F_calc >= F_table),
        'a_calc': (a_calc),
        'a_calc <= a_level': (a_calc <= a_level),
        'adequacy_check': (conclusion_model_adequacy_check),
        },
        index=[model_name]
        )
    
    return result

regression_model_adequacy_check(result_linear_ols, p_level=0.95, model_name='linear_ols')

Вывод: модель является АДЕКВАТНОЙ.

5. Коэффициент детерминации и проверка его значимости

Различают несколько видов коэффициента детерминации:

  1. Собственно обычный коэффициент детерминации:

Его значение может быть получено как свойство rsquared модели.

  1. Скорректированный (adjusted) коэффициент детерминации — используется для того, чтобы была возможность сравнивать модели с разным числом признаков так, чтобы число регрессоров (признаков) не влияло на статистику R2, при его расчете используются несмещённые оценки дисперсий:

Его значение может быть получено как свойство rsquared_adj модели.

  1. Обобщённый (extended) коэффициент детерминации — используется для сравнения моделей регрессии со свободным членом и без него, а также для сравнения между собой регрессий, построенных с помощью различных методов: МНК, обобщённого метода наименьших квадратов (ОМНК), условного метода наименьших квадратов (УМНК), обобщённо-условного метода наименьших квадратов (ОУМНК). В данном разборе ПЛРМ рассматривать этот коэффициент мы не будем.

Более подробно с теорией вопроса можно ознакомиться, например: http://www.machinelearning.ru/wiki/index.php?title=Коэффициент_детерминации), а также в [7].

Значения коэффициента детерминации и скорректированного коэффициента детерминации, извлеченные с помощью свойств rsquared и rsquared_adj модели.

print('R2 =', result_linear_ols.rsquared)
print('R2_adj =', result_linear_ols.rsquared_adj)

Значимость коэффициента детерминации можно проверить по критерию Фишера [3, с.201-203; 8, с.83].

Расчетное значение статистики критерия Фишера может быть получено с помощью свойства fvalue модели:

print(f"result_linear_ols.fvalue = {result_linear_ols.fvalue}")

Расчетный уровень значимости при проверке гипотезы по критерию Фишера может быть получено с помощью свойства f_pvalue модели:

print(f"result_linear_ols.f_pvalue = {result_linear_ols.f_pvalue}")

Можно рассчитать уровень значимости самостоятельно (так сказать, для лучшего понимания и общей демонстрации возможностей) — для этого воспользуемся библиотекой scipy, модулем распределения Фишера scipy.stats.f, свойством cdf (функция распределения):

df1 = int(result_linear_ols.df_model)
df2 = int(result_linear_ols.nobs - result_linear_ols.df_model - 1)
F_calc = result_linear_ols.fvalue
a_calc = 1 - sci.stats.f.cdf(F_calc, df1, df2, loc=0, scale=1)
print(a_calc)

Как видим, результаты совпадают.

Табличное значение статистики критерия Фишера получить с помощью Regression Results нельзя. Рассчитаем его самостоятельно — для этого воспользуемся библиотекой scipy, модулем распределения Стьюдента scipy.stats.f, свойством ppf (процентные точки):

F_table = sci.stats.f.ppf(p_level, df1, df2, loc=0, scale=1)
print(F_table)

Для удобства создадим пользовательскую функцию determination_coef_check для проверки значимости коэффициента детерминации, которая объединяет все вышеперечисленные расчеты:

# Пользовательская функция
def determination_coef_check(
    model_fit,
    p_level: float=0.95):
    
    a_level = 1 - p_level
    
    R2 = model_fit.rsquared
    R2_adj = model_fit.rsquared_adj
    n = model_fit.nobs    # объем выборки
    p = model_fit.df_model    # Model degrees of freedom. The number of regressors p. Does not include the constant if one is present.
    
    F_calc = R2 / (1 - R2) * (n-p-1)/p
    df1 = int(p)
    df2 = int(n-p-1)
    F_table = sci.stats.f.ppf(p_level, df1, df2, loc=0, scale=1)
    a_calc = 1 - sci.stats.f.cdf(F_calc, df1, df2, loc=0, scale=1)
    conclusion_determ_coef_sign = 'significance' if F_calc >= F_table else 'not significance'
        
    # формируем результат            
    result = pd.DataFrame({
        'notation': ('R2'),
        'coef_value (R)': (sqrt(R2)),
        'coef_value_squared (R2)': (R2),
        'p_level': (p_level),
        'a_level': (a_level),
        'F_calc': (F_calc),
        'df1': (df1),
        'df2': (df2),
        'F_table': (F_table),
        'F_calc >= F_table': (F_calc >= F_table),
        'a_calc': (a_calc),
        'a_calc <= a_level': (a_calc <= a_level),
        'significance_check': (conclusion_determ_coef_sign),
        'conf_int_low': (''),
        'conf_int_high': ('')
        },
        index=['Coef. of determination'])
    return result

determination_coef_check(
    result_linear_ols,
    p_level=0.95)

Вывод: коэффициент детерминации ЗНАЧИМ.

6. Коэффициенты регрессии и проверка их значимости

Ранее мы уже извлекли коэффициенты регрессии как параметры модели b0 и b1 (как свойство params модели). Также можно получить их значения, как свойство bse модели:

print(b0, b1)
print(result_linear_ols.bse, type(result_linear_ols.bse))

Значимость коэффициентов регрессии можно проверить по критерию Стьюдента [3, с.203-212; 8, с.78].

Расчетные значения статистики критерия Стьюдента могут быть получены с помощью свойства tvalues модели:

print(f"result_linear_ols.tvalues = n{result_linear_ols.tvalues}")

Расчетные значения уровня значимости при проверке гипотезы по критерию Стьюдента могут быть получены с помощью свойства pvalues модели:

print(f"result_linear_ols.pvalues = n{result_linear_ols.pvalues}")

Доверительные интервалы для коэффициентов регрессии могут быть получены с помощью свойства conf_int модели:

print(result_linear_ols.conf_int(), 'n')

Можно рассчитать уровень значимости самостоятельно (как ранее для критерия Фишера — для лучшего понимания и общей демонстрации возможностей) — для этого воспользуемся библиотекой scipy, модулем распределения Стьюдента scipy.stats.t, свойством cdf (функция распределения):

t_calc = result_linear_ols.tvalues
df = int(result_linear_ols.nobs - result_linear_ols.df_model - 1)
a_calc = 2*(1-sci.stats.t.cdf(abs(t_calc), df, loc=0, scale=1))
print(a_calc)

Как видим, результаты совпадают.

Табличные значения статистики критерия Стьюдента получить с помощью Regression Results нельзя. Рассчитаем их самостоятельно — для этого воспользуемся библиотекой scipy, модулем распределения Стьюдента scipy.stats.t, свойством ppf (процентные точки):

t_table = sci.stats.t.ppf((1 + p_level)/2 , df)
print(t_table)

Для удобства создадим пользовательскую функцию regression_coef_check для проверки значимости коэффициентов регрессии, которая объединяет все вышеперечисленные расчеты:

def regression_coef_check(
    model_fit,
    notation_coef: list='',
    p_level: float=0.95):
    
    a_level = 1 - p_level
    
    # параметры модели (коэффициенты регрессии)
    model_params = model_fit.params
    # стандартные ошибки коэффициентов регрессии
    model_bse = model_fit.bse
    # проверка гипотезы о значимости регрессии
    t_calc = abs(model_params) / model_bse
    n = model_fit.nobs    # объем выборки
    p = model_fit.df_model    # Model degrees of freedom. The number of regressors p. Does not include the constant if one is present.
    df = int(n - p - 1)
    t_table = sci.stats.t.ppf((1 + p_level)/2 , df)
    a_calc = 2*(1-sci.stats.t.cdf(t_calc, df, loc=0, scale=1))
    conclusion_ = ['significance' if elem else 'not significance' for elem in (t_calc >= t_table).values]
        
    # доверительный интервал коэффициента регрессии
    conf_int_low = model_params - t_table*model_bse
    conf_int_high = model_params + t_table*model_bse
    
    # формируем результат            
    result = pd.DataFrame({
        'notation': (notation_coef),
        'coef_value': (model_params),
        'std_err': (model_bse),
        'p_level': (p_level),
        'a_level': (a_level),
        't_calc': (t_calc),
        'df': (df),
        't_table': (t_table),
        't_calc >= t_table': (t_calc >= t_table),
        'a_calc': (a_calc),
        'a_calc <= a_level': (a_calc <= a_level),
        'significance_check': (conclusion_),
        'conf_int_low': (conf_int_low),
        'conf_int_high': (conf_int_high),
        })
    
    return result

regression_coef_check(
    result_linear_ols,
    notation_coef=['b0', 'b1'],
    p_level=0.95)

Вывод: коэффициенты регрессии b0 и b1 ЗНАЧИМЫ.

7. Проверка гетероскедастичности

Для проверка гетероскедастичности statsmodels предлагает нам следующие инструменты:

  • тест Голдфелда-Квандта (https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.het_goldfeldquandt.html#statsmodels.stats.diagnostic.het_goldfeldquandt) — теорию см. [8, с.178], также https://ru.wikipedia.org/wiki/Тест_Голдфелда_—_Куандта.

  • тест Бриша-Пэгана (Breush-Pagan test) (https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.het_breuschpagan.html#statsmodels.stats.diagnostic.het_breuschpagan) — теорию см.[8, с.179], также https://en.wikipedia.org/wiki/Breusch–Pagan_test.

  • тест Уайта (White test) (https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.het_white.html#statsmodels.stats.diagnostic.het_white) — теорию см.[8, с.177], а также https://ru.wikipedia.org/wiki/Тест_Уайта.

    Тест Голдфелда-Квандта (Goldfeld–Quandt test)

# тест Голдфелда-Квандта (Goldfeld–Quandt test)
test = sms.het_goldfeldquandt(result_linear_ols.resid, result_linear_ols.model.exog)
test_result = lzip(['F_calc', 'p_calc'], test)    # распаковка результатов теста
# расчетное значение статистики F-критерия
F_calc_tuple = test_result[0]
F_calc = F_calc_tuple[1]
print(f"Расчетное значение статистики F-критерия: F_calc = {round(F_calc, DecPlace)}")
# расчетный уровень значимости
p_calc_tuple = test_result[1]
p_calc = p_calc_tuple[1]
print(f"Расчетное значение доверительной вероятности: p_calc = {round(p_calc, DecPlace)}")
#a_calc = 1 - p_value
#print(f"Расчетное значение уровня значимости: a_calc = 1 - p_value = {round(a_calc, DecPlace)}")
# вывод
if p_calc < a_level:
    conclusion_GQ_test = f"Так как p_calc = {round(p_calc, DecPlace)} < a_level = {round(a_level, DecPlace)}" + 
        ", то дисперсии в подвыборках отличаются значимо, т.е. гипотеза о наличии гетероскедастичности ПРИНИМАЕТСЯ"
else:
    conclusion_GQ_test = f"Так как p_calc = {round(p_calc, DecPlace)} >= a_level = {round(a_level, DecPlace)}" + 
        ", то дисперсии в подвыборках отличаются незначимо, т.е. гипотеза о наличии гетероскедастичности ОТВЕРГАЕТСЯ"
print(conclusion_GQ_test)

Для удобства создадим пользовательскую функцию Goldfeld_Quandt_test:

def Goldfeld_Quandt_test(
    model_fit,
    p_level: float=0.95,
    model_name=''):
    
    a_level = 1 - p_level
    
    # реализация теста
    test = sms.het_goldfeldquandt(model_fit.resid, model_fit.model.exog)
    test_result = lzip(['F_statistic', 'p_calc'], test)    # распаковка результатов теста
    # расчетное значение статистики F-критерия
    F_calc_tuple = test_result[0]
    F_statistic = F_calc_tuple[1]
    # расчетный уровень значимости
    p_calc_tuple = test_result[1]
    p_calc = p_calc_tuple[1]
    # вывод
    conclusion_test = 'heteroscedasticity' if p_calc < a_level else 'not heteroscedasticity'
    
    result = pd.DataFrame({
        'test': ('Goldfeld–Quandt test'),
        'p_level': (p_level),
        'a_level': (a_level),
        'F_statistic': (F_statistic),
        'p_calc': (p_calc),
        'p_calc < a_level': (p_calc < a_level),
        'heteroscedasticity_check': (conclusion_test)
        },
        index=[model_name])
    
    return result

Goldfeld_Quandt_test(result_linear_ols, p_level=0.95, model_name='linear_ols')

Тест Бриша-Пэгана (Breush-Pagan test)

# тест Бриша-Пэгана (Breush-Pagan test)
name = ["Lagrange multiplier statistic", "p-value", "f-value", "f p-value"]
test = sms.het_breuschpagan(result_linear_ols.resid, result_linear_ols.model.exog)
lzip(name, test)

Для удобства создадим пользовательскую функцию Breush_Pagan_test:

def Breush_Pagan_test(
    model_fit,
    p_level: float=0.95,
    model_name=''):
    
    a_level = 1 - p_level
    
    # реализация теста
    test = sms.het_breuschpagan(model_fit.resid, model_fit.model.exog)
    name = ['Lagrange_multiplier_statistic', 'p_calc_LM', 'F_statistic', 'p_calc']
    test_result = lzip(name, test)    # распаковка результатов теста
    # расчетное значение статистики теста множителей Лагранжа
    LM_calc_tuple = test_result[0]
    Lagrange_multiplier_statistic = LM_calc_tuple[1]
    # расчетный уровень значимости статистики теста множителей Лагранжа
    p_calc_LM_tuple = test_result[1]
    p_calc_LM = p_calc_LM_tuple[1]
    # расчетное значение F-статистики гипотезы о том, что дисперсия ошибки не зависит от x
    F_calc_tuple = test_result[2]
    F_statistic = F_calc_tuple[1]
    # расчетный уровень значимости F-статистики
    p_calc_tuple = test_result[3]
    p_calc = p_calc_tuple[1]
    # вывод
    conclusion_test = 'heteroscedasticity' if p_calc < a_level else 'not heteroscedasticity'

    # вывод
    conclusion_test = 'heteroscedasticity' if p_calc < a_level else 'not heteroscedasticity'
    
    result = pd.DataFrame({
        'test': ('Breush-Pagan test'),
        'p_level': (p_level),
        'a_level': (a_level),
        'Lagrange_multiplier_statistic': (Lagrange_multiplier_statistic),
        'p_calc_LM': (p_calc_LM),
        'p_calc_LM < a_level': (p_calc_LM < a_level),
        'F_statistic': (F_statistic),
        'p_calc': (p_calc),
        'p_calc < a_level': (p_calc < a_level),
        'heteroscedasticity_check': (conclusion_test)
        },
        index=[model_name])
    
    return result

Breush_Pagan_test(result_linear_ols, p_level=0.95, model_name='linear_ols')

Тест Уайта (White test)

# тест Уайта (White test)
name = ["Lagrange multiplier statistic", "p-value", "f-value", "f p-value"]
test = sms.het_white(result_linear_ols.resid, result_linear_ols.model.exog)
lzip(name, test)

Для удобства создадим пользовательскую функцию White_test:

def White_test(
    model_fit,
    p_level: float=0.95,
    model_name=''):
    
    a_level = 1 - p_level
    
    # реализация теста
    test = sms.het_white(model_fit.resid, model_fit.model.exog)
    name = ['Lagrange_multiplier_statistic', 'p_calc_LM', 'F_statistic', 'p_calc']
    test_result = lzip(name, test)    # распаковка результатов теста
    # расчетное значение статистики теста множителей Лагранжа
    LM_calc_tuple = test_result[0]
    Lagrange_multiplier_statistic = LM_calc_tuple[1]
    # расчетный уровень значимости статистики теста множителей Лагранжа
    p_calc_LM_tuple = test_result[1]
    p_calc_LM = p_calc_LM_tuple[1]
    # расчетное значение F-статистики гипотезы о том, что дисперсия ошибки не зависит от x
    F_calc_tuple = test_result[2]
    F_statistic = F_calc_tuple[1]
    # расчетный уровень значимости F-статистики
    p_calc_tuple = test_result[3]
    p_calc = p_calc_tuple[1]
    # вывод
    conclusion_test = 'heteroscedasticity' if p_calc < a_level else 'not heteroscedasticity'

    # вывод
    conclusion_test = 'heteroscedasticity' if p_calc < a_level else 'not heteroscedasticity'
    
    result = pd.DataFrame({
        'test': ('White test'),
        'p_level': (p_level),
        'a_level': (a_level),
        'Lagrange_multiplier_statistic': (Lagrange_multiplier_statistic),
        'p_calc_LM': (p_calc_LM),
        'p_calc_LM < a_level': (p_calc_LM < a_level),
        'F_statistic': (F_statistic),
        'p_calc': (p_calc),
        'p_calc < a_level': (p_calc < a_level),
        'heteroscedasticity_check': (conclusion_test)
        },
        index=[model_name])
    
    return result

White_test(result_linear_ols, p_level=0.95, model_name='linear_ols')

Объединим результаты всех тестов гетероскедастичность в один DataFrame:

Goldfeld_Quandt_test_df = Goldfeld_Quandt_test(result_linear_ols, p_level=0.95, model_name='linear_ols')
Breush_Pagan_test_df = Breush_Pagan_test(result_linear_ols, p_level=0.95, model_name='linear_ols')
White_test_df = White_test(result_linear_ols, p_level=0.95, model_name='linear_ols')

heteroscedasticity_tests_df = pd.concat([Breush_Pagan_test_df, White_test_df, Goldfeld_Quandt_test_df])
display(heteroscedasticity_tests_df)

Выводы

Итак, мы провели статистический анализ регрессионной модели и установили:

  • исходные данные имеют нормальное распределение;

  • между переменными имеется весьма сильная корреляционная связь;

  • регрессионная модель хорошо аппроксимирует фактические данные;

  • остатки модели имеют нормальное распределение;

  • регрессионная модель адекватна по критерию Фишера;

  • коэффициент детерминации значим по критеию Фишера;

  • коэффициенты регрессии значимы по критерию Стьюдента;

  • гетероскедастичность отсутствует.

Применительно к рассматриваемой задаче выполнять проверку автокорреляции не имеет особого смысла из-за особенностей исходных данных (результаты замеров прочности бетона на разных участках здания).

Про статистический анализ регрессионных моделей с помощью statsmodels— см. еще https://www.statsmodels.org/stable/examples/notebooks/generated/regression_diagnostics.html.

Доверительные интервалы регрессионной модели

Для регрессионных моделей определяют доверительные интервалы двух видов [3, с.184-192; 4, с.172; 8, с.205-209]:

  1. Доверительный интервал средних значений переменной Y.

  2. Доверительный интервал индивидуальных значений переменной Y.

При этом размер доверительного интервала для индивидуальных значений больше, чем для средних значений.

Доверительные интервалы регрессионных моделей (ДИРМ) могут быть найдены разными способами:

  • непосредственно путем расчетов по формулам (см., например, https://habr.com/ru/post/558158/);

  • с использованием инструментария библиотеки statsmodels (см., например, https://www.stackfinder.ru/questions/17559408/confidence-and-prediction-intervals-with-statsmodels).

Разбререм более подробно способ с использованием библиотеки statsmodels. Прежде всего, с помощью свойства summary_table класса statsmodels.stats.outliers_influence.OLSInfluence (https://www.statsmodels.org/stable/generated/statsmodels.stats.outliers_influence.OLSInfluence.html?highlight=olsinfluence) мы можем получить таблицу данных, содержащую необходимую нам информацию:

  • Dep Var Population — фактические значения переменной Y;

  • Predicted Value — предсказанные значения переменной Y по по регрессионной модели;

  • Std Error Mean Predict — среднеквадратическая ошибка предсказанного среднего;

  • Mean ci 95% low и Mean ci 95% upp — границы доверительного интервала средних значений переменной Y;

  • Predict ci 95% low и Predict ci 95% upp — границы доверительного интервала индивидуальных значений переменной Y;

  • Residual — остатки регрессионной модели;

  • Std Error Residual — среднеквадратическая ошибка остатков;

  • Student Residual — стьюдентизированные остатки (подробнее см. http://statistica.ru/glossary/general/studentizirovannie-ostatki/);

  • Cook’s D — Расстояние Кука (Cook’s distance) — оценивает эффект от удаления одного (рассматриваемого) наблюдения; наблюдение считается выбросом, если Di > 4/n (более подробно — см.https://translated.turbopages.org/proxy_u/en-ru.ru.f584ceb5-63296427-aded8f31-74722d776562/https/en.wikipedia.org/wiki/Cook’s_distance, http://www.machinelearning.ru/wiki/index.php?title=Расстояние_Кука).

from statsmodels.stats.outliers_influence import summary_table
st, data, ss2 = summary_table(result_linear_ols, alpha=0.05)
print(st, 'n', type(st))

В нашем случае критическое значение расстояния Кука равно:

print(f'D_crit = 4/n = {4/result_linear_ols.nobs}')

то есть выбросов, смещающих оценки коэффициентов регрессии, не наблюдается.

Мы получили данные как класс statsmodels.iolib.table.SimpleTable. Свойство data преобразует данные в список. Далее для удобства работы преобразуем данные в DataFrame:

  st_data_df = pd.DataFrame(st.data)

Будем использовать данный DataFrame в дальнейшем, несколько преобразуем его:

  • изменим наименование столбцов (с цифр на названия показателей из таблицы summary_table)

  • удалим строки с текстовыми значениями

  • изменим индекс

  • добавим новый столбец — значения переменной X

  • отсортируем по возрастанию значений переменной X (это необходимо, чтобы графики границ доверительных интервалов выглядели как линии)

st_df = st_data_df.copy()
# изменим наименования столбцов
str = st_df.iloc[0,0:] + ' ' + st_df.iloc[1,0:]
st_df = st_df.rename(str, axis='columns')
# удалим строки 0, 1
st_df = st_df.drop([0,1])
# изменим индекс
st_df = st_df.set_index(np.arange(0, result_linear_ols.nobs))
# добавим новый столбец - значения переменной X
st_df.insert(1, 'X', X)
# отсортируем по возрастанию значений переменной X
st_df = st_df.sort_values(by='X')

display(st_df)

С помощью полученных данных мы можем построить график регрессионной модели с доверительными интервалами:

# создание рисунка (Figure) и области рисования (Axes)
fig, axes = plt.subplots(figsize=(297/INCH, 210/INCH))
# заголовок рисунка (Figure)
title_figure = Task_Project
fig.suptitle(title_figure, fontsize = 16)
# заголовок области рисования (Axes)
title_axes = 'Линейная регрессионная модель'
axes.set_title(title_axes, fontsize = 14)
# фактические данные
sns.scatterplot(
    x=st_df['X'], y=st_df['Dep Var Population'],
    label='фактические данные',
    s=50,
    color='red',
    ax=axes)
# график регрессионной модели
label_legend_regr_model=f'линейная регрессия Y = {b0:.3f} + {b1:.4f}*X'
sns.lineplot(
    x=st_df['X'], y=st_df['Predicted Value'],
    label=label_legend_regr_model,
    color='blue',
    ax=axes)
# доверительный интервал средних значений переменной Y
Mean_ci_low = st_df['Mean ci 95% low']
plt.plot(
    st_df['X'], Mean_ci_low,
    color='magenta', linestyle='--', linewidth=1,
    label='доверительный интервал средних значений Y')
Mean_ci_upp = st_df['Mean ci 95% upp']
plt.plot(
    st_df['X'], Mean_ci_upp,
    color='magenta', linestyle='--', linewidth=1)
# доверительный интервал индивидуальных значений переменной Y
Predict_ci_low = st_df['Predict ci 95% low']
plt.plot(
    st_df['X'], Predict_ci_low,
    color='orange', linestyle='-.', linewidth=2,
    label='доверительный интервал индивидуальных значений Y')
Predict_ci_upp = st_df['Predict ci 95% upp']
plt.plot(
    st_df['X'], Predict_ci_upp,
    color='orange', linestyle='-.', linewidth=2)

axes.set_xlabel(Variable_Name_X)
axes.set_ylabel(Variable_Name_Y)
axes.legend(prop={'size': 12})
plt.show()

Однако, мы получили данные о границах доверительных интервалов регрессионной модели только в пределах области фактических значений переменной X. Как быть, если мы хотим распространить прогноз за пределы этой области?

Прогнозирование

Под прогнозированием мы в данном случае будем понимать определение значений переменной Y и доверительных интервалов для ее средних и индивидуальных значений при заданном X. По сути, нам предстоит построить аналог рассмотренной выше таблицы summary_table, только с другими значениями X, причем эти значения могут выходить за пределы тех значений, которые использовались нами для построения регрессии.

Методика расчета доверительных интервалов регрессионных моделей разобрана в статье «Python, корреляция и регрессия: часть 4» (https://habr.com/ru/post/558158/), всем рекомендую ознакомиться.

Найти прогнозные значения Y не представляет труда, так как ранее мы уже формализовали модель в виде лямбда-функции, а вот для построения доверительных интервалов придется выполнить расчеты по формулам. Для этого создадим пользовательскую функцию regression_pair_predict, которая в случае парной регрессии (pair regression) для заданного значения X возвращает:

  • прогнозируемое по регрессионной модели значение y_calc

  • доверительный интервал [y_calc_mean_ci_low, y_calc_mean_ci_upp] средних значений переменной Y

  • доверительный интервал [y_calc_predict_ci_low, y_calc_predict_ci_upp] индивидуальных значений переменной Y

Алгоритм расчета доверительных интервалов для множественной регрессии (multiple regression) отличается и в данном обзоре не рассматривается (рассмотрим в дальнейшем).

Про прогнозирование с помощью регрессионных моделей — см.также:

  • https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.RegressionResults.predict.html?highlight=predict#statsmodels.regression.linear_model.RegressionResults.predict

  • How to Make Predictions Using Regression Model in Statsmodels

  • https://www.statsmodels.org/stable/examples/notebooks/generated/predict.html

def regression_pair_predict(
    x_in,
    model_fit,
    regression_model,
    p_level: float=0.95):
    
    a_level = 1 - p_level
    
    X = pd.DataFrame(model_fit.model.exog)[1].values    # найти лучшее решение
    Y = model_fit.model.endog
    
    # вспомогательные величины
    n = int(result_linear_ols.nobs)
    SSE = model_fit.ssr    # SSE (Sum of Squared Error)
    dfE = n - p - 1
    MSE = SSE / dfE    # остаточная дисперсия
    
    Xmean = np.mean(X)
    SST_X = np.sum([(X[i] - Xmean)**2 for i in range(0, n)])
    
    t_table = sci.stats.t.ppf((1 + p_level)/2 , dfE)
    S2_y_calc_mean = MSE * (1/n + (x_in - Xmean)**2 / SST_X)
    S2_y_calc_predict = MSE * (1 + 1/n + (x_in - Xmean)**2 / SST_X)
        
    # прогнозируемое значение переменной Y
    y_calc=regression_model(x_in)
    # доверительный интервал средних значений переменной Y
    y_calc_mean_ci_low = y_calc - t_table*sqrt(S2_y_calc_mean)
    y_calc_mean_ci_upp = y_calc + t_table*sqrt(S2_y_calc_mean)
    # доверительный интервал индивидуальных значений переменной Y
    y_calc_predict_ci_low = y_calc - t_table*sqrt(S2_y_calc_predict)
    y_calc_predict_ci_upp = y_calc + t_table*sqrt(S2_y_calc_predict)
    
    result = y_calc, y_calc_mean_ci_low, y_calc_mean_ci_upp, y_calc_predict_ci_low, y_calc_predict_ci_upp
    
    return result

Сравним результаты расчета доверительных интервалов разными способами — с использованием функции regression_pair_predict и средствами statsmodels, для этого сформируем DaraFrame с новыми данными:

regression_pair_predict_df = pd.DataFrame(
    [regression_pair_predict(elem, result_linear_ols, regression_model=Y_calc) for elem in st_df['X'].values],
    columns=['y_calc', 'y_calc_mean_ci_low', 'y_calc_mean_ci_upp', 'y_calc_predict_ci_low', 'y_calc_predict_ci_upp'])
regression_pair_predict_df.insert(0, 'X', st_df['X'].values)
display(regression_pair_predict_df)

Видим, что результаты расчетов идентичны, следовательно мы можем использовать функцию regression_pair_predict для прогнозирования.

def graph_regression_pair_predict_plot_sns(
    model_fit,
    regression_model_in,
    Xmin=None, Xmax=None, Nx=10,
    Ymin_graph=None, Ymax_graph=None,
    title_figure=None, title_figure_fontsize=18,
    title_axes=None, title_axes_fontsize=16,
    x_label=None,
    y_label=None,
    label_fontsize=14, tick_fontsize=12, 
    label_legend_regr_model='', label_legend_fontsize=12,
    s=50, linewidth_regr_model=2,
    graph_size=(297/INCH, 210/INCH),
    result_output=True,
    file_name=None):
    
    # фактические данные
    X = pd.DataFrame(model_fit.model.exog)[1].values    # найти лучшее решение
    Y = model_fit.model.endog
    X = np.array(X)
    Y = np.array(Y)
    
    # границы
    if not(Xmin) and not(Xmax):
        Xmin=min(X)
        Xmax=max(X)
        Xmin_graph=min(X)*0.99
        Xmax_graph=max(X)*1.01
    else:
        Xmin_graph=Xmin
        Xmax_graph=Xmax
    
    if not(Ymin_graph) and not(Ymax_graph):
        Ymin_graph=min(Y)*0.99
        Ymax_graph=max(Y)*1.01       
    
    # формируем DataFrame данных
    Xcalc = np.linspace(Xmin, Xmax, num=Nx)
    Ycalc = regression_model_in(Xcalc)
    
    result_df = pd.DataFrame(
        [regression_pair_predict(elem, model_fit, regression_model=regression_model_in) for elem in Xcalc],
        columns=['y_calc', 'y_calc_mean_ci_low', 'y_calc_mean_ci_upp', 'y_calc_predict_ci_low', 'y_calc_predict_ci_upp'])
    result_df.insert(0, 'x_calc', Xcalc)
            
    # заголовки графика
    fig, axes = plt.subplots(figsize=graph_size)
    fig.suptitle(title_figure, fontsize = title_figure_fontsize)
    axes.set_title(title_axes, fontsize = title_axes_fontsize)
    
    # фактические данные
    sns.scatterplot(
        x=X, y=Y,
        label='фактические данные',
        s=s,
        color='red',
        ax=axes)
    
    # график регрессионной модели
    sns.lineplot(
        x=Xcalc, y=Ycalc,
        color='blue',
        linewidth=linewidth_regr_model,
        legend=True,
        label=label_legend_regr_model,
        ax=axes)
    
    # доверительный интервал средних значений переменной Y
    Mean_ci_low = result_df['y_calc_mean_ci_low']
    plt.plot(
        result_df['x_calc'], Mean_ci_low,
        color='magenta', linestyle='--', linewidth=1,
        label='доверительный интервал средних значений Y')
    
    Mean_ci_upp = result_df['y_calc_mean_ci_upp']
    plt.plot(
        result_df['x_calc'], Mean_ci_upp,
        color='magenta', linestyle='--', linewidth=1)
    
    # доверительный интервал индивидуальных значений переменной Y
    Predict_ci_low = result_df['y_calc_predict_ci_low']
    plt.plot(
        result_df['x_calc'], Predict_ci_low,
        color='orange', linestyle='-.', linewidth=2,
        label='доверительный интервал индивидуальных значений Y')
    
    Predict_ci_upp = result_df['y_calc_predict_ci_upp']
    plt.plot(
        result_df['x_calc'], Predict_ci_upp,
        color='orange', linestyle='-.', linewidth=2)
    
        
    axes.set_xlim(Xmin_graph, Xmax_graph)
    axes.set_ylim(Ymin_graph, Ymax_graph)        
    axes.set_xlabel(x_label, fontsize = label_fontsize)
    axes.set_ylabel(y_label, fontsize = label_fontsize)
    axes.tick_params(labelsize = tick_fontsize)
    #axes.tick_params(labelsize = tick_fontsize)
    axes.legend(prop={'size': label_legend_fontsize})
        
    plt.show()
    if file_name:
        fig.savefig(file_name, orientation = "portrait", dpi = 300)
        
    if result_output:
        return result_df
    else:
        return

graph_regression_pair_predict_plot_sns(
    model_fit=result_linear_ols,
    regression_model_in=Y_calc,
    Xmin=Xmin_graph-300, Xmax=Xmax_graph+200, Nx=25,
    Ymin_graph=Ymin_graph-5, Ymax_graph=Ymax_graph+5,
    title_figure=Task_Project, title_figure_fontsize=16,
    title_axes='Линейная регрессионная модель', title_axes_fontsize=14,
    x_label=Variable_Name_X,
    y_label=Variable_Name_Y,
    label_legend_regr_model=f'линейная регрессия Y = {b0:.3f} + {b1:.4f}*X',
    s=50,
    result_output=True,
    file_name='graph/regression_plot_lin.png')

Выводы и рекомендации

Исследована зависимость показаний ультразвукового прибора «ПУЛЬСАР-2.1» (X) и результатов замера прочности бетона (методом отрыва со скалыванием) склерометром ИПС-МГ4.03 (Y).

Между переменными имеется весьма сильная линейная корреляционная связь. Получена регрессионная модель:

Y = b0 + b1∙X = -21.3741 + 0.0129∙X

Модель хорошо аппроксимирует фактические данные, является адекватной, значимой и может использоваться для предсказания прочности бетона.

Также построен график прогноза с доверительными интервалами.

ИТОГИ

Итак, мы рассмотрели все этапы регрессионного анализа в случае простой линейной регрессии (simple linear regression) с использованием библиотеки statsmodels на конкретном практическом примере; подробно остановились на статистическом анализа модели с проверкой гипотез; также предложен ряд пользовательских функций, облегчающих работу исследователя и уменьшающих размер программного кода.

Конечно, мы разобрали далеко не все вопросы анализа регрессионных моделей и возможности библиотеки statsmodels применительно к simple linear regression, в частности статистики влияния (Influence Statistics), инструмент Leverage, анализ стьюдентизированных остатков и пр. — это темы для отдельных обзоров.

Исходный код находится в моем репозитории на GitHub.

Надеюсь, данный обзор поможет специалистам DataScience в работе.

This article is to tell you the whole interpretation of the regression summary table. There are many statistical softwares that are used for regression analysis like Matlab, Minitab, spss, R etc. but this article uses python. The Interpretation is the same for other tools as well. This article needs the basics of statistics including basic knowledge of regression, degrees of freedom, standard deviation, Residual Sum Of Squares(RSS), ESS, t statistics etc. 

In regression there are two types of variables i.e. dependent variable (also called explained variable) and independent variable (explanatory variable). 

The regression line used here is,

hat{Y}_{i}=-3.2002+0.7529 X_{i}

The summary table of the regression is given below.

                                    OLS Regression Results                            
        ==============================================================================
        Dep. Variable:                      y   R-squared:                       0.669
        Model:                            OLS   Adj. R-squared:                  0.667
        Method:                 Least Squares   F-statistic:                     299.2
        Date:                Mon, 01 Mar 2021   Prob (F-statistic):           2.33e-37
        Time:                        16:19:34   Log-Likelihood:                -88.686
        No. Observations:                 150   AIC:                             181.4
        Df Residuals:                     148   BIC:                             187.4
        Df Model:                           1                                         
        Covariance Type:            nonrobust                                         
        ==============================================================================
                         coef    std err          t      P>|t|      [0.025      0.975]
        ------------------------------------------------------------------------------
        const         -3.2002      0.257    -12.458      0.000      -3.708      -2.693
        x1             0.7529      0.044     17.296      0.000       0.667       0.839
        ==============================================================================
        Omnibus:                        3.538   Durbin-Watson:                   1.279
        Prob(Omnibus):                  0.171   Jarque-Bera (JB):                3.589
        Skew:                           0.357   Prob(JB):                        0.166
        Kurtosis:                       2.744   Cond. No.                         43.4
        ==============================================================================

Dependent variable: Dependent variable is one that is going to depend on other variables. In this regression analysis Y is our dependent variable because we want to analyse the effect of X on Y.

Model: The method of Ordinary Least Squares(OLS) is most widely used model due to its efficiency. This model gives best approximate of true population regression line. The principle of OLS is to minimize the square of errors ( ∑ei2 ).

Number of observations: The number of observation is the size of our sample, i.e. N = 150.

Degree of freedom(df) of residuals: 

Degree of freedom is the number of independent observations on the basis of which the sum of squares is calculated.

D.f Residuals = 150 – (1+1) = 148

Degree of freedom(D.f) is calculated as,      

 Degrees of freedom,  D . f  = N – K

Where, N = sample size(no. of observations) and  K = number of variables + 1

Df of model: 

Df of model = K – 1 = 2 – 1 = 1 ,

Where, K = number of variables + 1

Constant term: The constant terms is the intercept of the regression line. From regression line (eq…1) the intercept is -3.002. In regression we omits some independent variables that do not have much impact on the dependent variable, the intercept tells the average value of these omitted variables and noise present in model.

Coefficient term: The coefficient term tells the change in Y for a unit change in X  i.e if X rises by 1 unit then Y rises by 0.7529. If you are familiar with derivatives then you can relate it as the rate of change of Y with respect to X .

Standard error of parameters: Standard error is also called the standard deviation. Standard error shows the sampling variability of these parameters. Standard error is calculated by as – 
 

Standard error of intercept term (b1): 

s eleft(b_{1}right)=sqrt{left(frac{sum x_{i}^{2}}{n sumleft(x_{i}-bar{x}right)^{2}}right) sigma^{2}}

Standard error of coefficient term(b2): 

s eleft(b_{2}right)=sqrt{frac{sigma^{2}}{sumleft(x_{i}-bar{x}right)}}

Here,  σ2 is the Standard error of regression (SER) .  And σ2 is equal to RSS( Residual Sum Of Square i.e ∑ei2 ).

t – statistics: 

In theory, we assume that error term follows the normal distribution and because of this the parameters b1  and  b2 also have normal distributions with variance calculated in above section.

 That is , 

  • b1  ∼ N(B1, σb12)
  • b2   N(B2 , σb22)

Here B1 and B are true means of b1 and  b2.

t – statistics are calculated by assuming  following hypothesis – 

  • H : B = 0       ( variable X has no influence on Y)
  • H : B ≠ 0      (X has significant impact on Y)

Calculations for t – statistics :          

                     t = ( b1 – B1 ) / s.e (b1)

 From summary table , b1 = -3.2002 and se(b1) = 0.257, So,

                   t = (-3.2002 – 0) / 0.257  = -12.458

Similarly,  b2 = 0.7529 , se(b2) = 0.044

                   t = (0.7529 – 0) / 0.044  = 17.296

p – values: 

In theory, we read that p-value is the probability of obtaining the t statistics at least as contradictory to H as calculated from assuming that the null hypothesis is true. In the summary table, we can see that P-value for both parameters is equal to 0. This is not exactly 0, but since we have very larger statistics (-12.458 and 17.296) p-value will be approximately 0.

If you know about significance levels then you can see that we can reject the null hypothesis at almost every significance level.

Confidence intervals:

There are many approaches to test the hypothesis, including the p-value approach mentioned above. The confidence interval approach is one of them. 5% is the standard significance level (∝) at which C.I’s are made. 

C.I for B1 is ( b1 – t∝/2 s.e(b1) , b1 + t∝/2 s.e(b1) )

Since ∝ = 5 %, b1 = -3.2002, s.e(b1) =0.257 , from t table , t0.025,148 = 1.655,

After putting values the C.I for B1 is approx. ( -3.708 , -2.693 ). Same can be done for b2 as well.

While calculating p values we rejected the null hypothesis we can see same in C.I as well. Since 0 does not lie in any of the intervals so we will reject the null hypothesis. 

 R – squared value: 

R2 is the coefficient of determination that tells us that how much percentage variation independent variable can be explained by independent variable. Here, 66.9 % variation in Y can be explained by X. The maximum possible value of R2  can be 1, means the larger the R value better the regression.

F – statistic: 

F test tells the goodness of fit of a regression. The test is similar to the t-test or other tests we do for the hypothesis. The F – statistic is calculated as below –                    

F=frac{R^{2} /(k-1)}{left(1-R^{2}right) /(n-k)}

Inserting the values of R2, n and k, F = (0.669/1) / (0.331/148) = 229.12.

You can calculate the probability of F >229.1 for 1 and 148 df, which comes to approx. 0. From this, we again reject the null hypothesis stated above. 

The remaining terms are not often used. Terms like Skewness and Kurtosis tells about the distribution of data. Skewness and kurtosis for the normal distribution are 0 and 3 respectively. Jarque-Bera test is used for checking whether an error has normal distribution or not.  

Надежна ли ваша стандартная ошибка?


  Перевод


  Ссылка на автора

Практическое руководство по выбору правильной спецификации

Управляющее резюме

  • Проблема:Стандартные ошибки по умолчанию (SE), сообщаемые Stata, R и Python, являются правильными только при очень ограниченных обстоятельствах. В частности, эти программы предполагают, что ваша ошибка регрессии распределена независимо и одинаково. На самом деле это не так, что приводит к серьезным ошибкам типа 1 и типа 2 в тестах гипотез.
  • Лечение 1:если вы используете OLS, вы должны кластеризовать SE по двум параметрам: индивидуально по годам.
  • Лечение 2:если вы используете FE (фиксированный эффект), вы должны кластеризовать SE только на 1 измерение: индивидуальное.
  • коды: Вот это ссылка на коды Stata, R и SAS для реализации кластеризации SE.

Если вам интересно об этой проблеме, пожалуйста, продолжайте читать. В противном случае, увидимся в следующий раз :)

План на день

В этом посте я собрал бы 69-страничный документ о здравой стандартной ошибке в чит-лист. Эта бумага Опубликованный профессором Митчеллом Петерсеном в 2009 году, на сегодняшний день собрал более 7 879 ссылок. Это остается библией для выбора правильной здравой стандартной ошибки.

Проблема

Обычная практика

В любом классе Stats 101 ваш профессор мог бы научить вас набирать «reg Y X» в Stata или R:

Где я обозначаю человека; т обозначает метку времени т

Вы приступаете к проверке своей гипотезы с указанными точечными оценками и стандартной ошибкой. Но в 99% случаев это было бы неправильно.

Ловушка

Чтобы OLS давал объективные и непротиворечивые оценки, нам нужно, чтобы термин ошибки epsilon был распределен независимо и одинаково:

Независимый означает, что никакие серийные или взаимные корреляции не допускаются:

  • Последовательные корреляции:для одного и того же человека остатки в разные периоды времени коррелируют;
  • Кросс-корреляция:различные индивидуальные остатки коррелируются внутри и / или между периодами.

Одинаковый означает, что все остатки имеют одну и ту же дисперсию (например, гомоскедастичность).

Визуализация проблемы

Давайте визуализируем i.i.d. предположение в дисперсионно-ковариационной матрице.

  • Нет последовательной корреляции:все недиагональные записи в красных пузырьках должны быть 0;
  • Нет взаимной корреляции:все диагональные записи должны быть одинаковыми — все записи в зеленых прямоугольниках должны быть 0;
  • гомоскедастичность:диагональные записи должны быть одинаковыми константами.

Что не так, если вы используете SE по умолчанию без I.I.D. Ошибки?

Вывод выражения SE:

Стандартная ошибка по умолчанию — последняя строка в (3). Но чтобы получить от 1-й до последней строки, нам нужно сделать дополнительные предположения:

  • Нам нужно предположение о независимости, чтобы переместить нас с 1-й строки на 2-ю в (3). Визуально все записи в зеленых прямоугольниках И все недиагональные записи в красных пузырьках должны быть 0.
  • Нам нужно одинаково распределенное предположение, чтобы переместить нас со 2-й строки на 3-ю. Визуально все диагональные элементы должны быть точно такими же.

По умолчанию SE прав в ОЧЕНЬ ограниченных обстоятельствах!

Цена неправильного

Мы не знаем, будет ли заявленная SE переоценена или недооценена истинная SE. Таким образом, мы можем получить:

  • Статистически значимый результат, когда эффекта нет в реальности. В результате команде разработчиков программного обеспечения и продукта может потребоваться несколько часов работы над каким-либо прототипом, который никак не повлияет на итоговую прибыль компании.
  • Статистически незначимый результат, когда в действительности наблюдается значительный эффект. Это могло быть для тебя перерывом. Упущенная возможность Очень плохо :(

На самом деле ложный позитив более вероятен.Там нет недостатка в новичках машинного обучения студентов, заявляющих, что они нашли какой-то шаблон / сигнал, чтобы побить рынок. Однако после развертывания их модели работают катастрофически. Частично причина в том, что они никогда не думали о последовательной или взаимной корреляции остатков.

Когда это происходит, стандартная ошибка по умолчанию может быть в 11 раз меньше, чем истинная стандартная ошибка, что приводит к серьезной переоценке статистической значимости их сигнала.

Надежная стандартная ошибка на помощь!

Правильно заданная надежная стандартная ошибка избавит от смещения или, по крайней мере, улучшит его. Вооружившись серьезной стандартной ошибкой, вы можете безопасно перейти к этапу вывода.

Есть много надежных стандартных ошибок. Выбор неправильного средства может усугубить проблему!

Какую робастную стандартную ошибку я должен использовать?

Это зависит от дисперсионно-ковариантной структуры. Спросите себя, страдает ли ваш остаток от взаимной корреляции, последовательной корреляции или от того и другого? Напомним, что:

  • Кросс-корреляция:в течение одного и того же периода времени разные индивидуальные остатки могут быть коррелированы;
  • Последовательная корреляция:для одного и того же лица остатки за разные периоды времени могут быть коррелированы

Случай 1: Термин ошибки имеет отдельный конкретный компонент

Предположим, что это истинное состояние мира:

При условии независимости от отдельных лиц, правильная стандартная ошибка будет:

Сравните это с (3), у нас есть дополнительный член, который обведен красным. Превышение или недооценка сообщаемой стандартной ошибки OLS истинной стандартной ошибки зависит от знака коэффициентов корреляции, который затем увеличивается на число периодов времени T.

Где практическое руководство?

Основываясь на большем количестве теории и результатов моделирования, Петерсен показывает, что:

Вы не должны использовать:

  • Стандартные ошибки Fama-MacBeth:он предназначен для работы с последовательной корреляцией, а не с перекрестной корреляцией между отдельными фирмами.
  • Стандартные ошибки Ньюи-Уэста:он предназначен для учета последовательной корреляции неизвестной формы в остатках одного временного ряда.

Вы должны использовать:

  • Стандартные кластерные ошибки:в частности, вы должны объединить вашу стандартную ошибку по фирмам. Обратитесь к концу поста для кодов.

Случай 2: Термин ошибки имеет компонент, зависящий от времени

Предположим, что это истинное состояние мира:

Правильная стандартная ошибка по существу такая же, как (7), если вы поменяете N и T.

Вы должны использовать:

  • Стандартные ошибки Fama-MacBeth:так как это то, что он создан для Обратитесь к концу поста для кода Stata.

Случай 3: Термин «ошибка» имеет как твердое, так и временное влияние

Предположим, что это истинное состояние мира:

Вы должны использовать:

  • Кластерная стандартная ошибка:кластеризацию следует проводить по двум параметрам — по годам. Обратите внимание, что это не настоящие стандартные ошибки, они просто создают менее предвзятую стандартную ошибку. Смещение становится более выраженным, когда в одном измерении всего несколько кластеров.

коды

Подробные инструкции и тестовые данные Stata, R и SAS от Petersen можно найти Вот, Для моей собственной записи я собираю список кода Stata здесь:

Случай 1: кластеризация по 1 измерению

Регресс зависимая_вариантная независимая_вариабельная, надежный кластер (cluster_variable)

Случай 2: Фама-Макбет

tsset firm_identifier time_identifier

fm independent_variable independent_variables, byfm (by_variable)

Случай 3: кластеризация по двум измерениям

cluster2 зависимая_ переменная independent_variables, fcluster (cluster_variable_one) tcluster (cluster_variable_two)

Случай 4: фиксированный эффект + кластеризация

xtreg variable_variable independent_variables, надежный кластер (cluster_variable_one)

Наслаждайтесь своим недавно найденным крепким миром!

Кредит Фотографии: Хорошие Новости Филиппины

До следующего раза :)

  • Разделы статистического отчета
  • Дополнительные ресурсы

Результатами работы инструмента Метод наименьших квадратов являются:

Ниже представлено отображение и описание каждого из этих элементов в виде серии шагов от запуска МНК до интерпретации результатов его работы.

(A) Чтобы запустить инструмент МНК, укажите входной класс объектов с полем уникального ID, зависимую переменную, которую требуется смоделировать/объяснить/спрогнозировать, и список независимые значения. Кроме того, нужно будет указать путь к выходному классу объектов и, если это необходимо, пути к выходному файлу отчета, выходной таблице коэффициентов и выходной таблице диагностики.

Инструмент Метод наименьших квадратов

Диалоговое окно инструмента Метод наименьших квадратов

После запуска ГВР прежде всего вам захочется увидеть отчет ГВР, записанный в виде сообщений во время выполнения инструмента в файл, хранящийся по указанному вами в параметре Выходной файл отчета пути.

(B) Просмотрите сводный отчет, используя приведенные ниже инструкции:

Отчет OLS

Компоненты Статистического отчета о МНК

Разделы статистического отчета

  1. Оценка производительности модели. Оба значения Multiple R-Squared и Adjusted R-Squared являются показателями производительности модели. Возможные значения варьируются от 0.0 до 1.0. Значение Adjusted R-Squared всегда несколько ниже, нежели Multiple R-Squared, поскольку отражает сложность модели (количество переменных), что, в свою очередь, связано с целостностью данных, поэтому гораздо точнее отражает производительность модели. Добавление дополнительных независимых переменных в модель, как правило, повышает значение Multiple R-Squared, но понижает при этом значение Adjusted R-Squared. Предположим, вы создаете регрессионную модель домовых краж (количество домовых краж по каждому кварталу является зависимой переменной, y). Значение Adjusted R-Squared, равное 0,39 показывает, что ваша модель (или независимые переменные, cмоделированные с использованием линейной регрессии) объясняет порядка 39 процентов случаев поведения зависимой переменной. Иными словами, ваша модель описывает около 39% домовых краж.Производительность модели
    Значения R-Squared определяют производительность модели
  2. Оценка каждой независимой переменной в модели: Coefficient (коэффициент), Probability (Вероятность) или Robust Probability (Устойчивая вероятность) и Variance Inflation Factor (VIF) (Фактор, увеличивающий дисперсию). Коэффициент для каждой независимой переменной отражает силу и тип отношений между независимой и зависимой переменной. Если коэффициент отрицательный, отношения являются «негативными» (например, чем больше расстояние от центра города, тем меньше количество домовых краж). Если значение положительно, связь между показателями прямая (например, чем больше население, тем больше количество домовых краж). Коэффициенты приводятся в тех же единицах, что и связанные с ними независимые переменные (коэффициент 0.005 связан с переменной, представляющей численность населения, которую можно указать как 0.005 человек). Коэффициент отражает ожидаемое изменение в зависимой переменной для каждого изменения в связанной независимой переменной, хранящей все остальные константы переменных (например, при добавлении очередного жильца в квартал (который «хранит» все остальные независимые переменные), ожидается повышение значения домовых краж на 0,005). Тест T используется для проведения оценки того, являются ли независимые переменные значимыми. Нулевая гипотеза означает, что для всех случаев коэффициент близок к нулю (и, соответственно, не подходит для моделирования). В случаях, когда вероятность или устойчивая вероятность (p-значения) являются очень маленькими, шанс того, что коэффициент равен нулю, также невелик. Если тест Koenker (см. ниже) является статистически значимым, используйте значения устойчивой вероятности для оценки статистической значимости независимых переменных. Статистические значимости вероятности помечены звездочкой (*). Независимая переменная, связанная со статистически значимым коэффициентом, важна для модели регрессии, если теоретическое/часто встречаемое значение поддерживает корректное отношение с зависимой переменной, если моделируемое отношение является, в основном, линейным и если переменная не является избыточной для всех остальных независимых переменных в модели. Фактор, увеличивающий дисперсию (VIF), измеряет избыточность среди независимых переменных. По опыту, независимые переменные, связанные со значениями фактора VIF, больше, чем 7,5 должны быть удалены (по одному) из модели регрессии. Если, например, в модели имеется переменная населения (количество человек) и переменная трудящихся (количество работающих человек), явную связь между ними можно найти по высокому значению VIF, увеличивающего дисперсию, который показывает, что обе переменных говорят об одном и том же, следовательно, одну из них из модели можно удалить.Анализ независимых переменных
    Оценка того, какие переменные являются статистически значимыми.
  3. Оценка значимости модели. Показатели Соединенная F-статистика (Joint F-Statistic) и Соединенная статистика Вальда (Joint Wald Statistic) отвечают за общую статистическую значимость модели. Joint F-Statistic является надежным только в том случае, когда показатель Koenker (BP) statistic (см. ниже) не является статистически значимым. В противном случае желательно проанализировать Joint Wald Statistic, чтобы определить общую значимость модели. Нулевая гипотеза для обоих тестов подразумевает, что независимые переменные в модели являются неэффективными. Для уровня надежности в 95%, a p-значение (вероятность) менее 0.05 показывает статистическую значимость модели.Общая производительность модели
    Оценка общей статистической значимости регрессионной модели.
  4. Оценка стационарности. Статистика Кенкера (BP) (Koenker (BP) Statistic) (стьюдентизированная Кенкером статистика Бреуша-Пагана) – это тест на определение того, имеют ли независимые переменные в модели постоянную связь с зависимой переменной как в географическом пространстве, так и в пространстве данных. Если модель согласована в географическом пространстве, то процессы, представленные независимыми переменными, ведут себя одинаково по всей области исследования (являются стационарными). Если модель согласована в пространстве данных, то разница в отношениях между предсказанными значениями и каждой независимой переменной не меняется при изменении самой переменной (в модели нет гетероскедастичности). Предположим, вы хотите предсказать преступление, и на входе у вас есть одна независимая переменная. У модели будет сомнительная гетероскедастичность, если предсказания были более точными для участков с низкими значениями медианы, нежели для участков с большим значением. Нулевая гипотеза для этого теста заключается в том, что модель является стационарной. Для 95% уровня надежности p-значение (вероятность) менее 0.05 означает статистически значимую гетероскедастичность и/или нестационарность. В случае, когда результаты теста являются статистически значимыми, проанализируйте стандартные ошибки и вероятности коэффициента надежности для оценки эффективности каждой независимой переменной. Регрессионные модели со статистически значимой нестационарностью зачастую являются отличными данными для анализа Географически взвешенной регрессии (ГВР).Оценка стационарности и зависимости дисперсии от случайной величины
    Оценка стационарности: если критерий Кенкера статистически значимый (*), примите во внимание устойчивые вероятности, чтобы оценить, статистически значимые ваши независимые коэффициенты или нет.
  5. Оценка смещения модели. Статистика Жака-Бера (Jarque-Bera) показывает, являются ли невязки (полученные/известные зависимые переменные минус предсказанные/ожидаемые значения) нормально распределенными. Нулевая гипотеза для данного теста заключается в том, что невязки распределены нормально, поэтому, если вы построите для них гистограмму, она будет выглядеть как классическая колоколообразная кривая или Гауссово распределение. Когда p-значение (вероятность) для этого теста мала (например, менее 0.05 для 95% уровня надежности), невязки не распределены нормально, это значит, что модель смещена. Если у вас есть статистически значимая пространственная автокорреляция невязок (см. ниже), смещение может быть результатом ошибок спецификации модели (потеря ключевой переменной в модели). Результаты такой модели являются ненадежными. Статистически значимый тест Жака-Бера также может возникнуть, если вы пытаетесь смоделировать нелинейные отношения, а данные содержат значительные выбросы или сильно зависимы дисперсии от случайной величины.Результаты теста Жака-Бера
    Оценка смещения модели.
  6. Оценка пространственной автокорреляции невязок. Всегда запускайте инструмент Пространственная автокорреляция (Индекс Морана I) для невязок регрессии, чтобы убедиться, что они пространственно случайны. Статистически значимая кластеризация высоких и/или низких невязок (пере- или недооценка модели) показывает, что в модели потеряна ключевая переменная (ошибка спецификации). Результаты МНК не могут быть достоверными в таком случае.Оценка пространственного распределения остатков регрессии
    Используйте инструмент Пространственная автокорреляция, чтобы убедиться, что данные о невязках модели не являются пространственно автокоррелированными.
  7. Наконец, обратитесь к разделу Почему не работает модель регрессии в документации Основы регрессионного анализа, чтобы убедиться, что ваша модель настроена соответствующим образом. Если возникают трудности при поиске правильной модели регрессии, инструмент Исследовательская регрессия (Exploratory Regression) может оказаться полезным. Замечания по интерпретации в конце сводного отчета OLS напоминают о цели каждого статистического теста и помогают найти решения, если ваша модель не проходит один или несколько диагностических проверок. Замечания по интерпретации
    Отчет о МНК включает замечания, которые помогают интерпретировать выходные данные.

(C) Если вы указали путь к дополнительному выходному файлу отчета, создается PDF-файл со всей информацией в сводном отчете и дополнительными графиками, позволяющими оценить вашу модель. На первой странице отчета представлены сведения о каждой независимой переменной. Как и в первом разделе сводного отчета (см. пункт 2 выше), вы используете эту информацию, чтобы определить, являются ли коэффициенты для каждой независимой переменной статистически значимыми и содержат ли ожидаемый знак (+/-). Если критерий Кенкера статистически значимый (см. пункт 4 выше), то можно доверять только устойчивым вероятностям, чтобы оценить, помогает ли переменная вашей модели или нет. Статистически значимые коэффициенты содержат знак звездочки (*) рядом со своими p-значениями для вероятностей и/или столбцов устойчивой вероятности. По информации на этой странице также можно определить, являются ли независимые переменные избыточными (проблемная мультиколлинеарность). Если теория не говорит иное, независимые переменные с большими значениями Фактора увеличения дисперсии (VIF) следует удалить по одной, пока значения VIF для всех оставшихся независимых переменных не будут меньше 7,5.

Страница 1 отчета OLS

Раздел 1 выходного отчета

В следующей разделе выходного файла отчета перечисляются результаты диагностических проверок OLS. На этой странице также представлены замечания по интерпретации, описывающие необходимость каждой проверки. Если ваша модель не проходит одну из этих проверок, в таблице типичных проблем с регрессией можно найти серьезность каждой проблемы и возможный путь ее устранения. Графики на остальных страницах отчета также помогают вам выявить и устранить проблемы с моделью.

Страница 2 отчета OLS

Раздел 2 выходного отчета

В третьем разделе выходного файла отчета представлены гистограммы с распределением каждой переменной в модели, а также диаграммы рассеивания, показывающие отношения зависимой и независимой переменной. Если у вас возникают проблемы со смещением модели (это обозначается статистически значимым p-значением Жака-Бера), найдите в гистограммах распределения с асимметрией и попробуйте преобразовать эти переменные, чтобы увидеть, устраняет ли это смещение и улучшается ли производительность модели. Диаграммы рассеивания показывают, какие переменные являются лучшими предикторами. Используйте эти диаграммы рассеивания, чтобы проверить переменные на наличие нелинейных отношений. В некоторых случаях преобразование одной или нескольких переменных устраняет нелинейные отношения и смещение модели. Выбросы в данных также могут привести к получению смещенной модели. Проверьте гистограммы и диаграммы рассеивания на наличие таких данных или отношений. Попробуйте запустить модель с выбросами и без них, чтобы оценить, как они влияют на результаты. Вы можете обнаружить, что выброс – это некорректные данные (введенные или записанные с ошибкой) и сможете удалить связанный объект из набора данных. Если выброс отражает корректные данные и сильно влияет на результаты анализа, можно провести ваш анализ с выбросами и без них.

Страница 3 отчета OLS

Раздел 3 выходного отчета

После получения правильно настроенной модели переоценки и недооценки будут отражать случайный шум. Если вам нужно создать гистограмму случайного шума, обычно это кривая с нормальным распределением (в виде колокола). Четвертый раздел выходного файла отчета представляет гистограмму переоценок и недооценок модели. Полосы на гистограмме отображают фактическое распределение, а синяя линия сверху диаграммы показывает форму, которую бы приняла гистограмма, если остатки имели нормальное распределение. Вряд ли вы получите идеальные результаты, поэтому следует проверить тест Жака-Бера, чтобы определить, является ли отклонение от нормального распределение статистически значимым или нет.

Страница OLS 4

Раздел 4 выходного отчета

Диагностика Кенкера позволяет определить, меняются ли моделируемые отношения в изучаемой области (нестационарность) или зависят от величины переменной, которую вы пытаетесь предсказать (зависимость дисперсии от случайной величины). Географически взвешенная регрессия позволяет устранить проблемы с нестационарностью. На графике в разделе 5 файла выходного отчета будет показано, имеется ли проблема с зависимостью дисперсии от случайной величины. На диаграмме рассеивания (см. ниже) показано отношение остаточных и прогнозируемых значений модели. Предположим, вы моделируете частоту преступлений. Если на графике показана коническая форма с точкой слева и расширением справа от графика, это указывает на то, что ваша модель хорошо прогнозирует расположения с низкой частотой преступлений, и плохо прогнозирует расположения с высокой частотой преступлений.

Страница OLS 5

Раздел 5 выходного отчета

На последней странице отчета показаны все настройки параметров, использованные при создании отчета.

(D) Изучите невязки модели в выходном классе объектов. Пере- и недооценки для правильно настроенной модели регрессии будут распределены случайно. Кластеризация переоценок и/или недооценок является доказательством того, что потеряна как минимум одна независимая переменная. Проверьте «рисунок» невязок модели, чтобы посмотреть, не говорит ли он о том, какие переменные могли быть утеряны. Иногда запуск инструмента Анализ горячих точек (Hot Spot Analysis) для нее может помочь определить более общие закономерности. Дополнительные стратегии для обработки неправильно определенной модели см. в разделе Что вам не говорят о регрессионном анализе.

Картографическое представление невязок

Результат МНК: Картографическое представление невязок

(E) Просмотрите таблицы коэффициентов и диагностики. Создавать их необязательно. Если вы находитесь в процессе поиска эффективной модели, можно обойтись без них. Но этот процесс итеративен, поэтому может быть перепробовано огромное количество моделей (с разными независимыми переменными) до тех пор, пока не будет найдена лучшая. Вы можете использовать Скорректированный информационный критерий Акаике (Corrected Akaike Information Criterion (AICc)) в отчете, чтобы сравнить модели между собой. Модель с меньшим значением AICc лучше (то есть, наиболее точно отражает данные наблюдений).

Выходные данные AICc

Для сравнения регрессионных моделей можно использовать значение AICc.

Создание таблиц коэффициентов и диагностики для ваших итоговых моделей OLS позволяет фиксировать важные элементы отчета OLS. Таблица коэффициентов содержит список использованных в модели независимых переменных с их коэффициентами, стандартизированными коэффициентами, стандартными ошибками и вероятностями. Коэффициент представляет собой оценку того, насколько изменится зависимая переменная при изменении связанной с ней независимой переменной на 1 единицу. Единицы коэффициентов соответствуют независимым переменным. Если, например, у вас есть независимая переменная для общего количества населения, то и единица коэффициента для этой переменной будет отражать население; если другая независимая переменная будет для расстояния (в метрах) от железнодорожной станции, то единицы такого коэффициента будут отражать метры. Если эти коэффициенты конвертировать в среднеквадратические отклонения, то они будут называться стандартизированными коэффициентами. Стандартизированные коэффициенты могут использоваться для того, чтобы можно было сравнить силу влияния, которое имеют другие независимые переменные на зависимую переменную. Независимая переменная с наибольшим абсолютным значением стандартизированного коэффициента (т.е. после того, как вы отбросите знаки +/-) будет иметь наибольшую силу влияния на зависимую переменную. Следует иметь ввиду, что при интерпретации коэффициентов необходимо принимать в расчет стандартную ошибку. Стандартные ошибки указывают, насколько вероятно получить такие же коэффициенты при повторном отборе данных и перекалибровке модели множество раз. Большие значения стандартных ошибок для коэффициента означают, что в процессе повторов будет получен широкий диапазон возможных значений коэффициента; малые значения стандартных ошибок явно говорят о его постоянстве.

Таблица коэффициентов

Таблица коэффициентов включает вычисленные коэффициенты, стандартные ошибки и вероятности переменных.

Таблица диагностики содержит результаты для каждого теста, а также пояснения по интерпретации этих результатов.

Диагностика OLS

Таблица диагностики включает заметки об интерпретации результатов теста диагностики модели.

Дополнительные ресурсы

Существует целый ряд хороших ресурсов, которые помогут вам узнать больше о регрессии OLS на странице Ресурсы о пространственной статистике. Начните с чтения документации по Основы регрессионного анализа или просмотрите бесплатный одночасовой веб-семинар Esri Virtual Campus по Основы регрессионного анализа. Затем поработайте с обучающим руководством по Регрессионный анализ. Примените регрессионный анализ к собственным данным, изучите таблицу типичных проблем и статью Что вам не говорят о регрессионном анализе для поиска дополнительных стратегий. Если возникают трудности при поиске правильной модели регрессии, то для Вас может оказаться полезным инструмент Исследовательская регрессия (Exploratory Regression).


Регрессия позволяет прогнозировать зависимую переменную на основании значений фактора. В

MS

EXCEL

имеется множество функций, которые возвращают не только наклон и сдвиг линии регрессии, характеризующей линейную взаимосвязь между факторами, но и регрессионную статистику. Здесь рассмотрим простую линейную регрессию, т.е. прогнозирование на основе одного фактора.


Disclaimer

: Данную статью не стоит рассматривать, как пересказ главы из учебника по статистике. Статья не обладает ни полнотой, ни строгостью изложения положений статистической науки. Эта статья – о применении MS EXCEL для целей

Регрессионного анализа.

Теоретические отступления приведены лишь из соображения логики изложения. Использование данной статьи для изучения

Регрессии

– плохая идея.

Статья про

Регрессионный анализ

получилась большая, поэтому ниже для удобства приведены ее разделы:

  • Немного теории и основные понятия
  • Предположения линейной регрессионной модели
  • Задачи регрессионного анализа
  • Оценка неизвестных параметров линейной модели (используя функции MS EXCEL)
  • Оценка неизвестных параметров линейной модели (через статистики выборок)
  • Оценка неизвестных параметров линейной модели (матричная форма)
  • Построение линии регрессии
  • Коэффициент детерминации
  • Стандартная ошибка регрессии
  • Стандартные ошибки и доверительные интервалы для наклона и сдвига
  • Проверка значимости взаимосвязи переменных
  • Доверительные интервалы для нового наблюдения Y и среднего значения
  • Проверка адекватности линейной регрессионной модели


Примечание

: Если прогнозирование переменной осуществляется на основе нескольких факторов, то имеет место

множественная регрессия

.

Чтобы разобраться, чем может помочь MS EXCEL при проведении регрессионного анализа, напомним вкратце теорию, введем термины и обозначения, которые могут отличаться в зависимости от различных источников.


Примечание

: Для тех, кому некогда, незачем или просто не хочется разбираться в теоретических выкладках предлагается сразу перейти к вычислительной части —

оценке неизвестных параметров линейной модели

.

Немного теории и основные понятия

Пусть у нас есть массив данных, представляющий собой значения двух переменных Х и Y. Причем значения переменной Х мы можем произвольно задавать (контролировать) и использовать эту переменную для предсказания значений зависимой переменной Y. Таким образом, случайной величиной является только переменная Y.

Примером такой задачи может быть производственный процесс изготовления некого волокна, причем

прочность этого волокна

(Y) зависит только от

рабочей температуры процесса

в реакторе (Х), которая задается оператором.

Построим

диаграмму рассеяния

(см.

файл примера лист Линейный

), созданию которой

посвящена отдельная статья

. Вообще, построение

диаграммы рассеяния

для целей

регрессионного анализа

де-факто является стандартом.


СОВЕТ

: Подробнее о построении различных типов диаграмм см. статьи

Основы построения диаграмм

и

Основные типы диаграмм

.

Приведенная выше

диаграмма рассеяния

свидетельствует о возможной

линейной взаимосвязи

между Y от Х: очевидно, что точки данных в основном располагаются вдоль прямой линии.


Примечание

: Наличие даже такой очевидной

линейной взаимосвязи

не может являться доказательством о наличии причинной взаимосвязи переменных. Наличие

причинной

взаимосвязи не может быть доказано на основании только анализа имеющихся измерений, а должно быть обосновано с помощью других исследований, например теоретических выкладок.


Примечание

: Как известно, уравнение прямой линии имеет вид

Y

=

m

*

X

+

k

, где коэффициент

m

отвечает за наклон линии (

slope

),

k

– за сдвиг линии по вертикали (

intercept

),

k

равно значению Y при Х=0.

Предположим, что мы можем зафиксировать переменную Х (

рабочую температуру процесса

) при некотором значении Х

i

и произвести несколько наблюдений переменной Y (

прочность нити

). Очевидно, что при одном и том же значении Хi мы получим различные значения Y. Это обусловлено влиянием других факторов на Y. Например, локальные колебания давления в реакторе, концентрации раствора, наличие ошибок измерения и др. Предполагается, что воздействие этих факторов имеет случайную природу и для каждого измерения имеются одинаковые условия проведения эксперимента (т.е. другие факторы не изменяются).

Полученные значения Y, при заданном Хi, будут колебаться вокруг некого

значения

. При увеличении количества измерений, среднее этих измерений, будет стремиться к

математическому ожиданию

случайной величины Y (при Х

i

) равному μy(i)=Е(Y

i

).

Подобные рассуждения можно привести для любого значения Хi.

Чтобы двинуться дальше, воспользуемся материалом из раздела

Проверка статистических гипотез

. В статье о

проверке гипотезы о среднем значении генеральной совокупности

в качестве

нулевой

гипотезы

предполагалось равенство неизвестного значения μ заданному μ0.

В нашем случае

простой линейной регрессии

в качестве

нулевой

гипотезы

предположим, что между переменными μy(i) и Хi существует линейная взаимосвязь μ

y(i)

=α* Х

i

+β. Уравнение μ

y(i)

=α* Х

i

+β можно переписать в обобщенном виде (для всех Х и μ

y

) как μ

y

=α* Х +β.

Для наглядности проведем прямую линию соединяющую все μy(i).

Данная линия называется

регрессионной линией генеральной совокупности

(population regression line), параметры которой (

наклон

a и

сдвиг β

) нам не известны (по аналогии с

гипотезой о среднем значении генеральной совокупности

, где нам было неизвестно истинное значение μ).

Теперь сделаем переход от нашего предположения, что μy=a* Х +

β

, к предсказанию значения случайной переменной Y в зависимости от значения контролируемой переменной Х. Для этого уравнение связи двух переменных запишем в виде Y=a*X+β+ε, где ε — случайная ошибка, которая отражает суммарный эффект влияния других факторов на Y (эти «другие» факторы не участвуют в нашей модели). Напомним, что т.к. переменная Х фиксирована, то ошибка ε определяется только свойствами переменной Y.

Уравнение Y=a*X+b+ε называют

линейной регрессионной моделью

. Часто Х еще называют

независимой переменной

(еще

предиктором

и

регрессором

, английский термин

predictor

,

regressor

), а Y –

зависимой

(или

объясняемой

,

response

variable

). Так как

регрессор

у нас один, то такая модель называется

простой линейной регрессионной моделью

(

simple

linear

regression

model

). α часто называют

коэффициентом регрессии.

Предположения линейной регрессионной модели перечислены в следующем разделе.

Предположения линейной регрессионной модели

Чтобы модель линейной регрессии Yi=a*Xi+β+ε

i

была адекватной — требуется:

  • Ошибки ε

    i

    должны быть независимыми переменными;
  • При каждом значении Xi ошибки ε

    i

    должны быть иметь нормальное распределение (также предполагается равенство нулю математического ожидания, т.е. Е[ε

    i

    ]=0);
  • При каждом значении Xi ошибки ε

    i

    должны иметь равные дисперсии (обозначим ее σ

    2

    ).


Примечание

: Последнее условие называется

гомоскедастичность

— стабильность, гомогенность дисперсии случайной ошибки e. Т.е.

дисперсия

ошибки σ

2

не должна зависеть от значения Xi.

Используя предположение о равенстве математического ожидания Е[ε

i

]=0 покажем, что μy(i)=Е[Yi]:

Е[Yi]= Е[a*Xi+β+ε

i

]= Е[a*Xi+β]+ Е[ε

i

]= a*Xi+β= μy(i), т.к. a, Xi и β постоянные значения.


Дисперсия

случайной переменной Y равна

дисперсии

ошибки ε, т.е. VAR(Y)= VAR(ε)=σ

2

. Это является следствием, что все значения переменной Х являются const, а VAR(ε)=VAR(ε

i

).

Задачи регрессионного анализа

Для проверки гипотезы о линейной взаимосвязи переменной Y от X делают выборку из генеральной совокупности (этой совокупности соответствует

регрессионная линия генеральной совокупности

, т.е.  μy=a* Х +β). Выборка будет состоять из n точек, т.е. из n пар значений {X;Y}.

На основании этой выборки мы можем вычислить оценки наклона a и сдвига β, которые обозначим соответственно

a

и

b

. Также часто используются обозначения â и b̂.

Далее, используя эти оценки, мы также можем проверить гипотезу: имеется ли линейная связь между X и Y статистически значимой?

Таким образом:


Первая задача

регрессионного анализа

– оценка неизвестных параметров (

estimation

of

the

unknown

parameters

). Подробнее см. раздел

Оценки неизвестных параметров модели

.


Вторая задача

регрессионного анализа

Проверка адекватности модели

(

model

adequacy

checking

).


Примечание

: Оценки параметров модели обычно вычисляются

методом наименьших квадратов

(МНК),

которому посвящена отдельная статья

.

Оценка неизвестных параметров линейной модели (используя функции MS EXCEL)

Неизвестные параметры

простой линейной регрессионной модели

Y=a*X+β+ε оценим с помощью

метода наименьших квадратов

статье про МНК подробно описано этот метод

).

Для вычисления параметров линейной модели методом МНК получены следующие выражения:

Таким образом, мы получим уравнение прямой линии Y=

a

*X+

b

, которая наилучшим образом аппроксимирует имеющиеся данные.


Примечание

: В статье про

метод наименьших квадратов

рассмотрены случаи аппроксимации

линейной

и

квадратичной функцией

, а также

степенной

,

логарифмической

и

экспоненциальной функцией

.

Оценку параметров в MS EXCEL можно выполнить различными способами:

  • с помощью функций

    НАКЛОН()

    и

    ОТРЕЗОК()

    ;
  • с помощью функции

    ЛИНЕЙН()

    ; см. статью

    Функция MS EXCEL ЛИНЕЙН()

  • формулами через статистики выборок

    ;

  • в матричной форме

    ;

  • с помощью

    инструмента Регрессия надстройки Пакет Анализа

    .

Сначала рассмотрим функции

НАКЛОН()

,

ОТРЕЗОК()

и

ЛИНЕЙН()

.

Пусть значения Х и Y находятся соответственно в диапазонах

C

23:

C

83

и

B

23:

B

83

(см.

файл примера

внизу статьи).


Примечание

: Значения двух переменных Х и Y можно сгенерировать, задав тренд и величину случайного разброса (см. статью

Генерация данных для линейной регрессии в MS EXCEL

).

В MS EXCEL наклон прямой линии

а

(

оценку

коэффициента регрессии

), можно найти по

методу МНК

с помощью функции

НАКЛОН()

, а сдвиг

b

(

оценку

постоянного члена

или

константы регрессии

), с помощью функции

ОТРЕЗОК()

. В английской версии это функции SLOPE и INTERCEPT соответственно.

Аналогичный результат можно получить с помощью функции

ЛИНЕЙН()

, английская версия LINEST (см.

статью об этой функции

).

Формула

=ЛИНЕЙН(C23:C83;B23:B83)

вернет наклон

а

. А формула =

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83);2)

— сдвиг

b

. Здесь требуются пояснения.

Функция

ЛИНЕЙН()

имеет 4 аргумента и возвращает целый массив значений:

ЛИНЕЙН(известные_значения_y; [известные_значения_x]; [конст]; [статистика])

Если 4-й аргумент

статистика

имеет значение ЛОЖЬ или опущен, то функция

ЛИНЕЙН()

возвращает только оценки параметров модели:

a

и

b

.


Примечание

: Остальные значения, возвращаемые функцией

ЛИНЕЙН()

, нам потребуются при вычислении

стандартных ошибок

и для

проверки значимости регрессии

. В этом случае аргумент

статистика

должен иметь значение ИСТИНА.

Чтобы вывести сразу обе оценки:

  • в одной строке необходимо выделить 2 ячейки,
  • ввести формулу в

    Строке формул

  • нажать

    CTRL

    +

    SHIFT

    +

    ENTER

    (см. статью про

    формулы массива

    ).

Если в

Строке формул

выделить формулу =

ЛИНЕЙН(C23:C83;B23:B83)

и нажать

клавишу F9

, то мы увидим что-то типа {3,01279389265416;154,240057900613}. Это как раз значения

a

и

b

. Как видно, оба значения разделены точкой с запятой «;», что свидетельствует, что функция вернула значения «в нескольких ячейках одной строки».

Если требуется вывести параметры линии не в одной строке, а одном столбце (ячейки друг под другом), то используйте формулу =

ТРАНСП(ЛИНЕЙН(C23:C83;B23:B83))

. При этом выделять нужно 2 ячейки в одном столбце. Если теперь выделить новую формулу и нажать клавишу F9, то мы увидим что 2 значения разделены двоеточием «:», что означает, что значения выведены в столбец (функция

ТРАНСП()

транспонировала строку в столбец

).

Чтобы разобраться в этом подробнее необходимо ознакомиться с

формулами массива

.

Чтобы не связываться с вводом

формул массива

, можно

использовать функцию ИНДЕКС()

. Формула =

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83);1)

или просто

ЛИНЕЙН(C23:C83;B23:B83)

вернет параметр, отвечающий за наклон линии, т.е.

а

. Формула

=ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83);2)

вернет параметр

b

.

Оценка неизвестных параметров линейной модели (через статистики выборок)

Наклон линии, т.е. коэффициент

а

, можно также вычислить через

коэффициент корреляции

и

стандартные отклонения выборок

:

=

КОРРЕЛ(B23:B83;C23:C83) *(СТАНДОТКЛОН.В(C23:C83)/ СТАНДОТКЛОН.В(B23:B83))

Вышеуказанная формула математически эквивалентна отношению

ковариации

выборок Х и Y и

дисперсии

выборки Х:

=

КОВАРИАЦИЯ.В(B23:B83;C23:C83)/ДИСП.В(B23:B83)

И, наконец, запишем еще одну формулу для нахождения сдвига

b

. Воспользуемся тем фактом, что

линия регрессии

проходит через точку

средних значений

переменных Х и Y.

Вычислив

средние значения

и подставив в формулу ранее найденный наклон

а

, получим сдвиг

b

.

Оценка неизвестных параметров линейной модели (матричная форма)

Также параметры

линии регрессии

можно найти в матричной форме (см.

файл примера лист Матричная форма

).

В формуле символом β обозначен столбец с искомыми параметрами модели: β0 (сдвиг

b

), β1 (наклон

a

).

Матрица Х равна:

Матрица

Х

называется

регрессионной матрицей

или

матрицей плана

. Она состоит из 2-х столбцов и n строк, где n – количество точек данных. Первый столбец — столбец единиц, второй – значения переменной Х.

Матрица

Х

T

– это

транспонированная матрица

Х

. Она состоит соответственно из n столбцов и 2-х строк.

В формуле символом

Y

обозначен столбец значений переменной Y.

Чтобы

перемножить матрицы

используйте функцию

МУМНОЖ()

. Чтобы

найти обратную матрицу

используйте функцию

МОБР()

.

Пусть дан массив значений переменных Х и Y (n=10, т.е.10 точек).

Слева от него достроим столбец с 1 для матрицы Х.

Записав формулу

=

МУМНОЖ(МОБР(МУМНОЖ(ТРАНСП(B7:C16);(B7:C16))); МУМНОЖ(ТРАНСП(B7:C16);(D7:D16)))

и введя ее как

формулу массива

в 2 ячейки, получим оценку параметров модели.

Красота применения матричной формы полностью раскрывается в случае

множественной регрессии

.

Построение линии регрессии

Для отображения

линии регрессии

построим сначала

диаграмму рассеяния

, на которой отобразим все точки (см.

начало статьи

).

Для построения прямой линии используйте вычисленные выше оценки параметров модели

a

и

b

(т.е. вычислите

у

по формуле

y

=

a

*

x

+

b

) или функцию

ТЕНДЕНЦИЯ()

.

Формула =

ТЕНДЕНЦИЯ($C$23:$C$83;$B$23:$B$83;B23)

возвращает расчетные (прогнозные) значения ŷi для заданного значения Хi из столбца

В2

.


Примечание

:

Линию регрессии

можно также построить с помощью функции

ПРЕДСКАЗ()

. Эта функция возвращает прогнозные значения ŷi, но, в отличие от функции

ТЕНДЕНЦИЯ()

работает только в случае одного регрессора. Функция

ТЕНДЕНЦИЯ()

может быть использована и в случае

множественной регрессии

(в этом случае 3-й аргумент функции должен быть ссылкой на диапазон, содержащий все значения Хi для выбранного наблюдения i).

Как видно из диаграммы выше

линия тренда

и

линия регрессии

не обязательно совпадают: отклонения точек от

линии тренда

случайны, а МНК лишь подбирает линию наиболее точно аппроксимирующую случайные точки данных.


Линию регрессии

можно построить и с помощью встроенных средств диаграммы, т.е. с помощью инструмента

Линия тренда.

Для этого выделите диаграмму, в меню выберите

вкладку Макет

, в

группе Анализ

нажмите

Линия тренда

, затем

Линейное приближение.

В диалоговом окне установите галочку

Показывать уравнение на диаграмме

(подробнее см. в

статье про МНК

).

Построенная таким образом линия, разумеется, должна совпасть с ранее построенной нами

линией регрессии,

а параметры уравнения

a

и

b

должны совпасть с параметрами уравнения отображенными на диаграмме.


Примечание:

Для того, чтобы вычисленные параметры уравнения

a

и

b

совпадали с параметрами уравнения на диаграмме, необходимо, чтобы тип у диаграммы был

Точечная, а не График

, т.к. тип диаграммы

График

не использует значения Х, а вместо значений Х используется последовательность 1; 2; 3; … Именно эти значения и берутся при расчете параметров

линии тренда

. Убедиться в этом можно если построить диаграмму

График

(см.

файл примера

), а значения

Хнач

и

Хшаг

установить равным 1. Только в этом случае параметры уравнения на диаграмме совпадут с

a

и

b

.

Коэффициент детерминации R

2


Коэффициент детерминации

R

2

показывает насколько полезна построенная нами

линейная регрессионная модель

.

Предположим, что у нас есть n значений переменной Y и мы хотим предсказать значение yi, но без использования значений переменной Х (т.е. без построения

регрессионной модели

). Очевидно, что лучшей оценкой для yi будет

среднее значение

ȳ. Соответственно, ошибка предсказания будет равна (yi — ȳ).


Примечание

: Далее будет использована терминология и обозначения

дисперсионного анализа

.

После построения

регрессионной модели

для предсказания значения yi мы будем использовать значение ŷi=a*xi+b. Ошибка предсказания теперь будет равна (yi — ŷi).

Теперь с помощью диаграммы сравним ошибки предсказания полученные без построения модели и с помощью модели.

Очевидно, что используя

регрессионную модель

мы уменьшили первоначальную (полную) ошибку (yi — ȳ)  на значение (ŷi — ȳ)  до величины (yi — ŷi).

(yi — ŷi) – это оставшаяся, необъясненная ошибка.

Очевидно, что все три ошибки связаны выражением:

(yi — ȳ)= (ŷi — ȳ) + (yi — ŷi)

Можно показать, что в общем виде справедливо следующее выражение:

Доказательство:

или в других, общепринятых в зарубежной литературе, обозначениях:


SST

=

SSR

+

SSE

Что означает:


Total Sum of Squares

=

Regression Sum of Squares

+

Error Sum of Squares


Примечание

: SS — Sum of Squares — Сумма Квадратов.

Как видно из формулы величины SST, SSR, SSE имеют размерность

дисперсии

(вариации) и соответственно описывают разброс (изменчивость):

Общую изменчивость

(Total variation),

Изменчивость объясненную моделью

(Explained variation) и

Необъясненную изменчивость

(Unexplained variation).

По определению

коэффициент детерминации

R

2

равен:

R

2

=

Изменчивость объясненная моделью / Общая изменчивость.

Этот показатель равен квадрату

коэффициента корреляции

и в MS EXCEL его можно вычислить с помощью функции

КВПИРСОН()

или

ЛИНЕЙН()

:

=

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83;;ИСТИНА);3)

R

2

принимает значения от 0 до 1 (1 соответствует идеальной линейной зависимости Y от Х). Однако, на практике малые значения R2 вовсе не обязательно указывают, что переменную Х нельзя использовать для прогнозирования переменной Y. Малые значения R2 могут указывать на нелинейность связи или на то, что поведение переменной Y объясняется не только Х, но и другими факторами.

Стандартная ошибка регрессии


Стандартная ошибка регрессии

(

Standard Error of a regression

) показывает насколько велика ошибка предсказания значений переменной Y на основании значений Х. Отдельные значения Yi мы можем предсказывать лишь с точностью +/- несколько значений (обычно 2-3, в зависимости от формы распределения ошибки ε).

Теперь вспомним уравнение

линейной регрессионной модели

Y=a*X+β+ε. Ошибка ε имеет случайную природу, т.е. является случайной величиной и поэтому имеет свою функцию распределения со

средним значением

μ и

дисперсией

σ

2

.

Оценив значение

дисперсии

σ

2

и вычислив из нее квадратный корень – получим

Стандартную ошибку регрессии.

Чем точки наблюдений на диаграмме

рассеяния

ближе находятся к прямой линии, тем меньше

Стандартная ошибка.


Примечание

:

Вспомним

, что при построении модели предполагается, что

среднее значение

ошибки ε равно 0, т.е. E[ε]=0.

Оценим

дисперсию σ

2

. Помимо вычисления

Стандартной ошибки регрессии

эта оценка нам потребуется в дальнейшем еще и при построении

доверительных интервалов

для оценки параметров регрессии

a

и

b

.

Для оценки

дисперсии

ошибки ε используем

остатки регрессии

— разности между имеющимися значениями

yi

и значениями, предсказанными регрессионной моделью ŷ. Чем лучше регрессионная модель согласуется с данными (точки располагается близко к прямой линии), тем меньше величина остатков.

Для оценки

дисперсии σ

2

используют следующую формулу:

где SSE – сумма квадратов значений ошибок модели ε

i

=yi — ŷi (

Sum of Squared Errors

).

SSE часто обозначают и как SSres – сумма квадратов остатков (

Sum

of

Squared

residuals

).

Оценка

дисперсии

s

2

также имеет общепринятое обозначение MSE (Mean Square of Errors), т.е. среднее квадратов

ошибок

или MSRES (Mean Square of Residuals), т.е. среднее квадратов

остатков

. Хотя правильнее говорить сумме квадратов остатков, т.к. ошибка чаще ассоциируется с ошибкой модели ε, которая является непрерывной случайной величиной. Но, здесь мы будем использовать термины SSE и MSE, предполагая, что речь идет об остатках.


Примечание

: Напомним, что когда

мы использовали МНК

для нахождения параметров модели, то критерием оптимизации была минимизация именно SSE (SSres). Это выражение представляет собой сумму квадратов расстояний между наблюденными значениями yi и предсказанными моделью значениями ŷi, которые лежат на

линии регрессии.

Математическое ожидание

случайной величины MSE равно

дисперсии ошибки

ε, т.е.

σ

2

.

Чтобы понять почему SSE выбрана в качестве основы для оценки

дисперсии

ошибки ε, вспомним, что

σ

2

является также

дисперсией

случайной величины Y (относительно

среднего значения

μy, при заданном значении Хi). А т.к. оценкой μy является значение ŷi =

a

* Хi +

b

(значение

уравнения регрессии

при Х= Хi), то логично использовать именно SSE в качестве основы для оценки

дисперсии

σ

2

. Затем SSE усредняется на количество точек данных n за вычетом числа 2. Величина n-2 – это количество

степеней свободы

(

df



degrees

of

freedom

), т.е. число параметров системы, которые могут изменяться независимо (вспомним, что у нас в этом примере есть n независимых наблюдений переменной Y). В случае

простой линейной регрессии

число степеней свободы

равно n-2, т.к. при построении

линии регрессии

было оценено 2 параметра модели (на это было «потрачено» 2

степени свободы

).

Итак, как сказано было выше, квадратный корень из s

2

имеет специальное название

Стандартная ошибка регрессии

(

Standard Error of a regression

) и обозначается SEy. SEy показывает насколько велика ошибка предсказания. Отдельные значения Y мы можем предсказывать с точностью +/- несколько значений SEy (см.

этот раздел

). Если ошибки предсказания ε имеют

нормальное распределение

, то примерно 2/3 всех предсказанных значений будут на расстоянии не больше SEy от

линии регрессии

. SEy имеет размерность переменной Y и откладывается по вертикали. Часто на

диаграмме рассеяния

строят

границы предсказания

соответствующие +/- 2 SEy (т.е. 95% точек данных будут располагаться в пределах этих границ).

В MS EXCEL

стандартную ошибку

SEy можно вычислить непосредственно по формуле:

=

КОРЕНЬ(СУММКВРАЗН(C23:C83; ТЕНДЕНЦИЯ(C23:C83;B23:B83;B23:B83)) /( СЧЁТ(B23:B83) -2))

или с помощью функции

ЛИНЕЙН()

:

=

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83;;ИСТИНА);3;2)


Примечание

: Подробнее о функции

ЛИНЕЙН()

см.

эту статью

.

Стандартные ошибки и доверительные интервалы для наклона и сдвига

В разделе

Оценка неизвестных параметров линейной модели

мы получили точечные оценки наклона

а

и сдвига

b

. Так как эти оценки получены на основе случайных величин (значений переменных Х и Y), то эти оценки сами являются случайными величинами и соответственно имеют функцию распределения со

средним значением

и

дисперсией

. Но, чтобы перейти от

точечных оценок

к

интервальным

, необходимо вычислить соответствующие

стандартные ошибки

(т.е.

стандартные отклонения

).


Стандартная ошибка коэффициента регрессии

a

вычисляется на основании

стандартной ошибки регрессии

по следующей формуле:

где Sx – стандартное отклонение величины х, вычисляемое по формуле:

где Sey –

стандартная ошибка регрессии,

т.е. ошибка предсказания значения переменой Y

(

см. выше

).

В MS EXCEL

стандартную ошибку коэффициента регрессии

Se можно вычислить впрямую по вышеуказанной формуле:

=

КОРЕНЬ(СУММКВРАЗН(C23:C83; ТЕНДЕНЦИЯ(C23:C83;B23:B83;B23:B83)) /( СЧЁТ(B23:B83) -2))/  СТАНДОТКЛОН.В(B23:B83) /КОРЕНЬ(СЧЁТ(B23:B83) -1)

или с помощью функции

ЛИНЕЙН()

:

=

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83;;ИСТИНА);2;1)

Формулы приведены в

файле примера на листе Линейный

в разделе

Регрессионная статистика

.


Примечание

: Подробнее о функции

ЛИНЕЙН()

см.

эту статью

.

При построении

двухстороннего доверительного интервала

для

коэффициента регрессии

его границы определяются следующим образом:

где  —

квантиль распределения Стьюдента

с n-2 степенями свободы. Величина

а

с «крышкой» является другим обозначением

наклона

а

.

Например для

уровня значимости

альфа=0,05, можно вычислить с помощью формулы

=СТЬЮДЕНТ.ОБР.2Х(0,05;n-2)

Вышеуказанная формула следует из того факта, что если ошибки регрессии распределены нормально и независимо, то выборочное распределение случайной величины

является

t-распределением Стьюдента

с n-2 степенью свободы (то же справедливо и для наклона

b

).


Примечание

: Подробнее о построении

доверительных интервалов

в MS EXCEL можно прочитать в этой статье

Доверительные интервалы в MS EXCEL

.

В результате получим, что найденный

доверительный интервал

с вероятностью 95% (1-0,05) накроет истинное значение

коэффициента регрессии.

Здесь мы считаем, что

коэффициент регрессии

a

имеет

распределение Стьюдента

с n-2

степенями свободы

(n – количество наблюдений, т.е. пар Х и Y).


Примечание

: Подробнее о построении

доверительных интервалов

с использованием t-распределения см. статью про построение

доверительных интервалов

для среднего

.


Стандартная ошибка сдвига

b

вычисляется по следующей формуле:

В MS EXCEL

стандартную ошибку сдвига

Seb можно вычислить с помощью функции

ЛИНЕЙН()

:

=

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83;;ИСТИНА);2;2)

При построении

двухстороннего доверительного интервала

для

сдвига

его границы определяются аналогичным образом как для

наклона

:

b

+/- t*Seb.

Проверка значимости взаимосвязи переменных

Когда мы строим модель Y=αX+β+ε мы предполагаем, что между Y и X существует линейная взаимосвязь. Однако, как это иногда бывает в статистике, можно вычислять параметры связи даже тогда, когда в действительности она не существует, и обусловлена лишь случайностью.

Единственный вариант, когда Y не зависит X (в рамках модели Y=αX+β+ε), возможен, когда

коэффициент регрессии

a

равен 0.

Чтобы убедиться, что вычисленная нами оценка

наклона

прямой линии не обусловлена лишь случайностью (не случайно отлична от 0), используют

проверку гипотез

. В качестве

нулевой гипотезы

Н

0

принимают, что связи нет, т.е. a=0. В качестве альтернативной гипотезы

Н

1

принимают, что a <>0.

Ниже на рисунках показаны 2 ситуации, когда

нулевую гипотезу

Н

0

не удается отвергнуть.

На левой картинке отсутствует любая зависимость между переменными, на правой – связь между ними нелинейная, но при этом

коэффициент линейной корреляции

равен 0.

Ниже — 2 ситуации, когда

нулевая гипотеза

Н

0

отвергается.

На левой картинке очевидна линейная зависимость, на правой — зависимость нелинейная, но коэффициент корреляции не равен 0 (метод МНК вычисляет показатели наклона и сдвига просто на основании значений выборки).

Для проверки гипотезы нам потребуется:

  • Установить

    уровень значимости

    , пусть альфа=0,05;

  • Рассчитать с помощью функции

    ЛИНЕЙН()

    стандартное отклонение

    Se для

    коэффициента регрессии

    (см.

    предыдущий раздел

    );

  • Рассчитать число степеней свободы: DF=n-2 или по формуле =

    ИНДЕКС(ЛИНЕЙН(C24:C84;B24:B84;;ИСТИНА);4;2)
  • Вычислить значение тестовой статистики t

    0

    =a/S

    e

    , которая имеет

    распределение Стьюдента

    с

    числом степеней свободы

    DF=n-2;

  • Сравнить значение

    тестовой статистики

    |t0| с пороговым значением t

    альфа

    ,n-2. Если значение

    тестовой статистики

    больше порогового значения, то

    нулевая гипотеза

    отвергается (

    наклон

    не может быть объяснен лишь случайностью при заданном уровне альфа) либо
  • вычислить

    p-значение

    и сравнить его с

    уровнем значимости

    .

В

файле примера

приведен пример проверки гипотезы:

Изменяя

наклон

тренда k (ячейка

В8

) можно убедиться, что при малых углах тренда (например, 0,05) тест часто показывает, что связь между переменными случайна. При больших углах (k>1), тест практически всегда подтверждает значимость линейной связи между переменными.


Примечание

: Проверка значимости взаимосвязи эквивалентна

проверке статистической значимости коэффициента корреляции

. В

файле примера

показана эквивалентность обоих подходов. Также проверку значимости можно провести с помощью

процедуры F-тест

.

Доверительные интервалы для нового наблюдения Y и среднего значения

Вычислив параметры

простой линейной регрессионной модели

Y=aX+β+ε мы получили точечную оценку значения нового наблюдения Y при заданном значении Хi, а именно: Ŷ=

a

* Хi +

b

Ŷ также является точечной оценкой для

среднего значения

Yi при заданном Хi. Но, при построении

доверительных интервалов

используются различные

стандартные ошибки

.


Стандартная ошибка

нового наблюдения Y при заданном Хi учитывает 2 источника неопределенности:

  • неопределенность связанную со случайностью оценок параметров модели

    a

    и

    b

    ;
  • случайность ошибки модели ε.

Учет этих неопределенностей приводит к

стандартной ошибке

S(Y|Xi), которая рассчитывается с учетом известного значения Xi.

где SS

xx

– сумма квадратов отклонений от

среднего

значений переменной Х:


Примечание

: Se –

стандартная ошибка коэффициента регрессии

(

наклона

а

).

В

MS EXCEL 2010

нет функции, которая бы рассчитывала эту

стандартную ошибку

, поэтому ее необходимо рассчитывать по вышеуказанным формулам.


Доверительный интервал

или

Интервал предсказания для нового наблюдения

(Prediction Interval for a New Observation) построим по схеме показанной в разделе

Проверка значимости взаимосвязи переменных

(см.

файл примера лист Интервалы

). Т.к. границы интервала зависят от значения Хi (точнее от расстояния Хi до среднего значения Х

ср

), то интервал будет постепенно расширяться при удалении от Х

ср

.

Границы

доверительного интервала

для

нового наблюдения

рассчитываются по формуле:

Аналогичным образом построим

доверительный интервал

для

среднего значения

Y при заданном Хi (Confidence Interval for the Mean of Y). В этом случае

доверительный интервал

будет уже, т.к.

средние значения

имеют меньшую изменчивость по сравнению с отдельными наблюдениями (

средние значения,

в рамках нашей линейной модели Y=aX+β+ε, не включают ошибку ε).


Стандартная ошибка

S(Yср|Xi) вычисляется по практически аналогичным формулам как и

стандартная ошибка

для нового наблюдения:

Как видно из формул,

стандартная ошибка

S(Yср|Xi) меньше

стандартной ошибки

S(Y|Xi) для индивидуального значения

.

Границы

доверительного интервала

для

среднего значения

рассчитываются по формуле:

Проверка адекватности линейной регрессионной модели

Модель адекватна, когда все предположения, лежащие в ее основе, выполнены (см. раздел

Предположения линейной регрессионной модели

).

Проверка адекватности модели в основном основана на исследовании остатков модели (model residuals), т.е. значений ei=yi – ŷi для каждого Хi. В рамках

простой линейной модели

n остатков имеют только n-2 связанных с ними

степеней свободы

. Следовательно, хотя, остатки не являются независимыми величинами, но при достаточно большом n это не оказывает какого-либо влияния на проверку адекватности модели.

Чтобы проверить предположение о

нормальности распределения

ошибок строят

график проверки на нормальность

(Normal probability Plot).

В

файле примера на листе Адекватность

построен

график проверки на нормальность

. В случае

нормального распределения

значения остатков должны быть близки к прямой линии.

Так как значения переменной Y мы

генерировали с помощью тренда

, вокруг которого значения имели нормальный разброс, то ожидать сюрпризов не приходится – значения остатков располагаются вблизи прямой.

Также при проверке модели на адекватность часто строят график зависимости остатков от предсказанных значений Y. Если точки не демонстрируют характерных, так называемых «паттернов» (шаблонов) типа вор

о

нок или другого неравномерного распределения, в зависимости от значений Y, то у нас нет очевидных доказательств неадекватности модели.

В нашем случае точки располагаются примерно равномерно.

Часто при проверке адекватности модели вместо остатков используют нормированные остатки. Как показано в разделе

Стандартная ошибка регрессии

оценкой

стандартного отклонения ошибок

является величина SEy равная квадратному корню из величины MSE. Поэтому логично нормирование остатков проводить именно на эту величину.

SEy можно вычислить с помощью функции

ЛИНЕЙН()

:

=

ИНДЕКС(ЛИНЕЙН(C23:C83;B23:B83;;ИСТИНА);3;2)

Иногда нормирование остатков производится на величину

стандартного отклонения

остатков (это мы увидим в статье об инструменте

Регрессия

, доступного в

надстройке MS EXCEL Пакет анализа

), т.е. по формуле:

Вышеуказанное равенство приблизительное, т.к. среднее значение остатков близко, но не обязательно точно равно 0.

Понравилась статья? Поделить с друзьями:
  • Стандарт кодирования ошибок
  • Сталкер тень чернобыля xray engine ошибка как убрать
  • Станд ошибка эконометрика
  • Сталкер сборка от стасона ошибка 1 exe
  • Стальная рельса какая ошибка