网站首页 > 技术文章 正文
人们总能通过普通最小二乘回归进行数据的分析和预测。当选取的解释变量过多而样本很少时,无法使用普通最小二乘法进行建模。
R软件是一款具有强大统计分析功能的开源软件,利用R软件进行偏最小二乘回归建模,可以得到理想的模型,并能够对回归系数进行显著性检验,帮助人们发现变量的主要影响因素。
设有q个因变量{y1,y2,…,yq}和p个自变量{x1,x2,…,xp},观测了n个样本点,由此构成了自变量与因变量的数据表Xn×p和Yn×q。
偏最小二乘回归分别在X与Y中提取出成分t1与u1(即:t1、u1分别是x1,x2,…,xp、y1,y2,…,yq的线性组合)。
若选取成分的个数过多,会很容易出现过度拟合的问题,因此需要一个有效的原则来确定成分的个数。采用类似抽样测试的工作方式,把所有样本点分成两部分:第一部分用来重新拟合一个偏最小二乘模型,第二部分的样本点作为测试数据;带入拟合模型中求得预测值误差平方和PRESS=∑((yi-y^i)^2)。再以这种方式重复g次,直到所有的样本都被预测了一次,最后把每个样本的预测误差平方和加总,称为PRESS。
常见的交叉验证方法有“留一验证”,“K折交叉验证”,“Holdout验证”等方法,选取一种方法分别求出第1~r个成分对应的PRESS值,取PRESS最小的或者PRESS几乎不再变化的成分个数作为最终模型选取的成分个数m。
首先需要在加载R的程序包pls;pls包是由Bjrn-HelgeMevik,RonWehrens和Kristian Hovde Liland创建,专门用来做偏最小二乘回归的程序包。
代码如下:
>library("pls",lib.loc="C:/ProgramFiles/R/R-2.15.1/library")
再导入自变量和因变量的样本数据,并且使用scale()函数将数据进行标准化消除量纲的影响。记标准化之后的自变量为X,因变量为Y,进行PLS回归的代码如下:
>pls1<-plsr(Y~X,validation="LOO",jackknife=TRUE)#进行偏最小二乘回归,模型存为对象pls1
>summary(pls1,what="all")#显示回归结果(包括PRESS与变异解释度)。
其中,validation="LOO"表示使用留一交叉验证计算PRESS,jackknife=TRUE表示使用jackknife法估计回归系数方差(为后面的显著性检验做准备)。在没给定成分个数的情况下,会默认使用所有的主成分进行回归,因此需要在选择的成分个数尽可能小的前提下,选择使PRESS最小或几乎不变的成分个数。假设选定了成分个数为m,重新进行回归,并对回归系数假设检验,代码如下:
>pls2<-plsr(Y~X,ncomp=m,validation="LOO",jackknife=TRUE)#“ncomp=m”表示模型成分个数为m>jack。test(pls2)另外还可以使用coef()函数得到回归系数,scores()得到得分矩阵,loadings()得到载荷矩阵,predict()得到对应样本的预测值,以及plot()函数将结果以图的形式展现。
建模过程Step1:导入数据,并进行数据的标准化:
>G1<-read.csv("K:\\WORK\\论文\\R\\grape.csv")
>W1<-read.csv("K:\\WORK\\论文\\R\\wine.csv")
>X<-scale(G1)
>Y<-scale(W1)得到的自变量X是27×59的矩阵,X1~X59依次代表指标。
Step2:进行初步偏最小二乘回归:>pls1<-plsr(Y~X,ncomp=10,validation="LOO",jackknife=TRUE)
>summary(pls1,what="all")#注:R中默认最多只能显示25个主成分对应的各项结果,此处已达到最大个数25)。
其中CV即为不同主成分个数对应的PRESS,adjcv为调整后的PRESS,“TRAINING:%varianceexplained”一栏为主成分对各变量的累积贡献率。由结果可知,主成分个数为3个时,模型在经过留一交叉验证法后求得的PRESS总和最小,随着成分个数的增加,PRESS值也没有太大改变,并且3个成分对各个因变量的累积贡献率也基本达到了85%,因此定下回归的成分个数m=3。
Step3:根据成分数m=3,建立最终模型:
>pls2<-plsr(Y~X,ncomp=3,validation="LOO",jackknife=TRUE)
>coef(pls2)#得到回归系数得到回归系数后,便能写出各因变量对所有解释变量的回归方程。
使用validationplot()函数可以画出PLS模型在不同主成分数下对应的RMSEP(由留一交叉验证法算得的均方预测误差根),对初始模型的结果进行画图。
纵坐标“RMESP”表示均方预测误差根,横坐标为不同模型的成分个数;大部分因变量在成分数为3时对应的均方误差根最小,证明选择3个成分参与建模是正确的。使用predplot(pls2)函数画出最终模型的预测效果图。纵坐标为各因变量的预测值,横坐标为各因变量的实际测量值;散点集中分布在主对角线上则说明预测效果很好。预测图(对应15个因变量)的散点大致都分布在对角线上,说明最终模型的拟合效果较好。Y8对应的散点图几乎是一条垂直的线,预测很糟糕;查阅原始数据得知第26个样本点的Y8原始值是1.6239,远大于其他只有0.02左右的数据,因此26号样本为模型的强影响点,它使得对Y8的拟合效果很差;可以考虑将其剔除重新进行预测。
对于其他的变量,可以直观的看出效果是不错的。
使用jack.test()函数进行检验,挑出与通过检验的回归系数对应的自变量。
通过显著性检验可以知道各因变量(指标)受哪些自变量(理化指标)的影响较大,及其受影响程度。由表2可知,对因变量Y1而言,对其有显著影响的自变量有X19、X21、X27DPPH、X28、X29、X37、X40,并且均是对其有正向的影响。有正向影响是显然成立的,此处也通过了显著性检验,因此可初步判断此模型与实际相符,对于其他影响显著的变量便是给了一个探索点,可以通过别的方法深入探讨。同理于其他14个因变量,显著性检验可以初步了解到各因变量的受影响因素。#开源软件##R语言##R软件#
- 上一篇: R数据分析:如何简洁高效地展示统计结果
- 下一篇: R语言3种数据分析方法,搬好板凳,记笔记了!
猜你喜欢
- 2024-10-07 R语言实践问题与解决方法记录(一)
- 2024-10-07 R数据分析:使用R语言进行卡方检验
- 2024-10-07 R数据分析:如何用R做多重插补,实例操练
- 2024-10-07 R语言——关联规则(r语言关联规则分析)
- 2024-10-07 R语言数据质量分析(r语言数据分析步骤)
- 2024-10-07 R语言风险价值VaR(Value at Risk)和损失期望
- 2024-10-07 R语言——几个基础统计(r语言统计学)
- 2024-10-07 干货 | 超实用的【R语言与高级医学统计学】课程,科研人必备
- 2024-10-07 R语言中因子的创建与使用(r语言中因子指什么)
- 2024-10-07 协同过滤的R语言实现及改进(协同过滤算法改进)
- 1517℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 593℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 488℃启用MySQL查询缓存(mysql8.0查询缓存)
- 476℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 453℃MySQL server PID file could not be found!失败
- 最近发表
-
- PS所有滤镜的说明(六)(ps滤镜详解)
- 5款小白也能用的在线图片编辑器!电商效率飙升就靠它!
- Java变量(java变量有什么作用)
- Java面试常见问题:Java注解(java中的面试题)
- Java编程入门第一课:HelloWorld(java编程从入门到实践)
- Java基础教程:Java继承概述(java里继承的概述)
- java基础之——访问修饰符(private/default/protected/public)
- 如何规划一个合理的JAVA项目工程结构
- 将机器指令翻译成 JavaScript -- 终极目标
- Web 服务器基准测试:Go vs. Node.js vs. Nim vs. Bun
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)