zoukankan      html  css  js  c++  java
  • MATLAB解一元线性回归问题

    1. 注意事项

      一元线性回归模型对异常值比较敏感,应考虑在生成方程前对数据进行预处理。

      对于回归分析的相关定义,请参考:

      https://support.minitab.com/zh-cn/minitab/19/help-and-how-to/modeling-statistics/regression/supporting-topics/basics/types-of-regression-analyses/  

     

    2. MATLAB中的相关函数

      直接使用regress函数或polyfit函数都可直接获得表示预测变量与响应变量线性关系的方程的系数

    2.1 regress函数

    函数说明:多元线性回归函数

    详细说明请参考:

      https://ww2.mathworks.cn/help/stats/regress.html

    常用方式:

      [b,bint,r,rint,status] = regress(Y,X,alpha);

    等式右边:

    • Y——响应变量数据( n×1 数值向量 )
    • X——预测变量数据( n×p 数值矩阵。X 的行对应于各个观测值,列对应于预测变量 )
    • alpha——显著性水平

    等式左边:

    • b——系数估计值( p×1 向量,其中 p 是 X 中预测变量的数目 )
    • bint——系数估计值的置信区间 ( 置信边界下限和置信边界上限 )( p×2 矩阵,其中 p 是 X 中预测变量的数目 )
    • r——残差( p×1 向量,其中 p 是 X 中预测变量的数目 )
    • rint——残差的置信区间( 诊断离群值的区间 )( p×2 矩阵,其中 p 是 X 中预测变量的数目 )

    参数说明:

    • 如果status中的第一个参数R^2接近于1且第三个参数P值小于0.05,则响应Y和X中的预测变量之间存在显著的线性回归关系
    • 如果观测值 i 的 rint(i,:) 区间不包含零,即表明存在离群值

    使用示例:

    % 女子身高和腿长数据
    height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164];
    leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102];
    % 使用身高预测腿长(X是固定格式)
    X=[height,ones(length(height),1)];
    Y=leg_length;
    
    alpha = 0.05;
    % 注意regress函数中的预测变量和响应变量必须是列向量 [b,bint,r,rint,status] = regress(Y,X,alpha)

     

    2.2 polyfit函数

    函数说明:多项式曲线拟合函数

    详细说明请参考:

      https://ww2.mathworks.cn/help/matlab/ref/polyfit.html

    常用方式:

    [p,S] = polyfit(X,Y,degree);

    等式右边:

    • X——预测变量数据( 列向量 )
    • Y——响应变量数据( 列向量 )
    • degree——多项式p的次数( 多项式拟合的次数 )( >0 )

    等式左边:

    • p——最小二乘拟合多项式系数( 长度为 n+1,包含按降幂排列的多项式系数,最高幂为 n )
    • S——误差估计结构体

    参数说明:

    使用示例:

    % 女子身高和腿长数据
    height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164];
    leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102];
    
    degree = 1;
    [p,S] = polyfit(height,leg_length,degree);

    2.3 polyconf函数

    函数说明:计算多项式的置信区间函数

    详细说明请参考:

      https://ww2.mathworks.cn/help/stats/polyconf.html

    常用方式:

    [Y1,DELTA1] = polyconf(p,xdata,S,'predopt','observation');

    [Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');

    等式右边:

    • p——最小二乘拟合多项式系数
    • xdata——预测变量数据( 列向量 )
    • S——误差估计结构体
    • 'predopt'—— 'observation' (默认值)用于计算X值处的新观测值的预测区间,或 'curve' 用于计算X值处的拟合值的置信区间

    等式左边:

    • Y——在 x 中的每个点处计算多项式 p 所得的新观测值( 拟合值 )
    • DELTA——当输入参数 'predopt' 的值为 'observation' 时,得到的是用于计算X值处的新观测值的预测区间;当输入参数 'predopt' 的值为 'curve' 时,得到的是用于计算X值处的拟合值的置信区间

    说明:

    预测区间和置信区间的相关概念请参考百度百科和:

      https://www.zhihu.com/question/263893098

    使用示例:

    % 女子身高和腿长数据
    height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164];
    leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102];
    % xdata将预测变量以列向量的形式表示
    xdata = reshape(height,[length(height),1]); alpha = 0.05; % 设定多项式的次数 degree = 1; % 多项式曲线拟合a=polyfit(x,y,n): x是预测变量,y是响应变量,a是次数为n的多项式的系数 [p,S] = polyfit(height,leg_length,degree); % 输出S(误差估计结构体)给出Y的95%预测区间Y±DELTA [Y1,DELTA1] = polyconf(p,xdata,S,'alpha',alpha,'predopt','observation'); % 输出S(误差估计结构体)给出Y的95%置信区间Y±DELTA [Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');

    2.4 polyval函数

    函数说明:多项式计算函数

    详细说明请参考:

      https://ww2.mathworks.cn/help/matlab/ref/polyval.html#d120e898668

    常用方式:

    [y,delta] = polyval(p,x,S)

    等式右边:

    • p——最小二乘拟合多项式系数( 长度为 n+1,包含按降幂排列的多项式系数,最高幂为 n )
    • x——预测变量数据( 列向量 )
    • S——误差估计结构体

    等式左边:

    • y——在 x 中的每个点处计算多项式 p 所得的结果
    • delta——预测的标准误差,以标量形式返回。通常,区间 y ± Δ 对应于大型样本的未来观测值约 68% 的预测区间,y ± 2Δ 对应于约 95% 的预测区间

    使用示例:

    % 女子身高和腿长数据
    height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164];
    leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102];
    
    % 设定多项式的次数
    degree = 1;
    [p,S] = polyfit(height,leg_length,degree);
    % 多项式曲线拟合的响应值数组
    [preresult,delta]=polyval(p,height,S);

    3. 散点图+趋势线+95%预测区间 或 95%置信区间

    使用示例:

    % 输出S(误差估计结构体)给出Y的95%预测区间Y±DELTA
    [Y1,DELTA1] = polyconf(p,xdata,S,'alpha',alpha,'predopt','observation');
    hold on; plot(height,leg_length,'k+',height,preresult,'r'); % 95%预测区间 plot(xdata,Y1+DELTA1,'b--'); plot(xdata,Y1-DELTA1,'b--'); legend('Data','Linear Fit','95% Prediction Interval'); xlabel('身高'); ylabel('腿长'); hold off;
    % 输出S(误差估计结构体)给出Y的95%置信区间Y±DELTA
    [Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');
    hold on; plot(height,leg_length,'k+',height,preresult,'r'); % 95%置信区间 plot(xdata,Y2+DELTA2,'b--'); plot(xdata,Y2-DELTA2,'b--'); legend('Data','Linear Fit','95% Confidence Interval'); xlabel('身高'); ylabel('腿长'); hold off;

    4. 残差图

    % 女子身高和腿长数据
    height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164];
    leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102];
    % 使用身高预测腿长(X是固定格式)
    X=[height,ones(length(height),1)];
    Y=leg_length;
    
    alpha = 0.05;
    [b,bint,r,rint,status] = regress(Y,X,alpha);
    
    % 通过计算不包含 0 的残差区间 rint 来诊断离群值。
    contain0 = (rint(:,1)<0 & rint(:,2)>0);
    idx = find(contain0==false);
    
    hold on
    scatter(Y,r);
    % 填充离群值对应的点
    scatter(Y(idx),r(idx),'b','filled');
    xlabel('腿长');
    ylabel('残差');
    hold off
     
  • 相关阅读:
    android自定义透明dialog菜单
    webserice bug大全
    android五大布局居中对齐方式
    解决vs2010无法找到html页的问题
    android 旋转按钮和旋转变化动画
    android上画方框
    与Python有关的 备忘
    Python存取XML方法简介
    转载dll与lib之间的区别
    MSVCP100.dll 丢失的问题
  • 原文地址:https://www.cnblogs.com/GjqDream/p/12609233.html
Copyright © 2011-2022 走看看