R语言偏相关和典型相关


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



使用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个都没有显著性。


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


  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中提到了在“气温”作为控制变量下,“冷饮销售量”和“游泳人数”的偏相关系数为0.215,并且P值大于0.05,表示相关关系不再具有统计学意义。因此,可以怀疑之前两个变量的直接相关系数是不准确的。引用指出,在相关系数中,我们常常提到“Pearson”和“Spearman”,但是很少提及“相关系数。在医学相关的项目中,偏相关系数也很常见。引用提出了一个问题,即如何计算R语言中的栅格偏相关。 栅格偏相关指的是在存在混杂因素(即协变量)的情况下,计算两个变量之间的相关性。在R语言中,可以使用"ppcor"包来计算栅格偏相关系数。该包提供了一个函数"pcor",可以通过指定需要控制的变量来计算栅格偏相关系数。需要注意的是,计算偏相关系数之前,需要确保数据已经被转换为栅格形式。具体步骤如下: 1. 安装并加载"ppcor"包: ```R install.packages("ppcor") library(ppcor) ``` 2. 将数据转换为栅格形式: ```R # 假设数据存储在dataframe对象df中,包含变量x1, x2和协变量z1, z2, ..., zk x <- as.matrix(df[, c("x1", "x2")]) z <- as.matrix(df[, c("z1", "z2", ..., "zk")]) ``` 3. 计算栅格偏相关系数: ```R pcor_result <- pcor(x, z) ``` 在上述代码中,"x"是一个包含需要计算偏相关系数的变量的矩阵,"z"是一个包含需要控制的协变量的矩阵。计算结果"pcor_result"将包含栅格偏相关系数的值。 请注意,这只是计算栅格偏相关系数的一种方法,在实际应用中,可能还有其他方法或包可以使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [你需要理解一下“偏相关系数”及R语言实现](https://blog.csdn.net/nixiang_888/article/details/122120926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值