使用权重预测时间序列

机器算法验证 r 时间序列 预测
2022-04-18 22:08:08

我想预测(或预测)具有权重的时间序列。

以下工作使用常规的l线性m拟合技术,lm通过对输入数据应用(Sigmoidal)权重分布,本质上对后者数据点的权重比前者更大:

library("stats")
lm.weight.function <- function(x) {10 / (1 + exp(-x))} # Sigmoidal
lm.weights <- lapply(seq(-13, 14, length.out = 27), lm.weight.function)
lm.input <- as.data.frame(c(23957, 46771, 60767, 73284, 60296, 73122, 78304, 87154, 80459, 76885, 56479, 18809, 13453, 13951, 25140, 12035, 11920, 20683, 30357, 35019, 37732, 46150, 47856, 41931, 20985, 32526, 27283))
lm.input <- cbind(1:27, lm.input)
colnames(lm.input) <- c('x', 'y')
lm.model <- lm(formula = y ~ log(x), data = lm.input, weights = unlist(lm.weights))
predict.input <- as.data.frame(28:55)
colnames(predict.input) <- 'x'
predict.model <- predict(lm.model, predict.input)
plot(1:(27+28), c(lm.input$y, predict.model), type = 'l', xlab = 'x', ylab = 'y')

在此处输入图像描述

现在我希望使用forecast包做同样的事情。但是,我很难指定weights

library("forecast")
ts.weight.function <- function(x) {10 / (1 + exp(-x))} # Sigmoidal
ts.weights <- as.data.frame(lapply(seq(-13, 14, length.out = 27), ts.weight.function))
colnames(ts.weights) <- 'trend'
ts.input <- ts(c(23957, 46771, 60767, 73284, 60296, 73122, 78304, 87154, 80459, 76885, 56479, 18809, 13453, 13951, 25140, 12035, 11920, 20683, 30357, 35019, 37732, 46150, 47856, 41931, 20985, 32526, 27283), frequency = 1)
ts.model <- tslm(formula = ts.input ~ log(trend), weights = unlist(ts.weights))

以上打印错误:

Error in eval(expr, envir, enclos) : 
  ..1 used in an incorrect context, no ... to look in

如何使用tslm权重预测时间序列?

1个回答

这是一个问题lm

wrapper = function(formula,...)
  lm(formula=formula,...)
x=(1:27)
wrapper(ts.input~x,weights=ts.weights)

产生完全相同的错误。如果您将源代码阅读到tslm,您会发现它lm的调用方式或多或少是相同的。

我在这里发现这..1意味着包含在 中的第一个参数...,在这种情况下是唯一的参数weights它表明这种错误可能是由于正在传递的参数在调用函数的环境中不存在而引起的。wrapper(ts.input~x,weights=foo)如果您没有任何名为 的对象,您可以看到此行为foo

运行回溯wrapper(ts.input~x,weights=ts.weights)显示:

8 eval(expr, envir, enclos) 
7 eval(extras, data, env) 
6 model.frame.default(formula = formula, weights = ..1, drop.unused.levels = TRUE) 
5 stats::model.frame(formula = formula, weights = ..1, drop.unused.levels = TRUE) 
4 eval(expr, envir, enclos) 
3 eval(mf, parent.frame()) 
2 lm(formula = formula, ...) 
1 wrapper(ts.input ~ x, weights = ts.weights) 

而在源代码中lm

mf <- match.call(expand.dots = FALSE)
m <- match(c("formula", "data", "subset", "weights", "na.action", 
    "offset"), names(mf), 0L)
mf <- mf[c(1L, m)]
mf$drop.unused.levels <- TRUE
mf[[1L]] <- quote(stats::model.frame)
mf <- eval(mf, parent.frame())
if (method == "model.frame") 
    return(mf)

这表明呼叫model.frame正在...以一种奇怪的方式接听。

所以我决定不试一试...

wrapper = function(formula,weights)
  lm(formula=formula,weights=weights)
x=(1:27)
wrapper(ts.input~x,weights=ts.weights)

产生了

 Error in model.frame.default(formula = formula, weights = weights, drop.unused.levels = TRUE) : 

变量“(权重)”的无效类型(闭包)

当然,闭包是 R 中的一个函数。这只能意味着一件事……weights已经是全局环境中的一个函数。事实上,?weights它揭示了具有讽刺意味的是模型权重的提取函数。毫无疑问,它的搜索优先级高于局部变量。所以我改变了参数名称(因为formula也是一个函数):

wrapper = function(fm,ws){
  print(ws)
  lm(formula=fm,weights=ws)
}
x=(1:27)
wrapper(fm=ts.input~x,ws=ts.weights)

现在生产

 [1] 2.260324e-05 6.385091e-05 1.803683e-04 5.094997e-04 1.439136e-03 4.064300e-03
 [7] 1.147260e-02 3.234087e-02 9.082267e-02 2.523791e-01 6.815483e-01 1.712317e+00
[13] 3.685455e+00 6.224593e+00 8.232410e+00 9.293615e+00 9.737984e+00 9.905650e+00
[19] 9.966395e+00 9.988078e+00 9.995776e+00 9.998504e+00 9.999471e+00 9.999813e+00
[25] 9.999934e+00 9.999977e+00 9.999992e+00

 Error in eval(expr, envir, enclos) : object 'ws' not found 

如果你运行traceback,你仍然会遇到同样的问题model.frame所以我完全感到困惑。我唯一的结论是a)它与时间序列分析无关tslm,b)问题出在内部传递参数的方式上lm

这可能对您根本没有帮助,但希望至少有人可以过来解释这里发生了什么。我对您如何使用权重的实际问题的临时回答tslm是您不能。