精华内容
下载资源
问答
  • 使用R语言对数据分析主成分分析实现多元线性回归。包括源数据和代码。
  • 多元线性回归常见问题

    千次阅读 2020-12-24 23:35:15
    0.多元线性回归多元线性回归是统计学中经常用到回归方法,一般需满足一下六个条件:随机误差项是一个期望值或平均值为0的随机变量;对于解释变量的所有观测值,随机误差项有相同的方差;随机误差项彼此不相关;解释...

    0.多元线性回归

    多元线性回归是统计学中经常用到回归方法,一般需满足一下六个条件:

    随机误差项是一个期望值或平均值为0的随机变量;

    对于解释变量的所有观测值,随机误差项有相同的方差;

    随机误差项彼此不相关;

    解释变量是确定性变量,不是随机变量,与随机误差项彼此之间相互独立

    解释变量之间不存在精确的(完全的)线性关系

    随机误差项服从正态分布。

    但以上六个条件算是比较严格的条件,在实践中大部分情况下难以满足。由于无法满足假设条件,因此多元线性回归也经常遇到多重共线性、自相关、异方差等问题。下面就总结下这三个常见的问题。

    1.多重共线性

    多重共线性是解释变量存在线性关系或者近似的线性关系,多重共线性影响的模型一般为底层是线性的模型,例如:回归、SVM等

    如果变量间不存在多重共线性,则变量系数组成的矩阵应该是满秩的,且变量间不存在共线性不代表变量间不存在非线性关系

    产生变量相关性的原因有很多,一般为经济变量之间的相同变化趋势,模型中包含滞后变量和截面数据等等

    1.1多重共线性的检验

    计算相关系数,因为相关系数是对线性相关的度量

    对于线性回归来说,删除或者增加变量系数是不是有较大变化

    系数的正负号是否与现实相违背

    系数通不过显著性检验

    变量之间做回归,计算可决系数和VIF=1/(1-可决系数)来度量,也称为方差扩大因子法

    1.2多重共线性的影响后果

    共线性使最小二乘法预估的参数不确定且估计值方差较大,方差较大又会导致参数的置信区间增大

    回归显著但是回归系数通不过检验,甚至会出现回归系数的正负号的不到合理的解释

    但是如果遇到必须使用这些变量度量且为了预测Y,则可以对这些变量进行线性组合

    1.3多重共线性的处理方法

    删除变量--这个方法一般不推荐使用,因为删除变量会导致异方差增大,异方差后面会讲到

    增加样本容量--这个好像现实中也不是很好实现,毕竟能用的数据肯定都会用的,时效性不强的也没太大用

    变换模型--对数据求差分;计算相对指标;吧相关变量做线性组合,即小类合并成大类;----比较靠谱的做法

    逐步回归----常用方法,添加删除变量之后做可决系数、F检验和T检验来确定是否增加或者剔除变量,若果增加变量对这些指标的影响较小,也认为指标为多余的,如果增加指标引起R和F的变动且通不过T检验,说明存在共线性---常常使用的方法

    岭回归---但是岭回归的参数k不好选择,k的选择严重影响方差和偏倚程度

    2.异方差性

    什么是异方差呢,我们前面写线性回归的时候说过,做线性回归应假定随机扰动项满足l平均值和同方差,同方差表示的是所有变量对其均值的分散程度相同,由于u=0,所以也可以说是Y围绕回归线均值的分散程度,但是如果u对不同x呈现的离散程度不同,则称u具有异方差性,也就是被解释变量的观测值分散程度随着解释变量的变化而 变化,也可以说异方差是某个解释变量引起的

    2.1产生异方差的原因

    模型的设定(例如多重共线性变量的删除,但是变量与y具有相关性,也会产生异方差)

    测量误差和截面数据的影响

    2.3异方差的影响

    存在异方差将不能保证最小二乘法估计的方差最小,但是模型的拟合依然是无偏性和一致性,但不具有有效性,即不具有最小方差

    异方差会导致参数的方差增大,如果还是使用不存在异方差时的方法进行估计,则会低估参数方差

    破坏t检验和f检验的有效性

    image

    由于参数估计不满足方差最小,所以不是有效的,则对Y的预测也是无效的

    2.4异方差的检验

    相关图检验---观察随着x的增加y的离散程度是否增加,如果增加说明存在递增的异方差

    残差图分析

    image

    image

    image

    White检验

    基本思想是如果存在异方差,x与u存在相关关系,所以white检验不但可以检验异方差,还可以检验时哪个变量导致的异方差,但该方法要求大样本,但是解释变量过多又会导致丧失自由度,所以一般用u与预测值y和y的平方做回归,用F检验检验是否存在异方差,H0所有系数为0不存在异方差,否则存在异方差

    2.5异方差的处理

    加权最小二乘法

    方差越小,样本偏离均值的程度越小,越重视,权重越大,否则越小,一般权重使用1/x,1/x2,1/根号x

    模型对数变换,log之后缩小了异方差的范围

    3.自相关

    自相关即u存在自相关,即cov(u)不等于0,不满足线性回归的假定

    3.1自相关产生的原因

    经济活动滞后和经济系统的惯性

    3.2自相关的后果

    存在自相关将不能保证最小二乘法估计的方差最小,但是模型的拟合依然是无偏性和一致性,但不具有有效性,即不具有最小方差,所以估计的参数不是最佳线性无偏估计

    低估真实的方差会导致高估t检验的值,夸大参数显著性,本来不重要的变量会变为重要的变量,失去t检验的意义

    方差的变大导致预测变量的区间增加,降低了预测的精度

    3.3自相关的检验

    残差图---et与e(t-1)的相关图

    DW检验

    但是DW检验的前提条件较多,首先需要u为一阶自回归,而且回归必须存在常数项

    image

    image

    image

    image

    3.4自相关的处理

    差分法

    科克伦--奥克特迭代

    基本思想是对变量回归,求残差u,u=相关系数*u(t-1)+随机扰动项

    然后根据计算出来的相关系数做差分,yt-相关系数y(t-1)=yt

    用yt和xt做回归

    然后令最终计算的参数=上一步计算的参数/(1-上一步的相关系数)

    迭代直到两次相关系数相差很小时作为最佳的相关系数

    展开全文
  • 多元线性回归中多重共线问题的解决方法综述摘要在回归分析中,当自变量之间出现多重共线性现象时,常会严重影响到参数估计,扩大模型误差,并破坏模型的稳健性,因此消除多重共线性成为回归分析中参数估计的一个重要...

    多元线性回归中多重共线问题的解决方法综述

    在回归分析中,

    当自变量之间出现多重共线性现象时,

    常会严重影响到参数估计,

    扩大

    模型误差,

    并破坏模型的稳健性,

    因此消除多重共线性成为回归分析中参数估计的一个重要

    环节。

    现在常用的解决多元线性回归中多重共线性的回归模型有岭回归

    (

    Ridge Regression

    )

    主成分回归

    (Principal

    Component

    Regression

    简记为

    PCR)

    和偏最小二乘回归

    (Partial

    Least

    Square Regression

    简记为

    PLS)

    关键词:多重共线性;岭回归;主成分回归;偏最小二乘回归

    引言

    在多元线性回归分析中,变量的多重相关性会严重影响到参数估计,增大模型误差,并

    破坏模型的稳健性

    由于多重共线性问题在实际应用中普遍存在,并且危害严重,因此设法

    消除多重性的不良影响无疑具有巨大的价值常用的解决多元线性回归中多重共线问题的回

    归模型主要有主成分回归岭回归以及偏最小二乘回归。

    1

    多元线性回归模型

    1.1

    回归模型的建立

    Y

    是一个可观测的随机变量

    ,

    它受

    m

    个非随机因素

    X

    1

    ,X

    2

    ,…,X

    p-1

    和随机因素

    ε

    的影响

    ,

    有如下线性关系

    我们对变量进行了

    n

    次观察,得到

    n

    组观察数据

    (

    如下

    )

    ,对回归系数

    进行

    估计

    一般要求

    n>P

    。于是回归关系可写为

    采用矩阵形式来表示

    0

    1

    1

    2

    2

    1

    1

    p

    p

    Y

    X

    X

    X

    展开全文
  • 【算法1】多元线性回归

    千次阅读 2019-09-30 10:15:03
    多元线性回归模型的可解释性强,模型泛化能力比较好。使得它在实际商业环境中使用广泛。这里推出多元回归模型的个人见解,其中若有纰漏之处,恳请各位看官“怒怼”,小落必然“痛改前非,再接再厉”。大家一起学习,...

        计划在国庆期间推出一些挖掘算法,是不是心血来潮?绝对不是。应一小粉丝私信提出小要求,推一些挖掘算法的文章。只是写博文真的巨费时间,所以我会按自己的理解把算法的框架推出来,其中的一些细节推导我会在后期抽时间补充。
        

    1 知识框架

    在这里插入图片描述

    2 知识详解

    2.1基本假定

        多元线性回归算法在商业环境中比较吃香,就在于它的可解释性强。它的一般形式:
    Y ( x ) = β 0 + β 1 × x 1 + β 2 × x 2 + . . . . . . + β n × x n + ϵ . Y(x) =\beta_0+\beta_1 \times x_1+\beta_2 \times x_2+......+\beta_n \times x_n+\epsilon. Y(x)=β0+β1×x1+β2×x2+......+βn×xn+ϵ.其中 β \beta β 是模型的参数, ϵ \epsilon ϵ是误差项。当然,可解释能力强,也使得该算法的假定条件较其他算法更苛刻:
    在这里插入图片描述

    2.2违背基本假定的情况

        在处理实际的业务问题中,这些基本假定是很不友好的。需要数据分析师用特定的技术对实际业务数据进行转换,使得实际业务场景尽可能的逼近多元线性回归的基本假定。

    2.2.1异方差

        现实业务问题错综复杂,很多原因都会导致异方差,这是不可避免的。异方差会带来什么影响呢?怎样检查异方差呢?怎样解决异方差问题呢?
        它会使得模型的最小二乘估计失效:(1)参数估计无偏,但不是最小线性无偏;(2)参数的显著性检验失效;(3)回归方差的泛化能力极差。
        对异方差检验多用残差图分析法、等级相关系数法。回归模型满足基本假定时,残差图的分布是随机的、没有任何规律的,如果有异方差性,会出现一定的趋势或规律。等级相关系数法也叫斯皮尔曼(spearman)检验,它通常有三个步骤:
    在这里插入图片描述
        解决异方差问题的方法通常有加权最小二乘法、BOX-COX变换法、方差稳定性变换法。加权最小二乘法是常用的也最容易理解的方法之一。

    2.2.2 X强相关

        在多元线性回归中,对变量的理想关系是每个解释变量都与因变量相关且每个解释变量间无关。解释变量间的相关性问题也就是多重共线性问题,者是无可避免的,后文会专门解释。

    2.2.3 误差项自相关

        遗漏关键变量、滞后的经济变量、错误的回归函数形式、蛛网现象、数据加工等都会产生自相关问题。自相关问题使得:(1)参数估计值不再具有最小方差线性无偏;(2)均方误差(MSE)严重低估误差项误差;(3)得到错误的显著性检验结果;(4) β \beta β极其不稳定;(5)没处理此问题,最终的模型预测、结构会带来极大的误差和错误的解释。
        自相关问题的检验通常有自相关图、自相关系数法、DW检验。处理该问题多有迭代法、差分法。

    2.2.4 异常值与强影响点

        判定是否为异常值,3倍标准差原则、删除学生化误差、杠杆值、库克距离等。库克距离公式:
    D i = e i 2 ( p + 1 ) ϱ ^ 2 × 1 − h i i ( 1 − h i i ) 2 . D_i =\frac{e_i^2}{(p+1)\widehat \varrho^2}\times\frac{1-h _{ii}}{(1-h _{ii})^2}. Di=(p+1)ϱ 2ei2×(1hii)21hii.其中, h i i h _{ii} hii为杠杆值, D i < 0.5 D_i<0.5 Di<0.5认为是非异常值, D i > 1 D_i>1 Di>1认为是异常值。产生异常值的原因不同,处理的方法也不同。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190930115443371.png

    2.3回归模型

        在使用多元线性回归进行建模时,主要有全变量建模、选变量建模。对解释变量的重要性不清楚的时候,一般会做全变量模型,再根据模型的评估结果对变量进行筛选,得到最优的选变量模型。

    2.4 拟合优度

        拟合优度用于反映模型对因变量的估计程度。指标有调整的多重判定系数:
    R a 2 = 1 − ( 1 − R 2 ) × n − 1 n − k − 1 . R_a^2 =1-(1-R^2)\times\frac{n-1}{n-k-1}. Ra2=1(1R2)×nk1n1.
    实际意义表明,在因变量的变化中能被解释变量所解释的比例为 R a 2 R_a^2 Ra2。选择 R a 2 R_a^2 Ra2,是因为未调整的多重判定系数 R 2 = S S R S S T = 1 − S S E S S T R^2=\frac{SSR}{SST}=1-\frac{SSE}{SST} R2=SSTSSR=1SSTSSE会因为自变量的增加,使得预测误差变小,从而使得 R 2 R^2 R2偏大,得到错误的评估结果。

    2.5显著性检验

    总体显著性检验
    在这里插入图片描述
    回归系数著性检验
    在这里插入图片描述

    2.6多重共线性

        解释变量间完全不相关的假设是非常少见的,尤其是在商业环境中。鉴于问题本身的复杂性,涉及的因素众多,在建立模型时很难找到一组互不相关的解释变量来解释因变量。就无法避免面临解释变量建度相关性影响,当解释变量间的相关性很高时,我们说这是多重共线性问题。
        多重共线性的存在,使得模型对的结果混乱,信息高度重叠,不好解释,还会影响参数估计值的符号,会增加不必要的计算量等等。对多重共线性的检验方法 众多。当有下列几种情况时,会认为存在严重的多重共线性:
    (1)模型的各对解释变量间显著相关;
    (2)当模型的线性关系检验显著时<F检验>,几乎所有的回归系数t检验不通过;
    (3)回归的±号与预期相反;
    (4)容忍度 1 − R a 2 1 - R_a^2 1Ra2与方差膨胀因子 V I F VIF VIF.
        其中 V I F = 1 1 − R i 2 VIF=\frac{1}{1 - R_i^2} VIF=1Ri21,容忍度越小,方差膨胀因子越大(>10),认为存在严重多重共线性。
        对于多重共线性的处理,方法有很多。多重共线性的源头在于解释变量间的强相关性,只要能解出变量间的强相关性,就算作时对多重共线性问题的处理。通常有保留强相关的几个变量中的一个、逐步回归、岭回归、主成分法、特征根法、偏最小二乘法等。

    2.6模型的评估

        多元线性回归的模型评估指标有均方误差( M S E MSE MSE)、调整多重判别系数( R a 2 R_a^2 Ra2),当然也可以引入混淆矩阵。

    2.6模型的应用

        通过评估后的模型可以初步上线投入使用,将实际业务的数据加工成模型的可识别输入格式即可。在模型的具体应用中,可能会出现新的问题,这就要求数据分析师要定期对模型进行评估和重建、调休,保证模型功效。

    3 在R|Python 中的实现

        多元线性回归在R和Python 中都有专门的包来实现。R中的实现可以借鉴我之前的文章《【R】基于Logistic回归的初始信用评级》,该文的Logistic回归起源于多元线性回归。Python中的实现可通过下面链接查看。

    Python 线性回归
    https://nbviewer.jupyter.org/github/lda188/my-data/blob/master/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E4%B8%8A.ipynb
    展开全文
  • 1、线性回归概述 2、数据准备 3、数据探索 3.1简单的数据清洗 3.2 图形分析数据 3.2.1 盒形图的离群点分析,需要根据四分位距去掉部分数据点。 3.2.2 密度图进行分布分析 3.2.3 散点图相关分析 4、数据...

    目录

    1、线性回归概述

    2、数据准备

    3、数据探索

    3.1简单的数据清洗

    3.2 图形分析数据

    3.2.1 盒形图的离群点分析,需要根据四分位距去掉部分数据点。

    3.2.2 密度图进行分布分析

    3.2.3 散点图相关分析

    4、数据预处理

    4.1、独热编码(One Hot Encoding)

    4.2、按照比例分割为“测试集”和“训练集”

    5、建立模型

    6 检验标准(模型诊断)

    7、 模型预测、评价、交叉验证

    7.1 模型的预测与评价

    7.1.1预测

    7.1.2 计算误差

    7.2  交叉验证 Cross Validation

    8、Julia多元线性回归

    8.1 、去掉missing 值,并重新划分数据集

    与单元线性回归的模型相比,误差减小了,下面继续看看残差分布。

    8.2、模型诊断

    8.3、交叉验证


    线性回归是一种基本的机器学习算法,用于基于一个或多个自变量预测数字因变量,而因变量(Y)应该是连续的。这里将描述如何在Julia中构建线性回归,构建模型后如何诊断。

    1、线性回归概述

    线性回归是一种最基本的机器学习算法,用于基于一个或多个自变量预测因变量。因变量(Y)应该是连续的。线性回归找到最能描述Y变量作为X变量(特征)函数的数学方程。方程一旦形成,就可以用来预测只有X已知时Y的值。 这一数学方程可概括如下:

    𝑌=𝛽1+𝛽2𝑋+𝜖

    其中,𝛽1为截距,𝛽2为斜率。如果只有一个X变量,则称为“简单线性回归”。如果涉及多个预测因子(X),则称为“多元线性回归”。不管怎样,它们的构建过程基本是相同。 𝛽i 称为回归系数,𝜖为误差项 且是  回归模型最不好解释的部分。

    2、数据准备

    这将使用预期寿命的数据来做回归分析。目标是根据不同的特征和人口统计数据预测各国人民的预期寿命。

    数据集下载地址:预期寿命数据

    using DataFrames
    using CSV
    using Plots
    using Lathe
    using GLM
    using Statistics
    using StatsPlots
    using MLBase
    ENV["COLUMNS"] = 1000
    
    df = DataFrame(CSV.File("D:/Life-Expectancy-Data.csv"))
    

    3、数据探索

    在建模之前,首先要分析下数据,看下数据的矩阵大小,检查下是否有missing 值或者异常值。

    3.1简单的数据清洗

    去掉missing值,如果是线性回归,使用中值或者均值替代missing,会影响分析结果。

    #数据框的规格检查
    println(size(df))
    #(2938, 22)
    
    #规范化列名,很多列名会带有空格或者其他特殊字符
    colnames = Symbol[]
    for i in string.(names(df))
        push!(colnames,Symbol(replace(replace(replace(strip(i)," " => "_"),"-" => "_"), "/" => "_")))
    end
    rename!(df, colnames);
    
    #数据概要统计分析,比如mean,min,max,median,
    #当然还有几个非常重要的信息 ,nunique:w唯一值统计数,nmissing,missing值统计数
    ds = describe(df)
    names(df)
    gd = groupby(df, [:Life_expectancy,],sort= false,skipmissing=true)
    fh = DataFrame(gd)
    # dropmissing!(fh)

    数据概要分析

    │ Row │ variable                        │ mean      │ min         │ median    │ max        │ nunique │ nmissing │ eltype                  │
    │     │ Symbol                          │ Union…    │ Any         │ Union…    │ Any        │ Union…  │ Union…   │ Type                    │
    ├─────┼─────────────────────────────────┼───────────┼─────────────┼───────────┼────────────┼─────────┼──────────┼─────────────────────────┤
    │ 1   │ Country                         │           │ Afghanistan │           │ Zimbabwe   │ 183     │          │ String                  │
    │ 2   │ Year                            │ 2007.52   │ 2000        │ 2008.0    │ 2015       │         │          │ Int64                   │
    │ 3   │ Status                          │           │ Developed   │           │ Developing │ 2       │          │ String                  │
    │ 4   │ Life_expectancy                 │ 69.319    │ 44.3        │ 72.1      │ 89.0       │         │ 0        │ Union{Missing, Float64} │
    │ 5   │ Adult_Mortality                 │ 163.921   │ 1           │ 144.0     │ 723        │         │ 0        │ Union{Missing, Int64}   │
    │ 6   │ infant_deaths                   │ 30.3879   │ 0           │ 3.0       │ 1800       │         │          │ Int64                   │
    │ 7   │ Alcohol                         │ 4.62009   │ 0.01        │ 3.77      │ 17.87      │         │ 193      │ Union{Missing, Float64} │
    │ 8   │ percentage_expenditure          │ 742.76    │ 0.0         │ 66.5539   │ 19479.9    │         │          │ Float64                 │
    │ 9   │ Hepatitis_B                     │ 80.968    │ 1           │ 92.0      │ 99         │         │ 544      │ Union{Missing, Int64}   │
    │ 10  │ Measles                         │ 2423.73   │ 0           │ 17.0      │ 212183     │         │          │ Int64                   │
    │ 11  │ BMI                             │ 38.3002   │ 1.0         │ 43.5      │ 77.6       │         │ 32       │ Union{Missing, Float64} │
    │ 12  │ under_five_deaths               │ 42.1162   │ 0           │ 4.0       │ 2500       │         │          │ Int64                   │
    │ 13  │ Polio                           │ 82.6002   │ 3           │ 93.0      │ 99         │         │ 19       │ Union{Missing, Int64}   │
    │ 14  │ Total_expenditure               │ 5.91715   │ 0.37        │ 5.73      │ 17.6       │         │ 226      │ Union{Missing, Float64} │
    │ 15  │ Diphtheria                      │ 82.4039   │ 2           │ 93.0      │ 99         │         │ 19       │ Union{Missing, Int64}   │
    │ 16  │ HIV_AIDS                        │ 1.71779   │ 0.1         │ 0.1       │ 50.6       │         │          │ Float64                 │
    │ 17  │ GDP                             │ 7523.47   │ 1.68135     │ 1779.5    │ 119173.0   │         │ 443      │ Union{Missing, Float64} │
    │ 18  │ Population                      │ 1.27937e7 │ 34.0        │ 1.37887e6 │ 1.29386e9  │         │ 644      │ Union{Missing, Float64} │
    │ 19  │ thinness__1_19_years            │ 4.84456   │ 0.1         │ 3.3       │ 27.7       │         │ 32       │ Union{Missing, Float64} │
    │ 20  │ thinness_5_9_years              │ 4.8755    │ 0.1         │ 3.3       │ 28.6       │         │ 32       │ Union{Missing, Float64} │
    │ 21  │ Income_composition_of_resources │ 0.628373  │ 0.0         │ 0.678     │ 0.948      │         │ 160      │ Union{Missing, Float64} │
    │ 22  │ Schooling                       │ 12.012    │ 0.0         │ 12.4      │ 20.7       │         │ 160      │ Union{Missing, Float64} │

    3.2 图形分析数据

    3.2.1 盒形图的离群点分析,需要根据四分位距去掉部分数据点。

    想来看下概念解析:

    四分位距(interquartile range, IQR),又称四分差,四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。是描述统计学中的一种方法,以确定第三四分位数和第一四分位数的区别。与方差、标准差一样,表示统计资料中各变量分散情形,但四分差更多为一种稳健统计(robust statistic)。

    分位数是将总体的全部数据按大小顺序排列后,处于各等分位置的变量值。如果将全部数据分成相等的两部分,它就是中位数;如果分成四等分,就是四分位数;八等分就是八分位数等。四分位数也称为四分位点,它是将全部数据分成相等的四部分,其中每部分包括25%的数据,处在各分位点的数值就是四分位数。四分位数有三个,第一个四分位数就是通常所说的四分位数,称为下四分位数,第二个四分位数就是中位数,第三个四分位数称为上四分位数,分别用Q1、Q2、Q3表示 [2] 

    第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。

    第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。

    第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

    第三四分位数与第一四分位数的差距又称四分位距(InterQuartile Range,IQR)。公式:IQR = Q3 − Q1,

     

    #####基于盒形图的离群点分析
    # Box Plot
    boxplot(fh.Life_expectancy, title = "Box Plot - Life Expectancy", ylabel = "Life Expectancy (years)", legend = false)
    
    #很明显的看到有一些 异常值,需要删除这些数据点。
    #第25百分位数又称第一个四分位数
    first_percentile = percentile(fh.Life_expectancy, 25)
    #公式:IQR = Q3 − Q1,四分位距(interquartile range, IQR),又称四分差,四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。是描述统计学中的一种方法,以确定第三四分位数和第一四分位数的区别。与方差、标准差一样,表示统计资料中各变量分散情形,但四分差更多为一种稳健统计(robust statistic)。
    iqr_value = iqr(fh.Life_expectancy)
    df = fh[fh.Life_expectancy .>  (first_percentile - 1.5*iqr_value),:];

     

    3.2.2 密度图进行分布分析

    density(df.Life_expectancy , title = "Density Plot - Life Expectancy", ylabel = "Frequency", xlabel = "Life Expectancy", legend = false)
    

    当y变量为正态分布或接近正态分布时,线性回归效果良好。下面是y变量的分布,即预期寿命。分布确实有几个转折点,这说明分布是混合的。然而,总体分布确实像正太分布的曲线, 为了更好的理解,继续看下一个分析。

     

    3.2.3 散点图相关分析

    当y变量与x变量线性相关时,线性回归效果比较好。下面有几个概念需要先理解下,然后再看相关系数和散点图,

    VAR(方差) 、COR(相关系数)  、COV(协方差)
    方差:体现的是一组数据的波动情况,值越小波动越小。详细参阅:方差

    协方差:两种不同数据的方差,体现两组数据的变化趋势如何,正值变化趋势一致,负值变化趋势相反,0不相关。详细参阅:协方差

    相关系数:从概率论的角度,分析两组不同数据的相关程度,取值范围[-1,1],越接近与0越不相关,0时却不意味着两组数据独立,相关系数是两个变量之间的线性关联的一个度量,不一定有因果关系的含义。详细参阅:相关系数

    println("Correlation of Life Expectancy with Adult Mortality Rate is ", cor(df.Adult_Mortality,df.Life_expectancy), "\n\n")
    # Scatter plot
    train_plot = scatter(df.Adult_Mortality,df.Life_expectancy, title = "Scatter Plot Life Expectancy vs Adult Mortality Rate", ylabel = "Life Expectancy", xlabel = "Adult Mortality Rate",legend = false)
    

    这两个特征看起来是线性相关的,但仍然有一些点分布在其他位置。在后面我们构建具有多个特性的回归模型时,也许其他一些特征能解释这种关系。

    4、数据预处理

    数据预处理是建模的重要步骤之一,在前面的步骤中,已经处理了部分异常数据。这里主要针对带有分类的列进行分析。

    4.1、独热编码(One Hot Encoding

    独热编码是将类别变量转换为多个数字列的过程,因为有类别。这样,变量就可以被输入到ML算法中,从而更好地进行预测。对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100, 010, 001)。数据集中存在两个分类列需要处理。Country列有183个独特的值,分类太多了,只能放弃。相反,对Status列进行独热编码。

    scaled_feature = Lathe.preprocess.OneHotEncode(df,:Status)
    select!(df, Not([:Status,:Country]))
    first(df,5)
    

    4.2、按照比例分割为“测试集”和“训练集”

    #安装比例拆分为“测试集”和“训练集”
    using Lathe.preprocess: TrainTestSplit
    train, test = TrainTestSplit(df,.75)

    5、建立模型

    这里使用GLM软件包建立线性回归模型,它与R中的“GLM”包非常相似。先从单个变量开始。要使用GLM训练线性回归模型,需要使用lm()函数,它接受公式对象作为第一个参数,使用@formula创建所需的公式对象。

    fm = @formula(Life_expectancy ~ Adult_Mortality)
    linearRegressor = lm(fm, train)
    # StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}
    # 
    # Life_expectancy ~ 1 + Adult_Mortality
    # 
    # Coefficients: 一些评价指标,重点看P值,也就是Pr(>|t|) 
    # ──────────────────────────────────────────────────────────────────────────────────
    #                   Estimate  Std. Error   t value  Pr(>|t|)   Lower 95%   Upper 95%
    # ──────────────────────────────────────────────────────────────────────────────────
    # (Intercept)      78.1938    0.245709    318.237     <1e-99  77.7119     78.6757
    # Adult_Mortality  -0.053974  0.00119445  -45.1874    <1e-99  -0.0563164  -0.0516316
    # ──────────────────────────────────────────────────────────────────────────────────
    

    6 检验标准(模型诊断)

    这里给出一些概念:

    P值 ,P值越小,表明结果越显著,详细参考:P值

    T 值:是t检验bai的统计量值,t检验,亦称student t检验(duStudent's t test),主要用于样本含量较小(例如n < 30),总体标准差σ未知的正态分布。 t检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。t值是通过将β系数(X变量的权重)除以其标准误差来计算的统计度量。这里的标准误差是对β系数偏差的估计。t值越大说明β系数等于零的可能性越大,所以,t值越高越好。 参考:T值

    R平方:

    R平方是一种统计测度,它告诉我们在这个模型中,因变量(y)的变化比例是由不同的特征(自变量)解释的。R平方值越高越好,最大值为1。 参考:R平方

    # R平方值为,
    r2(linearRegressor)
    #> 0.4548557168286279

    可以看到上面的拟合出的模型已经给出了一些评价指标的值:

    # “estimate”是指已获得相关的数据,用某个确定的样本值而得到的一个确切地估计值。
    #Std. Error  标准误差,均方根误差是用来衡量观测值同真值之间的偏差,当样本容量n足够大时,标准差趋于稳定。标准误差随着n的增大而减小,甚至趋近于0。
    # t value,t值,指的是T检验,主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布资料。T检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。
    # Pr(>|t|) P值,双侧检验p值 
    # Lower 95%   Upper 95% 置信区间

    额外给出一些其他的检验标准:

    STATISTIC

    CRITERION

    R-Squared

    Higher the better

    Adj R-Squared

    Higher the better

    F-Statistic

    Higher the better

    Std. Error

    Closer to zero the better

    t-statistic

    Should be greater 1.96 for p-value to be less than 0.05

    AIC

    Lower the better

    BIC

    Lower the better

    Mallows cp

    Should be close to the number of predictors in model

    MAPE (Mean absolute percentage error)

    Lower the better

    MSE (Mean squared error)

    Lower the better

    Min_Max Accuracy => mean(min(actual, predicted)/max(actual, predicted))

    Higher the better

     

    7、 模型预测、评价、交叉验证

    涉及到的概念: 参考: 常用的评价误差指标有以下几种,RMSE、MSE、MAE、MAPE、SMAPE

    (1)平均误差(MAE)

    (2)平均绝对百分比误差(MAPE)

    (3)均方根误差(RMSE)

    (4)均方误差(MSE)

    (5)误差分布,是否符合正太分布

    在获取性能度量数据时,将研究训练集数据和测试集数据的评价指标。现在模型已经准备好了,让我们对训练集数据和测试数据以及cmopute平方误差进行预测。

    7.1 模型的预测与评价

    7.1.1预测

    训练集和测试集都要预测

    # 预测  Prediction
    ypredicted_test = predict(linearRegressor, test)
    ypredicted_train = predict(linearRegressor, train)

    7.1.2 计算误差

    先是平方误差

    #  测试数据集评估(计算平方误差)
    performance_testdf = DataFrame(y_actual = test[!,:Life_expectancy], y_predicted = ypredicted_test)
    performance_testdf.error = performance_testdf[!,:y_actual] - performance_testdf[!,:y_predicted]
    performance_testdf.error_sq = performance_testdf.error.*performance_testdf.error
    
    # 训练数据集(计算平方误差)
    performance_traindf = DataFrame(y_actual = train[!,:Life_expectancy], y_predicted = ypredicted_train)
    performance_traindf.error = performance_traindf[!,:y_actual] - performance_traindf[!,:y_predicted]
    performance_traindf.error_sq = performance_traindf.error.*performance_traindf.error ;

    误差函数

    #MAPE
    function mape(performance_df)
        mape = mean(abs.(performance_df.error./performance_df.y_actual))
        return mape
    end
    
    
    # RMSE 
    function rmse(performance_df)
        rmse = sqrt(mean(performance_df.error.*performance_df.error))
        return rmse
    end

    根据上面的误差函数  计算误差

    # 测试数据集 误差
    println("Mean Absolute test error: ",mean(abs.(performance_testdf.error)), "\n")
    println("Mean Aboslute Percentage test error: ",mape(performance_testdf), "\n")
    println("Root mean square test error: ",rmse(performance_testdf), "\n")
    println("Mean square test error: ",mean(performance_testdf.error_sq), "\n")
    # Mean Absolute test error: 4.871609770224901
    # Mean Aboslute Percentage test error: 0.07455633832726753
    # Root mean square test error: 6.89521671872878
    # Mean square test error: 47.54401359823688
    
    # 训练数据集  误差
    println("Mean train error: ",mean(abs.(performance_traindf.error)), "\n")
    println("Mean Absolute Percentage train error: ",mape(performance_traindf), "\n")
    println("Root mean square train error: ",rmse(performance_traindf), "\n")
    println("Mean square train error: ",mean(performance_traindf.error_sq), "\n")
    # Mean train error: 4.726124200320006
    # Mean Absolute Percentage train error: 0.07258363410210457
    # Root mean square train error: 6.716975968260544
    # Mean square train error: 45.117766158189674

    误差分布

    错误不应该有任何模式,它应该遵循正态分布。这里使用直方图对训练和测试数据集进行残差分析

    # 误差柱状图,看它是否在测试数据集上正态分布,  Histogram of error to see if it's normally distributed  on test dataset
    histogram(performance_testdf.error, bins = 50, title = "Test Error Analysis", ylabel = "Frequency", xlabel = "Error",legend = false)
    # 误差柱状图,看它是否在训练数据集上正态分布, Histogram of error to see if it's normally distributed  on train dataset
    histogram(performance_traindf.error, bins = 50, title = "Training Error Analysis", ylabel = "Frequency", xlabel = "Error",legend = false)
    

     

     通过上面的柱状图 可以看到误差是正态分布的,但仍然有一些异常值。下面使用散点图查看实际值和预测值。分析误差是没有特定的形式的

    # 测试数据集
    test_plot = scatter(performance_testdf[!,:y_actual],performance_testdf[!,:y_predicted], title = "Predicted value vs Actual value on Test Data", ylabel = "Predicted value", xlabel = "Actual value", legend = false)
    # 训练数据集
    train_plot = scatter(performance_traindf[!,:y_actual],performance_traindf[!,:y_predicted], title = "Predicted value vs Actual value on Train Data", ylabel = "Predicted value", xlabel = "Actual value",legend = false)
    

     

    可以看到有一些奇怪的点,这里很难数据来解释上面的问题,稍后将在下一节稍后解释这一点。

    7.2  交叉验证 Cross Validation

     如果拟合出的模型在25%的分割率(测试数据)时表现良好,但并不足以说明模型在任何时候都会表现得同样出色。
     这是什么意思呢?一个好的模型在新数据(X vars)上的表现应该和在训练数据上的表现一样好。如果在新数据集上(测试数据和任何未来数据)的预测出的数据和实际数据差异过大,则表明该模型可能过度拟合。也就是说,它对训练数据的解释过于复杂,不够笼统。
     因此,尽可能严格地交叉验证模型的准确性是非常重要的。 进行这种严格测试的一种方法是在不同的互斥数据块上进行训练和测试,并观察模型方程的准确性是否一样好。 这就是交叉验证的目的。下面是具体的实现。

    # 交叉验证函数,可以使用下面函数 RMSE、MSE、MAE、MAPE、SMAPE
    function cross_validation(train,k, fm = @formula(Life_expectancy ~ Adult_Mortality))
        a = collect(Kfold(size(train)[1], k))
        for i in 1:k
            row = a[i]
            temp_train = train[row,:]
            temp_test = train[setdiff(1:end, row),:]
            linearRegressor = lm(fm, temp_train)
            performance_testdf = DataFrame(y_actual = temp_test[!,:Life_expectancy], y_predicted = predict(linearRegressor, temp_test))
            performance_testdf.error = performance_testdf[!,:y_actual] - performance_testdf[!,:y_predicted]
            println("Mean Aboslute Percentage test error: ",mape(performance_testdf), "\n")
        end
    end
    
    cross_validation(train,10)

    验证结果如下:

    # Mean Aboslute Percentage test error: 0.07138211558037776
    # Mean Aboslute Percentage test error: 0.07010161078533023
    # Mean Aboslute Percentage test error: 0.08265067731693981
    # Mean Aboslute Percentage test error: 0.06696041707392626
    # Mean Aboslute Percentage test error: 0.08010228310894138
    # Mean Aboslute Percentage test error: 0.06245662468846822

     

    8、Julia多元线性回归

    到目前为止,只使用一个自变量来实现线性回归。但在实际情况下,会有多个自变量,无论是单变量还是多变量,它们的核心概念是一样的,下面是具体的实现。这里使用7个特性来构建回归模型。

    8.1 、去掉missing 值,并重新划分数据集

    #数据清洗
    gd = groupby(df, [:Life_expectancy,:Adult_Mortality,:infant_deaths,:Developing,:BMI,:Total_expenditure,:HIV_AIDS,:Income_composition_of_resources],sort= false,skipmissing=true)
    fh = DataFrame(gd)
    fh = fh[:,[:Life_expectancy,:Adult_Mortality,:infant_deaths,:Developing,:BMI,:Total_expenditure,:HIV_AIDS,:Income_composition_of_resources]]
    disallowmissing(fh)
    train, test = TrainTestSplit(fh,.75)
    
    # 回归模型
    fm2 = @formula(Life_expectancy ~ Adult_Mortality + infant_deaths + Developing + BMI + Total_expenditure + HIV_AIDS   + Income_composition_of_resources)
    linearRegressor = lm(fm2, train)
    
    #R 平方
    r2(linearRegressor)
    

    与单元线性回归的模型相比,误差减小了,下面继续看看残差分布。

    8.2、模型诊断

    计算误差

    function predict2(linearRegressor::RegressionModel,test::DataFrame,train::DataFrame)
        # 诊断
        ypredicted_test = predict(linearRegressor, test)
        ypredicted_train = predict(linearRegressor, train)
    
        # 测试数据集
        performance_testdf = DataFrame(y_actual = test[!,:Life_expectancy], y_predicted = ypredicted_test)
        performance_testdf.error = performance_testdf[!,:y_actual] - performance_testdf[!,:y_predicted]
        performance_testdf.error_sq = performance_testdf.error.*performance_testdf.error
    
        # 训练数据集
        performance_traindf = DataFrame(y_actual = train[!,:Life_expectancy], y_predicted = ypredicted_train)
        performance_traindf.error = performance_traindf[!,:y_actual] - performance_traindf[!,:y_predicted]
        performance_traindf.error_sq = performance_traindf.error.*performance_traindf.error ;
    
        # 测试数据集误差
        println("Mean Absolute test error: ",mean(abs.(performance_testdf.error)), "\n")
        println("Mean Aboslute Percentage test error: ",mape(performance_testdf), "\n")
        println("Root mean square test error: ",rmse(performance_testdf), "\n")
        println("Mean square test error: ",mean(performance_testdf.error_sq), "\n")
    
        # 训练数据集误差
        println("Mean train error: ",mean(abs.(performance_traindf.error)), "\n")
        println("Mean Aboslute Percentage train error: ",mape(performance_traindf), "\n")
        println("Root mean square train error: ",rmse(performance_traindf), "\n")
        println("Mean square train error: ",mean(performance_traindf.error_sq), "\n")
    end
    
    predict2(linearRegressor,test,train)
    
    # Mean Absolute test error: 3.19108586769138
    # Mean Aboslute Percentage test error: 0.04889948491362247
    # Root mean square test error: 4.474131472086835
    # Mean square test error: 20.01785242951791
    # Mean train error: 3.265500683664497
    # Mean Aboslute Percentage train error: 0.050029246118041305
    # Root mean square train error: 4.4325406761905635
    # Mean square train error: 19.647416846083896
    

    所有特征的p值、t值和R平方值均具有统计学意义。从诊断学的角度来看,这是一个很好的模型。比前一个好。下面看看这个模型在预测中的准确性。与单元线性回归的模型相比,误差减小了,下面继续看看残差分布。

    残差分布

    # 测试数据集残差分布
    histogram(performance_testdf.error, bins = 50, title = "Test Error Analysis", ylabel = "Frequency", xlabel = "Error",legend = false)
    # 训练数据集的残差分布
    histogram(performance_traindf.error, bins = 50, title = "Training Error Analysis", ylabel = "Frequency", xlabel = "Error",legend = false)
    

    这几乎是正态分布的,说明误差分布也比以前的模型好。下面用散点图看看预测值

    预测值与实际值非常接近。之前看到的一些怪异的数据点 现在也能通过自变量解释了。

    8.3、交叉验证

    cross_validation(train,10, fm)
    # Mean Aboslute Percentage test error: 0.052744242203262945
    # Mean Aboslute Percentage test error: 0.04686934760263142
    # Mean Aboslute Percentage test error: 0.04728274263246261
    # Mean Aboslute Percentage test error: 0.052746085003455706
    # Mean Aboslute Percentage test error: 0.047812645635019635
    # Mean Aboslute Percentage test error: 0.051726285166176805
    # Mean Aboslute Percentage test error: 0.048795829636545066
    # Mean Aboslute Percentage test error: 0.0491212004243017
    # Mean Aboslute Percentage test error: 0.049672209036192565
    # Mean Aboslute Percentage test error: 0.05783432064238129

    明显要比单变量的线性回归误差小很多。

     

    。。。。。待续

     

    展开全文
  • 当考察一个自变量对因变量的影响称为一元线性回归,多于一个自变量的情况称为多元线性回归。②问题二:控制变量如何放置?控制变量指可能干扰模型的项,比如年龄,学历等基础信息。从软件角度来看,并没有“控制变量...
  • 想做多元线性回归,但是结果是这样的: Variables Entered/Removed Model Variables Entered Variables Removed Method 1 VAR00010, VAR00008, VAR00004, VAR00009, VAR00005a . Enter a. Tolerance = .000 limits ...
  • 变量间的关系有两类,一类是变量间存在完全确定的关系,即函数关系(y=2x+1),另一类是变量间不存在完全的确定关系,不能用准确的数学公式来表示出来,这些变量间存在具有十分密切的关系,但是不能由一个或者几个变量...
  • 为了提高激光诱导击穿光谱技术的检测能力和准确性,分别采用单变量分析和多变量分析方法[多元线性回归(MLR)]对样品中Cr 进行定量分析。分别利用CrI: 425.435 nm 和CrI: 427.48 nm 两条特征谱线进行单变量分析,并在5...
  • 多元线性回归模型评估You’ve got a sample dataset and just finished working on a machine learning algorithm using the linear regression model. But now, you are wondering whether or not your analysis ...
  • 题目:把分类变量转变成哑变量之后,如何进行多元线性回归呢?我需要分析的因变量是连续数值变量,自变量中包含连续数值变量、二分类变量和转换后的虚拟变量.软件是SPSS,但具体的操作环节我不知道怎么做.解答:嗯,在...
  • 多元线性回归分析

    2021-08-07 20:34:33
    多元线性回归分析 回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成机制,进而...
  • 变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...
  • 多元回归变量存在共线性

    千次阅读 2020-10-09 20:32:37
    多重线性回归要求各个自变量之间相互独立,不存在多重共线性。所谓多重共线性,是指自变量之间存在某种相关或者高度相关的关系,其中某个自变量可以被其他自变量组成的线性组合来解释。 医学研究中常见的生理资料,...
  • 多元线性回归 pythonLinear regression is a standard statistical data analysis technique. We use linear regression to determine the direct relationship between a dependent variable and one or more ...
  • 多元线性回归模型检验-续上篇

    千次阅读 2020-04-04 20:42:46
    其实上一篇讨论的多元线性回归还不是很全面,...多元线性回归的输出变量是连续变量,输入变量中如果包含离散变量需要做哑变量或One-hot编码,连续变量可以直接用来建模。 共线性问题:https://www.sohu.com/a/326...
  • 多元线性回归—自相关

    千次阅读 2021-06-16 08:12:47
    文章目录@[toc]1 什么是自相关1.1 自相关概念1.2 自相关产生的原因1.3 自相关表现形式2 自相关后果2.1 对估计...自相关(auto correlation)又称序列相关(serial correlation),即总体回归模型的随机扰动项μi\mu_iμ
  • 利用MATLAB进行多元线性回归

    千次阅读 2021-04-21 02:46:03
    利用MATLAB进行多元线性回归 2.线性回归 b=regress(y,X) [b,bint,r,rint,s]=regress(y,X,alpha) 输入: y~因变量(列向量), X~1与自变量组成的矩阵, Alpha~显著性水平(缺省时设定为0.05) s: 3个统计统计 量:决定...
  • 文章目录一、多元线性回归模型预测房价1.基础包导入2.变量探索3.多元线性回归建模4.模型优化二、用Excel重做上面的多元线性回归,求解回归方程三、用机器学习库Sklearn库重做上面的多元线性归四、参考文献 一、多元...
  • 多元线性回归,主要是研究一个因变量与多个自变量之间的相关关系,跟一元回归原理差不多,区别在于影响因素(自变量)更多些而已,例如:一元线性回归方程 为:毫无疑问,多元线性回归方程应该为:上图中的 x1, x2, xp...
  • 相关系数公式 y=βx ,β为相关系数的标准化后取值 线性回归分析 小数据 import statsmodels.formula.api as smf result=smf.ols('体重~饮食+性别+亲缘+运动时间+骑行时间',data=data1).fit() result.summary()#汇总...
  • matlab多元线性回归教程

    千次阅读 2021-04-20 05:05:55
    《matlab多元线性回归教程》由会员分享,可在线阅读,更多相关《matlab多元线性回归教程(2页珍藏版)》请在人人文库网上搜索。1、matlab回归(多元拟合)教程前言 1、学三条命令 polyfit(x,y,n)-拟合成一元幂函数...
  • 文章目录一、多元线性回归理解二、波士顿房价案例三、数据清洗(数据预处理)1、数据预处理2、数据筛选3、非数值型数据转换四、...多元线性回归就是:用多个x(变量或属性)与结果y的关系式 来描述一些散列点之间的共同特
  • Excel做多元线性回归

    2021-10-26 13:09:36
    一、EXCEL进行多元线性回归 1.首先需要下载一个数据分析的插件: 点击左上角文件->选项->加载项->分析工具库->转到-数据分析库->确定 下载好插件之后就可以看到这里多了一个数据分析 点击...
  • R=0.765RSquare=0.585AdjustedRSquare=0.439Std.ErroroftheEstimate=0.0557这是否表明变量X对Y的解释程度不高呢ANOVA(b)ModelSumofSquaresdfMeanSquareFSig.1Regression0.08870.01254...R =0.765 R Square=0.585 ...
  • 回归的思想 通过研究自变量X和因变量Y的相关关系,尝试...线性回归 OLS、GLS(最小二乘) 连续数值型变量 GDP、产量、收入 0-1回归 logistic回归 二值变量(0‐1) 是否违约、是否得病 定序回归 probit定序回归 定
  • 机器学习算法(8)之多元线性回归分析理论详解

    万次阅读 多人点赞 2018-08-29 16:28:27
    前言:当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。线性回归(Linear regressions)和逻辑回归(Logistic regressions)是人们学习算法的第...
  • 多元线性回归中多重共线性Linear Regression is one of the simplest and most widely used algorithms for Supervised machine learning problems where the output is a numerical quantitative variable and the ...
  • 多元线性回归:这是一种线性回归的形式,当有两个或多个预测因子时使用。 我们将看到多个输入变量如何共同影响输出变量,同时还将了解计算与简单LR模型的不同之处。我们还将使用Python构建一个回归模型。 最后,我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,141
精华内容 2,056
关键字:

多元线性回归解释变量相关性