Python 2x2矩阵中元素的所有组合,行和列总和等于指定值

Python 2x2矩阵中元素的所有组合,行和列总和等于指定值,python,c,r,matrix,combinations,Python,C,R,Matrix,Combinations,背景 我正试图编写Fisher精确检验(见:),特别是针对2 x 2列联表(矩阵)。但是我在一个特定的步骤上陷入了困境:在给定非负整数的观测矩阵的情况下生成替代矩阵,其中替代矩阵的行和列和必须等于原始矩阵。有一个所有步骤的描述,但下面我将详细说明我卡住的位 问题 为了实现2 x 2列联表的Fisher精确检验,我得到了一个2 x 2矩阵,其元素是表示观测值的非负整数,即观测矩阵 其中一个步骤要求我生成2 x 2矩阵的所有组合,即备选矩阵,其非负整数元素受以下条件限制: 所有备选矩阵的维数均为

背景

我正试图编写Fisher精确检验(见:),特别是针对2 x 2列联表(矩阵)。但是我在一个特定的步骤上陷入了困境:在给定非负整数的观测矩阵的情况下生成替代矩阵,其中替代矩阵的行和列和必须等于原始矩阵。有一个所有步骤的描述,但下面我将详细说明我卡住的位


问题

为了实现2 x 2列联表的Fisher精确检验,我得到了一个2 x 2矩阵,其元素是表示观测值的非负整数,即观测矩阵

其中一个步骤要求我生成2 x 2矩阵的所有组合,即备选矩阵,其非负整数元素受以下条件限制:

  • 所有备选矩阵的维数均为2 x 2,即等于观测矩阵
  • 备选矩阵每行的总和必须等于观测矩阵每行的相应总和xm,即观测矩阵第2行的总和c==备选矩阵每行第2行的总和
  • 备选矩阵每列的总和必须等于观测矩阵每列的相应总和
对我来说,生成替代矩阵最明显的方法是强制执行2 x 2矩阵中所有可能的数字组合,其值小于或等于所观察矩阵的行/列之和。然后对这些组合进行迭代,筛选出不满足上述条件的组合

编辑:生成2x2矩阵(备选矩阵)中所有元素组合的最快算法是什么,行和列的总和等于观察矩阵的总和?

原文:我们如何用以下语言之一实现这一点:R、Python、C/C++、Matlab


示例

对于2×2检验的一个示例应用,假设X是一本杂志,比如数学杂志或科学杂志,Y是这些杂志中某一期中出现的关于数学和生物学主题的文章数量。如果《数学》杂志有五篇关于数学的文章和一篇关于生物学的文章,而《科学》杂志没有关于数学的文章和四篇关于生物学的文章,那么相关的矩阵应该是:

所有可能的替代矩阵将为:


相关帖子


  • 这其实很容易。您只需从所有可能的组合中选择符合条件的组合即可

    以下是python中的一个解决方案:

    # [[i, j]
    #  [k, l]]
    
    def findAlternativeMatrices(c):
        # arg c = cont. matrix
        # this only works for integers
        alt = []
        # no single value inside an alternative matrix
        # can be bigger than the largest row/column-sum 
        N = max([c[0][0]+c[1][0],c[0][1]+c[1][1],c[0][0]+c[0][1], c[1][0]+c[1][1]])
        # loop over all matrix entries
        for i in range(N):
            for j in range(N):
                for k in range(N):
                    for l in range(N):
                        #check if the respective sums equal
                        if(     (i+k == (c[0][0]+c[1][0]) )
                            and (j+l == (c[0][1]+c[1][1]) )
                            and (i+j == (c[0][0]+c[0][1]) )
                            and (k+l == (c[1][0]+c[1][1]) ) ):
    
                            if [[i,j],[k,l]] != c:
                                # append the matrix 
                                # if it isn't the given cont. matrix
                                alt.append([[i,j],[k,l]])
    
        return alt
    
    
    c = [[5,0],[1,4]]
    alt = findAlternativeMatrices(c)
    
    for a in alt:
        print a
    

    我用sympy得到了一个答案。想法是一样的:求解线性方程组,你从矩阵元素的行数和列数之和得到。这是用M硬编码的。s基本上是你的矩阵。linsolve为您提供无穷多个解,其余的将它们限制为正整数

    from sympy import *
    from sympy.solvers.solveset import linsolve
    from sympy.sets.fancysets import Naturals0
    from sympy.solvers.inequalities import reduce_inequalities
    
    M = Matrix([[1,1,0,0],[0,0,1,1],[1,0,1,0],[0,1,0,1]])
    s = Matrix([5,5,6,4])
    
    a,b,c,d = symbols('a, b, c, d')
    solution = linsolve((M,s), [a,b,c,d])
    
    solution_eq = [x >= 0 for x in list(list(solution)[0])]
    possible_values = reduce_inequalities(solution_eq, x.free_symbols)
    
    for d_fixed in Intersection(possible_values.as_set(), Naturals0()):
        print solution.subs({d : d_fixed})
    

    我们没有“做我的作业”服务!恐怕你得自己做。你应该多学一些语言。尝试在Brainfuck@Olaf,为了避免不必要的问题,我将集中在“自己动手”上,我将编辑问题以包含我的尝试。我对组合数学这个例子很感兴趣,因为我隐藏的怀疑是,最有效的解决方案类似于解决数独问题。