【R语言】回归分析与判别分析

一、线性回归分析

1、lm()函数

lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系。它可以处理简单的线性回归、多元线性回归以及带有分类预测变量的回归(通过创建虚拟变量或指示变量)。

基本格式:

lm(formula, data, subset, weights, ...)

  1. formula:描述因变量与自变量间关系的符号表达式。
  2. data:包含公式中所有变量的数据框(data frame)或列表(list)。若未明确指定,R 将在全局环境中搜索变量。
  3. subset(子集):逻辑向量或表达式,用于从数据中筛选用于模型拟合的观测值。默认为NULL,即使用全部数据。
  4. weights(权重):可选参数,用于为各观测值分配权重。默认为 NULL,即所有观测值权重相等。
  5. ...(其他参数):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%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件

步骤1 开始通过 WSL 使用 VS Code | Microsoft Learn 点击远程开发扩展包。 步骤2 Remote Development - Visual Studio Marketplace 点击install&#xff0c; 允许打开Visual Studio Code。 步骤3 共有4项&#xff0c;一齐安装。 步骤4 在WSL Linux(Ubuntu)中&#xf…

Unreal5从入门到精通之如何在 C++ 中创建 UserWidget

文章目录 前言UUserWidget 子类示例创建我们的 C++ 类的新蓝图子类更改现有蓝图的父类现在我们有了 C++ 基类,下一步做什么?蓝图还是 C++?结论前言 在之前的教程中,我展示了如何在编辑器中创建 UserWidget 蓝图, 在本教程中,我们将创建一个新的基于 C++ 的子类UUserWid…

利用雪花算法+Redis 自增 ID,生成订单号

在我们的项目中&#xff0c;我们需要定义一些全局唯一的 ID&#xff0c;比如订单号&#xff0c;支付单号等等。 这些ID有以下几个基本要求&#xff1a; 1、不能重复 2、不可被预测 3、能适应分库分表 为了生成一个这样一个全局的订单号&#xff0c;自定义了一个分布式 ID …

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码&#xff0c;执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…

Postman接口测试的cookie,token,session....鉴权

在接口测试过程中&#xff0c;常常需要进行Cookie、Token或Session等鉴权操作。Postman是一种流行的API开发环境&#xff0c;可以使用其自带的功能来进行这些鉴权操作。 下面是关于Postman接口测试中Cookie、Token和Session鉴权的详细介绍。 Cookie鉴权 在Postman中使用Cook…

深度学习机器学习:常用激活函数(activation function)详解

目录 Sigmoid Function ReLU&#xff08;Rectified Linear Unit&#xff09; LeakyReLU&#xff08;Leaky Rectified Linear Unit&#xff09; ClippedReLU&#xff08;Clipped Rectified Linear Unit&#xff09; PRelu&#xff08;Parametric ReLU&#xff09; Tanh&am…

使用llama.cpp在gpu和cpu上运行deepseek-r1 7b的性能对比

使用deepseek-r1 7b模型的q5km量化版本进行测试, gpu上的token解码速度是cpu的近8倍. 测试环境: ubuntu22.04 x86llama.cpp cpu intel 10750h 4.41 tokens / s model size params backend threads test t/s qwen2 7B Q5_K - Medium 5.07 GiB 7.62 B CPU 6 pp512 …

MVC模式和MVVM模式

目录 一、MVC模式和MVVM模式 1. MVC模式 2. MVVM 模式 3.在Qt中的应用示例 4.总结 二、MVC与MVVM模式的共同点和区别 1.共同点 2.区别 3.交互流程 4.总结 MVC&#xff08;Model-View-Controller&#xff09;和MVVM&#xff08;Model-View-ViewModel&#xff09;是两种…

Numpy简易入门

1.1 认识Numpy数组对象 1.1.1 导入NumPy工具包 #导包并起别名为np import numpy as np1.1.2 创建一个三行五列的数组 data np.arange(15).reshap(3, 5)打印结果&#xff1a; 1.1.3 查询data类型 print(type(data))打印结果&#xff1a; <class numpy.ndarray> nda…

Java中的Spliterator与并行计算

在Java编程中&#xff0c;Spliterator是一个强大的接口&#xff0c;它为集合和数组等数据结构提供了并行处理的能力。Spliterator的设计目标是支持高效并行遍历&#xff0c;同时兼容传统的迭代器模式。本文将详细介绍Spliterator的使用方法&#xff0c;并通过实例展示其在并行计…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description&#xff1a;任务描述 勾选 Discard old builds Discard old builds&#xff1a;控制何时…

Linux CentOS 7部署Vulhub靶场

漏洞复现环境&#xff1a; 1、Linux操作系统中通过Docker部署的Vulhub靶场&#xff1a; docker docker-compose 2、Nmap扫描工具 一、部署靶场 1、安装Docker 1、下载docker yum install docker 安装完成&#xff0c;如下图&#xff1a; 2、开启docker服务 [rootlocalhost…

DeepSeek笔记(二):DeepSeek局域网访问

如果有多台电脑&#xff0c;可以通过远程访问&#xff0c;实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中&#xff0c;首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11&#xff0c;…

软件测试技术之跨平台的移动端UI自动化测试(上)

摘要&#xff1a;本文提出一种跨平台的UI自动化测试方案&#xff0c;一方面使用像素级的截图对比技术&#xff0c;解决传统UI自动化测试难以验证页面样式的问题&#xff1b;另一方面用统一部署在服务器端的JavaScript测试代码代替Android和iOS测试代码&#xff0c;大大提高编写…

MySQL深度剖析-InnoDB索引与B+树

1. 什么是B树&#xff1f; B 树是一种自平衡的多叉树&#xff0c;它是 B 树的一种变体。与 B 树不同&#xff0c;B 树的所有数据都存储在叶子节点&#xff0c;非叶子节点仅存储索引&#xff0c;且叶子节点之间通过双向链表相连。这种结构使得 B 树在范围查询和排序操作上具…

win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录

DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法&#xff0c;以及后续使用夜神模拟器&#xff0c;关闭了Hyper-V时&am…

如何使用UniApp实现页面跳转和数据传递?

在 UniApp 中&#xff0c;页面跳转和数据传递是基本的功能&#xff0c;允许用户在应用中浏览不同的页面并传递必要的信息。以下是如何实现页面跳转和数据传递的详细步骤和示例。 一、页面跳转 UniApp 提供了几种方式来进行页面跳转&#xff0c;主要包括&#xff1a; uni.nav…

VSCode配合cline实现自动编程

VS Code是微软开发的代码编辑器&#xff0c;可以配合安装不同的插件&#xff0c;支持对不同语言、项目类型的开发。 &#xff08;1&#xff09;安装cline插件&#xff1a;在vscode扩展商店搜索cline&#xff0c;并安装&#xff1b; &#xff08;2&#xff09;选择不同的大模型…

Docker 镜像标签使用

写在前面 当使用命令 docker pull mysql 拉取镜像时&#xff0c;其实等价于如下命令 docker pull mysql:latest latest 是默认的标签&#xff0c;字面上理解为最新版本的镜像&#xff0c;实质上 latest 只是镜像的标签名称&#xff0c;跟具体某个版本号地位一样&#xff0c;…

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…