Python OLS 双向逐步回归方式

 更新时间:2024年05月16日 09:55:46   作者:AdamShyly  
这篇文章主要介绍了Python OLS 双向逐步回归方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Python OLS 双向逐步回归

算法基本思路

首先需要确定一个因变量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上基于Markov链生成伪随机文本的教程

    在Python上基于Markov链生成伪随机文本的教程

    这篇文章主要介绍了在Python上基于Markov链生成伪随机文本的教程,是一个基于马尔可夫算法的小实现,充分体现了Python在科学计算中的用途,需要的朋友可以参考下
    2015-04-04
  • 如何快速理解python的垃圾回收机制

    如何快速理解python的垃圾回收机制

    在本篇内容里小编给各位分享的是一篇关于如何快速理解python的垃圾回收机制的相关知识点内容,需要的朋友们可以学习下。
    2020-09-09
  • 详解Python中字典的增删改查

    详解Python中字典的增删改查

    这篇文章主要为大家介绍了 Python字典的增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • numpy中的log和ln函数解读

    numpy中的log和ln函数解读

    这篇文章主要介绍了numpy中的log和ln函数解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python 实现学生信息管理系统的示例

    python 实现学生信息管理系统的示例

    本篇文章主要分享python学生管理系统的使用,文章非常详细地介绍了通过示例代码实现的学生管理系统,该系统对每个人的研究或工作都有一定的参考学习价值,希望你能在其中有所收获。
    2020-11-11
  • Python报错:ModuleNotFoundError的解决办法

    Python报错:ModuleNotFoundError的解决办法

    "ModuleNotFoundError: No module named 'xxx'"这个报错是个非常常见的报错,几乎每个python程序员都遇到过,下面这篇文章主要给大家介绍了关于Python报:ModuleNotFoundError错误的解决办法,需要的朋友可以参考下
    2022-06-06
  • python实现自定义日志的具体方法

    python实现自定义日志的具体方法

    在本篇文章里小编给大家整理的是一篇关于python实现自定义日志的具体方法,有兴趣的朋友们可以学习下。
    2021-05-05
  • CentOS6.5设置Django开发环境

    CentOS6.5设置Django开发环境

    这篇文章主要为大家详细介绍了CentOS6.5设置Django开发环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 在Pycharm中执行scrapy命令的方法

    在Pycharm中执行scrapy命令的方法

    今天小编就为大家分享一篇在Pycharm中执行scrapy命令的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • pytest中fixture函数使用

    pytest中fixture函数使用

    本文主要介绍了pytest中fixture函数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论