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

news2024/11/24 13:08:16
  • 💂 个人信息:酷在前行
  • 👍 版权: 博文由【酷在前行】原创、需要转载请联系博主
  • 👀 如果博文对您有帮助,欢迎点赞、关注、收藏 + 订阅专栏
  • 🔖 本文收录于【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 <- TRUE
    n <- 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] <- 1
    r_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]<-NA
    p_re<-cbind(p_re,Pz)
    cor_data<-cbind(r_re,Pz)
  }
  
  else {
    r <- cor(x, y, method = method)
    sym = FALSE
    n <- 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] <- 1
    r_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]<-NA
    p_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 Var2
  scale_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.coloradmin.cn/o/373936.html

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

相关文章

libxlsxwriter簇状柱形图绘制

libxlsxwriter的功能覆盖面很大&#xff0c;今天一起来看一下如何用这个库来生成带有簇状柱形图的表格。 1 簇形柱状图 首先来看一下Excel的样例表格&#xff0c;簇状柱形图往往是用来对比若干“系列”的数据在某一时间段内&#xff0c;或某一情境下的差异情况。在商务领域还…

小白量化《穿云箭集群量化》(4)指标公式写策略

小白量化《穿云箭集群量化》&#xff08;4&#xff09;指标公式写策略 穿云箭量化平台支持中文Python写量化策略&#xff0c;同时也直接支持股票公式指标写策略。下面我们看看是如何实现的。 股票软件的指标公式语法是一样的&#xff0c;不同仅仅是个别函数或绘图函数或绘图命令…

java多态理解和底层实现原理剖析

java多态理解和底层实现原理剖析多态怎么理解java中方法调用指令invokespecial和invokevirtual指令的区别invokeinterface指令方法表接口方法调用为什么不能利用方法表快速定位小结多态怎么理解 抽象事务的多种具体表现&#xff0c;称为事务的多态性。我们在编码过程中通常都是…

计算机网络 第4章 作业1

一、选择题 1. 由网络层负责差错控制与流量控制,使分组按序被递交的传输方式是_________&#xff08;C&#xff09; A&#xff0e;电路交换 B&#xff0e;报文交换 C&#xff0e;基于虚电路的分组交换 D&#xff0e;基于数据报的分组交换 2. TCP/IP 参考…

Bunifu.UI.WinForms 6.0.2 Crack

Bunifu.UI.WinForms为 WinForms创建令人惊叹的UI Bunifu.UI.WinForms我们为您提供了现代化的快速用户界面控件。用于 WinForms C# 和 VB.NET 应用程序开发的完美 UI 工具 简单 Bunifu.UI.WinForms没有臃肿的特征。正是您构建令人惊叹的 WinForms 应用程序所需要的。只需拖放然…

计算机网络高频知识点

目录 一、http状态码 二、强缓存与协商缓存 三、简单请求与复杂请求 四、PUT 请求类型 五、GET请求类型 六、GET 和 POST 的区别 七、跨域 1、什么时候会跨域 2、解决方式 八、计算机网络的七层协议与五层协议分别指的是什么 1、七层协议 2、五层协议 九、计算机网…

监控生产环境中的机器学习模型

简介 一旦您将机器学习模型部署到生产环境中&#xff0c;很快就会发现工作还没有结束。 在许多方面&#xff0c;旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期&#xff1f;下周/月/年&#xff0c;当客户&#xff08;或欺诈者&#xff09;行为发生变化并且您的训练…

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】

我是用的xshell连接的云服务器&#xff0c;今天想在服务器上面部署一个前后端分离【springbootvue】项目&#xff0c;打开我的云服务器才发现&#xff0c;过期了&#xff0c;然后又买了一个&#xff0c;里面环境啥都没有&#xff0c;正好出一期教程&#xff0c;方便大家也方便自…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——ReduceTask工作机制

1、ReduceTask工作机制 ReduceTask工作机制&#xff0c;如下图所示。 &#xff08;1&#xff09;Copy阶段&#xff1a;ReduceTask从各个MapTask上远程拷贝一片数据&#xff0c;并针对某一片数据&#xff0c;如果其大小超过一定阈值&#xff0c;则写到磁盘上&#xff0c;否则直…

DHTMLX Suite 8.0.0 Crack

适用于现代 Web 应用程序的强大 JavaScript 小部件库 - DHTMLX 套件 用于创建现代用户界面的轻量级、快速且通用的 JavaScript/HTML5 UI 小部件库。 DHTMLX Suite 有助于推进 Web 开发和构建具有丰富功能的数据密集型应用程序。 DHTMLX Suite 是一个 UI 小部件库&#xff0c;用…

指针数组和数组指针的区别

数组指针&#xff08;也称行指针&#xff09;定义 int (*p)[n];()优先级高&#xff0c;首先说明p是一个指针&#xff0c;指向一个整型的一维数组&#xff0c;这个一维数组的长度是n&#xff0c;也可以说是p的步长。也就是说执行p1时&#xff0c;p要跨过n个整型数据的长度。如要…

【前端】JavaScript构造函数

文章目录概念执行过程返回值原型与constructor继承方式原型链其他继承方式&#xff08;还没写&#xff09;参考概念 在JS中&#xff0c;通过new来实例化对象的函数叫构造函数。实例化对象&#xff0c;也就是初始化一个实例对象。构造函数一般首字母大写。 构造函数的目的&…

Android性能调优 - 启动优化

一、APP启动优化1、 你对 APP 的启动有过研究吗? 有做过相关的启动优化吗?程序员&#xff1a;之前做项目的时候&#xff0c;我发现程序在冷启动时&#xff0c;会有 1s 左右的白屏闪现&#xff0c;低版本是黑屏的现象&#xff0c;在这期间我通过翻阅系统主题源码&#xff0c;发…

26 openEuler管理网络-使用ip命令配置网络

文章目录26 openEuler管理网络-使用ip命令配置网络26.1 配置IP地址26.1.1 配置静态地址26.1.2 配置多个地址26.2 配置静态路由26 openEuler管理网络-使用ip命令配置网络 说明&#xff1a; 使用ip命令配置的网络配置可以立即生效但系统重启后配置会丢失。 26.1 配置IP地址 使用…

JVM - G1垃圾收集器深入剖析

​​​​​​​1、G1收集器概述 HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力&#xff0c;也贡献了从串行Serial收集器、到并行收集器Parallerl收集器&#xff0c;再到CMS并发收集器&#xff0c;乃至如今的G1在内的一系列优秀的垃圾收集器。 G…

ER图、ERD图

ER图、ERD图1. 什么是ERD1.1 举例2. ERD符号指南2.1 实体2.2 属性2.3 主键2.4 外键2.4 关系2.5 基数2.5.1 一对一的基数的例子2.5.2 一对多的基数的例子2.5.3 多对多的基数的例子3.概念、逻辑和物理数据模型3.1 概念数据模型3.2 逻辑数据模型3.3 物理数据模型4.如何绘制ER图?5…

python的装饰器与设计模式中的装饰器模式

相信很多人在初次接触python中的装饰器时&#xff0c;会跟我一样有个疑问&#xff0c;这跟设计模式中的装饰器模式有什么区别吗&#xff1f;本质上是一样的&#xff0c;都是对现有对象&#xff0c;包括函数或者类的一种扩展。这篇文档将进行对比分析。 python的装饰器 装饰器…

Acwing 蓝桥杯 第一章 递归与递推

我上周在干什么&#xff0c;感觉我上周啥也没训&#xff0c;本来两天一次的vp也没v很寄啊&#xff0c;再这样下去真不行了先总结一下如何爆搜&#xff1a;先去确定好枚举的对象枚举的对象很重要&#xff01;&#xff01;这直接影响了复杂度然后就是去想递归树就好了一、确定状态…

基于VSG的预同步并离网控制MATLAB仿真模型

MATLAB2019b主要模块&#xff1a;并网逆变器VSG控制预同步控制电流电流双环控制锁相环、三相准PR控制、PWM0.65秒开始并网运行&#xff01;&#xff01;&#xff01;仿真模型&#xff1a;逆变器输出电压、电流波形。电压为单相&#xff08;可观察相位情况&#xff09;&#xff…

【逐步剖C】-第八章-指针进阶-下

前言&#xff1a;在文章【逐步剖C】-第八章-指针进阶-上与指针初阶中我们介绍了有关指针较为全面的知识&#xff0c;本篇文章主要从指针和数组相关试题出发&#xff0c;进一步巩固对指针的学习。接下来&#xff0c;让我们开始吧。 一、“真假”数组名 前言&#xff1a;这一部…