Мультиколлинеарность в регрессионном анализе возникает, когда две или более независимых переменных сильно коррелируют друг с другом, так что они не предоставляют уникальную или независимую информацию в регрессионной модели. Если степень корреляции между переменными достаточно высока, это может вызвать проблемы при подгонке и интерпретации регрессионной модели.
Одним из способов обнаружения мультиколлинеарности является использование показателя, известного как коэффициент инфляции дисперсии (VIF) , который измеряет корреляцию и силу корреляции между независимыми переменными в регрессионной модели .
В этом руководстве объясняется, как рассчитать VIF в Python.
Пример: расчет VIF в Python
В этом примере мы будем использовать набор данных, описывающий атрибуты 10 баскетболистов:
import numpy as npimport pandas as pd#create datasetdf = pd.DataFrame({'rating':[90,85,82,88,94,90,76,75,87,86],'points':[25,20,14,16,27,20,12,15,14,19],'assists':[5,7,7,8,5,7,6,9,9,5],'rebounds':[11,8,10,6,6,9,6,10,10,7]})#view datasetdf rating points assists rebounds09025511185207828214710388168649427565902079676126677515910887149109861957
Предположим, мы хотели бы подобрать модель множественной линейной регрессии, используя рейтинг в качестве переменной отклика и очки, передачи и подборы в качестве независимых переменных.
Чтобы рассчитать VIF для каждой независимой переменной в модели, мы можем использовать функцию variance_inflation_factor() из библиотеки statsmodels:
Мы можем наблюдать значения VIF для каждой из объясняющих переменных:
баллы: 1,76
передач: 1,96
подборов: 1,18
Примечание. Игнорируйте VIF для «Перехвата» в модели, поскольку это значение не имеет значения.
Как интерпретировать значения VIF
Значение VIF начинается с 1 и не имеет верхнего предела. Общее эмпирическое правило для интерпретации VIF выглядит следующим образом:
Значение 1 указывает на отсутствие корреляции между данной независимой переменной и любыми другими независимыми переменными в модели.
Значение от 1 до 5 указывает на умеренную корреляцию между данной объясняющей переменной и другими независимыми переменными в модели, но часто она недостаточно серьезна, чтобы требовать внимания.
Значение больше 5 указывает на потенциально сильную корреляцию между данной независимой переменной и другими независимыми переменными в модели. В этом случае оценки коэффициентов и p-значения в выходных данных регрессии, вероятно, ненадежны.
Учитывая, что каждое из значений VIF для независимых переменных в нашей регрессионной модели близко к 1, мультиколлинеарность в нашем примере не является проблемой.
from patsy import dmatrices
from statsmodels.stats.outliers_influence import variance_inflation_factor
#find design matrix for linear regression model using 'rating' as response variable
y, X = dmatrices('rating ~ points+assists+rebounds', data=df, return_type='dataframe')
#calculate VIF for each explanatory variable
vif = pd.DataFrame()
vif['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif['variable'] = X.columns
#view VIF for each explanatory variable
vif
VIF variable
0 101.258171 Intercept
1 1.763977 points
2 1.959104 assists
3 1.175030 rebounds