广义线性回归拟合教程和源码

原地址:http://www.matlabsky.com/thread-9145-1-1.html

为了使得回归分析的结果更加直观,我调用regstats函数,编写了一个更为实用的函数:reglm,代码如下(代码中有调用方法和例子)。下面再给出一个例子:

】这里有这样一组数据,涉及三个变量:p,t 和z,要拟合出 z = f(p,t) 的关系式(非线性的)。
 
解:调用自编的reglm函数进行二次拟合,命令如下:
  1. >> z = [9.73875 20.75 36.59875
  2. 13.5725 29.6325 50.93875
  3. 18.97875 36.59875 80.13875
  4. 20.75125 38.22125 90.925
  5. 22.055 44.58 104.7725];
  6. >> [p,t] = meshgrid([0.8 1 1.2],[60:60:300]);
  7. >> stats = reglm(z(:),[p(:), t(:)],'quadratic',{'p','t'});
  8. >> [pnew,tnew] = meshgrid(linspace(0.8,1.2,20),linspace(60,300,20));
  9. >> pp = pnew(:);
  10. >> tt = tnew(:);
  11. >> zhat = [ones(400,1) pp tt pp.*tt pp.^2 tt.^2]*stats.beta;
  12. >> mesh(pnew,tnew,reshape(zhat,[20,20]));
  13. >> hold on
  14. >> plot3(p(:),t(:),z(:),'k*')

  15. 拟合结果:

  16. ------------------------------------方差分析表------------------------------------
  17. 方差来源    自由度            平方和             均方             F值          p值
  18. 回归       5.0000       11548.9147        2309.7829         93.4739      0.0000
  19. 残差       9.0000         222.3942          24.7105
  20. 总计      14.0000       11771.3089
  21.        均方根误差(Root MSE)         4.9710           判定系数(R-Square)    0.9811
  22. 因变量均值(Dependent Mean)        41.2168        调整的判定系数(Adj R-Sq)    0.9706
  23. -----------------------------------参数估计-----------------------------------
  24.       变量               估计值            标准误             t值          p值
  25.      常数项            242.6188          69.0439           3.5140      0.0066
  26.          p           -513.7781         137.3777          -3.7399      0.0046
  27.          t             -0.3637           0.1212          -3.0002      0.0150
  28.        p*t              0.6022           0.0926           6.5010      0.0001
  29.        p*p            272.2625          68.0677           3.9999      0.0031
  30.        t*t             -0.0003           0.0002          -1.1946      0.2628

reglm函数的代码如下:

  1. function stats = reglm(y,X,model,varnames)
  2. % 多重线性回归分析或广义线性回归分析
  3. %
  4. %   reglm(y,X),产生线性回归分析的方差分析表和参数估计结果,并以表格形式显示在屏幕上. 参
  5. %   数X是自变量观测值矩阵,它是n行p列的矩阵. y是因变量观测值向量,它是n行1列的列向量.
  6. %
  7. %   stats = reglm(y,X),还返回一个包括了回归分析的所有诊断统计量的结构体变量stats.
  8. %
  9. %   stats = reglm(y,X,model),用可选的model参数来控制回归模型的类型. model是一个字符串,
  10. %   其可用的字符串如下
  11. %       'linear'          带有常数项的线性模型(默认情况)
  12. %       'interaction'     带有常数项、线性项和交叉项的模型
  13. %       'quadratic'       带有常数项、线性项、交叉项和平方项的模型
  14. %       'purequadratic'   带有常数项、线性项和平方项的模型
  15. %
  16. %   stats = reglm(y,X,model,varnames),用可选的varnames参数指定变量标签. varnames 
  17. %   可以是字符矩阵或字符串元胞数组,它的每行的字符或每个元胞的字符串是一个变量的标签,它的行
  18. %   数或元胞数应与X的列数相同. 默认情况下,用X1,X2,…作为变量标签.
  19. %
  20. %   例:
  21. %   x = [215 250 180 250 180 215 180 215 250 215 215
  22. %       136.5 136.5 136.5 138.5 139.5 138.5 140.5 140.5 140.5 138.5 138.5]';
  23. %   y = [6.2 7.5 4.8 5.1 4.6 4.6 2.8 3.1 4.3 4.9 4.1]';
  24. %   reglm(y,x,'quadratic')
  25. %
  26. %   ----------------------------------方差分析表----------------------------------
  27. %   方差来源    自由度          平方和           均方             F值          p值
  28. %   回归       5.0000        15.0277         3.0055          7.6122      0.0219
  29. %   残差       5.0000         1.9742         0.3948
  30. %   总计      10.0000        17.0018
  31. %
  32. %         均方根误差(Root MSE)     0.6284             判定系数(R-Square)    0.8839
  33. %   因变量均值(Dependent Mean)     4.7273        调整的判定系数(Adj R-Sq)    0.7678
  34. %
  35. %   -----------------------------------参数估计-----------------------------------
  36. %      变量               估计值            标准误             t值          p值
  37. %     常数项             30.9428        2011.1117           0.0154      0.9883
  38. %        X1              0.7040           0.6405           1.0992      0.3218
  39. %        X2             -0.8487          29.1537          -0.0291      0.9779
  40. %     X1*X2             -0.0058           0.0044          -1.3132      0.2461
  41. %     X1*X1              0.0003           0.0003           0.8384      0.4400
  42. %     X2*X2              0.0052           0.1055           0.0492      0.9626
  43. %
  44. %   Copyright 2009 - 2010 xiezhh. 
  45. %   $Revision: 1.0.0.0 $  $Date: 2009/12/22 21:41:00 $

  46. if nargin < 2
  47.    error('至少需要两个输入参数');
  48. end
  49. p = size(X,2);    % X的列数,即变量个数
  50. if nargin < 3 || isempty(model)
  51.    model = 'linear';    % model参数的默认值
  52. end

  53. % 生成变量标签varnames
  54. if nargin < 4 || isempty(varnames)
  55.     varname1 = strcat({'X'},num2str([1:p]'));
  56.     varnames = makevarnames(varname1,model);    % 默认的变量标签
  57. else
  58.     if ischar(varnames)
  59.         varname1 = cellstr(varnames);
  60.     elseif iscell(varnames)
  61.         varname1 = varnames(:);
  62.     else
  63.         error('varnames 必须是字符矩阵或字符串元胞数组');
  64.     end
  65.     if size(varname1,1) ~= p
  66.         error('变量标签数与X的列数不一致');
  67.     else
  68.         varnames = makevarnames(varname1,model);    % 指定的变量标签
  69.     end
  70. end

  71. ST = regstats(y,X,model);    % 调用regstats函数进行线性回归分析,返回结构体变量ST
  72. f = ST.fstat;    % F检验相关结果
  73. t = ST.tstat;    % t检验相关结果

  74. % 显示方差分析表
  75. fprintf('\n');
  76. fprintf('------------------------------方差分析表------------------------------');
  77. fprintf('\n');
  78. fprintf('%s%7s%15s%15s%15s%12s','方差来源','自由度','平方和','均方','F值','p值');
  79. fprintf('\n');
  80. fmt = '%s%13.4f%17.4f%17.4f%16.4f%12.4f';
  81. fprintf(fmt,'回归',f.dfr,f.ssr,f.ssr/f.dfr,f.f,f.pval);
  82. fprintf('\n');
  83. fmt = '%s%13.4f%17.4f%17.4f';
  84. fprintf(fmt,'残差',f.dfe,f.sse,f.sse/f.dfe);
  85. fprintf('\n');
  86. fmt = '%s%13.4f%17.4f';
  87. fprintf(fmt,'总计',f.dfe+f.dfr,f.sse+f.ssr);
  88. fprintf('\n');
  89. fprintf('\n');

  90. % 显示判定系数等统计量
  91. fmt = '%22s%15.4f%25s%10.4f';
  92. fprintf(fmt,'均方根误差(Root MSE)',sqrt(ST.mse),'判定系数(R-Square)',ST.rsquare);
  93. fprintf('\n');
  94. fprintf(fmt,'因变量均值(Dependent Mean)',mean(y),'调整的判定系数(Adj R-Sq)',...
  95.         ST.adjrsquare); 
  96. fprintf('\n');
  97. fprintf('\n');

  98. % 显示参数估计及t检验相关结果
  99. fprintf('-------------------------------参数估计-------------------------------');
  100. fprintf('\n');
  101. fprintf('%8s%18s%15s%15s%12s','变量','估计值','标准误','t值','p值');
  102. fprintf('\n');
  103. for i = 1:size(t.beta,1)
  104.     if i == 1
  105.         fmt = '%8s%20.4f%17.4f%17.4f%12.4f\n';
  106.         fprintf(fmt,'常数项',t.beta(i),t.se(i),t.t(i),t.pval(i));
  107.     else
  108.         fmt = '%10s%20.4f%17.4f%17.4f%12.4f\n';
  109.         fprintf(fmt,varnames{i-1},t.beta(i),t.se(i),t.t(i),t.pval(i));
  110.     end
  111. end

  112. if nargout == 1
  113.     stats = ST;    % 返回一个包括了回归分析的所有诊断统计量的结构体变量
  114. end

  115. % -----------------子函数-----------------------
  116. function varnames = makevarnames(varname1,model)
  117. % 生成指定模型的变量标签
  118. p = size(varname1,1);
  119. varname2 = [];
  120. for i = 1:p-1
  121.     varname2 = [varname2;strcat(varname1(i),'*',varname1(i+1:end))];
  122. end
  123. varname3 = strcat(varname1,'*',varname1);
  124. switch model
  125.     case 'linear'
  126.         varnames = varname1;
  127.     case 'interaction'
  128.         varnames = [varname1;varname2];
  129.     case 'quadratic'
  130.         varnames = [varname1;varname2;varname3];
  131.     case 'purequadratic'
  132.         varnames = [varname1;varname3];
  133. end

  1. function stats = reglm(y,X,model,varnames)
  2. % 多重线性回归分析或广义线性回归分析
  3. %
  4. %   reglm(y,X),产生线性回归分析的方差分析表和参数估计结果,并以表格形式显示在屏幕上. 参
  5. %   数X是自变量观测值矩阵,它是n行p列的矩阵. y是因变量观测值向量,它是n行1列的列向量.
  6. %
  7. %   stats = reglm(y,X),还返回一个包括了回归分析的所有诊断统计量的结构体变量stats.
  8. %
  9. %   stats = reglm(y,X,model),用可选的model参数来控制回归模型的类型. model是一个字符串,
  10. %   其可用的字符串如下
  11. %       'linear'          带有常数项的线性模型(默认情况)
  12. %       'interaction'     带有常数项、线性项和交叉项的模型
  13. %       'quadratic'       带有常数项、线性项、交叉项和平方项的模型
  14. %       'purequadratic'   带有常数项、线性项和平方项的模型
  15. %
  16. %   stats = reglm(y,X,model,varnames),用可选的varnames参数指定变量标签. varnames 
  17. %   可以是字符矩阵或字符串元胞数组,它的每行的字符或每个元胞的字符串是一个变量的标签,它的行
  18. %   数或元胞数应与X的列数相同. 默认情况下,用X1,X2,…作为变量标签.
  19. %
  20. %   例:
  21. %   x = [215 250 180 250 180 215 180 215 250 215 215
  22. %       136.5 136.5 136.5 138.5 139.5 138.5 140.5 140.5 140.5 138.5 138.5]';
  23. %   y = [6.2 7.5 4.8 5.1 4.6 4.6 2.8 3.1 4.3 4.9 4.1]';
  24. %   reglm(y,x,'quadratic')
  25. %
  26. %   ----------------------------------方差分析表----------------------------------
  27. %   方差来源    自由度          平方和           均方             F值          p值
  28. %   回归       5.0000        15.0277         3.0055          7.6122      0.0219
  29. %   残差       5.0000         1.9742         0.3948
  30. %   总计      10.0000        17.0018
  31. %
  32. %         均方根误差(Root MSE)     0.6284             判定系数(R-Square)    0.8839
  33. %   因变量均值(Dependent Mean)     4.7273        调整的判定系数(Adj R-Sq)    0.7678
  34. %
  35. %   -----------------------------------参数估计-----------------------------------
  36. %      变量               估计值            标准误             t值          p值
  37. %     常数项             30.9428        2011.1117           0.0154      0.9883
  38. %        X1              0.7040           0.6405           1.0992      0.3218
  39. %        X2             -0.8487          29.1537          -0.0291      0.9779
  40. %     X1*X2             -0.0058           0.0044          -1.3132      0.2461
  41. %     X1*X1              0.0003           0.0003           0.8384      0.4400
  42. %     X2*X2              0.0052           0.1055           0.0492      0.9626
  43. %
  44. %   Copyright 2009 - 2010 xiezhh. 
  45. %   $Revision: 1.0.0.0 $  $Date: 2009/12/22 21:41:00 $

  46. if nargin < 2
  47.    error('至少需要两个输入参数');
  48. end
  49. p = size(X,2);    % X的列数,即变量个数
  50. if nargin < 3 || isempty(model)
  51.    model = 'linear';    % model参数的默认值
  52. end

  53. % 生成变量标签varnames
  54. if nargin < 4 || isempty(varnames)
  55.     varname1 = strcat({'X'},num2str([1:p]'));
  56.     varnames = makevarnames(varname1,model);    % 默认的变量标签
  57. else
  58.     if ischar(varnames)
  59.         varname1 = cellstr(varnames);
  60.     elseif iscell(varnames)
  61.         varname1 = varnames(:);
  62.     else
  63.         error('varnames 必须是字符矩阵或字符串元胞数组');
  64.     end
  65.     if size(varname1,1) ~= p
  66.         error('变量标签数与X的列数不一致');
  67.     else
  68.         varnames = makevarnames(varname1,model);    % 指定的变量标签
  69.     end
  70. end

  71. ST = regstats(y,X,model);    % 调用regstats函数进行线性回归分析,返回结构体变量ST
  72. f = ST.fstat;    % F检验相关结果
  73. t = ST.tstat;    % t检验相关结果

  74. % 显示方差分析表
  75. fprintf('\n');
  76. fprintf('------------------------------方差分析表------------------------------');
  77. fprintf('\n');
  78. fprintf('%s%7s%15s%15s%15s%12s','方差来源','自由度','平方和','均方','F值','p值');
  79. fprintf('\n');
  80. fmt = '%s%13.4f%17.4f%17.4f%16.4f%12.4f';
  81. fprintf(fmt,'回归',f.dfr,f.ssr,f.ssr/f.dfr,f.f,f.pval);
  82. fprintf('\n');
  83. fmt = '%s%13.4f%17.4f%17.4f';
  84. fprintf(fmt,'残差',f.dfe,f.sse,f.sse/f.dfe);
  85. fprintf('\n');
  86. fmt = '%s%13.4f%17.4f';
  87. fprintf(fmt,'总计',f.dfe+f.dfr,f.sse+f.ssr);
  88. fprintf('\n');
  89. fprintf('\n');

  90. % 显示判定系数等统计量
  91. fmt = '%22s%15.4f%25s%10.4f';
  92. fprintf(fmt,'均方根误差(Root MSE)',sqrt(ST.mse),'判定系数(R-Square)',ST.rsquare);
  93. fprintf('\n');
  94. fprintf(fmt,'因变量均值(Dependent Mean)',mean(y),'调整的判定系数(Adj R-Sq)',...
  95.         ST.adjrsquare); 
  96. fprintf('\n');
  97. fprintf('\n');

  98. % 显示参数估计及t检验相关结果
  99. fprintf('-------------------------------参数估计-------------------------------');
  100. fprintf('\n');
  101. fprintf('%8s%18s%15s%15s%12s','变量','估计值','标准误','t值','p值');
  102. fprintf('\n');
  103. for i = 1:size(t.beta,1)
  104.     if i == 1
  105.         fmt = '%8s%20.4f%17.4f%17.4f%12.4f\n';
  106.         fprintf(fmt,'常数项',t.beta(i),t.se(i),t.t(i),t.pval(i));
  107.     else
  108.         fmt = '%10s%20.4f%17.4f%17.4f%12.4f\n';
  109.         fprintf(fmt,varnames{i-1},t.beta(i),t.se(i),t.t(i),t.pval(i));
  110.     end
  111. end

  112. if nargout == 1
  113.     stats = ST;    % 返回一个包括了回归分析的所有诊断统计量的结构体变量
  114. end

  115. % -----------------子函数-----------------------
  116. function varnames = makevarnames(varname1,model)
  117. % 生成指定模型的变量标签
  118. p = size(varname1,1);
  119. varname2 = [];
  120. for i = 1:p-1
  121.     varname2 = [varname2;strcat(varname1(i),'*',varname1(i+1:end))];
  122. end
  123. varname3 = strcat(varname1,'*',varname1);
  124. switch model
  125.     case 'linear'
  126.         varnames = varname1;
  127.     case 'interaction'
  128.         varnames = [varname1;varname2];
  129.     case 'quadratic'
  130.         varnames = [varname1;varname2;varname3];
  131.     case 'purequadratic'
  132.         varnames = [varname1;varname3];
  133. end
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
% MATLAB数学建模工具箱 % % 本工具箱主要包含三部分内容 % 1. MATLAB常用数学建模工具的中文帮助 % 2. 贡献MATLAB数学建模工具(打*号) % 3. 中国大学生数学建模竞赛历年试题MATLAB程序 % 数据拟合 % interp1 - 一元函数插值 % spline - 样条插值 % polyfit - 多项式插值或拟合 % curvefit - 曲线拟合 % caspe - 各种边界条件的样条插值 % casps - 样条拟合 % interp2 - 二元函数插值 % griddata - 不规则数据的二元函数插值 % *interp - 不单调节点插值 % *lagrange - 拉格朗日插值法 % % 方程求根 % inv - 逆矩阵 % roots - 多项式的根 % fzero - 一元函数零点 % fsolve - 非线性方程组 % solve - 符号方程解 % *newton - 牛顿迭代法解非线性方程 % %微积分和微分方程 % diff - 差分 % diff - 符号导函数 % trapz - 梯形积分法 % quad8 - 高精度数值积分 % int - 符号积分 % dblquad - 矩形域二重积分 % ode45 - 常微分方程 % dsolve - 符号微分方程 % *polyint - 多项式积分法 % *quadg - 高斯积分法 % *quad2dg - 矩形域高斯二重积分 % *dblquad2 - 非矩形域二重积分 % *rk4 - 常微分方程RungeKutta法 % %随机模拟和统计分析 % max,min - 最大,最小值 % sum - 求和 % mean - 均值 % std - 标准差 % sort - 排序(升序) % sortrows - 按某一列排序(升序) % rand - [0,1]区间均匀分布随机数 % randn - 标准正态分布随机数 % randperm - 1...n 随机排列 % regress - 线性回归 % classify - 统计聚类 % *trim - 坏数据祛除 % *specrnd - 给定分布律随机数生成 % *randrow - 整行随机排列 % *randmix - 随机置换 % *chi2test - 分布拟合度卡方检验 % % 数学规划 % lp - 线性规划 % linprog - 线性规划(在MATLAB5.3使用) % fmin - 一元函数极值 % fminu - 多元函数极值拟牛顿法 % fmins - 多元函数极值单纯形搜索法 % constr - 非线性规划 % fmincon - 非线性规划(在MATLAB5.3使用) % % 离散优化 % *enum - 枚举法 % *monte - 蒙特卡洛法 % *lpint - 线性整数规划 % *L01p_e - 0-1整数规划枚举法 % *L01p_ie - 0-1整数规划隐枚举法 % *bnb18 - 非线性整数规划(在MATLAB5.3使用) % *bnbgui - 非线性整数规划图形工具(在MATLAB5.3使用) % *mintreek - 最小生成树kruskal算法 % *minroute - 最短路dijkstra算法 % *krusk - 最小生成树kruskal算法mex程序 % *dijkstra - 最短路dijkstra算法mex程序 % *dynprog - 动态规划 % % % 图形 % plot - 平面曲线(一元函数) % plot3 - 空间曲线 % mesh - 空间曲面(二元函数) % *meshf - 非矩形网格图 % *draw - 用鼠标划光滑曲线 % %中国大学生数学建模竞赛题解 % jm96a - 捕鱼策略 % jm96b - 节水洗衣机 % jm96bfun - 节水洗衣机优化函数 % jm97a - 零件参数设计 % jm97afun - 零件参数函数 % jm97aoptim - 零件参数设计优化函数 % jm97b - 截断切割 % jm97bcount - 截断切割枚举法 % jm97brule - 截断切割优化准则 % jm98a1 - 风险投资模型求解 % jm98a2 - 风险投资模型讨论 % jm98a3 - 收益与风险非线性模型求解 % jm98a3fun - 收益与风险非线性模型优化函数 % jm98b - 灾情巡视路线(C程序) % jm99a1 - 自动化车床模型一 % jm99a1fun - 自动化车床模型目标函数 % jm99a1simu - 自动化车床模型随机模拟 % jm99asmfun - 自动化车床模型费用函数 % % 演示程序 % funtool - 函数计算器 % tutdemo - MATLAB优化工具箱教程 % mathmodl - 数学建模工具箱演示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值