为什么在使用cumsum()时这个预测函数需要为零?

时间:2016-01-07 00:04:30

标签: r function prediction

我正在接受一个udemy课程,在一节课中,有一个函数采用向量x为1和0并且基于先前的k值序列预测下一个值。我试图围绕我的大脑,为什么我需要在行csx <- c(0,cumsum(x)).

中的下面的函数中包含0
 predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector pred will contain our predicted values
  pred <- vector(length=n-k)
  csx <- c(0,cumsum(x))
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) 
        pred[i] <- 1 
     else 
        pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

2 个答案:

答案 0 :(得分:1)

0可以正确处理案例i=1。通过预先0,累积和csx向量的第一个元素也将是0,即csx[1]=0。这意味着对i=1我们将评估语句

if (csx[1+k] >= k2) pred[1] <- 1 else pred[1] <- 0

如果我们无法使用i=1,通常会将此for放置在预测函数(例如此函数)的cumsum()循环之外(之前)。即,没有cumsum,我们将使用类似

的形式评估循环之前的i=1表达式
mysum <- sum(x[1:k]
if (mysum >= k2) pred[1] <- 1 else pred[1] <- 0

然后在for函数中重复更新mysum,范围从i=2n-k。最后请注意,sum(x[1:k]等同于k+1中的元素c(0,cumsum(x))

答案 1 :(得分:1)

正确处理第一个元素的滞后。您可以尝试以下代码来生动地看到差异:

predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector red will contain our predicted values
  pred <- vector(length=n-k)
  csx <- c(0,cumsum(x))
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) pred[i] <- 1 else pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

x <- sample(c(0,1), 1000, replace = TRUE)
pred(x, 1)
[1] 0.4974975

修改函数而不预先添加0:

predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector red will contain our predicted values
  pred <- vector(length=n-k)
  csx <- cumsum(x)
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) pred[i] <- 1 else pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

pred(x, 1)
[1] 0

注意:对于pred(x,2),没有第一个前置滞后项,会出现相同的收敛问题。