Python OLS 双向逐步回归

该博客详细介绍了如何使用逐步回归方法进行数据分析。通过Python的statsmodels库,逐步回归算法选择最优解释变量,逐步建立一元及多元线性回归模型。在每一步迭代中,算法检查新引入变量的显著性,确保模型的稳定性。最终,该方法用于从大量解释变量中筛选出对目标变量影响最大的变量,生成相应的回归方程式,并将结果输出到.txt文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法基本思路:首先需要确定一个因变量y以此构建一元回归方程,再找到已通过显著性检验的一元线性回归方程中F值最大的解释变量x0,将其并入回归方程中,再分别将剩余的解释变量与解释变量x0作为OLS函数的自变量集拟合回归方程,同样找出其中F值最大的自变量集,如果该自变量集均能通过显著性检验则将该解释变量并入回归方程中并进行下一轮的迭代,否则舍弃该解释变量,并找出F值第二大的自变量集继续对其进行显著性检验。

import pandas as pd
import numpy as np
import statsmodels.api as sm


def test_significance(data, dv, src_idvs):
    model = sm.OLS(data.loc[:, dv], data.loc[:, src_idvs]).fit()
    for p in model.pvalues:
        if p > 0.05:
            return False
    else:
        return True


def find_max_F(data, dv, idvs, res_idvs):
    F_max = -1
    idv_F_max = None
    res_model = None
    for idv in idvs:
        new_idvs = res_idvs.copy()
        new_idvs.append(idv)  # 加入新解释变量找出F最大值
        model = sm.OLS(data.loc[:, dv], sm.add_constant(
            data.loc[:, new_idvs])).fit()
        F = model.fvalue
        if F > F_max:
            F_max = F
            idv_F_max = idv
            res_model = model
    return F_max, idv_F_max, res_model


def stepwise_regression(data, dv, idvs=None):  # 向前向后逐步回归
    res_idvs = []
    src_idvs = idvs.copy()
    res_models = []
    for step in range(len(idvs)):
        isExit = False
        while True:
            F, idv, model = find_max_F(
                data, dv, src_idvs, res_idvs)  # 求出F最大值以及对应的解释变量

            if model == None:  # 多元线性拟合失败
                print("第{0}步拟合线性失败".format(step + 1))
                isExit = True
                break

            res_idvs.append(idv)

            # 没有新解释变量并入回归方程中
            if model.f_pvalue >= 0.05 or not test_significance(data, dv, res_idvs):
                res_idvs.pop()  # 移除该解释变量
                src_idvs.remove(idv)
                print("第{0}步移除解释变量{1}".format(step + 1, idv))
                if len(src_idvs) == 0:  # 该轮for循环并没有解释变量能够并入回归方程中
                    isExit = True
                    break
            else:  # 找到新解释变量,结束While循环
                print("第{0}步并入解释变量{1}".format(step + 1, idv))
                res_models.append(model)
                break
        if isExit:  # 提前结束逐步回归
            break
        else:
            src_idvs = []
            for idv in idvs:
                if idv not in res_idvs:
                    src_idvs.append(idv)
    return res_idvs, res_models


data = pd.read_excel('./normalization.xlsx')

equations = []
stdouts = []
for column in data.columns:
    idvs = list(data.columns.copy())
    idvs.remove(column)
    res, models = stepwise_regression(data=data, dv=column, idvs=idvs)
    equation = 'y = '
    stdout = 'y为' + column + '、'
    for index in range(len(res)):
        equation += str(models[index].params[1]) + ' * x' + str(index)
        stdout += 'x' + str(index) + '为' +  res[index]
        if index != len(res) - 1:
            equation += ' + '
            stdout += '、'
    equations.append(equation)
    stdouts.append(stdout)

with open(file='./MultivariateLinearity.txt', mode='w', encoding='utf-8') as f:
    for index in range(len(equations)):
        f.write(equations[index] + '\n其中: ' + stdouts[index] + '\n')

以下是data数据集格式,一个解释变量为一列

 以下是将方程以及变量解释输出至.txt文件的最终结果

### 如何在Python中执行逐步回归检验 逐步回归是一种用于特征选择的方法,旨在构建一个最优的线性回归模型。该方法通过迭代地增加或删除变量来优化模型性能。Python 中可以利用 `stepwise_selection` 函数实现这一过程。 为了在 Python 中执行逐步回归测试,通常会采用如下方式: 定义一个函数来进行前向选择、后向消除或者双向淘汰。这里提供了一个基于 P-values 和 Adjusted R-Squared 的简单实现方案[^1]: ```python import statsmodels.api as sm import pandas as pd def stepwise_selection(X, y, initial_list=[], threshold_in=0.01, threshold_out=0.05, verbose=True): """ Perform a forward-backward feature selection based on p-value from statsmodels.api.OLS. Arguments: X {pandas.DataFrame} -- A data frame with all available features. y {pandas.Series} -- The target variable. Keyword Arguments: initial_list {list} -- Initial list of features (default: {[]}) threshold_in {float} -- Include a feature if its p < threshold_in (default: {0.01}) threshold_out {float} -- Exclude a feature if its p > threshold_out (default: {0.05}) verbose {bool} -- Whether to prints the sequence of inclusions and exclusions (default: {True}) Returns: included {list} -- List of selected variables. """ included = list(initial_list) while True: changed=False # Forward step excluded = list(set(X.columns)-set(included)) new_pval = pd.Series(index=excluded,dtype=float) for new_column in excluded: model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit() new_pval[new_column] = model.pvalues[new_column] best_pval = new_pval.min() if best_pval<threshold_in: best_feature = new_pval.idxmin() included.append(best_feature) changed=True if verbose: print('Add {:30} with p-value {:.6}'.format(best_feature,best_pval)) # Backward step model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit() # use all coefs except intercept pvalues = model.pvalues.iloc[1:] worst_pval = pvalues.max() # null if pvalues is empty if worst_pval>threshold_out: changed=True worst_feature = pvalues.argmax() included.remove(worst_feature) if verbose: print('Drop {:30} with p-value {:.6}'.format(worst_feature,worst_pval)) if not changed: break return included ``` 此代码片段展示了如何创建一个自定义功能以自动化的方式挑选最合适的预测因子集合。给定一组潜在解释变量 \(X\) 及响应变量 \(y\), 上述算法将返回最终选定的一组列名作为输入数据框中的索引列表。 值得注意的是,在实际应用过程中可能还需要考虑其他因素如共线性和交叉验证等,以便进一步提高所选子集的质量和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值