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