【R语言】回归分析与判别分析
一、线性回归分析
1、lm()函数
lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系。它可以处理简单的线性回归、多元线性回归以及带有分类预测变量的回归(通过创建虚拟变量或指示变量)。
基本格式:
lm(formula, data, subset, weights, ...)
- formula:描述因变量与自变量间关系的符号表达式。
- data:包含公式中所有变量的数据框(data frame)或列表(list)。若未明确指定,R 将在全局环境中搜索变量。
- subset(子集):逻辑向量或表达式,用于从数据中筛选用于模型拟合的观测值。默认为NULL,即使用全部数据。
- weights(权重):可选参数,用于为各观测值分配权重。默认为
NULL
,即所有观测值权重相等。- ...(其他参数):lm函数还接受其他多个参数,这些参数通常与模型的拟合与优化相关。例如,na.action参数可用于定义缺失值(NA)的处理方式,method参数可用于指定拟合方法(尽管对于普通线性模型,此参数通常设为默认值 "qr" 即可)。
2、简单线性回归
用R语言内置的cars数据集做演示,此数据集记录了汽车的速度(speed)和停车距离(dist),一共50条记录。
head(cars, n=5)
# 简单线性模型拟合
fit <- lm(dist ~ speed, data=cars)
# 拟合结果的详细信息
summary(fit)
# 模型参数
coeffcients(fit)
# 回归系数置信区间
confint(fit)
# 模型预测值
fitted(fit)
# 模型的残差
residuals(fit)
从上面结果可知,拟合得到的模型参数的截距项为-17.5791,回归系数是3.9324,调整的多重R2(Adjusted R-squared)为0.6438,说明该模型能解释停车距离为64.38%的变异。方差分析结果也显示整个模型是显著的(p=1.49e-12 < 0.05)。因为简单线性回归只有一个自变量,所以模型的F检验和回归系数的t检验的结果是相同的。
plot(cars)
lines(x=cars$speed, y=fitted(fit), col="red")
3、多重线性回归
多重线性回归包含多个自变量。
下面使用R语言内置的数据集mtcars进行演示,此数据集包含了32种汽车的11种基本性能数据。通过汽车排量(disp),总功率(hp),后桥速比(drat)和车重(wt)四个变量来预测汽车油耗指数(mpg),mpg越大,油耗越低。
head(mtcars, n=5)
fit <- lm(mpg ~ disp + hp + drat + wt, data=mtcars)
summary(fit)
从以上结果可知:汽车排量和后桥速比与汽车油耗指数正相关,而汽车总功率和车重于汽车油耗指数负相关。在多重线性回归中,回归系数表示当1个自变量每增加1个单位,且其它自变量不变时,因变量所增加或减少的数量,例如,车重的回归系数为-3.479668,表示当排量、总功率和后桥速比不变时,车重每增加1个单位,汽车油耗指数将下降约3.48个单位。方差分析结果表明,整个回归模型是显著的(F=34.82,p=2.704e-10<0.01)。在截距项和回归系数显著性检验中,截距项(Intercept)、总功率(hp)和车重(wt)的回归系数显著(Pr<0.05) ,排量(disp)和后桥速比(drat)的回归系数不显著。整个模型能解释油耗指数81.36%的变异。
4、plot()函数
R语言中有一个实用的基础函数plot(),可以生成四种回归模型诊断图:残差图、正态QQ图、尺度-位置图和残差-杠杆图。
fit <- lm(mpg ~ disp+hp+drat+wt, data=mtcars)
# 将四种形态组合成一张图
par(mfrow=c(2,2))
plot(fit)
5、多重共线性
如果自变量之间为多重共线性,即自变量之间有较强的相关性,将使回归系数的估计产生非常严重的误差,以至于估计出来的回归系数没有任何意义。如果要判断回归模型是否存在严重的多重共线性,可以使用方差膨胀因子。
library(car)
fit <- lm(mpg ~ disp+hp+drat+wt, data=mtcars)
vif <- vif(fit)
vif
# 查看哪些变量膨胀因子大于10
vif > 10
# 查看哪些变量膨胀因子的开方大于2
sqrt(vif) > 2
从上面结果可知,如果以方差膨胀因子是否大于10来作为判断准则,那么该回归模型中不存在严重的多重共线性;如果以方差膨胀因子的开方大于2为判断准则,那么该回归模型中存在disp和wt两个变量时,存在严重的多重共线性。
二、判别分析
判别分析就是利用若干个特征来表征事物,通过对这些特征的定量分析,最终将事物判定为某一已知总体。
常见的判别分析有如下三种。
1、距离判别
距离判别(Distance-based Discriminant Analysis)对空间中的某个点进行类属判别,最容易想到的是使用该点与各已知总体的距离远近来进行判别。
对数据进行距离判别,有很多种选择:借助mahalanobis()函数得到马氏距离,接着自编函数进行距离判别;使用WMDB扩展包的wmd()函数,此函数可以进行加权或非加权的马氏距离判别;使用WeDiBaDis扩展包的WDBdisc()函数,此函数也可以进行加权或非加权的马氏距离判别。
以下是如何在R中实现基于距离的分类的基本步骤:
1.1 准备数据
确保你的数据集已经加载并准备好。数据集应该包含特征变量(用于计算距离)和目标变量(类别标签)。
1.2 计算类别中心
对于每个类别,计算其所有样本的均值(或其他代表点),这将作为该类别的中心。
1.3 计算距离
对于新的未知样本,计算它到每个类别中心的距离。可以使用欧氏距离、马氏距离等。
1.4 分类
将样本分类到距离最小的类别中。
1.5 评估模型
使用测试集评估模型的性能,通常通过混淆矩阵、准确率等指标。
1.6 示例
使用R语言中内置的iris数据集进行演示,此数据集包含了3类鸢尾花(setosa、versicolor和virginica)的4个特征,从150条记录。
# 先查看数据信息
head(iris)
str(iris)
library(iris)
describe(iris)
# 从iris数据集中随机抽取3种鸢尾花的数据各一条作为测试集,剩余的作为训练集
# 设定随机种子
set.seed(1234)
# 随机抽取测试集
data <- cbind(rownames = rownames(iris),iris) # 将行名添加为数据框的一列
library(dplyr)
test_data <- data %>% group_by(Species) %>% sample_n(1)
# 剩余数据作为训练集
train_data <- filter(data, !(rownames %in% test_data$rownames))
# 移除行名列以进行后续计算
test_data <- test_data[,-1] %>% ungroup()
test_data
# 移除行名列以进行后续计算
train_data <- train_data[,-1] %>% ungroup()
head(train_data,n=10)
使用WDBdisc()函数进行马氏距离判别:
4.4.2版本的R语言不支持安装WeDiBaDis扩展包。
# 将数据框转换为矩阵
library(dplyr)
test_data1 <- mutate(test_data, Species=as.numeric(Species)) %>%
as.matrix()
train_data1 <- mutate(train_data, Species=as.numeric(Species)) %>%
as.matrix()# 进行马氏距离判别
library(WeDiBaDis)
fit1 <- WDBdisc(data=train_data1, datatype="m", classcol=5, distance="Mahalanobis", method="DB")
summary(fit1)
如下使用欧氏距离进行基于距离的分类:
# 查看数据集
head(iris, n=5)
# 加载数据集
data(iris)# 拆分数据集为训练集和测试集
set.seed(12345)
index <- sample(1:nrow(iris), 0.7 * nrow(iris)) # 70%训练集
train_data <- iris[index, -5] # 训练集,去掉最后的类别标签用于计算中心
train_labels <- iris[index, 5]test_data <- iris[-index, -5] # 测试集
test_labels <- iris[-index, 5]# 计算类别中心
centers <- aggregate(train_data, by=list(Species=train_labels), FUN=mean)# 定义一个函数来计算欧氏距离
euclidean_distance <- function(x, y) {sqrt(sum((x - y)^2))
}# 对测试集中的每个样本进行分类
predictions <- apply(test_data, 1, function(row) {distances <- sapply(split(centers[, -1], centers$Species), function(center) {euclidean_distance(row, center)})# 返回距离最小的类别names(which.min(distances))
})# 评估模型性能
conf_matrix <- table(Predicted=predictions, Actual=test_labels)
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
print(conf_matrix)
print(paste("Accuracy:", round(accuracy, 2)))
2、Fisher判别
Fisher判别分析(Fisher Discriminant Analysis, FDA),也被称为线性判别分析(Linear Discriminant Analysis, LDA)在统计模式识别领域有着广泛的应用。尽管“Fisher判别分析”和“线性判别分析”在术语上存在些许差异,但在大多数情况下,它们指的是同一种方法。FDA/LDA的目标是找到一个线性组合(或投影)方向,使得在这个方向上,不同类别之间的样本投影点尽可能分开,而同一类别内的样本投影点尽可能紧凑。
使用MASS扩展包的lda()函数做演示:
library(MASS) # 包含lda函数
library(ggplot2) # 可视化# 使用经典鸢尾花数据集
data(iris)
head(iris)# 数据预处理
set.seed(12) # 设置随机种子保证可重复性
train_index <- sample(1:nrow(iris), nrow(iris)*0.9) # 90%训练集
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]# 执行Fisher判别分析(LDA);Species ~ .表示使用所有特征预测品种
lda_model <- lda(Species ~ ., data = train_data)# 查看模型概要
print(lda_model)
lda()函数会输出各类别的先验概率(Prior probabilities)、分组均值(Group means)、判别函数系数(Coefficients of linear discriminants)和迹的比重(Proportion of trace)。其中,LD1能解释总变异的99.22%,LD2只能解释总变异的0.78%,故LD1就是所需要的线性函数。
# 模型预测
predictions <- predict(lda_model, newdata = test_data)# 生成混淆矩阵
confusion_matrix <- table(Predicted = predictions$class, Actual = test_data$Species)
print(confusion_matrix)
# 计算准确率
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
cat("\n测试集准确率:", round(accuracy*100, 2), "%\n")
从上面结果可知,总共15种预测,全都预测成功。
# 可视化判别结果
projected_data <- data.frame(LD1 = predictions$x[,1],LD2 = predictions$x[,2],Species = test_data$Species
)ggplot(projected_data, aes(x = LD1, y = LD2, color = Species)) +geom_point(size = 3) +stat_ellipse(level = 0.95) +labs(title = "Fisher判别投影结果",x = "第一判别函数",y = "第二判别函数") +theme_minimal()
3、Bayes判别
使用klaR扩展包中的NaiveBayes()函数。
library(klaR)
set.seed(12) # 设置随机种子保证可重复性
train_index <- sample(1:nrow(iris), nrow(iris)*0.9) # 90%训练集
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]
# 首先建立先验概率相等的Bayes判别模型
data1 <- NaiveBayes(Species ~ ., data=train_data)
# 建立先验概率分别为0.3,0.5,0.2的Bayes判别模型
data2 <- NaiveBayes(Species ~., data=train_data, prior=c(3/10, 5/10, 2/10))
# 查看data1和data2的结构
str(data1)
str(data2)
# 计算两个模型的混淆矩阵
x <- table(Actual = train_data$Species, predicted = predict(data1, train_data)$class)
y <- table(Actual = train_data$Species, predicted = predict(data2, train_data)$class)
x
y# 计算正确率
sum(diag(prop.table(x)))
sum(diag(prop.table(y)))
从上面结果可知,先验概率相等时,有6朵花判错;先验概率不等时,也有6朵花判错。但两者的概率相等,都是95.556%。
相关文章:

【R语言】回归分析与判别分析
一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系…...
ES6中Object.defineProperty 的详细用法和使用场景以及例子
ES6 Object.defineProperty() 用法总结 Object.defineProperty() 是 ES5 引入的一个方法,ES6 继续强化了该方法的使用,它允许我们为对象的属性定义或修改 属性描述符。它能够控制对象属性的行为,如读写权限、可枚举性和可配置性。 1. Objec…...

揭秘云计算 | 5、关于云计算效率的讨论
一、 公有云效率更高? 解:公有云具有更高的效率。首先我们需要知道效率到底指的是什么。这是个亟须澄清的概念。在这里效率是指云数据中心(我们将在后文中介绍其定义)中的IT设备资源利用率,其中最具有代表性的指标就是…...

【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一…...
如何查询网站是否被百度蜘蛛收录?
一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”,例如“site:example.com”(请将“example.com”替换为你实际的网站域名)。如果搜索结果显示了你的网站页面,并且显示了收录的页面数量…...

什么是网络安全审计?网络安全审计的作用...
网络安全审计通过对网络数据的采集、分析、识别,实时动态监测通信内容、网络行为和网络流量,发现和捕获各种敏感信息、违规行为,实时报警响应,全面记录网络系统中的各种会话和事件,实现对网络信息的智能关联分析、评估…...

EasyExcel实现excel导入(模版上传)
目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...

Vue 3最新组件解析与实践指南:提升开发效率的利器
目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…...

【前端】如何安装配置WebStorm软件?
文章目录 前言一、前端开发工具WebStorm和VS Code对比二、官网下载三、安装1、开始安装2、选择安装路径3、安装选项4、选择开始菜单文件夹5、安装成功 四、启动WebStorm五、登录授权六、开始使用 前言 WebStorm 是一款由 JetBrains 公司开发的专业集成开发环境(IDE…...
vllm专题(一):安装-GPU
vLLM 是一个 Python 库,支持以下 GPU 变体。选择您的 GPU 类型以查看供应商特定的说明: 1. NVIDIA CUDA vLLM 包含预编译的 C++ 和 CUDA(12.1)二进制文件。 2. AMD ROCm vLLM 支持配备 ROCm 6.3 的 AMD GPU。 注意 此设备没有预构建的 wheel 包,因此您必须使用预构建的 Do…...

php文件包含
文章目录 基础概念php伪协议什么是协议协议的格式php中的协议file协议http协议ftp协议php://input协议php://filter协议php://data协议 php文件上传机制高级文件包含nginx文件日志包含临时文件包含session文件包含pear文件包含远程文件包含 基础概念 文件包含,相当…...

升级 SpringBoot3 全项目讲解 — Spring Boot 3 中如何发Http请求?
随着 Spring Boot 3 的发布,许多开发者开始考虑将他们的项目升级到这个新版本。Spring Boot 3 带来了许多新特性和改进,尤其是在 HTTP 请求处理方面。本文将详细介绍如何在 Spring Boot 3 中发送 HTTP 请求,并通过代码示例帮助你快速上手。 …...

分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现
分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现 目录 分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现MFO-LSSVM飞蛾扑火算法优化最小二…...

MyBatis Plus核心功能
一、条件构造器 1.为什么要学? 用于方便地构建SQL查询条件 2.如何使用? 3.实战案例 例:查询出名字中带o的,存款大于等于1000元的人的id,username,info,balance字段 数据库如图: 示例: Test void testL…...
nginx ngx_http_module(10) 指令详解
nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module:HTTP/2支持模块,允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化,如多路复用、头部压缩和服务器推…...

【ENSP】链路聚合的两种模式
【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大,人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中,为…...

Windows环境安装部署minimind步骤
Windows环境安装部署minimind步骤 必要的软件环境 git git,可下载安装版,本机中下载绿色版,解压到本地目录下(如:c:\soft\git.win64),可将此路径添加到PATH环境变量中,供其他程序…...
让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt 使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo1、GPT-4o 以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图…...
代码随想录-- 第一天图论 --- 岛屿的数量
99 统计岛屿的数量 c 99. 岛屿数量 #include <iostream> #include <vector> #include <queue>using namespace std;struct MGraph {int numVertices, numEdges;vector<vector<int>> Edge; };int dir[4][2] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}…...

Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...