Фактор инфляции дисперсии (VIF) — это числовой показатель, который измеряет, насколько дисперсия (вариация) оценки коэффициента регрессии увеличивается из-за мультиколлинеарности между предикторами.
Математическое определение
Для предиктора VIF вычисляется по формуле:
где:
- — коэффициент детерминации регрессионной модели, в которой предиктор является зависимой переменной, а все остальные предикторы — независимыми переменными
Как вычисляется VIF?
Шаг 1: Вспомогательная регрессия
Для каждого предиктора строится регрессионная модель:
Шаг 2: Расчет
Из этой регрессии извлекается коэффициент детерминации , который показывает, какая доля дисперсии объясняется другими предикторами.
Шаг 3: Расчет VIF
Интерпретация значений VIF
| Значение VIF | Степень мультиколлинеарности | Интерпретация |
|---|---|---|
| VIF = 1 | Отсутствует | Нет корреляции с другими предикторами |
| 1 < VIF < 5 | Умеренная | Приемлемый уровень |
| 5 ≤ VIF < 10 | Высокая | Требует внимания |
| VIF ≥ 10 | Критическая | Серьезная проблема |
Почему VIF работает?
Из формулы дисперсии коэффициента регрессии в методе наименьших квадратов:
где:
- — дисперсия ошибок
- — общая сумма квадратов для
- — фактор инфляции дисперсии
VIF показывает, во сколько раз увеличивается дисперсия коэффициента из-за мультиколлинеарности.
Практический пример
Предположим, у нас есть модель с тремя предикторами: , ,
Вычисление VIF для :
- Строим регрессию:
- Получаем
- Вычисляем:
Интерпретация:
Дисперсия коэффициента в 5 раз больше, чем была бы при отсутствии мультиколлинеарности.
Особые случаи
Совершенная мультиколлинеарность:
Если , то:
Полная независимость:
Если , то:
Средний VIF
Для общей оценки мультиколлинеарности в модели можно использовать средний VIF:
где — количество предикторов.
Практическое применение
В Python (statsmodels):
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant
# Добавляем константу
X_with_const = add_constant(X)
# Вычисляем VIF для каждого предиктора
vif_data = pd.DataFrame()
vif_data["Variable"] = X_with_const.columns
vif_data["VIF"] = [variance_inflation_factor(X_with_const.values, i)
for i in range(X_with_const.shape[1])]В R:
library(car)
vif(model) # Вычисляет VIF для всех предикторов в моделиОграничения VIF
- Не обнаруживает все формы мультиколлинеарности — только линейные зависимости
- Не указывает, какие переменные коррелированы — только факт наличия проблемы
- Чувствителен к спецификации модели — добавление/удаление переменных меняет VIF
Рекомендации по использованию
- Пороговое значение 10 — общепринятый критерий для серьезной мультиколлинеарности
- Сравнительный анализ — смотреть на относительные значения VIF разных предикторов
- Содержательный смысл — иногда высокая корреляция между предикторами оправдана содержательно
- Для прогнозирования — если цель прогноз, а не интерпретация коэффициентов, можно допустить более высокие значения VIF
VIF — это мощный диагностический инструмент, который помогает понять, насколько надежны оценки коэффициентов в регрессионном анализе и стоит ли беспокоиться о мультиколлинеарности.