python 求系数矩阵,关于numpy:python-如何在数据矩阵中使用nans计算相关矩阵
我找不到能為數據中存在NaN的數組計算相關系數矩陣的函數,該數組包含兩個以上變量的觀測值。有一些函數可以對成對的變量(或者只是使用?is.nan()掩蓋數組)。但是通過遍歷大量變量來使用這些功能,計算每對變量的相關性可能非常耗時。
因此,我自己嘗試一下,很快意識到這樣做的復雜性是對協方差的正確歸一化的問題。您的意見我將非常感興趣。
這是代碼:
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)我們用它的nanmean來淡化每個變量,而每個變量的方差就是它的不變性。對于協方差,其中一個變量或另一個變量為NaN而不是兩者均是NaN的每個觀察值都是無協變量的觀察值,因此將其設置為零。則協方差的因子為1 /(觀察數,其中兩個變量都不都是NaN-1),用n表示。相關系數的分母中的兩個方差均由其對應的非NaN觀測值減去1分別表示,分別由n1和n2表示。這可以通過在上面的函數中設置nanfact = True來實現。
(3)可能希望協方差和方差具有與沒有NaNs的相關系數相同的因子。在這里執行此操作的唯一有意義的方法(如果選項(1)不可行)是簡單地忽略(1 / n)/ sqrt(1 / n1 * n2)。由于此數字小于1,因此估計的相關系數(在絕對值上)將比(2)中的大,但將保持在-1,1之間。這可以通過設置nanfact = False來實現。
我會對您對方法(2)和(3)的意見非常感興趣,尤其是,我非常希望看到不使用循環的(1)解決方案。
我認為您正在尋找的方法是pandas中的corr()。 例如,如下所示的數據框。 您也可以參考此問題。 如何有效地獲取具有NaN值的數據幀的相關矩陣(具有p值)?
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
因此,熊貓顯然提供了我在上述選項(1)下描述的內容。 也就是說,在計算成對相關性時,它僅使用在兩個相應列中均不是Nan的觀察值-甚至用于計算均值和方差。 我上面沒有提到的另一個問題是,我不確定這是否保證半正定Cov。 順便說一句,您似乎為示例數據框提供了錯誤的corr矩陣。 例如。 C,D條目應顯示為-0.347928。
更正了corr-matrix結果。
對于帶有nans的數組,panda.corr的速度很慢。 它基本上是一個手寫的python循環。
總結
以上是生活随笔為你收集整理的python 求系数矩阵,关于numpy:python-如何在数据矩阵中使用nans计算相关矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python write和writeli
- 下一篇: Python识别表格图_使用Python