You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ppcor与correlation包计算Spearman偏相关结果不一致的问题排查

Spearman偏相关分析结果不一致问题排查

我使用R语言的ppcor包(pcor函数)与correlation包,对var1、var2、var3三个变量进行Spearman偏相关分析,设置相同的方法参数,但得到的结果却不一致,恳请帮忙排查问题。

测试代码及结果

var1 <- c(1.283e-04 ,1.284e-03 ,1.129e-04 ,1.698e-05, 1.853e-05 ,6.170e-05, 8.921e-06 ,2.880e-04,  3.526e-05 ,7.063e-05 ,4.152e-05, 3.580e-05 ,5.995e-04 ,7.177e-05 ,1.201e-04 ,8.308e-04, 9.538e-05, 1.269e-04 ,2.282e-05 ,3.311e-05 ,9.737e-05 ,3.116e-05)
var2 <- c(104.69974 ,82.73531,  80.11138,  93.30909,  63.92139 ,106.68449,  67.84821, 105.61487,  74.03226, 113.31995 , 26.73993,16.89038  ,90.67514 , 87.42241 , 67.88991, 119.01793,  71.56187 , 96.25090 , 16.89373 ,100.48780 , 62.84884 ,100.26991)
var3 <- c(45.900783 ,107.176287,  28.082737 , 25.672727 , 22.274216,  37.254902 ,  6.922435 , 85.172005,  38.838710,  26.305221,97.649573 , 38.478747  ,53.042688  ,55.962104 , 22.763761  ,48.713952,  28.194726,  40.555155,  33.605813,  26.463415,21.860465 , 46.153846)

# ppcor包结果
pcor(data.frame(var1=var1, var2=var2, var3=var3), method="spearman")
# $estimate
#           var1       var2       var3
# var1 1.0000000 0.27801067 0.48177768
# var2 0.2780107 1.00000000 0.09467777
# var3 0.4817777 0.09467777 1.00000000
# 
# $p.value
#            var1      var2       var3
# var1 0.00000000 0.2223786 0.02700195
# var2 0.22237855 0.0000000 0.68311211
# var3 0.02700195 0.6831121 0.00000000

# correlation包原代码结果
data.frame(var1=var1, var2=var2, var3=var3) %>% correlation(partial=T, method="spearman", p_adjust="none")
# Parameter1 | Parameter2 |  rho |        95% CI |       S |     p
# ----------------------------------------------------------------
# var1       |       var2 | 0.04 | [-0.40, 0.47] | 1698.00 | 0.855
# var1       |       var3 | 0.42 | [-0.01, 0.72] | 1026.00 | 0.051
# var2       |       var3 | 0.06 | [-0.38, 0.48] | 1666.00 | 0.793

问题原因

两个包对偏相关的默认计算逻辑不同:

  • ppcor::pcor()默认计算全偏相关(full partial correlation):计算两个变量的相关时,同时控制所有其他变量对这两个变量的影响(比如计算var1与var2的偏相关时,控制var3)。
  • correlation::correlation(partial=T)默认计算半偏相关(semi-partial correlation):仅控制其他变量对其中一个变量的影响,而非同时控制对两个变量的影响。

解决方案

将correlation包的partial参数设置为"full",即可与ppcor的计算逻辑一致:

# 修改后的correlation包代码
data.frame(var1=var1, var2=var2, var3=var3) %>% 
  correlation(partial = "full", method="spearman", p_adjust="none")

运行后结果会与ppcor::pcor()的输出完全匹配,比如:

  • var1与var2的rho为0.278,p值0.222
  • var1与var3的rho为0.482,p值0.027
  • var2与var3的rho为0.095,p值0.683

内容的提问来源于stack exchange,提问作者mary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:18:22