朱莉娅的皮尔逊 r

Pearson's r in Julia

我无法在 Julia 中找到一个已经创建的函数来计算 Pearson 的 r,所以我尝试自己制作它,但是我 运行 遇到了麻烦。

代码:

r(x,y) = (sum(x*y) - (sum(x)*sum(y))/length(x))/sqrt((sum(x^2)-(sum(x)^2)/length(x))*(sum(y^2)-(sum(y)^2)/length(x)))

如果我尝试 运行 在两个数组上执行此操作:

b = [4,8,12,16,20,24,28]
q = [5,10,15,20,25,30,35]

我收到以下错误:

ERROR: `*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})
in r at none:1

您的函数正在尝试将两个列向量相乘。您将需要 反转 转置其中之一。考虑:

> [1,2]*[3,4]
ERROR: `*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})

但是:

> [1,2]'*[3,4]
1-element Array(Int64,1)
  11

和:

> [1,2]*[3,4]'
2x2 Array(Int64,2):
  3   4
  6   8

Pearson 的 r 在 Julia 中可用 cor:

julia> cor(b,q)
1.0

当您在 Julia 中查找函数时,apropos 函数会非常有用:

julia> apropos("pearson")
Base.cov(v1[, v2][, vardim=1, corrected=true, mean=nothing])
Base.cor(v1[, v2][, vardim=1, mean=nothing])

您 运行 的定义问题是元素 multiplication/exponentiation 和矩阵 multiplication/exponentiation 之间的区别。为了按照您的意图使用元素行为,您需要 .*.^:

r(x,y) = (sum(x.*y) - (sum(x)*sum(y))/length(x))/sqrt((sum(x.^2)-(sum(x)^2)/length(x))*(sum(y.^2)-(sum(y)^2)/length(x)))

只有这三处更改,您的 r 定义似乎与 Julia 的 cor 相匹配,只差几个 ULP:

julia> cor(b,q)
1.0

julia> x,y = randn(10),randn(10)
([-0.2384626335813905,0.0793838075714518,2.395918475924737,-1.6271954454542266,-0.7001484742860653,-0.33511064476423336,-1.5419149314518956,-0.8284664940238087,-0.6136547926069563,-0.1723749334766532],[0.08581770755520171,2.208288163473674,-0.5603452667737798,-3.0599443201343854,0.585509815026569,0.3876891298047877,-0.8368409374755644,1.672421071281691,0.19652240951291933,0.9838306761261647])

julia> r(x,y)
0.23514468093214283

julia> cor(x,y)
0.23514468093214275

Julia 的 cor is defined iteratively(这是零均值实现 — 调用 cor 首先减去均值,然后调用 corzm),这意味着更少的分配和更好的性能。我不能说数字的准确性。