R语言偏相关和典型相关

news2024/11/24 18:33:07

本文首发于公众号:医学和生信笔记,完美观看体验请至公众号查看本文。


文章目录

    • 偏相关(partial correlation)
      • 偏相关散点图
    • 典型相关(Canonical Correlation)

使用R语言实现偏相关分析和典型相关分析,并画出偏相关的散点图。

关于偏相关和典型相关的具体含义和适用范围大家自己学习。

偏相关(partial correlation)

使用R包ppcor实现。

首先是加载数据和R包。

library(ppcor)
## Loading required package: MASS

df <- haven::read_sav("../000files/data01.sav")
df1 <- df[,2:4]
names(df1) <- c("height","weight","vc")
head(df1)
## # A tibble: 6 × 3
##   height weight    vc
##    <dbl>  <dbl> <dbl>
## 1   139.   30.4  2   
## 2   164.   46.2  2.75
## 3   156.   37.1  2.75
## 4   156.   35.5  2   
## 5   150.   31    1.5 
## 6   145    33    2.5

这个数据有3列,现在我们要探索身高(height)和体重(weight)的关系,其中vc是需要控制的因素。

首先进行pearson偏相关分析

p1 <- pcor(df1,method = "pearson")
p1
## $estimate
##            height    weight         vc
## height  1.0000000 0.7941292 -0.2022408
## weight  0.7941292 1.0000000  0.6166786
## vc     -0.2022408 0.6166786  1.0000000
## 
## $p.value
##              height       weight          vc
## height 0.0000000000 0.0000491115 0.406351395
## weight 0.0000491115 0.0000000000 0.004920346
## vc     0.4063513954 0.0049203462 0.000000000
## 
## $statistic
##            height   weight         vc
## height  0.0000000 5.387551 -0.8514549
## weight  5.3875507 0.000000  3.2299064
## vc     -0.8514549 3.229906  0.0000000
## 
## $n
## [1] 20
## 
## $gp
## [1] 1
## 
## $method
## [1] "pearson"

结果中$estimate给出了偏相关系数,可以看到在控制了vc后,heightweight的偏相关系数是0.4672715;$p.value给出了相应的P值,$statistic给出了检验统计量。

上面演示的是pearson偏相关分析,下面展示一个spearman偏相关分析

# 加载数据
df2 <- haven::read_sav("../000files/data02.sav")
names(df2) <- c("id","x","y","z")

head(df2)
## # A tibble: 6 × 4
##      id         x         y     z
##   <dbl> <dbl+lbl> <dbl+lbl> <dbl>
## 1     7    1 [矮]    1 [轻]  1.25
## 2    17    1 [矮]    1 [轻]  1.25
## 3     1    1 [矮]    1 [轻]  2   
## 4    11    1 [矮]    1 [轻]  2   
## 5     5    2 [中]    1 [轻]  1.5 
## 6    15    2 [中]    1 [轻]  1.5

现在我们要计算xy的相关性,z是要控制的因素,由于这两个变量是分类变量,所以要用spearman偏相关分析

其实用法是一样的,就是改个参数而已:

pcor(df2[,-1],method = "spearman")
## $estimate
##            x         y          z
## x  1.0000000 0.6985577 -0.4212568
## y  0.6985577 1.0000000  0.8486095
## z -0.4212568 0.8486095  1.0000000
## 
## $p.value
##              x            y            z
## x 0.0000000000 8.779998e-04 7.245901e-02
## y 0.0008779998 0.000000e+00 4.386687e-06
## z 0.0724590110 4.386687e-06 0.000000e+00
## 
## $statistic
##           x        y         z
## x  0.000000 4.025172 -1.915103
## y  4.025172 0.000000  6.613943
## z -1.915103 6.613943  0.000000
## 
## $n
## [1] 20
## 
## $gp
## [1] 1
## 
## $method
## [1] "spearman"

结果解读同上。

偏相关散点图

还是用df1的数据作为演示,现在是研究weight对height的影响,vc是需要控制的变量。

所以我们可以分别计算残差,用残差的散点图代表偏相关的散点图。

# 首先计算height为因变量,vc是自变量的残差
residX <- resid(lm(height~vc,data = df1))

# 再计算weight为因变量,vc是自变量的残差
residY <- resid(lm(weight~vc, data = df1))

# 两个残差的相关系数就是weight和height的偏相关系数!
cor(residX, residY, method = "pearson")
## [1] 0.7941292

# 画图即可
plot(residX, residY)

unnamed-chunk-5-154665071

但是这个图的横纵坐标取值范围对实际来说是不能解释的,所以我们可以分别加上它们各自的平均值,然后再画散点图,方法借鉴了这篇文章:

residX1 <- residX + mean(df1$height)
residY1 <- residY + mean(df1$weight)

plot(residX1, residY1,xlab = "身高",ylab = "体重")

plot of chunk unnamed-chunk-6

这个就是偏相关散点图了!

典型相关(Canonical Correlation)

这个数据来自孙振球《医学统计学》第四版的例23-1,探讨小学生的生长发育指标(肺活量、身高、体重、胸围)和身体素质(短跑、跳高、跳远、实心球)的相互关系。

df <- read.csv("../000files/例23-1.csv",header = T)
psych::headtail(df)
##     肺活量  身高 体重 胸围 短跑 跳高 跳远 实心球
## 1     1210 120.1 23.8   61 10.2 66.3 2.01   2.73
## 2     1210 120.7 23.4 59.8 11.3 67.6 1.92   2.71
## 3     1040 121.2 22.9   59 10.1 66.5 1.92    2.6
## 4     1620 121.5 24.6 59.5  9.5 67.8 1.95   2.64
## ...    ...   ...  ...  ...  ...  ...  ...    ...
## 81    1310 129.7 24.7 61.7 10.1 69.4 2.03    2.8
## 82    2280 143.6 37.6   70  9.7 88.8 2.17   4.18
## 83    1580 136.6 32.3 67.2 10.3 87.1 2.66   4.04
## 84    2370 147.4 38.8   73 10.8 90.7 2.82   4.38

典型相关分析R语言自带了cancor()函数,无需借助第三方R包:

# 前4个变量和后4个变量做相关性,直接提供2个数据框也可以
cc1 <- cancor(df[,1:4],df[,5:8])

cc1
## $cor
## [1] 0.8858445 0.2791523 0.1940486 0.0379654
## 
## $xcoef
##                 [,1]          [,2]         [,3]          [,4]
## 肺活量 -5.267493e-05 -0.0001955795 -0.000407694  0.0002971469
## 身高   -7.754975e-03 -0.0086910713  0.021599065  0.0079782016
## 体重   -3.471120e-03 -0.0180620718 -0.015626841 -0.0522321990
## 胸围   -1.552353e-02  0.0464952778  0.004886088  0.0178728641
## 
## $ycoef
##               [,1]        [,2]        [,3]        [,4]
## 短跑    0.02340474 -0.08458262  0.07017709 -0.13566387
## 跳高   -0.01068107 -0.02440377  0.01443519  0.01626168
## 跳远   -0.02867642  0.92500098  0.23862503 -0.29882238
## 实心球 -0.06884355 -0.07825414 -0.29442851 -0.19118769
## 
## $xcenter
##     肺活量       身高       体重       胸围 
## 1490.47619  131.52024   26.44405   61.51190 
## 
## $ycenter
##      短跑      跳高      跳远    实心球 
## 10.271429 72.805952  2.109048  2.978929

$cor给出了两组数据之间的典型相关系数,$xcoef是第一组的典型相关系数,可以看到计算出了4个虚拟变量,$ycoef是第二组的典型相关系数。

下面进行典型相关的显著性检验,使用R包CCP实现。

library(CCP)

rho <- cc1$cor
n <- dim(df[,1:4])[1]
p <- length(df[,1:4])
q <- length(df[,5:8])

p.asym()函数实现典型相关的显著性检验。需要典型相关系数、观测个数、第一组的变量个数、第二组的变量个数。

# 4种典型相关的结果
p.asym(rho,n,p,q, tstat = "Wilks")
## Wilks' Lambda, using F-approximation (Rao's F):
##               stat     approx df1      df2   p.value
## 1 to 4:  0.1907537 10.4765088  16 232.8215 0.0000000
## 2 to 4:  0.8860745  1.0618303   9 187.5484 0.3930330
## 3 to 4:  0.9609581  0.7843615   4 156.0000 0.5369444
## 4 to 4:  0.9985586  0.1140327   1  79.0000 0.7364945
p.asym(rho,n,p,q, tstat = "Hotelling")
##  Hotelling-Lawley Trace, using F-approximation:
##                 stat     approx df1 df2   p.value
## 1 to 4:  3.770206950 17.5550261  16 298 0.0000000
## 2 to 4:  0.125083307  1.0632081   9 306 0.3898996
## 3 to 4:  0.040571670  0.7962190   4 314 0.5283457
## 4 to 4:  0.001443452  0.1161979   1 322 0.7334177
p.asym(rho,n,p,q, tstat = "Pillai")
##  Pillai-Bartlett Trace, using F-approximation:
##                 stat    approx df1 df2      p.value
## 1 to 4:  0.901742684 5.7482049  16 316 5.963363e-11
## 2 to 4:  0.117022206 1.0849404   9 324 3.733220e-01
## 3 to 4:  0.039096223 0.8192541   4 332 5.135803e-01
## 4 to 4:  0.001441371 0.1225607   1 340 7.264904e-01
p.asym(rho,n,p,q, tstat = "Roy")
##  Roy's Largest Root, using F-approximation:
##               stat   approx df1 df2 p.value
## 1 to 1:  0.7847205 71.99119   4  79       0
## 
##  F statistic for Roy's Greatest Root is an upper bound.

我们就看下Wilks结果,可以看到只有第一个典型相关系数是有意义的,后面3个都没有显著性。


本文首发于公众号:医学和生信笔记,完美观看体验请至公众号查看本文。


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

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

相关文章

一个对C#程序混淆加密,小巧但够用的小工具

对于我们程序员来说&#xff0c;平常开发的桌面应用程序&#xff0c;如果不进行一定程度的加密、混淆&#xff0c;是很容易通过反编译手段进行破解的&#xff0c;特别是一些商业用途的C#软件&#xff0c;更是容易被破解。 所以今天给大家推荐一个对C#程序加密混淆项目&#xf…

脱离CRUD苦海 !性能优化全栈小册来了!

性能优化 随着互联网的高速发展&#xff0c;互联网行业已经从IT时代慢慢步入到DT时代。对于Java程序员的要求越来越高&#xff0c;只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位&#xff0c;大量招聘岗位显示&#xff1a;如果是面试中高级的Java岗&#xff0c;基本上都…

flex1时内容溢出

目标效果&#xff1a;右边黄色部分填充减去红色部分的剩余部分 原理: flex: 1 代码&#xff1a; <div class"box"><div class"inner-left"></div><div class"inner-right"><span class"inner-right-content&…

RK3568平台开发系列讲解(NPU篇)让 NPU 跑起来

🚀返回专栏总目录 文章目录 一、在 Android 系统中使用 NPU1.1、下载编译所需工具1.2、修改编译工具路径1.3、更新 RKNN 模型1.4、编译 demo沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何让NPU跑起来。 一、在 Android 系统中使用 NPU 下载 rknpu2 …

Hadoop的eclipse搭建(客观莫划走,留下来看一眼(适用人群学生初学,其他人看看就行))

前言&#xff1a;Hadoop的eclipse搭建是建立在Hadoop的安装之后进行的&#xff0c;因为Linux上的Hadoop和Windows上的Hadoop版本要求一致&#xff0c;不一致可能会出现某些问题 准备工作&#xff1a;Java的安装包、eclipse的安装包、Hadoop的包&#xff08;Windows的Hadoop安装…

基于Socket编程下 实现Linux-Linux、Linux-Windows udp通信

文章目录一、通信实现二、Linux-Linux1. 服务器 Server2. 客户端 Client三、Linux-Windows1. 服务器 Linux_Server2. 客户端 Windows_Client程序源码一、通信实现 1. Linux-Linux 在虚拟机下开启俩个终端&#xff0c;分别运行服务器和客户端程序(服务器运行在前&#xff0c;客…

栈的简单实现及应用

栈的简单实现及其应用什么是栈&#xff1f;栈的分类栈的数据结构栈的基本操作栈的初始化栈的销毁入栈操作出栈和栈空的判断获取栈顶元素获取栈的元素个数头文件总结栈的应用什么是栈&#xff1f; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除…

【毕业设计】垃圾邮件(短信)分类算法研究与实现 - 机器学习

文章目录1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#…

Vue面试题-答案、例子

1、Vue的生命周期 每一个vue实例从创建到销毁的过程&#xff0c;就是这个vue实例的生命周期。在这个过程中&#xff0c;他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程。 将要创建 >调用beforeCreate函数 创建完毕 >调用creat…

振弦采集模块复位( 重启)及恢复出厂设置

振弦采集模块复位&#xff08; 重启&#xff09;及恢复出厂设置 以下几种情况&#xff08;或操作&#xff09;可使模块产生复位动作&#xff0c;重新启动。 &#xff08; 1&#xff09; 在模块正常工作期间&#xff0c;向寄存器 SYS_FUN 发送软复位指令 0x01&#xff1b; &…

74ls192无法正常使用。

分析与解决74ls192芯片无法在proteus中正常运行 博主最近要做电子技术课程设计&#xff0c;于是重新拾起了长久不用的proteus。在构建倒计时电路时&#xff0c;发现了一个问题&#xff1a; 74ls192芯片&#xff0c;在软件提供的时钟信号下能正常开启计时。但是在自己使用的55…

从理论到实践:MySQL性能优化和高可用架构,一次讲清

数据库系统作为IT业务系统的核心&#xff0c;其高可用性和容灾能力对整个业务系统的连续性和数据完整性起着至关重要的作用&#xff0c;是企业正常运营的基石 尤其是在性能优化与高可用架构两方面&#xff0c;很多从业多年的DBA限于生产环境的固定体系&#xff0c;往往盲人摸象…

Grafana-web使用说明

本文分别记录了&#xff1a; Grafana使用步骤P50 P99 min max m1_rate等指标分别是什么意思&#xff0c;Metrics为何不会对“吞吐量”指标记录P99 min 等聚合Metrics常用的几种记录方式&#xff08;我司用了两种&#xff09; 1.场景 Metrics收集日志交给Graphite&#xff08;…

第九节:类和对象【三】【static、代码块、对象的打印】

目录 &#x1f947;1.什么是封装 &#x1f4d8;1.1封装的实现 &#x1f392;2.static成员 &#x1f4d2;2.1 再谈学生类 ​编辑 &#x1f4d7;2.2 static修饰成员变量 2.3 static修饰成员方法 &#x1f4d5;2.4 static成员变量初始化 &#x1f532;3. 代码块 &#x…

第四届全国中医药院校大学生程序设计竞赛 : 二进制码(Python)

文章目录题目描述输入输出样例输入 Copy样例输出 Copy代码测试题目描述 在计算机中&#xff0c;对于定点数有三种不同的表示方法。在本题中&#xff0c;假定码的长度固定为 8 位&#xff0c;从左往右依次编号为第 1 到 8 位&#xff0c;第 1 位为最高位。 x 的原码&#xff1a…

Python爬虫实战(七):某讯较真辟谣小程序爬虫

追风赶月莫停留&#xff0c;平芜尽处是春山。 文章目录追风赶月莫停留&#xff0c;平芜尽处是春山。一、准备工作二、目标分析二、接口分析url分析返回数据分析三、编写代码获取数据保存数据完整代码大四考研狗没时间更新博客了&#xff0c;大家勿怪&#xff0c;等我有学上了&a…

手把手带你搭建个人博客系统(二)

⭐️前言⭐️ 因文章篇幅较长&#xff0c;所以整个流程分两篇文章来完成。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1f341; &#x1f349;精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、【数据结构】 &#x1f349;欢迎点赞…

Matplotlib设置限制制作

Matplotlib自动到达要沿着图的x&#xff0c;y(以及3D图的情况下为z轴)轴显示的变量的最小值和最大值。但是&#xff0c;可以使用set_xlim()和set_ylim()函数显式设置限制。 在下图中&#xff0c;显示了x和y轴的自动缩放限制 - #! /usr/bin/env python #codingutf-8 import matp…

【关于Linux中----进程控制和进程替换】

文章目录一、进程创建二、进程终止2.1进程退出场景2.2进程退出方法三、进程等待3.1进程等待必要性3.2进程等待的方法3.3获取子进程status四、进程程序替换4.1替换原理4.2替换函数4.3命名理解五、总结一、进程创建 谈到创建进程&#xff0c;不得不提到一个函数----fork。 在li…

【Python】一个矩阵根据某一列选择大于或小于范围的数据

data_all data_all[data_all[:,3]>54201]data_all data_all[data_all[:, 3] < 54220] 上面就是根据数据的第3列&#xff0c;选取54201到54220的范围的数据&#xff1a;