繁体   English   中英

创建 Python Function 以迭代 List/DataFrame (VIF)

[英]Creating Python Function to Iterate over List/DataFrame (VIF)

我有一个数据集,我想 select VIF(方差膨胀因子)小于某个阈值的变量子集。 我的想法是计算每个变量的 VIF,然后取出最大值的变量(如果它高于某个阈值),重新计算每个剩余变量的 VIF 并重复该过程,直到没有高于阈值的 VIF .

这种方法没有新的想法,但我无法超越某个点来制作 function 以在 Python 中自动化此过程。

x 是删除了目标变量的数据集

import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant

x_vif = add_constant(x)

vif = pd.DataFrame([variance_inflation_factor(x_vif.values, i) for i in range(x_vif.shape[1])], index=x_vif.columns)

vif 也可以是一个列表。 那么,是否有任何 package 可以自动执行此操作,或者您能否告诉我如何创建此 function?

我找到了一个可以自动执行此操作的 R 库 (thinXwithVIF),但我无法使 rpy2 与我需要使用的 python 版本一起工作。

也许有意义的是删除每轮中具有最高 vif 的变量,子集 dataframe 并在所有变量低于您的阈值时停止。 我不认为 vif 会是万能的,你真的必须查看数据来决定要包括什么等等。

import statsmodels.api as sm
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor

data = sm.datasets.get_rdataset('mtcars')

x_vif = data.data.iloc[:,1:]
y = data.data['mpg']

thres = 10

while True:
    Cols = range(x_vif.shape[1])
    
    vif = np.array([variance_inflation_factor(x_vif.values, i) for i in Cols])
    if all(vif < thres):
        break
    else:
        Cols = np.delete(Cols,np.argmax(vif))
        x_vif = x_vif.iloc[:,Cols]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM