Я пытаюсь вычислить коэффициент инфляции дисперсии (VIF) для каждого столбца в простом наборе данных в python:
a b c d
1 2 4 4
1 2 6 3
2 3 7 4
3 2 8 5
4 1 9 4
Я уже сделал это в R, используя функцию vif из библиотеки usdm, которая дает следующие результаты:
a <- c(1, 1, 2, 3, 4)
b <- c(2, 2, 3, 2, 1)
c <- c(4, 6, 7, 8, 9)
d <- c(4, 3, 4, 5, 4)
df <- data.frame(a, b, c, d)
vif_df <- vif(df)
print(vif_df)
Variables VIF
a 22.95
b 3.00
c 12.95
d 3.00
Однако, когда я делаю то же самое в python, используя функцию statsmodel vif, мои результаты:
a = [1, 1, 2, 3, 4]
b = [2, 2, 3, 2, 1]
c = [4, 6, 7, 8, 9]
d = [4, 3, 4, 5, 4]
ck = np.column_stack([a, b, c, d])
vif = [variance_inflation_factor(ck, i) for i in range(ck.shape[1])]
print(vif)
Variables VIF
a 47.136986301369774
b 28.931506849315081
c 80.31506849315096
d 40.438356164383549
Результаты сильно различаются, хотя исходные данные одинаковы. В общем, результаты из функции VIF statsmodel кажутся неправильными, но я не уверен, что это из-за того, как я это называю, или если это проблема с самой функцией.
Я надеялся, что кто-то поможет мне разобраться, неправильно ли я вызывал функцию statsmodel или объяснял расхождения в результатах. Если это проблема с функцией, есть ли какие-либо альтернативы VIF в python?