多元线性回归--案例分析及python实践

回归分析--多元回归

介绍一下多元回归分析中的统计量

  • 总观测值\large n
  • 总自变量\large k
  • 自由度df:回归自由度 \large (k),残差自由度 \large (n-k-1)
  • SST总平方和                 \large SST=\sum \left (y_{i} -\bar{y}\right )^{2}
  • SSR回归平方和             \large SSR=\sum \left (\widehat{y}_{i} -\bar{y}\right )^{2}
  • SSE残差平方和             \large SSE=\sum \left (y_{i} -\widehat{y}_{i}\right )^{2}
  • MSR均方回归               \large MSR=\frac{SSR}{k}
  • MSE均方残差               \large MSE=\frac{SSE}{n-k-1}
  • 判定系数R_square        \large R^{2}=\frac{SSR}{SST}=\frac{\sum \left (\widehat{y}_{i} -\bar{y}\right )^{2}}{\sum \left (y_{i} -\bar{y}\right )^{2}} = 1-\frac{\sum \left (y_{i} -\widehat{y}_{i}\right )^{2}}{\sum \left (y_{i} -\bar{y}\right )^{2}}
  • 调整的判定系数Adjusted_R_square   \large R_{a}^{2} = 1-(1-R^{2})(\frac{n-1}{n-k-1})
  • 复相关系数Multiple_R      \large MultipleR = \sqrt{R^{2}}
  • 估计标准误差    \large s_{e}=\sqrt{\frac{\sum \left (y_{i} -\widehat{y}_{i}\right )^{2}}{n-k-1}} = \sqrt{\frac{SSE}{n-k-1}}=\sqrt{MSE}
  • F检验统计量     \large F = \frac{SSR/k}{SSE/\left ( n-k-1 \right )} = \frac{MSR}{MSE} \sim F\left ( k, n-k-1 \right )
  • 回归系数抽样分布的标准误差  \large s_{e}(\widehat{\beta _{k}}) = \sqrt{(s_{e})^{2}(X^{T}X)_{kk}^{-1}}
  • 各回归系数的t检验统计量    \large t_{k} = \frac{\widehat{\beta }_{k}}{Se(\widehat{\beta _{k}})}
  • 各回归系数的置信区间   \large \widehat{\beta }_{k} \pm t_{\alpha /2}(n-k-1) *s_{e}(\widehat{\beta _{k}})
  • 对数似然值(log likelihood)

       \large \sigma = \sqrt{\frac{\sum (y^{(i)} -\theta ^{T}x^{(i)})^{2}}{n}}

       \large logLik = L(\theta ) = \prod_{i=1}^{m}\frac{1}{\sqrt{2\pi }\sigma }exp^{\left ( -\frac{(y^{(i)} -\theta ^{T}x^{(i)})^{2}}{2\sigma ^{2}} \right )}

  • AIC准则   \large AIC=2k - 2logLik
  • BIC准则   \large AIC= - 2logLik + k ln(n)

案例分析及python实践

# 导入相关包
import pandas as pd
import numpy as np
import math
import scipy
import matplotlib.pyplot as plt
from scipy.stats import t
# 构建数据
columns = {'A':"分行编号", 'B':"不良贷款(亿元)", 'C':"贷款余额(亿元)", 'D':"累计应收贷款(亿元)", 'E':"贷款项目个数", 'F':"固定资产投资额(亿元)"}
data={"A":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],
      "B":[0.9,1.1,4.8,3.2,7.8,2.7,1.6,12.5,1.0,2.6,0.3,4.0,0.8,3.5,10.2,3.0,0.2,0.4,1.0,6.8,11.6,1.6,1.2,7.2,3.2],
      "C":[67.3,111.3,173.0,80.8,199.7,16.2,107.4,185.4,96.1,72.8,64.2,132.2,58.6,174.6,263.5,79.3,14.8,73.5,24.7,139.4,368.2,95.7,109.6,196.2,102.2],
      "D":[6.8,19.8,7.7,7.2,16.5,2.2,10.7,27.1,1.7,9.1,2.1,11.2,6.0,12.7,15.6,8.9,0,5.9,5.0,7.2,16.8,3.8,10.3,15.8,12.0],
      "E":[5,16,17,10,19,1,17,18,10,14,11,23,14,26,34,15,2,11,4,28,32,10,14,16,10],
      "F":[51.9,90.9,73.7,14.5,63.2,2.2,20.2,43.8,55.9,64.3,42.7,76.7,22.8,117.1,146.7,29.9,42.1,25.3,13.4,64.3,163.9,44.5,67.9,39.7,97.1]
     }

df = pd.DataFrame(data)
X = df[["C", "D", "E", "F"]]
Y = df[["B"]]
# 构建多元线性回归模型
from sklearn.linear_model import LinearRegression
lreg = LinearRegression()
lreg.fit(X, Y)

x = X
y_pred = lreg.predict(X)
y_true = np.array(Y).reshape(-1,1)

coef = lreg.coef_[0]
intercept = lreg.intercept_[0]
# 自定义函数
def log_like(y_true, y_pred):
    """
    y_true: 真实值
    y_pred:预测值
    """
    sig = np.sqrt(sum((y_true - y_pred)**2)[0] / len(y_pred)) # 残差标准差δ
    y_sig = np.exp(-(y_true - y_pred) ** 2 / (2 * sig ** 2)) / (math.sqrt(2 * math.pi) * sig)
    loglik = sum(np.log(y_sig))
    return loglik

def param_var(x):
    """
    x:只含自变量宽表
    """
    n = len(x)
    beta0 = np.ones((n,1))
    df_to_matrix = x.as_matrix()
    concat_matrix = np.hstack((beta0, df_to_matrix))         # 矩阵合并
    transpose_matrix = np.transpose(concat_matrix)           # 矩阵转置
    dot_matrix = np.dot(transpose_matrix, concat_matrix)     # (X.T X)^(-1)
    inv_matrix = np.linalg.inv(dot_matrix)                   # 求(X.T X)^(-1) 逆矩阵
    diag = np.diag(inv_matrix)                               # 获取矩阵对角线,即每个参数的方差
    return diag

def param_test_stat(x, Se, intercept, coef, alpha=0.05):
    n = len(x)
    k = len(x.columns)
    beta_array = param_var(x)
    beta_k = beta_array.shape[0]
    
    coef = [intercept] + list(coef)
    std_err = []
    t_Stat = []
    P_value = []
    t_intv = []
    coefLower = []
    coefupper = []
    
    for i in range(beta_k):
        se_belta = np.sqrt(Se**2 * beta_array[i])            # 回归系数的抽样标准误差
        t = coef[i] / se_belta                               # 用于检验回归系数的t统计量, 即检验统计量t
        p_value = scipy.stats.t.sf(np.abs(t), n-k-1)*2       # 用于检验回归系数的P值(P_value)
        t_score = scipy.stats.t.isf(alpha/2, df = n-k-1)     # t临界值
        coef_lower = coef[i] - t_score * se_belta            # 回归系数(斜率)的置信区间下限
        coef_upper = coef[i] + t_score * se_belta            # 回归系数(斜率)的置信区间上限
        
        std_err.append(round(se_belta, 3))
        t_Stat.append(round(t,3))
        P_value.append(round(p_value,3))
        t_intv.append(round(t_score,3))
        coefLower.append(round(coef_lower,3))
        coefupper.append(round(coef_upper,3))
        
    dict_ = {"coefficients":list(map(lambda x:round(x, 4), coef)), 
             'std_err':std_err, 
             't_Stat':t_Stat, 
             'P_value':P_value, 
             't临界值':t_intv, 
             'Lower_95%':coefLower, 
             'Upper_95%':coefupper}
    
    index = ["intercept"] + list(x.columns)
    stat = pd.DataFrame(dict_, index=index)
    return stat
# 自定义函数(计算输出各回归分析统计量)
def get_lr_stats(x, y_true, y_pred, coef, intercept, alpha=0.05):
    
    n   = len(x)
    k   = len(x.columns)
    ssr = sum((y_pred - np.mean(y_true))**2)[0]  # 回归平方和 SSR
    sse = sum((y_true - y_pred)**2)[0]           # 残差平方和 SSE
    sst = ssr + sse                              # 总平方和   SST
    msr = ssr / k                                # 均方回归   MSR
    mse = sse / (n-k-1)                          # 均方残差   MSE
    
    R_square = ssr / sst                                   # 判定系数R^2
    Adjusted_R_square = 1-(1-R_square)*((n-1) / (n-k-1))   # 调整的判定系数
    Multiple_R = np.sqrt(R_square)                         # 复相关系数   
    Se = np.sqrt(sse/(n - k - 1))                          # 估计标准误差
    
    loglike = log_like(y_true, y_pred)[0]
    AIC = 2*(k+1) - 2 * loglike                  # (k+1) 代表k个回归参数或系数和1个截距参数
    BIC = -2*loglike + (k+1)*np.log(n)  
    
    # 线性关系的显著性检验
    F  = (ssr / k) / (sse / ( n - k - 1 ))            # 检验统计量F (线性关系的检验)
    pf = scipy.stats.f.sf(F, k, n-k-1)                # 用于检验的显著性F,即Significance F
    Fa = scipy.stats.f.isf(alpha, dfn=k, dfd=n-k-1)   # F临界值
    
    # 回归系数的显著性检验
    stat = param_test_stat(x, Se, intercept, coef, alpha=alpha)
    
    # 输出各回归分析统计量
    print('='*80)
    print('df_Model:{}  df_Residuals:{}'.format(k, n-k-1), '\n')
    print('loglike:{}  AIC:{}  BIC:{}'.format(round(loglike,3), round(AIC,1), round(BIC,1)), '\n')
    print('SST:{}  SSR:{}  SSE:{}  MSR:{}  MSE:{}  Se:{}'.format(round(sst,4),
                                                                 round(ssr,4),
                                                                 round(sse,4),
                                                                 round(msr,4),
                                                                 round(mse,4),
                                                                 round(Se,4)), '\n')
    
    print('Multiple_R:{}  R_square:{}  Adjusted_R_square:{}'.format(round(Multiple_R,4),
                                                                    round(R_square,4),
                                                                    round(Adjusted_R_square,4)), '\n')
    print('F:{}  pf:{}  Fa:{}'.format(round(F,4), pf, round(Fa,4)))
    
    print('='*80)
    print(stat)
    print('='*80)
    
    return 0

输出结果如下:

对比statsmodels下ols结果:

参考资料:

【1】https://www.zhihu.com/question/328568463

【2】https://blog.csdn.net/qq_38998213/article/details/83480147

  • 9
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 多元线性回归分析是一种基于多个自变量来预测因变量的统计法。下面以一个房价预测的案例来说明如何使用Python进行多元线性回归分析。 假设我们有一份数据集,包含了房屋的面积、卧室数量和位置等自变量,以及相应的售价因变量。我们希望通过多元线性回归来建立一个模型,能够根据房屋的特征来预测其售价。 首先,我们需要导入必要的库,如pandas(用于数据处理)、scikit-learn(用于建立回归模型)和matplotlib(用于可视化)。 然后,我们读取数据集,并观察数据的分布和相关性。可以使用pandas的`read_csv`法来读取数据集,并使用`head`法查看前几行数据。可以使用matplotlib的`scatter`法绘制散点图来观察各个自变量与因变量之间的关系。 接下来,我们需要对数据进行预处理。首先,我们需要将自变量和因变量分开,以便训练模型。可以使用pandas的`iloc`法来选择特定的列。然后,我们需要将自变量和因变量分为训练集和测试集,以便检验模型的性能。可以使用scikit-learn的`train_test_split`法来进行数据集的拆分。 然后,我们可以建立多元线性回归模型。可以使用scikit-learn的`LinearRegression`类来建立模型,并使用训练集进行拟合。可以使用模型的`fit`法来进行拟合。 最后,我们可以使用测试集来评估模型的性能。可以使用模型的`score`法来计算模型的准确率或均误差等指标。 综上所述,使用Python进行多元线性回归分析的步骤如下:导入必要的库、读取数据集、观察数据的分布和相关性、数据预处理、建立回归模型、训练模型、评估模型的性能。以上是一个简单的案例示例,实际应用中可能需要更多的数据处理和模型优化。 ### 回答2: 多元线性回归分析是一种统计法,用于研究多个自变量与一个因变量之间的关系。下面以一种案例来说明如何使用Python进行多元线性回归分析。 假设我们想研究某城市房屋价格与其面积、卧室数量以及距离市中心的距离之间的关系。我们可以收集到一组相关数据,其中包括了许多房屋的信息,包括它们的面积、卧室数量和距离市中心的距离,以及对应的价格。 首先,我们需要导入Python中的一些库,如numpy、pandas和statsmodels,以便于数据的处理和回归分析的实现。然后,我们可以使用pandas库中的read_csv函数从数据集中读取数据,并将其转换为数据帧形式。 接下来,我们可以使用statsmodels库来构建多元线性回归模型。回归模型的核心是将因变量和自变量传入模型中,并使用fit函数进行拟合。由于我们有多个自变量,因此需要在模型中指定这些自变量。 一旦模型被拟合,我们就可以使用模型法来进行预测和分析。例如,我们可以使用模型的预测函数来预测新的房屋价格。另外,我们还可以使用模型的summary函数来查看各个自变量的系数、p值、置信区间等统计信息。 最后,我们可以使用可视化工具如matplotlib来绘制散点图和回归线,以展示自变量与因变量之间的关系。 总之,Python提供了丰富的库和函数来进行多元线性回归分析。通过收集相关数据、构建模型、拟合模型并进行预测和分析,我们可以了解自变量对于因变量的影响,并通过可视化结果来直观展示分析结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值