Problem

当你使用 polyfit 函数进行多项式拟合之后,你希望计算决定系数或者相关系数看看拟合效果如何。聪明的你肯定觉得聪明的 Matlab 的 polyfit 函数的返回值中会有 \(R^2\) 或者 \(r\) 吧。你尝试 disp 了一下,发现有一个结构体 \(S\)。再查一查帮助文档,发现误差估计结构体 \(S\) 中只有一个范德蒙德矩阵 \(R\)、自由度 \(df\) 和残差的范数 \(normr\),并没有你想要的 \(R^2\) 或者 \(r\)。

Solution

很遗憾,我们还是需要手动计算这两个系数。

假设X是原始数据自变量,Y是原始数据因变量,我们先进行多项式拟合:

p = polyfit(X, Y, n); % n是多项式次数
Y_pre = polyval(p,X);

得到了Y_pre为多项式拟合后的预测值。

决定系数R-squared的计算

我们使用如下公式计算\(R^2\)​:

\[\begin{align}
RSS&=\sum (y_{pre}-y)^2\\
ESS&=\sum (y-\overline y)^2\\
R^2&=1-\frac{ESS}{TSS}
\end{align}
\]

代码如下:

SSerr = sum((Y_pre - Y).^2); % 残差平方和
SStot = sum((Y - mean(Y)).^2); % 总平方和
R_squared = 1 - (SSerr / SStot); % R-squared

相关系数r的计算

计算相关系数\(r\),可以使用corrcoef函数先计算相关系数矩阵,取其非对角线元素的值。

代码如下:

r = corrcoef(Y_pre, Y);
disp(r(1,2))

Others

\(r\)(相关系数)和 \(R^2\)​​(决定系数,也称为R-squared)是可以用于衡量数据的不同的方面的两个不同的统计量。

Calculation

\[\begin{gather}
R^2=1-\frac{RSS}{TSS}=1-\frac{\sum (y_{pre}-y)^2}{\sum (y-\overline y)^2}\\
r=\frac{n(\sum x y)-(\sum x)(\sum y)}{\sqrt{[n \sum x^2-(\sum x)^2][n \sum y^2-(\sum y)^2]}}\\
R^2=r^2
\end{gather}
\]

Comparison

  1. 相关系数 \(r\in[-1,1]\):衡量两个变量之间线性关系的强度和方向。

    • \(r = 1\) 表示完全正相关。
    • \(r = -1\) 表示完全负相关。
    • \(r = 0\) 表示没有线性相关。
  2. 决定系数 \(R^2\in[0,1]\):衡量模型对因变量变异的解释程度。
    • R² = 1 表示模型完美地解释了数据的变异。
    • R² = 0 表示模型没有解释数据的任何变异。

R² 衡量模型拟合优度的指标,告诉我们模型对数据变异的解释程度有多好。而相关系数 r 仅仅告诉我们两个变量之间线性关系的强度,它并不对模型拟合优度全面评估。

如果想要更全面的评估,通常会看 \(R^2\) 。

如果只关心两个变量之间是否有线性关系,看相关系数 \(r\)。

后续

补充于2024-7-31

但是有时候会出现 \(R^2<0\) 的情况。等等,为什么 \(R^2\) 会小于零?它不是 \(r\) 的平方吗?

当出现拟合效果特别差的时候,就有可能会出现(?)

今天我们在研读一篇论文的时候,遇到了“多元线性回归”。而由于题目背景,有些小组疑惑是否要规定常数项为 0。假如使用 Matlab 中的多元线性回归函数 regress 的话,当 X 不存在全为 1 的一列时,会出现报错:

警告: R 方和 F 统计量的定义不良,除非 X 有一列全部为 1。

键入 "help regress" 了解详细信息。

同时,如果硬要输出 regress 返回值中的 stat(1) 的话,会发现 \(R^2\) 可能是一个负数。(演示代码见附录)

实际上这是因为 \(R^2\) 的定义不同导致的。

  1. 范德蒙德矩阵

    [b,bint,r,rint,stats]=regress(Y,X,0.05);
    fprintf("R^2=stats(1)=%f\n",stats(1));

​ 输出 R^2=stats(1)=-0.381201,为负数。

  1. \(1-\frac{ESS}{TSS}\)

    Y_pre=X*b;
    ESS=sum((Y_pre-Y).^2);
    TSS=sum((Y-mean(Y)).^2);
    fprintf("R^2=1-ESS/TSS=%f\n",1-ESS/TSS);

    输出 R^2=1-ESS/TSS=-0.381201,结果与范德蒙德矩阵结果一致。

  2. \(\frac{RSS}{TSS}\)

    RSS=sum((Y_pre-mean(Y)).^2);
    fprintf("R^2=RSS/TSS=%f\n",RSS/TSS);

    输出 R^2=RSS/TSS=3.746787,为正数。

  3. \(r^2\)

    r = corrcoef(Y_pre, Y);
    fprintf("r=corrcoef()(1,2)=%f=>r^2=%f\n",r(1,2),(r(1,2)).^2);

    输出 r=corrcoef()(1,2)=0.869397=>r^2=0.755851,为正数。

以上。

References

polyfit and R^2 value - MATLAB Answers - MATLAB Central (mathworks.cn)

相关系数 - MATLAB corrcoef - MathWorks 中国

Code

X_data=[120	73	180	80	125	125	81.1000000000000	90
133.020000000000 73 180 80 125 125 81.1000000000000 90
129.630000000000 73 180 80 125 125 81.1000000000000 90
158.770000000000 73 180 80 125 125 81.1000000000000 90
145.320000000000 73 180 80 125 125 81.1000000000000 90
120 78.5960000000000 180 80 125 125 81.1000000000000 90
120 75.4500000000000 180 80 125 125 81.1000000000000 90
120 90.4870000000000 180 80 125 125 81.1000000000000 90
120 83.8480000000000 180 80 125 125 81.1000000000000 90
120 73 231.390000000000 80 125 125 81.1000000000000 90
120 73 198.480000000000 80 125 125 81.1000000000000 90
120 73 212.640000000000 80 125 125 81.1000000000000 90
120 73 190.550000000000 80 125 125 81.1000000000000 90
120 73 180 75.8570000000000 125 125 81.1000000000000 90
120 73 180 65.9580000000000 125 125 81.1000000000000 90
120 73 180 87.2580000000000 125 125 81.1000000000000 90
120 73 180 97.8240000000000 125 125 81.1000000000000 90
120 73 180 80 150.710000000000 125 81.1000000000000 90
120 73 180 80 141.580000000000 125 81.1000000000000 90
120 73 180 80 132.370000000000 125 81.1000000000000 90
120 73 180 80 156.930000000000 125 81.1000000000000 90
120 73 180 80 125 138.880000000000 81.1000000000000 90
120 73 180 80 125 131.210000000000 81.1000000000000 90
120 73 180 80 125 141.710000000000 81.1000000000000 90
120 73 180 80 125 149.290000000000 81.1000000000000 90
120 73 180 80 125 125 60.5820000000000 90
120 73 180 80 125 125 70.9620000000000 90
120 73 180 80 125 125 64.8540000000000 90
120 73 180 80 125 125 75.5290000000000 90
120 73 180 80 125 125 81.1000000000000 104.840000000000
120 73 180 80 125 125 81.1000000000000 111.220000000000
120 73 180 80 125 125 81.1000000000000 98.0920000000000
120 73 180 80 125 125 81.1000000000000 120.440000000000];
X=X_data;
Y=Y_data(:,1);
[b,bint,r,rint,stats]=regress(Y,X,0.05); fprintf("R^2=stats(1)=%f\n",stats(1)); Y_pre=X*b;
ESS=sum((Y_pre-Y).^2);
TSS=sum((Y-mean(Y)).^2);
fprintf("R^2=1-ESS/TSS=%f\n",1-ESS/TSS); RSS=sum((Y_pre-mean(Y)).^2);
fprintf("R^2=RSS/TSS=%f\n",RSS/TSS); r = corrcoef(Y_pre, Y);
fprintf("r=corrcoef()(1,2)=%f=>r^2=%f\n",r(1,2),(r(1,2)).^2);

在Matlab中如何计算决定系数R^2和相关系数r的更多相关文章

  1. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

  2. Matlab中给figure添加图例(legend),标题(title)和颜色(color)

    在Matlab绘图过程中,尤其是需要将多个图绘制在相同的坐标轴中时,通常需要将不同的曲线设置成为不同的颜色.此外,为了直观,还需要给这张图标增添标题和图例.这篇文章展示了在Matlab的绘图窗口(fi ...

  3. Matlab中函数定义方法

    Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...

  4. MATLAB中白噪声的WGN和AWGN函数的使用

    MATLAB中白噪声的WGN和AWGN函数的使用如下: MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一 信号 ...

  5. matlab中的xcorr 自相关函数

    转载自 http://blog.163.com/to_be_myself/blog/static/176060227201101762159227/ Matlab中用于计算自相关函数的指令是xcorr ...

  6. MATLAB中plot()画图的颜色线型和希腊字母参数设置

    y         黄色           ·             点线      m         粉红           ○             圈线      c          ...

  7. matlab 中txt文件(含字符及数值)处理

    matlab 中txt文件(含字符及数值)处理 (2008-08-02 09:45:12) 转载▼ 标签: 杂谈 分类: matlab及C学习 Matlab文件操作及读txt文件ZZ 2008-07- ...

  8. matlab中各种高斯相关函数

    matlab中各种高斯相关函数 matlab, 高斯函数, 高斯分布 最常见的是产生服从一维标准正态分布的随机数 n=100;  x=randn(1,n)  实现服从任意一维高斯分布的随机数 u=10 ...

  9. MATLAB中提供的线型属性

    MATLAB中提供的线型属性有: 线型 说明 标记符 说明 颜色 说明 - 实线(默认) + 加号符 r 红色 -- 双划线 o 空心圆 g 绿色 : 虚线 * 星号 b 蓝色 :. 点划线 . 实心 ...

  10. 【matlab】将matlab中数据输出保存为txt或dat格式

    将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...

随机推荐

  1. QTableView实现在表格内直接对数据库内容进行修改、新增和删除等操作

    文章目录 前言 QSqlTableModel 新增 删除 修改 提交 取消 前言 本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作 ...

  2. TypeScript 为什么使用 Go 而不是 Rust 重写 ?官方回应来了

    TypeScript官推最近宣布他们正在移植到 Go,速度已经提高了 10 倍之多. 作为以性能为代表的另一语言Rust,人们自然会疑惑为什么没有选Rust语言重构呢?为方便大家快速理解,我用Deep ...

  3. rust学习笔记(4)

    流程控制 if if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is ...

  4. Oracle 修改SYS、system用户密码

      by:授客 QQ:1033553122 概念 SYS用户是Oracle中权限最高的用户,而SYSTEM是一个用于数据库管理的用户.在数据库安装完之后,应立即修改SYS,SYSTEM这两个用户的密码 ...

  5. linux命令:lsof命令

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...

  6. Docker daemon error cannot allocate memory

    Issue When getting theses errors: Jan 12 00:21:55 -- dockerd[904]: time="2018-01-12T00:21:55.32 ...

  7. 一个属性同时使用Autowired和Resource注解会发生什么?

    首发于公众号:BiggerBoy 右侧图片wx扫码关注有惊喜 欢迎关注,查看更多技术文章 如题,如果在同一个属性上使用@Autowired注解注入bean1,然后使用@Resource注解注入bean ...

  8. SQL Server 查看版本信息

    SQL Server 查看版本信息3种方法: 1) 使用命令行查看 [Win + R]键 -> 打开cmd 2) 使用SSMS查看 打开并连接SSMS后查看 3) 通过服务器属性查看 使用SSM ...

  9. study Rust-1【Rust的特点和应用场景】

    Rust语言的特点 高性能 - Rust 速度惊人且内存利用率极高.由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成. 可靠性 - Rust ...

  10. 搞笑的ini文件读取ReadSectionValues

    用fdconnection自动生成连接文本,将其写入ini文件,用于程序的读写.ini文件见后面. Lfini.ReadSection('LocalConnection',lstrings); Sho ...