【问题标题】:How to predict next next number in a sequence in R如何预测R中序列中的下一个数字
【发布时间】:2019-08-25 16:00:31
【问题描述】:

我希望创建一个函数来预测几何序列序列中的下一个数字,例如这些或任何其他 n 倍数:

1 2 4 8 16 32 64
2 4 8 16 32 64 128
3 6 12 24 48 96 192

1 3 9 27 81 243 729
2 6 18 54 162 486 1458
3 9 27 81 243 729 2187

我尝试过使用这种方法 (How to get next number in sequence in R),但它似乎只适用于线性序列。另外,如何实现 IF 语句来检查序列是否是几何序列而不是任何其他序列类型,例如线性?

【问题讨论】:

    标签: r math data-manipulation


    【解决方案1】:

    对于几何级数,连续值的比率是恒定的,因此将该比率乘以当前值可以得到下一个值。

    为了检查序列是否是几何的,我们可以取序列中每对连续值的比率,如果这些比率都相等,则序列是几何的。因为这相当于检查它们的方差是否为零,我们可以使用var 轻松完成。由于浮点运算不精确,我们检查方差是否小于eps

    请注意,is.geo 对于长度为 1 或 2 的序列返回 NA,如果 is.geo 不返回 TRUE,nextValue 将返回 NA。

    nextValue <- function(x) {
      if (!isTRUE(is.geo(x))) NA
      else {
        y <- tail(x, 2)
        y[2]^2 / y[1]
      }
    }
    
    is.geo <- function(x, eps = 1e-5) var(x[-1] / x[-length(x)]) < eps
    

    测试

    使用最后注释中定义的m,我们可以将下一个值作为新列附加到它:

    cbind(m, apply(m, 1, nextValue))
    

    给予:

         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    2    4    8   16   32   64  128
    [2,]    2    4    8   16   32   64  128  256
    [3,]    3    6   12   24   48   96  192  384
    [4,]    1    3    9   27   81  243  729 2187
    [5,]    2    6   18   54  162  486 1458 4374
    [6,]    3    9   27   81  243  729 2187 6561
    

    我们也可以测试m的每一行来检查是否是几何的:

    apply(m, 1, is.geo)
    ## [1] TRUE TRUE TRUE TRUE TRUE TRUE
    
    is.geo(c(1, 2, 4, 12))
    ## [1] FALSE
    

    使用 lm

    如果通过问题中显示的链接的方法意味着使用lm,那么我们可以使用lm,如果该系列是严格正的,请注意这种几何级数的log是算术的,所以我们可以将系列的对数拟合为 1, 2, 3, ... 。如果偏差为零时发生的残差为零,则它满足这一点。

    fit <- function(x) {
        ix <- seq_along(x)
        lm(log(x) ~ ix)
    }
    
    nextValue2 <- function(x) {
      if (!isTRUE(is.geo2(x))) NA
      else exp( predict(fit(x), list(ix = length(x) + 1)) )
    }
    
    is.geo2 <- function(x, eps = 1.e-5) {
      if (length(x) <= 2) NA
      else deviance(fit(x)) < eps
    }
    

    注意

    m <- matrix(c(1L, 2L, 3L, 1L, 2L, 3L, 2L, 4L, 6L, 3L, 6L, 9L, 4L, 
    8L, 12L, 9L, 18L, 27L, 8L, 16L, 24L, 27L, 54L, 81L, 16L, 32L, 
    48L, 81L, 162L, 243L, 32L, 64L, 96L, 243L, 486L, 729L, 64L, 128L, 
    192L, 729L, 1458L, 2187L), 6)
    

    【讨论】:

    • 只是出于好奇,!isTRUEisFALSE 不同吗?
    • 如果参数为 NA,它们是不同的。 !isTRUE(NA) 为真,但`isFALSE(NA) 为假。
    • @ G. Grothendieck 我们是否也可以对反向几何级数做同样的事情,例如(256 128 64 32 16)?
    • 那还是几何形状
    • @G.格洛腾迪克,所以我终于有机会测试您的解决方案,当在 (90,93,96,99,102,105) 等序列上运行 is.geo 函数时,尽管是线性序列,但它返回 TRUE
    【解决方案2】:

    如果只是几何数列,可以通过factor &lt;- seq[2]/seq[1]找到因子。如果您不知道序列的类型,则不可能在一般情况下找到公式。

    但是,您知道数列的一般公式,因此您有一些变量可以通过数列的某些项来计算。例如,对于几何序列,我们知道a_n = factor * a_{n-1}。因此,通过替换序列的一些项,我们可以在这里找到因子。它是一个变量方程。我们可以说factor = a_n / a_{n-1}

    再举一个例子,假设我们知道序列公式喜欢a_n = alpha * a_{n-1} + beta * a_{n-2}。现在,我们可以使用序列的四个项(a_1a_2a_3 和 `a_4)找到 alphabeta

    对于最后一种情况,您可以拥有不带任何变量的序列的一般形式,例如a_n = a_{n-1} + n。如果你有这个,你可以很容易地根据序列中所需的最后一项来预测最后一项。

    【讨论】:

    • 非常感谢,在那种情况下,我认为像 geoSolve
    • @BethanHuish 是的,有点。您需要将最后一个结果添加到数据框中才能使 getNext 正常工作。
    • 对不起,我不太确定我明白你的意思,我已经运行了这段代码,它似乎工作正常。有什么我想念的吗?
    • @BethanHuish 是的。这是正确的。但是,您需要将最后一个结果添加到序列中,以使下一个预测正确。
    • 嗯,我明白了
    猜你喜欢
    • 2018-11-20
    • 2019-12-25
    • 2023-03-05
    • 1970-01-01
    • 2018-04-03
    • 2020-12-30
    • 2021-10-10
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多