你能解释一下这两种情况的区别吗?
> cor(1:10, rep(10,10))
[1] NA
Warning message:
In cor(1:10, rep(10, 10)) : the standard deviation is zero
> cor(1:10, 1:10)
[1] 1
第一个只是一条直线,而第二个我希望相关性是一个。我没有考虑什么?谢谢
你能解释一下这两种情况的区别吗?
> cor(1:10, rep(10,10))
[1] NA
Warning message:
In cor(1:10, rep(10, 10)) : the standard deviation is zero
> cor(1:10, 1:10)
[1] 1
第一个只是一条直线,而第二个我希望相关性是一个。我没有考虑什么?谢谢
绘制数据,应该很清楚。数据集
## y doesn't vary
plot(1:10, rep(10,10))
只是一条水平线。水平线的相关系数未定义y
,因为标准差的估计值为 0(这出现在相关系数的分母上)。尽管
plot(1:10, 1:10)
是行:
y = x
如果要测量点的“直线”程度,可以使用(减一)方差矩阵的特征值的比率。
f <- function(x,y) {
e <- eigen(var(cbind(x,y)))$values
1 - e[2] / e[1]
}
# To have values closer to 0, you can square that quantity.
f <- function(x,y) {
e <- eigen(var(cbind(x,y)))$values
( 1 - e[2] / e[1] )^2
}
f( 1:10, 1:10 )
f( 1:10, rep(1,10) )
f( rnorm(100), rnorm(100) ) # Close to 0
f( rnorm(100), 2 * rnorm(100) ) # Closer to 1
f( 2 * rnorm(100), rnorm(100) ) # Similar
如果点对齐,则为 1,如果它们形成的云具有球形形状,平移和旋转不变,非负且对称,则为 0。
如果您的情况不是对称的,即如果x
和y
不扮演相同的角色,那么 Roland 评论中建议的基于回归的方法更有意义。