概述
本篇博客分为两大部分,第一部分是最小二乘法作线性回归时会遭遇的问题:多重共线性问题。第二部分,使用岭回归解决第一部分中的多重共线性问题。
第一部分:线性回归最小二乘法的困境
第一部分借由1987-2007年的人口、消费和技术对碳排放的影响的数据来说明多重共线性问题(包括如何判断多重共线性问题)和多重共线性问题对普通最小二乘估计的影响。同时也给出线性模型定义和普通最小二乘法对线性模型的拟合的介绍
1.1 1987-2007年的人口、消费和科技对碳排放的影响
研究目的是量化分析人口、消费和技术因素对碳排放的影响,进而判断哪些因素是影响气候变化的主要因子。
文献[1]提出一个关于人文因素 (人口、经济和技术)对环境影响的量化模型STIRPAT模型:
I = α P b A c T d e (1) I = \alpha P^bA^cT^de \tag{1} I=αPbAcTde(1)
其中, α \alpha α为模型系数,b、c、d为各自变量指数,e为误差。
对两边取自然对数,得到方程:
l n I = l n a + b ( l n P ) + c ( l n A ) + d ( l n T ) + l n e (2) lnI = lna + b(lnP) + c(lnA) + d(lnT)+lne\tag{2} lnI=lna+b(lnP)+c(lnA)+d(lnT)+lne(2)
将人口城市化率引入模型,得到最终的扩展的STIRPAT模型:
l n I = l n a + b s ( l n P s ) + b c ( l n P c ) + c ( l n A ) + d ( l n T ) + l n e (3) lnI = lna + b_s(lnP_s) + b_c(lnP_c)+ c(lnA) + d(lnT)+lne \tag{3} lnI=lna+bs(lnPs)+bc(lnPc)+c(lnA)+d(lnT)+lne(3)
模型一般还会假设误差项 l n e lne lne满足正态分布、同方差,见附录1。
数据可以从这里下载链接:链接: https://pan.baidu.com/s/12s4lJNGIXXuBVX1QRXjGbw 密码: afn7
数据来源于文献[1],如表1所示:
按照公式(3),使用statsmodels库中的简单最小二乘法对公式(3)进行回归方程拟合。
statsmodels起源于Jonathan Taylor用R语言实现的各类统计分析模型,由Skipper Seabold 和Josef Perktold于2010年开始开发,实现各种统计模型和假设检验。
下面是数据读取和标准化代码:
import numpy as np
import pandas as pd
# 载入数据
file_path = "./PopulationConsumptionAndCarbonEmission1980_2007.csv"
data_df = pd.read_csv(open(file_path, encoding='utf-8'))
# 给列名重新命名,每一列就是一个自(因)变量的观测值
data_df.columns = ['year','I', 'Ps', 'Pc', 'A', 'T']
# 量纲恢复
data_df['I'] = data_df['I']*1e4
data_df['Ps'] = data_df['Ps']*1e4
data_df['T'] = data_df['T']*1e4
# 数据标准化
def Normalize(data):
"""对因变量作标准化变换,标准化因子选择是标准差,这个和文献[1]不相同"""
return (data - data.mean())/data.std()
下面是statsmodels库中的简单最小二乘法拟合公式(3)的代码:
import statsmodels.api as sm
# 为了时间连续性,选取1990-2007年数据,下同。
X = np.log(data_df.iloc[2:,2:])
y = np.log(data_df.iloc[2:,1])
X = sm.add_constant(X)
ols_model = sm.OLS(y, X).fit()
print(ols_model.summary())
回归结果如下图所示: