2017-03-06 25 views
2

我一直在嘗試使用scipy.stats.levene沒有成功執行列文的測試。如何使用SciPy的

我有形狀(2128,45100)一個numpy的矩陣。每一行都是一個樣本,屬於三個羣集之一。

我想測試羣集之間是否存在同方差。

我試着通過集羣過濾我的矩陣和發送,像這樣的PARAMS:

from scipy.stats import levene 

levene(matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0], 
     matrixAudioData[np.ix_((cutTree == 1).ravel()),:][0], 
     matrixAudioData[np.ix_((cutTree == 2).ravel()),:][0]) 

ValueError: setting an array element with a sequence.

甚至

levene(matrixAudioData) 

ValueError: Must enter at least two input sample vectors.

這工作:

levene([1,2,3],[2,3,4]) 

但是如果每個樣本不只是一個數字呢?

請注意,我用作參數的每個matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0]都具有形狀(1048,45100),所以應該沒問題。

你們可以點我在任何方向?

謝謝!

回答

0

哦..列文似乎是一元......我的壞...

箱公司的M測試的路要走,但它似乎在Python中沒有實現。

2

根據Box's M Test formula,這裏是一個Python程序,用於在兩個相等大小的協方差矩陣X0和X1(即每個都具有相同的行數和列數)上進行Box的M檢驗,並使用np存儲爲numpy數組。 cov()函數。這已經針對SPSS輸出進行了測試。

numpy的是一個依賴,縮寫爲NP。

def box_m(X0,X1): 

     global Xp 

     m = 2 
     k = len(np.cov(X0)) 
     n_1 = len(X0[0]) 
     n_2 = len(X1[0]) 
     n = len(X0[0])+len(X1[0]) 

     Xp = (((n_1-1)*np.cov(X0)) + ((n_2-1)*np.cov(X1)))/(n-m) 

     M = ((n-m)*np.log(np.linalg.det(Xp))) \ 
     - (n_1-1)*(np.log(np.linalg.det(np.cov(X0)))) - (n_2-1)*(np.log(np.linalg.det(np.cov(X1)))) 

     c = ((2*(k**2) + (3*k) - 1)/((6*(k+1)*(m-1)))) \ 
      * ((1/(n_1-1)) + (1/(n_2-1)) - (1/(n-m))) 

     df = (k*(k+1)*(m-1))/2 

     c2 = (((k-1)*(k+2))/(6*(m-1))) \ 
      * ((1/((n_1-1)**2)) + (1/((n_2-1)**2)) - (1/((n-m)**2))) 

     df2 = (df+2)/(np.abs(c2-c**2)) 

     if (c2>c**2): 

      a_plus = df/(1-c-(df/df2)) 

      F = M/a_plus 

     else: 

      a_minus = df2/(1-c+(2/df2)) 

      F = (df2*M)/(df*(a_minus-M)) 

     print('M = {}'.format(M)) 
     print('c = {}'.format(c)) 
     print('c2 = {}'.format(c2)) 
     print('-------------------') 
     print('df = {}'.format(df)) 
     print('df2 = {}'.format(df2)) 
     print('-------------------') 
     print('F = {}'.format(F))