【R统计】R语言相关性分析及其可视化

news/2024/4/24 19:20:43/文章来源:https://blog.csdn.net/qq_42830713/article/details/129172319
  • 💂 个人信息:酷在前行
  • 👍 版权: 博文由【酷在前行】原创、需要转载请联系博主
  • 👀 如果博文对您有帮助,欢迎点赞、关注、收藏 + 订阅专栏
  • 🔖 本文收录于【R统计】,该专栏主要介绍R语言实现统计分析的过程,如数据的描述性统计、t检验、方差分析、相关性、线性回归等等。请大家多多关注点赞和支持,共同进步~ 欢迎大家订阅!

📋 文章目录

  • 🐣 一、相关性的简介
    •   🍎 1、单个矩阵中等长度两变量的相关性
      •    🐕‍🦺 1)、Example 1 -- 满足正态分布的连续变量
      •    🐕 2)、Example 2 -- 不满足正态分布的有序变量
    •   🍌 2、单矩阵中非等长度两变量的相关性
      •    🐕‍🦺 1)、Example 1 -- 单矩阵非等长度的相关性分析
      •    🐕 2)、Example 2 -- 单矩阵等长度的相关性分析 (`corr.test 函数`)
    •   🥝 3、自定义函数计算两个矩阵等长度的相关性

   相关性分析 通常用来定量描述两个变量之间的联系,正相关?负相关?不存在相关?等。常见相关性指标: Pearson相关系数(参数检验), SpearmanKendall(非参数检验)。本篇与分享R语言相关分析时的小技巧:1) 一个矩阵中等长度两两变量的相关性,常用到 cor() 函数和 cor.test() 函数;2) 一个矩阵中非等长度两个变量的相关性,常用 corr.test()函数;3) 两个矩阵中变量对应的相关性,这里编了一个函数与大家分享。 ( 偏相关分析的讲解)

🐣 一、相关性的简介

   1) Pearson相关系数 (积差相关系数)通常用来表示相关性大小中最常用的指标。cor系数介于-1~1之间,越接近0相关性越弱,越接近-1 or 1则相关性越强,并存在对应的负正相关。

  • 条件 :两个符合正态分布的连续变量。

   1) Spearman等级相关系数 (秩相关系数)利用两个变量的秩次大小进行比较,属于非参数检验。

  • 条件 :适用于不满足Pearson相关系数正态分布要求的连续变量;还可用于有序分类变量之间的相关性比较。

   1) Kendall等级相关系数 (和谐系数)也属于一种非参数检验。

  • 条件 :适用于两个有序分类变量之间的相关性分析。

  🍎 1、单个矩阵中等长度两变量的相关性

等长度是两个变量的样本量相等。主要利用 cor() 函数 和 cor.test() 函数对不同方法的讲解。以一组满足正态分布的连续变量和不满足正态分布的有序变量进行对比。例子讲解前,我们先用?cor()/ help(cor)了解一下函数的用法和命令。
在这里插入图片描述

# 函数的基本命令:
cor(x, use= , method= )

在这里插入图片描述
对应参数的描述

  • x为一个数值向量,矩阵或者数据框都可以;
  • y这里默认为NULL;
  • na.rm 表示缺失值的逻辑,计算比较时是否保留缺失值(T表示去除缺失值,但是这里只能用于var函数中);
  • use 指定缺失数据的处理方式。可选项:all.obs(假设不存在缺失数据)、everything(数据存在缺失值时,相关系数计算结果会显示missing)、complete.obs(行删除)、pairwise.complete.obs(成对删除);
  • method 指定相关系数的类型。可选类型为pearson、spearman、kendall。

清楚了函数对应命令的参数后,进行例子的理解

   🐕‍🦺 1)、Example 1 – 满足正态分布的连续变量

利用str()检查数据结构的结果,num表示数值型的连续变量。

#1 构建一组符合正态分布的数据
set.seed(1)
a <- rnorm(n = 50, mean = 1, sd = 5)
b <- rnorm(50, 2, 3)
c <- rnorm(50, 3, 2)
d <- rnorm(50, 0, 1)
# 将上述构建的数据组合成数据框, 并检查数据结构(num数值型)
e <- data.frame(a, b, c, d);str(e)
# pearson
corr1 <- cor(e, method = "pearson");corr1
# spearman
corr2 <- cor(e, method = "spearman");corr2
# kendall
corr3 <- cor(e, method = "kendall");corr2

输出结果:当使用参数与非参数的方法对符合正态分布的连续变量进行相关性比较时,结果是存在差异的。Pearson为一个结果,而Spearman和kendall为两一个结果。
在这里插入图片描述

   🐕 2)、Example 2 – 不满足正态分布的有序变量

利用as.integer()将向量转换成整数型的,使其变成有序变量,数据结构为int,表示整数型。

#2 构建一组不满足正态分布的数据
set.seed(2)
a1 <- as.integer(runif(n = 50, min = 1, max = 10))
b1 <- as.integer(runif(n = 50, min = 0, max = 3))
c1 <- as.integer(runif(n = 50, min = 1, max = 6))
d1 <- data.frame(a1, b1, c1); str(d1)
# pearson
corr.1 <- cor(d1, method = "pearson");corr.1
# spearman
corr.2 <- cor(d1, method = "spearman");corr.2
# kendall
corr.3 <- cor(d1, method = "kendall");corr.2

输出结果:从结果也能发现不同方法进行的相关性分析确实存在差异,但是具体哪种更好,可能需要大家多做尝试。
在这里插入图片描述
接下来,利用cor.test()函数对上面例子做详细展示,可以看得到对应的p值大小,有利于大家解读和后续可视化。还是先咨询下该函数的用法和对应参数。
在这里插入图片描述

# 函数的基本命令:
cor.test(x, y, alternative= , method= ,...)

在这里插入图片描述
这里不做详细介绍,有问题的话可以评论留言~但这里需要注意的是:不能直接用数据框进行分析,而是需要用两两向量,因此用$提取对应向量进行相关性分析。

# cor.test
aa <- cor.test(e$a,e$b);aa
bb <- cor.test(d1$a1,d1$b1);bb

在这里插入图片描述

  🍌 2、单矩阵中非等长度两变量的相关性

   当数据矩阵中存在大量缺失值时,可以利用corr.test()函数轻松化解难题。该函数可以直接对矩阵中的每两两变量进行相关性分析,同时能输出对应cor系数和p值。另外,还可以对等长度的单矩阵进行相关性分析,因此相比上面cor()cor.test()函数,更加推荐corr.test()函数。但是大家一定要记住,该函数基于 psych R包,每次记得先library(psych)。废话不多说,进入例子学习:

   🐕‍🦺 1)、Example 1 – 单矩阵非等长度的相关性分析

# 单矩阵非等长度的相关性分析
?corr.test()
# corr.test
library(psych)
set.seed(3)
df1 <- rnorm(50, 1, 2)
df2 <- rnorm(100, 2, 3)
df3 <- runif(200, 10, 20)
df_all <- data.frame(df1, df2, df3);tail(df_all,20)
df <- df_all
# 需要将对应向量中非本身存在的数值替换成空值
df[51:200, 1] <- NA
df[101:200, 2] <- NA
tail(df,100)
str(df)
corr.test(df, method = "pearson")

先构建了一个没有缺失的数据集,这里需要强调的是,当多个向量之间的长度不同时,如果将其用data.frame构建成数据框,系统会默认将短向量按当前向量数值的顺序补齐与其他向量长度保持一致。因此,如果我们要构建一个具有不等长的数据矩阵,需要对某列向量进行数值的缺失值替换,从而形成一个具有缺失值的数据框。
在这里插入图片描述
在这里插入图片描述
从结果来看,1)没有报错;2)也符合我们的预期,数据矩阵中每两列之间都进行了相关性的比较;3)能看到样本量的大小,对应的cor系数和p值大小。因此,该函数得到的结果可读性比较高。

   🐕 2)、Example 2 – 单矩阵等长度的相关性分析 (corr.test 函数

这里就不写太多代码了,df_all这个数据集在上个例子中就已经展示了尾部5行,可以看到数据都是齐的,证明是等长度的数据矩阵。

# 等长度的数据矩阵相关性分析
str(df_all)
corr.test(df_all, method = "pearson")

输出结果:首先看到样本数量大小为200,这是等长的。其次,能够详细的看到对应输出的结果,提高了整体的可读性。
在这里插入图片描述
进一步,对得到的结果进行绘图

这里介绍两种专门绘制相关性矩阵分析的R包,1)GGally;2)corrplot。

# 绘图
#1 GGally 包
?ggcorr
library(GGally)
ggcorr(df,label=TRUE)#2 corrplot包
?corrplot
library(corrplot)
res1 <- cor.mtest(df, conf.level=0.95,use="complete.obs")
N <- cor(df,use="complete.obs" ,method = "pearson") # use 是可以省略缺失值的相关性分析
corrplot(N,p.mat=res1$p, # res1$p 中$表示提取符号 意为提取该数据的p列数据,p为显著性insig ="label_sig", # 如果“label_sig”,标记与pch显著相关 用星号表示sig.level=c(0.001, 0.01, 0.05), # 0.001 表示3个星号 以此类推pch.col = "white",pch.cex = 1) # 数字,颜色标签中的数字标签的cex

关于结果具体完善代码就不细说了,有需要可以自行help然后查看描述及其例子。如果遇到问题,可以给推文评论或者私聊联系~
在这里插入图片描述
在这里插入图片描述

  🥝 3、自定义函数计算两个矩阵等长度的相关性

通常从公司或者做实验得到的同类型但不同的数据矩阵很多,也就是有多个数据集。如何直接对两个数据矩阵之间做相关分析呢?目前好像没有函数可以直接做到,这里分享一个自定义函数,能够计算两个矩阵等长度的相关性。

# 自定义函数--计算两个矩阵之间的相关性
cor_function<-function(x,y,method){library(reshape2)if (is.null(y)) {r <- cor(x, method = method)sym <- TRUEn <- t(!is.na(x)) %*% (!is.na(x))t <- (r * sqrt(n - 2))/sqrt(1 - r^2)p <- -2 * expm1(pt(abs(t), (n - 2), log.p = TRUE))se <- sqrt((1 - r * r)/(n - 2))nvar <- ncol(r)p[p > 1] <- 1r_re<-reshape2::melt(r)r_re$value<-round(r_re$value,2)p_re<-reshape2::melt(p)Pz<-rep(1,nrow(p_re))Pz[p_re$value<=0.001]<-'***'Pz[p_re$value<=0.01&p_re$value>0.001]<-'**'Pz[p_re$value<0.05&p_re$value>0.01]<-'*'Pz[p_re$value>=0.05]<-NAp_re<-cbind(p_re,Pz)cor_data<-cbind(r_re,Pz)}else {r <- cor(x, y, method = method)sym = FALSEn <- t(!is.na(x)) %*% (!is.na(y))t <- (r * sqrt(n - 2))/sqrt(1 - r^2)p <- -2 * expm1(pt(abs(t), (n - 2), log.p = TRUE))se <- sqrt((1 - r * r)/(n - 2))nvar <- ncol(r)p[p > 1] <- 1r_re<-reshape2::melt(r)r_re$value<-round(r_re$value,2)p_re<-reshape2::melt(p)Pz<-rep(1,nrow(p_re))Pz[p_re$value<=0.001]<-'***'Pz[p_re$value<0.01&p_re$value>0.001]<-'**'Pz[p_re$value<0.05&p_re$value>=0.01]<-'*'Pz[p_re$value>=0.05]<-NAp_re<-cbind(p_re,Pz)cor_data<-cbind(r_re,Pz)}result <- list(cor_data=cor_data,r = r_re, n = n, t = t, p = p_re, se = se)class(result) <- c("psych", "corr.test")return(result)
}# 构建两个矩阵
dat1 <- mtcars[,3:7]
dat2 <- iris[1:32,1:4]str(dat1)
str(dat2)
# 画图 ----------------------------------------------------------------------
library(viridis)
library(ggplot2)
dat_cor <-cor_function(dat1,dat2,method='pearson')
ggplot(data=dat_cor$cor_data)+ # $cor_data 提取相关性r值geom_tile(aes(x=Var1,y=Var2,fill=value))+ # x y 分别为dat_cor 中的Var1 Var2scale_fill_viridis(option="viridis",limits=c(-1,1))+theme(axis.text.x=element_text(hjust = 1,size=14),axis.title.x=element_blank(),axis.text.y=element_text(size=14),axis.title.y=element_blank())+geom_text(data=dat_cor$cor_data,aes(x=Var1,y=Var2,label=value,hjust=0.5))

关于函数定义的部分就不展开讲解了,大家可以先copy进行使用。然后熟练掌握函数定义后就能理解了~

在这里插入图片描述

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

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

相关文章

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

1.前言在现实业务中&#xff0c;经常遇到这样的需求&#xff1a;一端采用web形式开发的&#xff0c;如&#xff1a;客户端采用html、javascript、nodejs开发&#xff1b;而另一端采用C开发&#xff0c;如&#xff1a;Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据…

房屋出租管理系统

1. 铺垫 1.1 项目真实开发的过程 上来要做什么&#xff1f;&#xff1f;&#xff1f;&#xff1f; 有电脑—》配环境&#xff08;JDK、IDEA、MAVEN……&#xff09; 这个项目&#xff1a;房屋管理系统 从什么角度出发&#xff0c;第一步做什么&#xff1f;&#xff1f; 架构 …

IoT项目系统架构案例2

项目背景 1.这个项目是对之前的案例的升级改造参考&#xff1a;IoT项目系统架构案例_iot案例_wxgnolux的博客-CSDN博客2.基于方案1的项目实施过程中碰到的问题,对硬件设备标准化的理念及新的功能需求(如根据天气预报温度调水温,APP界面可操作性优化等)•采用目前IoT主流厂商的架…

vue中render函数的作用和参数(vue2中render函数用法)

render 函数是 Vue2.x 新增的一个函数、主要用来提升节点的性能&#xff0c;它是基于 JavaScript 计算。使用 Render 函数将 Template 里面的节点解析成虚拟的 Dom 。Vue 推荐在绝大多数情况下使用模板来创建 HTML。然而在一些场景中&#xff0c;需要 JavaScript 的完全编程能力…

gitlab部署使用,jenkins部署使用

gitlab部署使用&#xff0c;jenkins部署使用gitlab下载gitlab安装gitlab使用gitlab设置中文修改管理员密码创建组,创建项目,创建用户jenkins下载jenkins安装jenkin使用jenkins更改管理员密码配置拉取代码配置登录gitlab拉取代码的账号密码配置项目配置gitlab仓库配置构建构建构…

CTFer成长之路之Python中的安全问题

Python中的安全问题CTF 1.Python里的SSRF 题目提示 尝试访问到容器内部的 8000 端口和 url path /api/internal/secret 即可获取 flag 访问url&#xff1a; http://f5704bb3-5869-4ecb-9bdc-58b022589224.node3.buuoj.cn/ 回显如下&#xff1a; 通过提示构造payload&…

Android 基础知识4-3.2 EditText(输入框)详解

一、EditText&#xff08;输入框&#xff09;介绍 EditText在开发中也是经常使用的控件&#xff0c;比如&#xff0c;要实现一个登录页面&#xff0c;需要用户输入账号、密码等信息&#xff0c;然后我们或得用户输入的内容&#xff0c;把它交给服务器来判断。因此&#xff0c;这…

远程使用服务器上的Jupyter notebook

记录下如何远程使用服务器上的jupyter notebook。 主要是在服务器端执行以下操作&#xff1a; 激活需要使用的环境使用pip list 或conda list检查是否已经安装notebook。如果没有安装&#xff0c;则使用pip install jupyter notebook进行安装&#xff1b;反之忽略这一步&…

一些硬件学习的注意事项与快捷方法

xilinx系列软件 系统适用版本 要安装在Ubuntu系统的话&#xff0c;要注意提前看好软件适用的版本&#xff0c;不要随便安好了Ubuntu系统又发现对应版本的xilinx软件不支持。 如下图&#xff0c;发行说明中会说明这个版本的软件所适配的系统版本。 下载 vivado vitis这些都可以…

从编年史角度看大数据兴起

开源大数据编年史大数据发展的各阶段大数据诞生初期大数据百花齐放的发展之路追求性能的大数据成熟期大数据发展的各阶段 开源大数据的编年史的话&#xff0c;实际上分为三个阶段。一般来说它分为初期、发展期、成熟期。 初期就是大数据刚开始萌芽的一个阶段&#xff0c;它从…

selenium模块(自动化)

文章目录一、环境配置二、使用selenium解析源码三、基本函数四、子页面&#xff08;ifFrame&#xff09;&#xff08;动作链&#xff0c;拖拽&#xff09;五、实现无可视化界面&#xff0c;规避被检测的风险&#xff08;反反爬&#xff09;六、等待七、异常处理Selenium是自动化…

kafka使用入门案例与踩坑记录

每次用到kafka时都会出现各种奇怪的问题&#xff0c;综合实践&#xff0c;下面汇总下主要操作步骤&#xff1a; Docker镜像形式启动 zookeeper启动 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeperkafka启动 docker run --name kafka01 -p 9092:909…

YOLOV5s+Shufflenetv2+VOC数据集+迁移学习

前言&#xff1a;更改YOLOV5的backbone网络为 Shufflenetv2&#xff0c;便于达到轻量化的目的 1. 试运行YOLOv5 b站推土机 2. VOC数据集处理 3. 更改轻量级网络 参考魔改yolov5 3.1 在common.py末尾加入以下代码 #添加轻量化模块Shufflenetv2 # ------------------------…

安装配置DHCP

本次实验采用CentOS71.检查在安装DHCP之前先使用rpm命令查看系统中已有的DHCP软件包rpm -qa | grep dhcp由此可知&#xff0c;系统中尚未安装DHCP软件包2.安装我们可以使用yum命令为系统安装DHCP软件包yum -y install dhcp安装完成后再次检查可以看到DHCP软件包3.配置dhcp配置文…

办公室人员离岗识别检测系统 yolov7

办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术&#xff0c;办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;30…

刷题28-有效的变位词

32-有效的变位词 解题思路&#xff1a; 注意变位词的条件&#xff0c;当两个字符串完全相等或者长度不等时&#xff0c;就不是变位词。 把字符串中的字符映射成整型数组&#xff0c;统计每个字符出现的次数 注意数组怎么初始化&#xff1a; int [] s1new int[26]代码如下&a…

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务&#xff0c;我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性&#xff0c;它能够创建多个 builder 实例&#xff0c;在多个节点并行地执行构建任…

社畜大学生的Python之pandas学习笔记,保姆入门级教学

接上期&#xff0c;上篇介绍了 NumPy&#xff0c;本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的&#xff0c;让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…

NLP中的对话机器人——预训练基准模型

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答&#xff0c;从中找到最佳回答的任务。 在场景二中&#xff0c;我们来实现&#xff1a; 给定新问题&#xff0c;从…

基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全

1、什么是算法算法(algorithm&#xff0c;[ˈlɡərɪəm]&#xff0c;计算程序)&#xff1a;就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结…