如何用python实现含有虚拟自变量的回归

作者&投稿:曹奚 (若有异议请与网页底部的电邮联系)
python怎样做高斯拟合~

需要载入numpy和scipy库,若需要做可视化还需要matplotlib(附加dateutil, pytz, pyparsing, cycler, setuptools库)。不画图就只要前两个。

如果没有这些库的话去 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应版本,之后解压到 C:\Python27\Lib\site-packages。
import numpy as np import pylab as plt #import matplotlib.pyplot as plt from scipy.optimize import curve_fit from scipy import asarray as ar,exp x = ar(range(10)) y = ar([0,1,2,3,4,5,4,3,2,1]) def gaussian(x,*param): return param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4], 2.)))+param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.))) popt,pcov = curve_fit(gaussian,x,y,p0=[3,4,3,6,1,1]) print popt print pcov plt.plot(x,y,'b+:',label='data') plt.plot(x,gaussian(x,*popt),'ro:',label='fit') plt.legend() plt.show()

一元回归容易啊。先求中心点,然后计算斜率,迭代,直到各个点到直线的距离最小。可以自己写一个算法。


利用python进行线性回归


理解什么是线性回归

线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的数学模型是这样的:

y = a+ b* x+e

其中,a 被称为常数项或截距;b 被称为模型的回归系数或斜率;e 为误差项。a 和 b 是模型的参数。

当然,模型的参数只能从样本数据中估计出来:

y'= a' + b'* x

我们的目标是选择合适的参数,让这一线性模型最好地拟合观测值。拟合程度越高,模型越好。
那么,接下来的问题就是,我们如何判断拟合的质量呢?

这一线性模型可以用二维平面上的一条直线来表示,被称为回归线。



模型的拟合程度越高,也即意味着样本点围绕回归线越紧密。

如何计算样本点与回归线之间的紧密程度呢?

高斯和勒让德找到的方法是:被选择的参数,应该使算出来的回归线与观测值之差的平房和最小。用函数表示为:

这被称为最小二乘法。最小二乘法的原理是这样的:当预测值和实际值距离的平方和最小时,就选定模型中的两个参数(a 和 b)。这一模型并不一定反映解释变量和反应变量真实的关系。但它的计算成本低;相比复杂模型更容易解释。


模型估计出来后,我们要回答的问题是:
我们的模型拟合程度如何?或者说,这个模型对因变量的解释力如何?(R2)

整个模型是否能显著预测因变量的变化?(F 检验)

每个自变量是否能显著预测因变量的变化?(t 检验)

首先回答第一个问题。为了评估模型的拟合程度如何,我们必须有一个可以比较的基线模型。

如果让你预测一个人的体重是多少?在没有任何额外信息的情况下,你可能会用平均值来预测,尽管会存在一定误差,但总比瞎猜好。

现在,如果你知道他的身高信息,你的预测值肯定与平均值不一样。额外信息相比平均值更能准确地预测被预测的变量的能力,就代表模型的解释力大小。



上图中,SSA 代表由自变量 x 引起的 y 的离差平方和,即回归平方和,代表回归模型的解释力;SSE 代表由随机因素引起的 y 的离差平方和,即剩余平方和,代表回归模型未能解释的部分;SST 为总的离差平方和,即我们仅凭 y 的平均值去估计 y 时所产生的误差。

用模型能够解释的变异除以总的变异就是模型的拟合程度:
R2=SSA/SST=1-SSE

R2(R 的平方)也被称为决定系数或判定系数。

第二个问题,我们的模型是否显著预测了 y 的变化?

假设 y 与 x 的线性关系不明显,那么 SSA 相对 SSE 占有较大的比例的概率则越小。换句话说,在 y 与 x 无线性关系的前提下,SSA 相对 SSE 的占比越高的概率是越小的,这会呈现一定的概率分布。统计学家告诉我们它满足 F 分布,就像这样:



如果 SSA 相对 SSE 占比较大的情况出现了,比如根据 F 分布,这个值出现的概率小于 5%。那么,我们最好是拒绝 y 与 x 线性关系不显著的原始假设,认为二者存在显著的线性关系较为合适。

第三个问题,每个自变量是否能显著预测因变量的变化?换句话说,回归系数是否显著?

回归系数的显著性检验是围绕回归系数的抽样分布(t 分布)来进行的,推断过程类似于整个模型的检验过程,不赘言。

实际上,对于只有一个自变量的一元线性模型,模型的显著性检验和回归系数的检验是一致的,但对于多元线性模型来说,二者就不能等价了。

利用 statsmodels 进行最小二乘回归

#导入相应模块

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: import statsmodels.api as sm

#将数据导入 pandas 的 dataframe 对象,第一列(年份)作为行标签

In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看头部数据
In [5]: df.head()

Out[5]:

GNP.deflator      GNP  Unemployed  Armed.Forces  Population  Year  \

1947          83.0  234.289       235.6         159.0     107.608  1947

1948          88.5  259.426       232.5         145.6     108.632  1948

1949          88.2  258.054       368.2         161.6     109.773  1949

1950          89.5  284.599       335.1         165.0     110.929  1950

1951          96.2  328.975       209.9         309.9     112.075  1951

Employed

1947    60.323

1948    61.122

1949    60.171

1950    61.187

1951    63.221

#设置预测变量和结果变量,用 GNP 预测 Employed

In [6]: y=df.Employed #结果变量

In [7]: X=df.GNP #预测变量
#为模型增加常数项,即回归线在 y 轴上的截距
In [8]: X=sm.add_constant(X)

#执行最小二乘回归,X 可以是 numpy array 或 pandas dataframe(行数等于数据点个数,列数为预测变量个数),y 可以是一维数组(numpy array)或 pandas series

In [10]: est=sm.OLS(y,X)

使用 OLS 对象的 fit() 方法来进行模型拟合

In [11]: est=est.fit()
#查看模型拟合的结果
In [12]: est.summary()

Out[12]:



#查看最终模型的参数
In [13]: est.params

Out[13]:

const    51.843590

GNP       0.034752

dtype: float64

#选择 100 个从最小值到最大值平均分布(equally spaced)的数据点

In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]

In [15]: X_prime=sm.add_constant(X_prime)

#计算预测值

In [16]: y_hat=est.predict(X_prime)

In [17]: plt.scatter(X.GNP, y, alpha=0.3) #画出原始数据
#分别给 x 轴和 y 轴命名

In [18]: plt.xlabel("Gross National Product")

In [19]: plt.ylabel("Total Employment")

In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回归线,红色


多元线性回归(预测变量不止一个)

我们用一条直线来描述一元线性模型中预测变量和结果变量的关系,而在多元回归中,我们将用一个多维(p)空间来拟合多个预测变量。下面表现了两个预测变量的三维图形:商品的销量以及在电视和广播两种不同媒介的广告预算。



数学模型是:

Sales = beta_0 + beta_1*TV + beta_2*Radio

图中,白色的数据点是平面上的点,黑色的数据点事平面下的点。平面的颜色是由对应的商品销量的高低决定的,高是红色,低是蓝色。

利用 statsmodels 进行多元线性回归

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: import statsmodels.api as sm

In [4]: df_adv=pd.read_csv('g.csv',index_col=0)

In [6]: X=df_adv[['TV','Radio']]

In [7]: y=df_adv['Sales']

In [8]: df_adv.head()

Out[8]:

TV  Radio  Newspaper  Sales

1  230.1   37.8       69.2   22.1

2   44.5   39.3       45.1   10.4

3   17.2   45.9       69.3    9.3

4  151.5   41.3       58.5   18.5

5  180.8   10.8       58.4   12.9

In [9]: X=sm.add_constant(X)

In [10]: est=sm.OLS(y,X).fit()

In [11]: est.summary()

Out[11]:


你也可以使用 statsmodels 的 formula 模块来建立多元回归模型

In [12]: import statsmodels.formula.api as smf

In [13]: est=smf.ols(formula='Sales ~ TV + Radio',data=df_adv).fit()

处理分类变量

性别或地域都属于分类变量。

In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)

In [16]: X=df.copy()

利用 dataframe 的 pop 方法将 chd 列单独提取出来

In [17]: y=X.pop('chd')

In [18]: df.head()

Out[18]:

sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  \

row.names

1          160    12.00  5.73      23.11  Present     49    25.30    97.20

2          144     0.01  4.41      28.61   Absent     55    28.87     2.06

3          118     0.08  3.48      32.28  Present     52    29.14     3.81

4          170     7.50  6.41      38.03  Present     51    31.99    24.26

5          134    13.60  3.50      27.78  Present     60    25.99    57.34

age  chd

row.names

1           52    1

2           63    1

3           46    0

4           58    1

5           49    1

In [19]: y.groupby(X.famhist).mean()

Out[19]:

famhist

Absent     0.237037

Present    0.500000

Name: chd, dtype: float64

In [20]: import statsmodels.formula.api as smf

In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels

In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit()
分类变量的编码方式有许多,其中一种编码方式是虚拟变量编码(dummy-encoding),就是把一个 k 个水平的分类变量编码成 k-1 个二分变量。在 statsmodels 中使用 C 函数实现。

In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()

In [26]: est.summary()

Out[26]:


处理交互作用

随着教育年限(education)的增长,薪酬 (wage) 会增加吗?这种影响对男性和女性而言是一样的吗?

这里的问题就涉及性别与教育年限的交互作用。

换言之,教育年限对薪酬的影响是男女有别的。

#导入相关模块

In [1]: import pandas as pd

In [2]: import numpy as np

In [4]: import statsmodels.api as sm

#导入数据,存入 dataframe 对象

In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')

In [6]: df[['Wage','Education','Sex']].tail()

Out[6]:

Wage  Education  Sex

529  11.36         18    0

530   6.10         12    1

531  23.25         17    1

532  19.88         12    0

533  15.38         16    0

由于性别是一个二分变量,我们可以绘制两条回归线,一条是 sex=0(男性),一条是 sex=1(女性)

#绘制散点图

In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)

In [9]: plt.xlabel('education')

In [10]: plt.ylabel('wage')



#linspace 的作用是生成从最小到最大的均匀分布的 n 个数

In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)

In [12]: import statsmodels.formula.api as smf

In [13]: est=smf.ols(formula='Wage ~ Education + Sex', data=df).fit()

In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, 'r')

In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')



以上两条线是平行的。这是因为分类变量只影响回归线的截距,不影响斜率。

接下来我们可以为回归模型增加交互项来探索交互效应。也就是说,对于两个类别,回归线的斜率是不一样的。

In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)

In [33]: plt.xlabel('education')

In [34]: plt.ylabel('wage')

#使用*代表我们的回归模型中除了交互效应,也包括两个变量的主效应;如果只想看交互效应,可以用:代替,但通常不会只看交互效应

In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=df).fit()

In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, 'r')

In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, 'g')



参考资料:
DataRobot | Ordinary Least Squares in Python

DataRoboe | Multiple Regression using Statsmodels

AnalyticsVidhya | 7 Types of Regression Techniques you should know!






用python如何实现啊?
if randint(1,2) == 1: #用randint函数创建1\/2概率 self.money += 110 self.number -= 1 else:self.tuihuo()def tuihuo(self):self.money -= 30 #退货一件,相当于亏了30元 print("退货一件")class Gebishi(Shengfen):def __init__(self, sname, gname):Shengfen.__init_...

怎样用python实现这样一个简单程序
def numberInputer(prompt, quitflat): """ prompt: 输入时的提示信息, quitflag: 退出标识字 """ while True: gotter = rawinput(prompt+', "%s" for quit' % quitflag) if gotter==quitflag: break try: yield int(gotter) except: continuedegrees = ...

python有没有实际用途
5. 人工智能 MASA和Google早期大量使用Python,为Python积累了丰富的科学运算库,当AI时代来临后,Python从众多编程语言中脱颖而出,各种人工智能算法都基于Python编写,尤其PyTorch之后,Python作为AI时代头牌语言的位置基本确定。6. 自动化运维 Python是一门综合性的语言,能满足绝大部分自动化运维需求,前端...

如何用python实现巴斯卡三角形算法
1、何为帕斯卡三角形(巴斯卡三角形)其实,帕斯卡三角形就是杨辉三角形,是二项式系数的一种写法,从第0层开始,依次类推,如图所示:比如第2层中的1 2 1 对应的是幂指数为2的二项式运算(a+b)^2=a^2+2ab+b^2的系数 2、如何用python实现该算法 在碰到难的题目,一时不知道如何下手解决的时候...

如何用python实现双列表同步赋值?
答:可以使用Python中的for循环进行列表的赋值,for循环的格式为:for iterating_var in sequence:statements(s)对应代码如下所示。其中一次的运行结果如下,满足题目要求。

如何利用 Python 实现 SVM 模型
我先直观地阐述我对SVM的理解,这其中不会涉及数学公式,然后给出Python代码。SVM是一种二分类模型,处理的数据可以分为三类:线性可分,通过硬间隔最大化,学习线性分类器 近似线性可分,通过软间隔最大化,学习线性分类器 线性不可分,通过核函数以及软间隔最大化,学习非线性分类器 线性分类器,在...

用Python编程实现一个登录注册程序。可以实现如下功能: 1、注册功能...
可以分别判断用户名称 和密码。根据输入来做各种情况的判断

如何用python代码实现1 12 123 1234 12345
def test(n): res=[] for i in range(1,n+1): val='' for j in range(1,i+1): val+=str(j) res.append(val) return resprint test(5)>> ['1', '12', '123', '1234', '12345']

如何用python实现随机抽取
物信息、统计、网页制作、计算等多个领域都体现出了强大的功能。python和其他脚本语言如java、R、Perl 一样,都可以直接在命令行里运行脚本程序。工具\/原料 python;CMD命令行;windows操作系统 方法\/步骤 1、首先下载安装python,建议安装2.7版

怎么样用Python实现地理编码
工具原料:地理编码工具geocoder 用Python实现地理编码方法如下:一、看一下它都支持哪些公司的地理编码服务:二、安装 pip install geocoder 三、地理编码 import geocoder g = geocoder.google("1403 Washington Ave, New Orleans, LA 70130")g = geocoder.arcgis(u"北京市海淀区上地十街10号")g....

什邡市13295388500: 如何实现Python自增运算 -
呼肿英路: 在语法上出现自增自减运算符可能是不够优雅的.作为一门注重效率的语言,C语言中出现自增自减操作可能是为了生成高效的机器码,因为这些操作可以直接映射成CPU的指令 而Python、Ruty等现代语言的设计哲学是“优雅”、“明确”、“简单”.其设计目标之一是让代码具备高度的可阅读性.像JavaScript等语言也不推荐使用++、--运算符.

什邡市13295388500: spss自变量同时含有连续变量和虚拟变量,因变量为连续变量,能直接用多远线性回归吗? 虚拟变量需不 -
呼肿英路: 可以的.虚拟变量可以做自变量,即一个值设为0,另一个设为1. 具体地说,有截距变量模型,斜率变动模型,和截距斜率同时变动模型. 还有困惑,可以给我数据,方式见私信. 希望对你有帮助,统计人刘得意

什邡市13295388500: 如何利用python实现多元ARIMAX建模? -
呼肿英路: 可以在Python中将其实现为一个新的独立函数,名为evaluate_arima_model(),它将时间序列数据集作为输入,以及具有p,d和q参数的元组作为输入. 数据集分为两部分:初始训练数据集为66%,测试数据集为剩余的34%.

什邡市13295388500: python里怎么实现异步调用 -
呼肿英路: 本文实例讲述了python使用multiprocessing模块实现带回调函数的异步调用方法.分享给大家供大家参考.具体分析如下:multipressing模块是python 2.6版本加入的,通过这个模块可以轻松实现异步调用 from multiprocessing import Pool def f(x):...

什邡市13295388500: 求助:因变量中含有虚拟变量,如何回归 -
呼肿英路: 因变量是0-1虚拟变量的话,应该用logistic回归

什邡市13295388500: 如何利用python实现bass模型 -
呼肿英路: 步骤如下:1、下载maven的bin,在apache官方网站可以下载.2、下载下来之后,解压,找个路径放进去, 把bin的位置设在环境变量里,新建环境变量MAVEN_HOME.3、在PATH里加入maven的bin的路径.4、配置完毕后,在Windows命...

什邡市13295388500: 怎么用python做自动化测试 -
呼肿英路: 1新建一台Jenkins服务器,安装并配置好Jenkins2配置一个自动化测试脚本的代码库,可以使用Git或者SVN等版本控制工具.然后在Jenkins服务器上配置一个Job,负责自动的同步最新代码到Jenkins服务器上.3配置要跑自动化测试的虚拟机...

什邡市13295388500: 如何用python实现 echart -
呼肿英路: python安装echarts-python模块

什邡市13295388500: 如何使用Python和Nose实现自动化测试 -
呼肿英路: 如何使用Python和Nose实现自动化测试?本文我将详细介绍使用Appium下的Python编写的测试的例子代码对一个iOS的样例应用进行测试所涉及的各个步骤,而对Android应用进行测试所需的步骤与此非常类似.然后按照安装指南,在你的机器...

什邡市13295388500: 用eviews怎样对有虚拟变量的模型进行操作 -
呼肿英路: series x 回车( 产生一个虚拟变了量x)打开变量,输入数据 如果虚拟变量的值是按顺序排列,可在excel中先生成,再粘贴过去

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网