手动计算 R 中的皮尔逊相关系数?
Manually calculate a pearson correlation in R?
我正在尝试计算两个数据向量之间的皮尔逊相关性。
x = c(5,5,4,5,5,5)
y = c(0,5,0,3,5,4)
mx = mean(x)
my = mean(y)
newx = c(x-mx)
newy = c(y-my)
corr = (newx%*%t(newy)/sqrt((newx^2)%*%(sqrt(newy^2)))
我的第一个主要问题是这种相关性是通过忽略 0 值计算的。但是,如果我完全省略它们,我认为我的最终计算是不可能的。
如果您知道更优雅的编码方式,或者我做错了什么,我将不胜感激。
你有几个错误。首先,您缺少右括号。二是分子反了。您想要第一个组件的转置,而不是第二个组件。你忘了计算分母的总和。
c(t(newx) %*% newy) / (sqrt(sum(newx^2)) * sqrt(sum(newy^2)))
#[1] 0.5991713
cor(x, y)
#[1] 0.5991713
或者,您可以使用 crossprod
。
crossprod(newx, newy) / (sqrt(sum(newx^2)) * sqrt(sum(newy^2)))
[,1]
[1,] 0.5991713
x = c(5,5,4,5,5,5)
y = c(0,5,0,3,5,4)
mx = mean(x)
my = mean(y)
newx = c(x-mx)
newy = c(y-my)
corr = (newx%*%t(newy)/sqrt((newx^2)%*%(sqrt(newy^2)))
我的第一个主要问题是这种相关性是通过忽略 0 值计算的。但是,如果我完全省略它们,我认为我的最终计算是不可能的。
如果您知道更优雅的编码方式,或者我做错了什么,我将不胜感激。
你有几个错误。首先,您缺少右括号。二是分子反了。您想要第一个组件的转置,而不是第二个组件。你忘了计算分母的总和。
c(t(newx) %*% newy) / (sqrt(sum(newx^2)) * sqrt(sum(newy^2)))
#[1] 0.5991713
cor(x, y)
#[1] 0.5991713
或者,您可以使用 crossprod
。
crossprod(newx, newy) / (sqrt(sum(newx^2)) * sqrt(sum(newy^2)))
[,1]
[1,] 0.5991713