如何使用 "correlation" 包进行偏相关(不使用 "pcor" 包)?

How to perform partial correlation with "correlation" package (without using "pcor" package)?

所以正如标题所说,我正在寻找一种方法来 运行 在 R 的“相关”包中进行部分相关,因为我通常发现它更容易处理我已经完成的大多数相关工作在过去。但是,根据 CRAN pdf:

https://cran.rstudio.com/web/packages/correlation/correlation.pdf

我看到运行偏相关的论点很简单:

correlation(partial = T)

很好,但我对它的工作原理有点困惑。例如,如果我决定在 pcor 中执行此操作,它相当简单;你只需像这样插入 x(自变量)、y(因变量)和 z(控制变量):

pcor.test(x = df$variable1,
      y = df$variable2,
      z = df$variable3)

但是对于相关包,好像有点不清楚。通常我只是 运行 默认使用 Pearson 的相关性,或者选择方法作为 Kendall 的 tau 或 Spearman 的 rho。但是,在这种情况下,就部分而言,文档并不清晰。因此,如果我 运行 与 starwars 数据集建立正常关联,它看起来像这样:

starwars %>% 
  select(mass,
         height,
         birth_year) %>% 
  correlation()

这给了我这个默认的 Pearson r 值:

Parameter1 | Parameter2 |     r |         95% CI |     t | df |       p
-----------------------------------------------------------------------
mass       |     height |  0.13 | [-0.13,  0.38] |  1.02 | 57 | 0.312  
mass       | birth_year |  0.48 | [ 0.18,  0.70] |  3.17 | 34 | 0.010**
height     | birth_year | -0.40 | [-0.63, -0.11] | -2.79 | 41 | 0.016* 

如果我在这个部分脚本中添加:

starwars %>% 
  select(mass,
         height,
         birth_year) %>% 
  correlation(partial = T)

它现在给了我这个:

Parameter1 | Parameter2 |     r |         95% CI | t(34) |         p
--------------------------------------------------------------------
mass       |     height |  0.38 | [ 0.06,  0.63] |  2.38 | 0.023*   
mass       | birth_year |  0.58 | [ 0.30,  0.76] |  4.10 | < .001***
height     | birth_year | -0.53 | [-0.73, -0.24] | -3.60 | 0.002** 

所以我想我的两个问题是 1) 如果实际控制了任何变量,这里控制的是什么变量;2) 如果这不以任何方式控制相关性,我该如何修改脚本以使其执行此操作?我天生对 pcor 没有任何问题,我只是非常希望能够在一个库中使用尽可能多的函数。

我想出了解决办法。这是因为我使用 ppcor 的“pcor.test”函数而不是“pcor”来与相关包的“相关”函数中的相关矩阵进行比较。我在下面展示了如何 运行。

首先,我使用了以下数据:

    structure(list(Mins_Work = c(435L, 350L, 145L, 135L, 15L, 60L, 
60L, 390L, 395L, 395L, 315L, 80L, 580L, 175L, 545L, 230L, 435L, 
370L, 255L, 515L, 330L, 65L, 115L, 550L, 420L, 45L, 266L, 196L, 
198L, 220L, 17L, 382L, 0L, 180L, 343L, 207L, 263L, 332L, 259L, 
417L, 282L, 685L, 517L, 111L, 64L, 466L, 499L, 460L, 269L, 300L, 
427L, 301L, 436L, 342L, 229L, 379L, 102L, 94L, 345L, 73L, 204L, 
512L, 113L, 458L, 552L, 108L, 335L, 508L, 546L, 396L, 159L, 325L, 
747L, 650L, 461L, 669L, 186L, 220L, 410L, 708L, 409L, 515L, 413L, 
166L, 451L, 660L, 177L, 192L, 191L, 461L, 637L, 297L, 601L), 
    Mins_Sleep = c(300L, 540L, 540L, 480L, 480L, 480L, 480L, 
    420L, 300L, 240L, 480L, 300L, 420L, 360L, 390L, 405L, 420L, 
    360L, 420L, 350L, 420L, 450L, 445L, 480L, 300L, 400L, 310L, 
    390L, 350L, 450L, 390L, 390L, 510L, 452L, 310L, 360L, 500L, 
    360L, 420L, 420L, 420L, 382L, 430L, 393L, 240L, 400L, 480L, 
    450L, 450L, 359L, 420L, 361L, 360L, 480L, 570L, 340L, 450L, 
    180L, 510L, 420L, 425L, 407L, 360L, 510L, 360L, 368L, 410L, 
    360L, 510L, 436L, 291L, 420L, 240L, 300L, 420L, 420L, 424L, 
    520L, 240L, 390L, 480L, 300L, 480L, 390L, 300L, 360L, 420L, 
    360L, 480L, 330L, 375L, 390L, 458L), Coffee_Cups = c(3L, 
    0L, 2L, 6L, 4L, 5L, 3L, 3L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 2L, 
    0L, 1L, 1L, 4L, 4L, 3L, 0L, 1L, 3L, 0L, 0L, 0L, 0L, 2L, 0L, 
    1L, 2L, 3L, 2L, 2L, 4L, 3L, 3L, 4L, 6L, 8L, 3L, 5L, 0L, 2L, 
    2L, 8L, 6L, 4L, 6L, 4L, 4L, 2L, 6L, 6L, 5L, 1L, 5L, 4L, 6L, 
    5L, 0L, 6L, 4L, 2L, 2L, 6L, 7L, 3L, 3L, 0L, 5L, 7L, 3L, 5L, 
    3L, 3L, 1L, 9L, 9L, 3L, 3L, 6L, 6L, 6L, 3L, 0L, 7L, 6L, 6L, 
    3L, 9L)), class = "data.frame", row.names = c(NA, -93L))

然后我运行这个只有三个变量的数据集,在pcor函数中:

pcor(work_clean)

这给了我这些价值。第一行是我原来找的r值的相关矩阵:

$estimate
             Mins_Work Mins_Sleep Coffee_Cups
Mins_Work    1.0000000 -0.2520279   0.4448886
Mins_Sleep  -0.2520279  1.0000000   0.2803302
Coffee_Cups  0.4448886  0.2803302   1.0000000

$p.value
               Mins_Work  Mins_Sleep  Coffee_Cups
Mins_Work   0.000000e+00 0.015368604 8.863486e-06
Mins_Sleep  1.536860e-02 0.000000000 6.798296e-03
Coffee_Cups 8.863486e-06 0.006798296 0.000000e+00

$statistic
            Mins_Work Mins_Sleep Coffee_Cups
Mins_Work    0.000000  -2.470701    4.712651
Mins_Sleep  -2.470701   0.000000    2.770535
Coffee_Cups  4.712651   2.770535    0.000000

$n
[1] 93

$gp
[1] 1

$method
[1] "pearson"

之后,我运行 pcor测试:

pcor.test(x=work_clean$Mins_Work,
          y=work_clean$Mins_Sleep,
          z=work_clean$Coffee_Cups)

这只给我一个与上面的 p 值 table 匹配的 sig 值:

    estimate   p.value statistic  n gp  Method
1 -0.2520279 0.0153686 -2.470701 93  1 pearson

然后当我运行它在相关函数中时:

work_clean %>% 
  correlation(partial = T)

它给了我一个更好的矩阵,将所有这些值打包成一个整洁的 table:

# Correlation Matrix (pearson-method)

Parameter1 |  Parameter2 |     r |         95% CI | t(91) |         p
---------------------------------------------------------------------
Mins_Work  |  Mins_Sleep | -0.25 | [-0.43, -0.05] | -2.48 | 0.015*   
Mins_Work  | Coffee_Cups |  0.44 | [ 0.27,  0.59] |  4.74 | < .001***
Mins_Sleep | Coffee_Cups |  0.28 | [ 0.08,  0.46] |  2.79 | 0.013*   

p-value adjustment method: Holm (1979)
Observations: 93

作为比较,如果我只使用基本相关函数:

work_clean %>% 
  correlation()

这是矩阵在不控制三个变量相互关系的情况下的样子:

# Correlation Matrix (pearson-method)

Parameter1 |  Parameter2 |     r |        95% CI | t(91) |         p
--------------------------------------------------------------------
Mins_Work  |  Mins_Sleep | -0.15 | [-0.34, 0.06] | -1.43 | 0.157    
Mins_Work  | Coffee_Cups |  0.40 | [ 0.22, 0.56] |  4.20 | < .001***
Mins_Sleep | Coffee_Cups |  0.19 | [-0.01, 0.38] |  1.89 | 0.125    

p-value adjustment method: Holm (1979)
Observations: 93