【问题标题】:Manual pearson correlation in rr中的手动皮尔逊相关
【发布时间】:2016-08-12 07:50:19
【问题描述】:

您将如何创建一个在 r 中手动计算 pearson 相关性的函数。我知道有一个名为 cor 的本机函数,但是如果我想将 R 中的以下等式应用于数据框中的每个列组合,我该怎么做?

我希望我知道怎么做,但我相信它需要许多 for 循环、嵌套 for 循环等才能实现,而且我在编程方面还没有那么强。我希望有人会尝试这样像我这样的新手可以学习。谢谢

例子:

  set.seed(1)
  DF = data.frame(V1 = rnorm(10), V2=rnorm(10), V3=rnorm(10), V4=rnorm(10))

  #     V1    V2    V3    V4
  # V1  1.00 -0.38 -0.72 -0.24
  # V2 -0.38  1.00  0.60  0.18
  # V3 -0.72  0.60  1.00  0.08
  # V4 -0.24  0.18  0.08  1.00

【问题讨论】:

  • 不需要循环。您可以将 sigmaX 计算为 sum(X) 并将 sigmaXY 计算为 sum(X*Y) 并构建整个方程
  • 请给我们一个可重现的输入示例和预期输出

标签: r functional-programming correlation


【解决方案1】:

先写一个辅助函数来计算协方差:

v <- function(x,y=x) mean(x*y) - mean(x)*mean(y)

然后用它来计算相关性:

my_corr <- function(x,y) v(x,y) / sqrt(v(x) * v(y))

这是一个快速检查它是否正常工作:

> my_corr(DF$V1, DF$V2)
[1] -0.3767034
> cor(DF$V1, DF$V2)
[1] -0.3767034

请注意,以这种方式计算相关性在数值上是不稳定的。

编辑:

要将其应用于所有列组合,请使用outer

> outer(DF, DF, Vectorize(my_corr))

                  V1    V2    V3    V4
            # V1  1.00 -0.38 -0.72 -0.24
            # V2 -0.38  1.00  0.60  0.18
            # V3 -0.72  0.60  1.00  0.08
            # V4 -0.24  0.18  0.08  1.00

【讨论】:

  • 不起作用,当我插入我的数据框 my_corr(DF)` 时,请记住它是一个 数据框,该函数不应该在向量上工作。
  • 但是在这里你用 $ 定义你的列,一个函数应该被泛化以便它自己找到列。如果你有 100 列怎么办?你会怎么写那个函数?
【解决方案2】:

嗯。您无需“手动”执行此操作,只需使用....

cor(DF)

...计算所有列组合的 r。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2021-08-29
    • 2011-08-20
    • 1970-01-01
    • 2014-11-13
    • 2017-03-17
    相关资源
    最近更新 更多