2017-03-06 3 views
2

Ich habe versucht, scipy.stats.levene ohne Erfolg zu verwenden.So führen Sie einen Levene-Test mit scipy

Ich habe eine numpy Matrix mit Form (2128, 45100). Jede Zeile ist ein Beispiel und gehört zu einem von 3 Clustern.

Ich möchte testen, ob es homoscedasticity zwischen Clustern gibt.

Ich habe versucht Filterung meine Matrix durch Cluster und Senden der params wie so:

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.

oder sogar

levene(matrixAudioData) 

ValueError: Must enter at least two input sample vectors.

Dies funktioniert:

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

Aber was ist, wenn jede Probe nicht nur eine Zahl ist?

Bitte beachten Sie, dass jeder matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0], den ich als Parameter verwende, Form (1048, 45100) hat, also sollte es in Ordnung sein.

Können Sie mir in irgendeine Richtung zeigen?

Danke!

Antwort

0

Oh .. levene scheint univariate ... mein schlechter ...

Box-M-Test die Art und Weise, zu gehen, aber es scheint, dass es keine Implementierung in Python ist.

2

Basierend auf den Box's M Test formula, hier ist ein Python-Programm für eine M-Test auf zwei gleich großen Kovarianzmatrizen X0 und X1 Box leitend (dh jeden gleiche hat Nr. Von Zeilen und Spalten), gespeichert als numpy Arrays die np verwenden. Cov() -Funktion. Dies wurde anhand der SPSS-Ausgabe getestet.

Numpy ist eine Abhängigkeit, abgekürzt als 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))