一元线性回归


一、一元线性回归

一元线性回归是回归分析中最简单的一种形式,主要考察单独1个自变量对因变量的影响。其模型形如: y=a+ βx+ε

一元线性回归分析的基本步骤如下:

依据变量之间的关系,判断其是否是线性关系。如果是线性关系,可以利用OLS方法或其他方法进行回归模型的参数估计,然后根据参数估计的结果进行检验。

在检验过程中,可以先对模型的解释能力进行拟合优度判定,拟合优度的判定系数如果非常小,说明建立的回归方程解释能力较差,在进行回归分析的过程中可能还有其他重要因素没有加入到模型当中,可以考虑增加有重要影响的自变量;回归方程总体显著性如果不显著,说明变量之间的线性关系不明显,不适合做线性回归;在拟合优度判定系数比较高、方程总体显著的情况下,对回归系数进行检验,通过显著性检验的回归系数才对因变量有解释能力。

只有通过检验的模型才能够充分描述变量之间的关系,建立的模型才有现实意义。

对于一元线性回归分析,也可用其他工具包,如statsmodels中的ols、sklearn.linear_model中的类LinearRegression等。

二、理论与基础

自变量:样本的特征数值

因变量:需要预测的样本的预测值

1.简单线性回归(simple linear regression)

y:样本的预测值,即回归模型中的应变量

x:样本的特征数值,即回归模型中的自变量

ε:回归模型中的误差项,误差项说明了包含在y里面,但不能被x与y之间线性关系解释的变异性

2.线性回归方程

可以看到它是一条直线

β0: 回归直线y轴的截距

β1: 回归直线y轴的斜率

对于一个给定的x值,E(y)是y的均值或期望值

3.简单线性回归方程,可以分析两个变量的关系

x值越大,E(y)越大,呈正相关

x值越大,E(y)越小,呈负相关

当回归方程的图为一条直线时,两个变量没有相关性

4.估计的简单线性回归方程

对于一个给定的x值是y的平均值E(y)的一个点估计

5.最小二乘准则

三、Python实现一元线性回归分析

使用的代码如下:

import numpy as np
import matplotlib.pyplot as plt

class SimpleRegress(object):
    def __init__(self, x_data, y_data):
        self.x_data = x_data
        self.y_data = y_data
        self.b0 = 0
        self.b1 = 1
        return

    def calculate_work(self):  # 回归方程中b0、b1的求解
        x_mean = np.mean(self.x_data)  # x_mean= 14.0
        y_mean = np.mean(self.y_data)  # y_mean= 130.0
        x1 = self.x_data - x_mean  # x1= [-12.-8.-6.-6.-2.2.6.6.8.12.]
        y1 = self.y_data - y_mean  # y1= [-72.-25.-42.-12.-13.7.27.39.19.72.]
        s = x1 * y1  # s= [864.200.252.72.26.14.162.234.152.864.]
        u = x1 * x1  # u= [144.64.36.36.4.4.36.36.64.144.]
        self.b1 = np.sum(s) / np.sum(u)  # b1= 5.0
        self.b0 = y_mean - self.b1 * x_mean  # b0= 60.0
        return

    def test_data_work(self, text_data):  # 回归方程的建立与数值预测
        result = list([])
        for one_test in text_data:
            y = self.b0 + self.b1 * one_test
            result.append(y)
        return result

    def root_data_view(self):  # 绘制源数据可视化图
        plt.scatter(x_data, y_data, label='simple regress', color='k', s=5)  # s 点的大小
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.show()
        return

    def test_data_view(self):  # 绘制回归线
        # 绘制回归线两个点的数据
        x_min = np.min(self.x_data)
        x_max = np.max(self.x_data)
        y_min = np.min(self.y_data)
        y_max = np.max(self.y_data)
        x_plot = list([x_min, x_max])
        y_plot = list([y_min, y_max])
        # 绘制
        plt.scatter(x_data, y_data, label='root data', color='k', s=5)  # s 点的大小
        plt.plot(x_plot, y_plot, label='regression line')
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.title('simple linear regression')
        plt.show()
        return

x_data = list([2, 6, 8, 8, 12, 16, 20, 20, 22, 26])
y_data = list([58, 105, 88, 118, 117, 137, 157, 169, 149, 202])
test_data = list([16])
sr = SimpleRegress(x_data, y_data)
sr.calculate_work()
result = sr.test_data_work(test_data)  # result= [140.0]
# sr.root_data_view()
sr.test_data_view()

回归线的绘制: