python进行多元线性回归模型,多元非线性回归模型具体例子

  python进行多元线性回归模型,多元非线性回归模型具体例子

  developer.51cto.com/art/202008/624683.htm 3359号

  很多人在做数据分析时,经常会用到一元线性回归。这是描述两个变量之间统计关系的最简单的回归模型。但是在实际问题中,我们经常会遇到多个变量之间的线性关系。在这种情况下,使用多元线性回归。多元回归是一元回归的推广,在实际应用中有着广泛的应用。本文通过python代码演示了如何使用多元线性回归来解决实际问题。

  图一。多重回归模型中使用的表达式

  如图1所示,假设随机变量Y与一般变量x1、x2、xp之间的线性回归模型为公式(1)。其中y为因子,x1、x2、xp为自变量,1、2、p为回归系数,0为回归常数。对于实际问题,如果我们有n组观测数据(xi1,xi2,xip;Y)) I=1,2,N),则N组观测数据可以写成矩阵形式y=x。

  解完回归方程后,我们往往要检验回归方程的显著性。这里的显著性检验主要包括三个部分。第一个是f检验。也就是说,公式(2)、(3)、(4)主要用于验证参数x1、x2、xp对Y整体是否有明显影响。其中,表达式(2)和(3)是一个表达式,但是它们由不同的符号表示。第二种是t-check,显式检查每个自变量。每个独立变量看y是否有明显的影响。这和之前的整体检查还是有区别的。第三个是拟合优势,即R2,其值介于0和1之间。越接近1,回归拟合效果越好。越接近0,效果越低。r只是直观的反映了拟合效果,而不是f检验,这是严格显而易见的。

  以上是多元线性回归的简单介绍,详细原理不胜枚举。有兴趣的读者可以参考相关文献。这里不解释,只说python分析的方法。下面是用代码分析多元线性回归的过程。

  这里使用的数据来自《中国统计年鉴》,2013,以居民消费支出为因变量Y,其他9个变量为自变量。其中,x1为居民食品支出,x2为衣着支出,x3为住宿支出,x4为医疗支出,x5为娱乐支出,x6为职工平均工资,x7为地区人均GDP,x8为地区居民消费价格指数,x9为地区居民消费价格指数。在所有这些变量中,x1~x7的整体大小为31x10,即31行10列。大致内容如图2所示。

  图二。数据集的一部分

  首先导入所需的库。

  importnumpyasnpimportpandaaspdimportstatsmodels . API assm是数据预处理:原始数据的列表标记太长,将被处理。删除中文,只留英文名。

  file=r c:\ users \ data . xlsx data=PD . read _ excel(file)data . columns=[ y , x1 , x2 ,

  x=sm . add _ constant(data . iloc[:1:])世代参数y=data[y]#世代因子变量model=sm。OLS(y) y,x)生成模型结果这里的参数指的是x1到x9的9个参数,代码data.iloc [:1:]是原

  图3。所有参数的回归结果

  在这个结果中,我们主要看三列:coef,T和Pt。因为coef是前面提到的回归系数,const的值是回归常数,所以回归模型为Y=320.6409481.316588 x 1.649859 x 2.17866 x 3-0.005609 x 4.684283 x 5.01032 x 60.003666,主要用于判断各个变量与Y的线性显著关系,从图中可以看出,Prob(f-1.17866 x 3接近于零,说明我们多元线性方程明显。也就是说,y与x1、x2、x9之间存在明显的线性关系,R的平方为0.992。从理论上讲,这一多元线性方程已得到很好的结果,并可用于预测。但是,如上所述,y与x1、x2、x9之间存在明显的线性关系。这里必须注意,从x1到x9的九个变量被视为一个整体。整体上与Y有明显的线性关系,但Y与其各自的变量没有明显的线性关系。这里找到与y没有线性关系的自变量,去掉,只留下明显的。这是

  就是前面说的T检验。T检验的原理和内容有些复杂,有兴趣的读者可以自行查阅资料,这里不再赘述。我们可以通过图3中的“Pt”一栏来判断。在这一栏中,我们可以选择一个阈值,比如统计中常用的0.05、0.02或0.01。这里我们会用0.05,我们会剔除Pt一栏中所有值大于0.05的自变量。这些都是与Y没有显著线性关系的自变量,所以都被舍弃了。不过这里有个原则,就是一次只能淘汰一个,P值最大的往往是P值最大的。比如图3中,P值最大的一个是x4,然后将其剔除,再用剩下的x1,x2,x3,x5,x6,x7,x8,x9重复上述建模过程,然后找出P值最大的自变量并剔除,重复这个过程。

  我们可以把上面的过程写成一个函数,命名为looper,代码如下。

  deflooper(limit):cols=[x1 , x2 , x3 , x5 , x6 , x7 , x8 ,X9 ]for iinrange(len(cols)):data data1=data[cols]x=sm . add _ constant(data1)#生成自变量y=data[y]#生成因变量model=sm。OLS(y,X)#生成模型结果=model.fit()#模型拟合pvvalues=result.pvvalues #获取所有p值pvalues.drop(const )在结果中,In=true) #获取const pmax=max(pvalues)#选择最大p值ifp max limit:ind=pvalues . idx max()#查找索引cols.remove(ind)#从cols中删除此索引else:return result result=looper(0.05)结果.从结果可以看出,剩下的有效变量是x1,x2,x3,x5,我们得到的多元线性模型是Y=-1694.6269 1.3642 x 1.7679 x 22.2894 x 3 1.7424 x 5,这是我们最终要用的有效多元线性模型。

  图4。剔除无效变量后的回归模型

  那么问题来了。我们应该选择哪一个,我们之前得到的多元线性模型和这个排除了一些变量的模型?毕竟第一个模型的整体线性效果还是比较显著的。根据笔者的经验,这个还是要看具体的项目需求。因为我们实际项目中遇到的问题都是现实生活中的真实例子,而不再是简单的数学问题,比如本案中的x8居民消费价格指数和x9地区失业率。这两个肯定对Y有一定的影响,如果盲目淘汰,可能会对最终结果产生不好的影响,所以还是要根据实际需要来做决定。

  最后要讨论的是,在这个例子中,原始数据是没有标准化的。那么在数据分析中是否应该对原始数据进行标准化处理呢?

  这个也要看情况。比如这个例子中的数据都是有具体的维度和单位的,就不要标准化了。我们得到的线性回归模型是在原始变量的基础上拟合的结果。这个公式包含物理单位,所以都有一定的实际意义。在这种情况下,我们只要输入一个特定的自变量的值,就可以得到对应的Y值,预测效果很直观,这就是用原始数据进行线性拟合的优势。

  如果把原始数据标准化,情况就不一样了。标准化之后,自变量和因变量的物理单位都没有了,这时候我们用模型做预测会很麻烦。对新自变量的值进行标准化,得到的Y仍然是标准化的数据,其实际大小和物理意义一眼看不出来。当然,有些纯数学问题,其变量没有单位,此时可以标准化,这样会有利于问题的分析。所以这个还是要看情况。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: