R组合序列生成

R组合序列生成,r,math,R,Math,我试图生成一个矩阵,其中每列表示R中的一系列因子。这些因子可以采用值1、2、3或4。每个序列有13个元素,表明总共有4^13个潜在序列。然而,只有这些潜在序列的特定子集被认为是有效的。逻辑如下: 序列可以从任何因素开始 如果序列从4开始,其第二个元素可以小于或等于4 一旦一个元素降到4以下,随后的条目必须弱递增 如果序列以1、2或3开头,则它必须是弱递增的 例如,序列(1,2,3,3,3…..3)是有效的。序列(4,4,1,1,2,4,4…4)也是有效的。序列(4,1,2,3,1,1…1)并非如

我试图生成一个矩阵,其中每列表示R中的一系列因子。这些因子可以采用值1、2、3或4。每个序列有13个元素,表明总共有4^13个潜在序列。然而,只有这些潜在序列的特定子集被认为是有效的。逻辑如下:

  • 序列可以从任何因素开始
  • 如果序列从4开始,其第二个元素可以小于或等于4
  • 一旦一个元素降到4以下,随后的条目必须弱递增
  • 如果序列以1、2或3开头,则它必须是弱递增的
  • 例如,序列(1,2,3,3,3…..3)是有效的。序列(4,4,1,1,2,4,4…4)也是有效的。序列(4,1,2,3,1,1…1)并非如此,因为在从4降到1的第一次下降后,它并没有微弱地增加

    目前,我有代码来组合2&3个因素并生成这个矩阵。该过程包括生成所有可能序列的矩阵,然后根据上述逻辑向下过滤。这是非常低效的,但我可以张贴它,如果必要的话。这个过程也不能推广到四因素模型,因为4^13个潜在序列压倒了我的机器


    如果你们中的任何一位能够深入了解我如何生成这些有效序列,我们将不胜感激。谢谢。

    我假设,一旦一个逐渐增加的向量达到4,它就不能像4是第一个数字那样再次跳回到更低的值(如果可以,代码实际上更容易)

    下面的函数生成兼容序列,基本上使用
    开关
    实现马尔可夫链


    generate_seq我假设,一旦一个逐渐增加的向量达到4,它就不能像4是第一个数字那样再次跳回到更低的值(如果可以,代码实际上更容易)

    下面的函数生成兼容序列,基本上使用
    开关
    实现马尔可夫链


    generate_seq我认为您可以使用
    RcppAlgos
    为长度为1:n的向量生成组合,从而有效地实现这一点(假设较短的向量用
    4
    填充到长度为13):

    库(RcppAlgos)
    
    get_combos我认为您可以使用
    RcppAlgos
    为长度为1:n的向量生成组合,从而有效地实现这一点(假设较短的向量用
    4
    填充到长度为13):

    库(RcppAlgos)
    
    这是很棒的艾伦,谢谢你!我可以生成大量列,然后删除重复项以获得完整的序列集合。我可以将其保存为.csv文件,并在需要时调用该文件。我认为这是不正确的,因为它没有考虑到如果第二个元素是4,则序列可以放在第二个元素之后(即OP声明
    (4,4,1,1,2,4,4…4)
    是有效序列)。这是正确的,只要所有先行元素都是4s,序列就可以删除。例如,如果序列的前5个元素都是4s,那么第六个元素可以是1、2、3或4。一旦一个序列从4下降,剩下的元素一定是微弱地增加了。@27ñ9 Thanjs-我想我错过了。但是,这不会使函数生成的任何序列出错;这只意味着它遗漏了一小部分样本空间。将
    if(x[i+1]==4)
    更改为
    if(x[i+1]==4&!all(x==4))
    可以解决这个问题。是的,对不起,这并不意味着生成的序列是错误的,只是它不能用来生成OP想要的详尽列表。这是非常好的Allan,谢谢!我可以生成大量列,然后删除重复项以获得完整的序列集合。我可以将其保存为.csv文件,并在需要时调用该文件。我认为这是不正确的,因为它没有考虑到如果第二个元素是4,则序列可以放在第二个元素之后(即OP声明
    (4,4,1,1,2,4,4…4)
    是有效序列)。这是正确的,只要所有先行元素都是4s,序列就可以删除。例如,如果序列的前5个元素都是4s,那么第六个元素可以是1、2、3或4。一旦一个序列从4下降,剩下的元素一定是微弱地增加了。@27ñ9 Thanjs-我想我错过了。但是,这不会使函数生成的任何序列出错;这只意味着它遗漏了一小部分样本空间。将
    if(x[i+1]==4)
    更改为
    if(x[i+1]==4&!all(x==4))
    可以解决这个问题。是的,很抱歉,这并不意味着生成的序列是错误的,只是它不能用于生成OP想要的详尽列表。
    set.seed(4)
    matrix(replicate(4, generate_seq(13)), ncol = 4)
    #>       [,1] [,2] [,3] [,4]
    #>  [1,]    4    4    1    1
    #>  [2,]    3    3    1    2
    #>  [3,]    3    4    2    3
    #>  [4,]    3    4    2    3
    #>  [5,]    4    4    2    4
    #>  [6,]    4    4    3    4
    #>  [7,]    4    4    3    4
    #>  [8,]    4    4    3    4
    #>  [9,]    4    4    4    4
    #> [10,]    4    4    4    4
    #> [11,]    4    4    4    4
    #> [12,]    4    4    4    4
    #> [13,]    4    4    4    4
    
    library(RcppAlgos)
    
    get_combos <- function(n) {
      unique(do.call(rbind, sapply(rev(seq(n)), function(x)
        do.call(
          cbind, c(rep(4, n - x), list(comboGeneral(1:4, x, TRUE)))
        ))))
    }
    
    res <- get_combos(13)
    
    head(res)
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
    [1,]    1    1    1    1    1    1    1    1    1     1     1     1     1
    [2,]    1    1    1    1    1    1    1    1    1     1     1     1     2
    [3,]    1    1    1    1    1    1    1    1    1     1     1     1     3
    [4,]    1    1    1    1    1    1    1    1    1     1     1     1     4
    [5,]    1    1    1    1    1    1    1    1    1     1     1     2     2
    [6,]    1    1    1    1    1    1    1    1    1     1     1     2     3
    
    nrow(res)
    [1] 2367