如何使用scipy进行Levene检验

5
我一直在尝试使用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])

数值错误:用序列设置数组元素。

甚至可能是

levene(matrixAudioData)

数值错误:必须输入至少两个样本向量。

这个是有效的:

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

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

请注意,我正在使用的每个matrixAudioData[np.ix_((cutTree == 0).ravel()),:][0]作为参数,其形状为(1048, 45100),因此应该没问题。

你们能指点我方向吗?

谢谢!

2个回答

0

正如您所注意到的,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检验的p值大于0.05,则可以假定存在方差齐性(HOV)。否则,不存在方差齐性。
因此,在这种情况下,我们可以拒绝方差在col1col2col3之间相同的零假设。

值得一提的是,如果Levene检验的p值大于0.05,则可以假定存在方差齐性(HOV)。否则,不存在方差齐性。 - EMT
当然可以,@EMT,请随意编辑答案以添加此内容。 - Miguel Trejo

-1
基于Box's M Test formula,这里提供了一个Python程序,用于对两个相等大小的协方差矩阵X0和X1(即每个矩阵具有相同的行数和列数),使用np.cov()函数存储为numpy数组进行Box's M测试。该程序已经通过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)) 

3
OP问的Levene检验在哪里? - msh855

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接