回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图用python计算一个简单数据集中每一列的方差通胀因子(VIF):</p>
<pre><code>a b c d
1 2 4 4
1 2 6 3
2 3 7 4
3 2 8 5
4 1 9 4
</code></pre>
<p>我已经在R中使用了<a href="https://cran.r-project.org/web/packages/usdm/usdm.pdf" rel="noreferrer">usdm library</a>中的vif函数完成了这项工作,它给出了以下结果:</p>
<pre><code>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
</code></pre>
<p>但是,当我在python中使用<a href="http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.outliers_influence.variance_inflation_factor.html" rel="noreferrer">statsmodel vif function</a>执行相同操作时,我的结果是:</p>
<pre><code>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
</code></pre>
<p>尽管输入是相同的,但结果却大不相同。一般来说,statsmodel VIF函数的结果似乎是错误的,但我不确定这是否是因为我调用它的方式,或者这是否是函数本身的问题。</p>
<p>我希望有人能帮我弄清楚我是在错误地调用statsmodel函数还是解释结果中的差异。如果这是函数的问题,那么python中是否有VIF的替代方案?</p>