【问题标题】:How to perform a Levene's test using scipy如何使用 scipy 执行 Levene 测试
【发布时间】:2017-07-26 18:18:51
【问题描述】:

我一直在尝试使用scipy.stats.levene,但没有成功。

我有一个形状为 (2128, 45100) 的 numpy 矩阵。每行都是一个样本,属于 3 个集群之一。

我想测试集群之间是否存在同方差性。

我尝试按集群过滤我的矩阵并像这样发送参数:

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: 使用序列设置数组元素。

甚至

levene(matrixAudioData)

ValueError: 必须输入至少两个输入样本向量。

这行得通:

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

但是如果每个样本不只是一个数字呢?

请注意,我用作参数的每个 matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0] 都有形状 (1048, 45100),所以应该没问题。

你们能指出我的方向吗?

谢谢!

【问题讨论】:

    标签: python scipy statistics


    【解决方案1】:

    基于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)) 
    

    【讨论】:

    • OP 询问的 levene 测试在哪里?
    【解决方案2】:

    正如您所注意到的,levene([1,2,3],[2,3,4]) 将起作用,因为您将 array_like 对象传递给函数。但是,将matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0] 作为输入不会因为您需要一维数组作为输入。

    例如,考虑下一个例子

    col1, col2, col3 = list(range(1, 100)), list(range(50, 78)), list(range(115, 139))
    

    请注意,每个列表都有不同的长度,因为我们可以使用不同长度的样本进行统计检验。现在,要调用leven 函数,我们将array_like 一维对象作为输入

    statistic, p_value = leven(col1,col2,col3,center="mean")
    

    在这种情况下,p_value=1.3326317740560537e-14。如果 Levene's 结果的 p_value 大于 0.05,则可以认为存在方差齐性 (HOV)。否则,不存在同质性。

    因此,在这种情况下,我们可以拒绝 col1col2col3 的方差相同的原假设。

    【讨论】:

    • 值得一提的是,如果 Levene's 结果的 p_value 大于 0.05,则可以认为存在方差齐性(HOV)。否则,不存在同质性。
    • 当然,@EMT 随时编辑答案以添加此内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2019-09-28
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多