2014-11-24 154 views
5

当数据中存在NaN时,我没有找到计算包含两个以上变量观测数组的相关系数矩阵的函数。有一些函数为变量对(或者只是使用〜is.nan())来掩盖数组)。但是,通过循环大量变量来使用这些函数,计算每对函数的相关性可能非常耗时。python - 如何在数据矩阵中计算nans的相关矩阵

所以我尝试了一下,很快就意识到这样做的复杂性是协方差正确化的问题。我会非常感兴趣的关于如何做到这一点的意见。

下面是代码:

def nancorr(X,nanfact=False): 
    X = X - np.nanmean(X,axis=1,keepdims = True)*np.ones((1,X.shape[1])) 

    if nanfact: 
     mask = np.isnan(X).astype(int) 
     fact = X.shape[1] - np.dot(mask,mask.T) - 1  

    X[np.isnan(X)] = 0 
    if nanfact: 
     cov = np.dot(X,X.T)/fact 
    else: 
     cov = np.dot(X,X.T) 

    d = np.diag(cov) 
    return cov/np.sqrt(np.multiply.outer(d,d)) 

该函数假定每行是一个变量。它基本上是numpy的corrcoeff()中的一个调整后的代码。 我相信有三种方法可以做到这一点:

(1)对于每一对变量,你只采用那些既不是其中一个变量也不是NaN的观察值。这可以说是最准确的,但也是最难编程的,如果你想同时进行多对计算而不是上面的代码。但是,为什么要抛弃每个变量的均值和方差的信息,仅仅是因为另一个变量的对应条目是NaN?因此,另外两个选项。 (2)我们将每个变量用它来表示,并且每个变量的方差就是其方差。对于协方差,每个观测值中的一个或另一个变量是NaN,但不是两者都是观察到无共变,因此设为零。协方差因子是1 /(观测值,其中两个变量都不是NaN - 1),用n表示。相关系数分母中的两个方差都由其相应的非NaN观测值减1表示,分别用n1和n2表示。这是通过在上面的函数中设置nanfact = True来实现的。 (3)人们可能希望协方差和方差具有与没有NaN时的相关系数相同的因子。在这里做唯一有意义的方法(如果选项(1)不可行),就是简单地忽略(1/n)/ sqrt(1/n1 * n2)。由于这个数字小于1,估计的相关系数将会大于(绝对值)比(2),但将保持在-1,1之间。这是通过设置nanfact = False来实现的。我会非常感兴趣的方法(2)和(3)的意见,尤其是,我非常希望看到(1)的解决方案,而不使用循环。

回答

5

我觉得你正在寻找的方法是从熊猫corr()。例如,一个数据框如下。你也可以参考这个问题。 How to efficiently get the correlation matrix (with p-values) of a data frame with NaN values?

import pandas as pd 
df = pd.DataFrame({'A': [2, None, 1, -4, None, None, 3], 
        'B': [None, 1, None, None, 1, 3, None], 
        'C': [2, 1, None, 2, 2.1, 1, 0], 
        'D': [-2, 1.1, 3.2, 2, None, 1, None]}) 

df 
A  B  C  D 
0 2  NaN  2  -2 
1 NaN  1  1  1.1 
2 1  NaN  NaN  3.2 
3 -4  NaN  2  2 
4 NaN  1  2.1  NaN 
5 NaN  3  1  1 
6 3  NaN  0  NaN 
rho = df.corr() 
rho 
 A   B   C   D 
A 1.000000  NaN  -0.609994 -0.441784 
B NaN   1.0  -0.500000 -1.000000 
C -0.609994 -0.5  1.000000 -0.347928 
D 0.041204  -1.0  -0.347928 1.000000 
+0

所以熊猫显然提供什么I(1)上述下选项。也就是说,在计算成对相关时,它只使用那些在各个列中都不是'Nan'的观察值 - 即使是计算平均值和方差。我之前没有提到的另外一个问题是,我不确定这是否是一个半正定的Cov。顺便说一句,你似乎已经提供了错误的corr矩阵到你的示例数据框。例如。 C,D条目应为-0.347928。 – user3820991 2016-12-16 14:09:05

+0

更正了corr-matrix结果。 – 2016-12-16 15:54:10