先学习这个资料:

OLS自编算法,不调用函数

重要的英文参考资料:

Using Python for Introductory Econometrics

kevinsheppard讲授Python做计量

相关分析

1.相关系数的计算公式:
r=∑(xi−xˉ)(yi−yˉ)∑(xi−xˉ)2∑(yi−yˉ)2r=\frac{\sum (x_{i}-\bar{x})(y_{i}-\bar{y})}{\sum (x_{i}-\bar{x})^{2}\sum(y_{i}-\bar{y})^{2}} r=∑(xi​−xˉ)2∑(yi​−yˉ​)2∑(xi​−xˉ)(yi​−yˉ​)​
2. 统计量:
t=r∗n−21−r2,自由度:(n−2)t=\frac{r*\sqrt{n-2}}{\sqrt{1-r^{2}}} , 自由度:(n-2) t=1−r2​r∗n−2​​,自由度:(n−2)
3.根据 t 统计量来计算显著性水平,从而确认(x,y)(x,y)(x,y)之间的相关性是否显著(H0H0H0:相关系数等于0,即相关性不显著)。

import pandas as pd
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegressiondata=pd.DataFrame()
data=pd.DataFrame(pd.read_excel(r"D:\myfolder\al5-1.xls"))
x=np.array(data[['adv']])
y=np.array(data[['sale']])plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#matplotlib画图中中文显示会有问题,需要这两行设置默认字体plt.xlabel('X')
plt.ylabel('Y')
colors1 = '#00CED1' #点的颜色
area = np.pi * 16**2  # 点面积
plt.scatter(x, y, s=area, c=colors1, alpha=0.4, label='散点图:adv-sale')
plt.plot(linewidth = '0.5',color='#000000')
plt.legend()
print(type(x)) #<class 'numpy.ndarray'>
x=np.squeeze(x)
y=np.squeeze(y)
corr,pval=stats.pearsonr(x,y)
print( '相关系数(pearson 间隔量表) = %6.5f  显著性水平 = %6.5f' % (corr, pval))corr,pval=stats.spearmanr(x,y)
print( '相关系数(spearman 顺序量表) = %6.5f  显著性水平 = %6.5f' % (corr, pval))

<class ‘numpy.ndarray’>
相关系数(pearson ) = 0.96368 显著性水平 = 0.00000
相关系数(spearman) = 0.99301 显著性水平 = 0.00000

计算相关系数表

df=data[['time','adv','sale']]
df.corr()

利用现有数据回归一下:

import statsmodels.api as sm #最小二乘
from statsmodels.formula.api import ols #加载ols模型lm=ols('sale~ adv',data=data).fit()
print(lm.summary())


请看看上面的结果,相关系数(pearson ) = 0.96368,它的平方等于 0.9286791423999999,然后再看看上面的回归结果,R2R^{2}R2=0.929。这也验证了在二元回归方程中:R2=r2R^{2}=r^{2}R2=r2。

例子:

import statsmodels.formula.api as smf
model = smf.ols('distress ~ num_at_risk + launch_temp + leak_check_pressure + order', data = data)
result = model.fit()
# result.summary()
import matplotlib.pyplot as plt
plt.figure(figsize = (10, 8), dpi = 80)
plt.scatter(result.fittedvalues, result.resid)
plt.plot([-0.3, 1.3], [0, 0], color = "black")
plt.show()#############
import numpy as np
import pandas as pd
from sklearn.linear_model import BayesianRidge, LinearRegression, ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor   # 集成算法
from sklearn.model_selection import cross_val_score    # 交叉验证
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline# 数据导入
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/boston/train.csv', usecols=['lstat', 'indus', 'nox', 'rm', 'medv'])# 可视化数据关系
sns.set(style='whitegrid', context='notebook')   #style控制默认样式,context控制着默认的画幅大小
sns.pairplot(df, size=2)
plt.savefig('x.png')
#######
# 相关度
corr = df.corr()
# 相关度热力图
sns.heatmap(corr, cmap='GnBu_r', square=True, annot=True)
plt.savefig('xx.png')
# 自变量
X = df[['lstat', 'rm']].values
# 因变量
y = df[df.columns[-1]].values# 设置交叉验证次数
n_folds = 5# 建立贝叶斯岭回归模型
br_model = BayesianRidge()# 普通线性回归
lr_model = LinearRegression()# 弹性网络回归模型
etc_model = ElasticNet()# 支持向量机回归
svr_model = SVR()# 梯度增强回归模型对象
gbr_model = GradientBoostingRegressor()# 不同模型的名称列表
model_names = ['BayesianRidge', 'LinearRegression', 'ElasticNet', 'SVR', 'GBR']
# 不同回归模型
model_dic = [br_model, lr_model, etc_model, svr_model, gbr_model]
# 交叉验证结果
cv_score_list = []
# 各个回归模型预测的y值列表
pre_y_list = []# 读出每个回归模型对象
for model in model_dic:# 将每个回归模型导入交叉检验scores = cross_val_score(model, X, y, cv=n_folds)# 将交叉检验结果存入结果列表cv_score_list.append(scores)# 将回归训练中得到的预测y存入列表pre_y_list.append(model.fit(X, y).predict(X))
### 模型效果指标评估 ###
# 获取样本量,特征数
n_sample, n_feature = X.shape
# 回归评估指标对象列表
model_metrics_name = [explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]
# 回归评估指标列表
model_metrics_list = []
# 循环每个模型的预测结果
for pre_y in pre_y_list:# 临时结果列表tmp_list = []# 循环每个指标对象for mdl in model_metrics_name:# 计算每个回归指标结果tmp_score = mdl(y, pre_y)# 将结果存入临时列表tmp_list.append(tmp_score)# 将结果存入回归评估列表model_metrics_list.append(tmp_list)
df_score = pd.DataFrame(cv_score_list, index=model_names)
df_met = pd.DataFrame(model_metrics_list, index=model_names, columns=['ev', 'mae', 'mse', 'r2'])# 各个交叉验证的结果
df_score
# 各种评估结果
df_met
### 可视化 ###
# 创建画布
plt.figure(figsize=(9, 6))
# 颜色列表
color_list = ['r', 'g', 'b', 'y', 'c']
# 循环结果画图
for i, pre_y in enumerate(pre_y_list):# 子网络plt.subplot(2, 3, i+1)# 画出原始值的曲线plt.plot(np.arange(X.shape[0]), y, color='k', label='y')# 画出各个模型的预测线plt.plot(np.arange(X.shape[0]), pre_y, color_list[i], label=model_names[i])plt.title(model_names[i])plt.legend(loc='lower left')
plt.savefig('xxx.png')
plt.show()
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm TV = [230.1, 44.5, 17.2, 151.5, 180.8]
Radio = [37.8,39.3,45.9,41.3,10.8]
Newspaper = [69.2,45.1,69.3,58.5,58.4]
Sales = [22.1, 10.4, 9.3, 18.5,12.9]
df = pd.DataFrame({'TV': TV, 'Radio': Radio, 'Newspaper': Newspaper, 'Sales': Sales}) Y = df.Sales
X = df[['TV','Radio','Newspaper']]
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
print(model.summary())

我们做回归的时候,可以调用以下模块来进行:

  1. 使用patsy创建模型,使用其下面的 dmatrices来生成 设计矩阵,不需要再生成常数项的1111…数列了,后面再调用statsmodels.api 来执行回归任务。
  2. statsmodels的线性模型有两种不同的接口:1基于数组:import statsmodels.api as sm,需要配合 add_constant()来生成自变量矩阵。
  3. statsmodels的线性模型有两种不同的接口:2基于公式:import statsmodels.formula.api as smf,写公式直接拟合方程,公式中自变量可以变为平方项、自变量相互相乘等等,很方便的。
  4. 机器学习sklearn 的 linear_model模块来执行回归任务。

参考资料:python建模库介绍

同学们做最后的项目,可以参考以上博主的文章,提供了有关数据整理的系统性介绍。

伍德里奇书上的例子:

import wooldridge as woo
import numpy as np
import pandas as pd
import statsmodels.formula.api as smfattend = woo.dataWoo('attend')
n = attend.shape[0]
# # shape[0]输出矩阵的行数, 同理shape[1]输出列数
reg = smf.ols(formula='stndfnl ~ atndrte*priGPA + ACT + I(priGPA**2) + I(ACT**2)',data=attend)
results = reg.fit()# print regression table:
table = pd.DataFrame({'b': round(results.params, 4),'se': round(results.bse, 4),'t': round(results.tvalues, 4),'pval': round(results.pvalues, 4)})
print(f'table: \n{table}\n')# estimate for partial effect at priGPA=2.59:
b = results.params
partial_effect = b['atndrte'] + 2.59 * b['atndrte:priGPA']
print(f'partial_effect: {partial_effect}\n')# F test for partial effect at priGPA=2.59:
hypotheses = 'atndrte + 2.59 * atndrte:priGPA = 0'
ftest = results.f_test(hypotheses)
fstat = ftest.statistic[0][0]
fpval = ftest.pvalueprint(f'fstat: {fstat}\n')
print(f'fpval: {fpval}\n')

回归中的一些检验:

  1. 回归系数假设检验方法(可以检验 β\betaβ 为任意值的情形)
    t=β^−E(β^)Se(β^)∼t(n−k−1)t=\frac{\hat{\beta}-E(\hat{\beta})}{S_{e}(\hat{\beta})}\sim t(n-k-1) t=Se​(β^​)β^​−E(β^​)​∼t(n−k−1)
    其中:

注意: x=Xi−Xˉx =X_{i} -\bar{X}x=Xi​−Xˉ

Se(β^)=σ^∑xi2,σ^扰动项方差,算法是:S_{e}(\hat{\beta })=\frac{\hat{\sigma }}{\sqrt{\sum x_{i}^{2}}} , \hat{\sigma}扰动项方差,算法是: Se​(β^​)=∑xi2​​σ^​,σ^扰动项方差,算法是:

σ^2=∑ei2n−k−1\hat{\sigma }^{2}=\frac{\sum e_{i}^{2}}{n-k-1} σ^2=n−k−1∑ei2​​

比如: H0H0H0 : β\betaβ=8 等等,其实就是把8带入到 E(β^)E(\hat{\beta})E(β^​) 的位置,然后去计算 T 值。

  1. 系数的显著性检验:即 β\betaβ=0 的检验
    t=β^−0Se(β^)∼t(n−k−1)t=\frac{\hat{\beta}-0}{S_{e}(\hat{\beta})}\sim t(n-k-1) t=Se​(β^​)β^​−0​∼t(n−k−1)

  2. 全部斜率系数 β\betaβ 为 0 的 FFF 检验。
    F=∑i=1N(Yi^−Yiˉ)2/k∑i=1N(Yi−Yi^)2/(n−k−1)F=\frac{\sum_{i=1}^{N}(\hat{Y_{i}}-\bar{Y_{i}})^2/k} {\sum_{i=1}^{N}({Y_{i}}-\hat{Y_{i}})^2/(n-k-1)} F=∑i=1N​(Yi​−Yi​^​)2/(n−k−1)∑i=1N​(Yi​^​−Yi​ˉ​)2/k​

教材的公式有误。

公式变形后有:F=n−k−1k∗R21−R2公式变形后有:F=\frac{n-k-1}{k}*\frac{R^2}{1-R^2} 公式变形后有:F=kn−k−1​∗1−R2R2​
所以,F 检验和 拟合优度 是有联系的。

  1. 方程拟合优度 R2R^2R2
    R2=解释的变差总变差=ESSTSSR^2=\frac{解释的变差}{总变差} =\frac{ESS}{TSS} R2=总变差解释的变差​=TSSESS​

ESSTSS=∑i=1N(Yi^−Yˉ)2∑i=1N(Yi−Yˉ)2=1−∑i=1Nei2∑i=1N(Yi−Yˉ)2\frac{ESS}{TSS} =\frac{\sum_{i=1}^{N}(\hat{Y_{i}}-\bar{Y})^2} {\sum_{i=1}^{N}({Y_{i}}-\bar{Y})^2} =1- \frac{\sum_{i=1}^{N}e_{i} ^2} {\sum_{i=1}^{N}({Y_{i}}-\bar{Y})^2} TSSESS​=∑i=1N​(Yi​−Yˉ)2∑i=1N​(Yi​^​−Yˉ)2​=1−∑i=1N​(Yi​−Yˉ)2∑i=1N​ei2​​

判断拟合效果的统计量还有:平均绝对误差MAE 和 均方根误差 RMSE。

MAE=∑i=1N∣Yi^−Yi∣NMAE=\frac{ {\textstyle \sum_{i=1}^{N}}\left |\hat{Y_{i} } -Y_{i} \right | }{N} MAE=N∑i=1N​∣∣∣​Yi​^​−Yi​∣∣∣​​

RMSE=∑i=1N(Yi^−Yi)2NRMSE=\sqrt{\frac{ {\textstyle \sum_{i=1}^{N}}(\hat{Y_{i} } -Y_{i} )^2 }{N} } RMSE=N∑i=1N​(Yi​^​−Yi​)2​​

  1. 双变量回归中 YYY的置信区间(其中:x=Xi−Xˉx =X_{i} -\bar{X}x=Xi​−Xˉ

Y0−Y0^σ^∗1+1n+(X0−Xˉ)2∑x2∼t(n−2)\frac{Y_{0} -\hat{Y_{0}} }{\hat{\sigma }*\sqrt{1+\frac{1}{n} +\frac{(X_{0} -\bar{X} )^2}{\sum x^{2} } } } \sim t(n-2) σ^∗1+n1​+∑x2(X0​−Xˉ)2​​Y0​−Y0​^​​∼t(n−2)

则Y0^\hat{Y_{0}}Y0​^​ 的 95% 置信区间为:
(α^+β^X0)±t0.025(n−2)∗σ^∗1+1n+(X0−Xˉ)2∑x2(\hat{\alpha }+\hat{\beta} X_{0} )\pm t_{0.025}(n-2)* {\hat{\sigma }*\sqrt{1+\frac{1}{n} +\frac{(X_{0} -\bar{X} )^2}{\sum x^{2} } } } (α^+β^​X0​)±t0.025​(n−2)∗σ^∗1+n1​+∑x2(X0​−Xˉ)2​​

import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm TV = [230.1, 44.5, 17.2, 151.5, 180.8]
Radio = [37.8,39.3,45.9,41.3,10.8]
Newspaper = [69.2,45.1,69.3,58.5,58.4]
Sales = [22.1, 10.4, 9.3, 18.5,12.9]
df = pd.DataFrame({'TV': TV, 'Radio': Radio, 'Newspaper': Newspaper, 'Sales': Sales}) Y = df.Sales
X = df[['TV','Radio','Newspaper']]
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
print(model.summary())

1.提取元素-回归系数类

# 提取回归系数
model.params# 提取回归系数标准差
model.bse# 提取回归系数p值
model.pvalues# 提取回归系数t值
model.tvalues# 提取回归系数置信区间 默认5%,括号中可填具体数字 比如0.05, 0.1
model.conf_int()  # 提取模型预测值
model.fittedvalues# 提取残差
model.resid# 模型自由度(系数自由度)
model.df_model# 残差自由度(样本自由度)
model.df_resid# 模型样本数量
model.nobs

2.模型评价类:

# 提取R方
model.rsquared# 提取调整R方
model.rsquared_adj# 提取AIC
model.aic# 提取BIC
model.bic# 提取F-statistic
model.fvalue# 提取F-statistic 的pvalue
model.f_pvalue# 模型mse
model.mse_model# 残差mse
model.mse_resid# 总体mse
model.mse_total

3.下面是不太常用的计量经济学方面的系数:

# 协方差矩阵比例因子
model.scale#  White异方差稳健标准误
model.HC0_se# MacKinnon和White(1985)的异方差稳健标准误
model.HC1_se#  White异方差矩阵
model.cov_HC0# MacKinnon和White(1985)的异方差矩阵
model.cov_HC1

以上可查阅这篇文章

参考文章:

Python实现多元线性回归

Python实现多元线性回归

Python 实战多元线性回归模型

Python 实现多元线性回归预测

利用scipy, seaborn 做假设检验,回归分析

lecture 8:OLS回归模型相关推荐

  1. 双变量OLS回归模型(Python3)

    模型为Y=B1+B2X+u Y-平均小时工资 X-读书年数 import statsmodels.api as sm Y=[4.4567,5.77,5.9787,7.3317,7.3182,6.584 ...

  2. python回归模型_缺少Python statsmodels中OLS回归模型的截取

    我正在进行滚动,例如在 this link( https://drive.google.com/drive/folders/0B2Iv8dfU4fTUMVFyYTEtWXlzYkk)中找到的数据集的1 ...

  3. python的ols模型_pythonstatsmodels中缺少OLS回归模型的截取

    time X Y 0.000543 0 10 0.000575 0 10 0.041324 1 10 0.041331 2 10 0.041336 3 10 0.04134 4 10 ... 9.98 ...

  4. 美赛 6:相关性模型、回归模型(十大模型篇)

    目录 三.相关性模型(SPSS) 1.皮尔逊相关系数 2.皮尔逊相关系数假设检验 3.数据正态分布检验 4.斯皮尔曼相关系数 四.回归模型(Stata) 1.多元线性回归分析 2.逐步回归分析 3.岭 ...

  5. logit回归模型_常见机器学习模型的假设

    > Photo by Thought Catalog on Unsplash 暂时忘记深度学习和神经网络. 随着越来越多的人开始进入数据科学领域,我认为重要的是不要忘记这一切的基础. 统计. 如 ...

  6. 基于Geoda的经典空间回归模型(OLS)、空间误差模型(SEM)和空间迟滞模型(SLM)

    引言 最近在网上搜索有关空间误差模型的方法,看到的最多的就是https://editor.csdn.net/md/?not_checkout=1&spm=1001.2014.3001.5352 ...

  7. python多元线性回归mlr 校正_多元线性 回归模型满足假定 MLR.1 ~假定 MLR.4 时 , 回归参数的 OLS 估计量是 的 。_学小易找答案...

    [填空题]任务5-1的照明回路WL4的管内穿线BV-2.5的安装工程量是()m [单选题]必须认识到,我国社会主要矛盾的变化,没有改变我们对我国社会主义所处历史阶段的判断,我国仍处于并将长期处于___ ...

  8. python时间序列滞后命令_如何在Python Pandas回归模型中使用滞后的时间序列变量?...

    我正在创建时间序列计量经济回归模型. 数据存储在Pandas数据框中. 如何使用Python进行滞后的时序经济计量分析? 我过去曾经使用过Eviews(这是一个独立的计量经济学程序,即不是Python ...

  9. 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!

    作者 | 台运鹏 几乎每个机器学习从业者都知道回归,其中一些人可能认为这没什么大不了的,只是从参数之间的切 换罢了.本文将阐明每种回归算法的细节,以及确切的区别.包括 : OLS Weighted L ...

最新文章

  1. 关于学习数据库的一点总结
  2. linux shell map dict 字典数组
  3. 2020-11-4(安卓开发)
  4. 230. Kth Smallest Element in a BST
  5. 孩子学python用什么教材比较好-python大学里用哪本教材比较好?
  6. 太阳能灯_【产品中心】太阳能野营灯
  7. (48)FPGA三态多驱动(tri型)
  8. linux g++ 链接,Linux G++将64位共享库代码链接到静态库
  9. [Java] 蓝桥杯ALGO-103 算法训练 完数
  10. iOS开发之算法加密md5,sha1,AES,base64
  11. vue-cli中引入jquery的方法
  12. SpringBoot项目从IE浏览器跳转至谷歌浏览器并打包成windows环境下可行EXE文件
  13. 非科班程序员AI学习路径建议
  14. 绪论 数据库系统工程师考试分析
  15. 使用python对图片进行压缩
  16. win7计算机开机黑屏解决办法参考
  17. Linux tcp拥塞控制
  18. 小程序跳转:h5避免中间页直接打开微信小程序
  19. 使用windows自带虚拟机---Hyper-V 管理器
  20. 两台电脑无线连接的办法

热门文章

  1. iPhone 9或延后上市,你会换新手机吗?
  2. CSS3模拟中文/英文打字效果
  3. 恭喜微微软喜当爹,Github嫁入豪门。
  4. MyEclipse6.5_org.tigris.subversion.javahl.ClientException: Unsupported working copy format问题解决方法
  5. 淘宝关了我的店封了我的号, 严重歧视程序员开店
  6. python图灵智能语音聊天机器人
  7. 小学家长会主题班会PPT模板
  8. python适合哪个专业好_那个选错专业的大学生,后来去干嘛了?
  9. CityEngine -- CGA语法学习
  10. 关于友善电子开发板RK3399再Ubuntu系统下串口绑定