如何预测R中序列中的下一个下一个数字

时间:2019-08-25 16:00:31

标签: r math data-manipulation

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

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

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语句来检查序列是否为几何序列,而不是其他任何类型的序列,例如线性序列?

2 个答案:

答案 0 :(得分:1)

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

要检查级数是否为几何,我们可以采用级数中每对连续值的比率,如果这些比率都相等,则级数为几何。由于这等效于检查其方差是否为零,因此可以使用var轻松地做到这一点。由于浮点算法不精确,因此我们检查方差是否小于eps

请注意,is.geo返回一系列长度1或2的NA,并且nextValue如果is.geo不返回TRUE,则返回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这样的几何series是算术运算,因此我们可以将series的对数拟合为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)

答案 1 :(得分:0)

如果只是几何序列,则可以通过factor <- 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}。现在,我们可以使用序列的四个项(alphabetaa_1和`a_4)来找到a_2a_3

对于最后一种情况,您可以具有序列的一般形式,而没有任何变量,例如a_n = a_{n-1} + n。如果有此功能,则可以根据所需的序列最后一项轻松地预测最后一项。