如何使用 "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
所以正如标题所说,我正在寻找一种方法来 运行 在 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