R和Python之间cov和cor的差异

ppcbkaq5  于 2022-12-21  发布在  Python
关注(0)|答案(4)|浏览(256)

我经常使用R,对Python也不熟悉,在R中,我们给出了一个计算给定矩阵的均值、cov和cor的演示,如下所示:

X = matrix(c(1,0.5,3,7,9,6,2,8,4), nrow=3, ncol=3, byrow=FALSE)
X
    # [,1] [,2] [,3]
# [1,]  1.0    7    2
# [2,]  0.5    9    8
# [3,]  3.0    6    4
M = colMeans(X) # apply(X,2,mean)
M
# [1] 1.500000 7.333333 4.666667
S = cov(X)
S
    # [,1]      [,2]      [,3]
# [1,]  1.75 -1.750000 -1.500000
# [2,] -1.75  2.333333  3.666667
# [3,] -1.50  3.666667  9.333333
R = cor(X)
R
        # [,1]       [,2]       [,3]
# [1,]  1.0000000 -0.8660254 -0.3711537
# [2,] -0.8660254  1.0000000  0.7857143
# [3,] -0.3711537  0.7857143  1.0000000

我想用Python重现上面的代码,我尝试:

import numpy as np
X = np.array([1,0.5,3,7,9,6,2,8,4]).reshape(3, 3)
X = np.transpose(X) # byrow=FALSE
X
# array([[ 1. ,  7. ,  2. ],
    # [ 0.5,  9. ,  8. ],
    # [ 3. ,  6. ,  4. ]])

M = X.mean(axis=0) # colMeans
M
# array([ 1.5       ,  7.33333333,  4.66666667])
S = np.cov(X)
S
# array([[ 10.33333333,  10.58333333,   4.83333333],
    # [ 10.58333333,  21.58333333,   5.83333333],
    # [  4.83333333,   5.83333333,   2.33333333]])
R = np.corrcoef(X)
R
# array([[ 1.        ,  0.70866828,  0.98432414],
    # [ 0.70866828,  1.        ,  0.82199494],
    # [ 0.98432414,  0.82199494,  1.        ]])

那么cov和cor的结果是不同的,为什么?

9lowa7mx

9lowa7mx1#

这是因为numpy按行计算,R按列计算。请注解掉X = np.transpose(X) # byrow=FALSE,或使用np.cov(X, rowvar=False)

np.cov(X, rowvar=False)
array([[ 1.75      , -1.75      , -1.5       ],
       [-1.75      ,  2.33333333,  3.66666667],
       [-1.5       ,  3.66666667,  9.33333333]])

在相应文件中解释了差异(着重号为我):

巨蟒:

help(np.cov)

rowvar:bool,optional如果rowvar为True(默认值),则每个***行***表示一个变量,列中包含观测值。否则,关系将被转置:每列代表一个变量,而行包含观测值。

R:

?cov

var,cov和cor计算x的方差以及x和y的协方差或相关性(如果它们是向量)。如果x和y是矩阵,则计算x的***列***和y的列之间的协方差(或相关性)。

bmp9r5qi

bmp9r5qi2#

如果我在Python中不转置数组,那么我有完全相同的答案。
协方差是按行计算的(X[0]返回第一行),我猜想R以Fortran顺序存储数据,而Python/Numpy使用C顺序,这解释了mean计算方式的差异,Python中的第一个轴是行,而不是列。

jv2fixgn

jv2fixgn3#

你必须把数据矩阵的转置传递给numpy.cov(),因为numpy.cov()认为它的输入数据矩阵的每一列都有观测值,每一行都有变量,你可以从np.cov()的文档中读到:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.cov.html
在这里提供的代码中,如果将转置矩阵传递给np.cov(),您将获得与使用cov()在R中获得的值相同的值。

31moq8wy

31moq8wy4#

不仅如此,偏差也... np使用1/n-1,R可能相同...但在numpy中,您可以通过设置标志bias = FALSE将其设置为1/n...我不确定如何在R中执行此操作。

相关问题