在Matlab中如何计算决定系数R^2和相关系数r
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\):
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
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
- 相关系数 \(r\in[-1,1]\):衡量两个变量之间线性关系的强度和方向。
- \(r = 1\) 表示完全正相关。
- \(r = -1\) 表示完全负相关。
- \(r = 0\) 表示没有线性相关。
- 决定系数 \(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\) 的定义不同导致的。
范德蒙德矩阵
[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-\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,结果与范德蒙德矩阵结果一致。\(\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,为正数。\(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的更多相关文章
- Matlab中的一些小技巧
(转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...
- Matlab中给figure添加图例(legend),标题(title)和颜色(color)
在Matlab绘图过程中,尤其是需要将多个图绘制在相同的坐标轴中时,通常需要将不同的曲线设置成为不同的颜色.此外,为了直观,还需要给这张图标增添标题和图例.这篇文章展示了在Matlab的绘图窗口(fi ...
- Matlab中函数定义方法
Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...
- MATLAB中白噪声的WGN和AWGN函数的使用
MATLAB中白噪声的WGN和AWGN函数的使用如下: MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一 信号 ...
- matlab中的xcorr 自相关函数
转载自 http://blog.163.com/to_be_myself/blog/static/176060227201101762159227/ Matlab中用于计算自相关函数的指令是xcorr ...
- MATLAB中plot()画图的颜色线型和希腊字母参数设置
y 黄色 · 点线 m 粉红 ○ 圈线 c ...
- matlab 中txt文件(含字符及数值)处理
matlab 中txt文件(含字符及数值)处理 (2008-08-02 09:45:12) 转载▼ 标签: 杂谈 分类: matlab及C学习 Matlab文件操作及读txt文件ZZ 2008-07- ...
- matlab中各种高斯相关函数
matlab中各种高斯相关函数 matlab, 高斯函数, 高斯分布 最常见的是产生服从一维标准正态分布的随机数 n=100; x=randn(1,n) 实现服从任意一维高斯分布的随机数 u=10 ...
- MATLAB中提供的线型属性
MATLAB中提供的线型属性有: 线型 说明 标记符 说明 颜色 说明 - 实线(默认) + 加号符 r 红色 -- 双划线 o 空心圆 g 绿色 : 虚线 * 星号 b 蓝色 :. 点划线 . 实心 ...
- 【matlab】将matlab中数据输出保存为txt或dat格式
将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...
随机推荐
- html5文本标签
标题文本 h1.h2.h3.h4.h5.h6 其中 h1.h2.h3是比较常用的.h3.h4.h5.h6相对来说用的会少一点,除非结构层次比较深才会使用. 段落文本 p <p>这是一个段落 ...
- 三分钟教学:手把手教你实现Arduino发布第三方库
三分钟教学:手把手教你实现Arduino发布第三方库 原文链接: 手把手教你实现Arduino发布第三方库 摘要 Arduino 发布第三方库的流程包括:构建库的基本框架后将其打包并上传至 GitHu ...
- PostgreSQL configure: error: readline library not found
前言 安装 PostgreSQL 时报错,以下 configure: error: readline library not found If you have readline already in ...
- Pydantic模型继承解析:从字段继承到多态模型
title: Pydantic模型继承解析:从字段继承到多态模型 date: 2025/3/19 updated: 2025/3/19 author: cmdragon excerpt: 涵盖字段继承 ...
- Linux系统挂载未分配硬盘空间
先查看未挂载之前的磁盘使用情况 发现磁盘使用率已经达到了96%,迫切需要扩容 查看分区情况fdisk –l 首先确保有可分配的磁盘空间 发现/dev/vda下有400多个G 的空间 所以将/dev/v ...
- 从上下文切换谈thread_local工作原理
从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说 ...
- 前端必备的 CSS 库,normalize.css
这是一个小 CSS 样式表,是著名的库,作为 CSS 基础样式的一部分,可消除客户端渲染不一致问题. 地址是 https://necolas.github.io/normalize.css/ 别小看这 ...
- OpenAI的GPT-4o:普通人的AI秘书来了
1. 惊艳时刻:AI比你想象的更"人性" 早餐时,张三正埋头刷推送,一篇关于OpenAI发布GPT-4o的文章瞬间点燃了他的好奇心.这个AI简直是科技圈的惊雷!竟然可以像真人一样说 ...
- HackTheBox-Linux-Brainfuck
brainfuck 一.攻击流程: 使用nmap进行探测开放端口和服务. sudo nmap --min-rate=1000 -sT -sC -sV [target] 通过上图可以看出,有22端口的s ...
- Cannot attach the file *.mdf as database
使用ASP.NET MVC 4 和 Entity Framwork 6(Code First)爬的一个坑,无意间把App_Data下的*.mdf文件删除了,然后程序编译正常,但是运行异常RT,留爪. ...