我正在接受一个udemy课程,在一节课中,有一个函数采用向量x为1和0并且基于先前的k值序列预测下一个值。我试图围绕我的大脑,为什么我需要在行csx <- c(0,cumsum(x)).
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])))
}
答案 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=2
到n-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),没有第一个前置滞后项,会出现相同的收敛问题。