使用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
相关产品推荐
相关产品推荐

