`midasr` 包的预测:包含新的高频值

6
我正在尝试使用所谓的MIDAS概念计算一步预测。在这个概念中,人们根据更高频率的数据计算预测。例如,依赖变量y可以是每年记录的,并且可以通过一个独立变量x来解释,该独立变量可以被抽样,例如季度。

有一个名为midasr的包,提供了许多函数。我可以使用该包中的select_and_forecast函数计算一步预测,如下所示(使用模拟数据,这是midasr包用户指南示例的简化版本):

生成数据:

library(midasr)
set.seed(1001)
n <- 250
trend <- c(1:n)
x <- rnorm(4 * n)
z <- rnorm(12 * n)
fn.x <- nealmon(p = c(1, -0.5), d = 8)
y <- 2 + 0.1 * trend + mls(x, 0:7, 4) %*% fn.x + rnorm(n)

预测计算(通过参数outsample控制样本外预测范围,在我的示例中,我正在计算10个预测值,从240到250)

select_and_forecast(y~trend+mls(y,1,1,"*")+mls(x,0,4),
                          from=list(x=c(4)),
                          to=list(x=rbind(c(14,19))),
                          insample=1:250,outsample=240:250,
                          weights=list(x=c("nealmon","almonp")),
                          wstart=list(nealmon=rep(1,3),almonp=rep(1,3)),
                          IC="AIC",
                          seltype="restricted",
                          ftype="recursive",
                          measures=c("MSE"),
                          fweights=c("EW","BICW")
)$forecasts[[1]]$forecast

现在我想模拟这样一种情况:当一个更高频率的变量的新值可用时,可以使用该变量的新值。例如,一个新的月份已经过去,可以在模型中使用该月份的值。我会按照以下步骤进行,但我非常不确定是否正确:

select_and_forecast(y~trend+mls(y,1,1,"*")+mls(x,0,4),
                          from=list(x=c(3)),   # The only change is the reduction of the lower bound of the range of the lags of the regeressor from 4 to 3
                          to=list(x=rbind(c(14,19))),
                          insample=1:250,outsample=240:250,
                          weights=list(x=c("nealmon","almonp")),
                          wstart=list(nealmon=rep(1,3),almonp=rep(1,3)),
                          IC="AIC",
                          seltype="restricted",
                          ftype="recursive",
                          measures=c("MSE"),
                          fweights=c("EW","BICW")
)$forecasts[[1]]$forecast

理论上,通过缩减时间索引可以将更高频的变量的新观测结果包含进去,但我不确定是否正确使用了该函数。

这个问题是针对熟悉此软件包的人。有人能发表评论吗?

我认为的公式是:

y_t=\beta_0 + \beta_1B(L^{1/m};\theta)x_{t-h+1/m}^{(m)} + \epsilon_t^{(m)}

在我的情况下,使用

并添加1/m以包含新的高频观测。

1个回答

4

我不确定我是否正确理解了你的问题,所以我会举一个例子来回答你的问题。

假设你的响应变量 y 是按年观察的,而预测变量 x 是按季度观察的(这对应于模拟数据)。假设你想要使用前一年的数据来预测下一年的 y 值。那么在包 midasr 中,模型方程如下:

y~mls(x,4:7,4)

数值 4:7 是用于预测的 x 的滞后期,而且每一个 y 观测值伴随着 x 的四个观测值。

midasr 使用以下约定:对于低频率周期 t=l,我们观测到高频率周期 m*(l-1)+1:m。因此,对于年份 1,我们有季度 1,2,3,4,对于年份 2,我们有季度 5,6,7,8。这个约定假设我们在年份 1 时用 x 的第四季度与 y 观测值一起观测,年份 2 时用 x 的第八季度与 y 观测值一起观测等等。

MIDAS 模型是通过滞后期来定义的,从零开始。因此,如果我们想解释同一年份内的 y(就像我们的例子中低频率是年度频率一样),使用同一年份内的 x 值,即第四季度到第一季度,我们使用滞后期 0,1,2,3。如果我们的目标是用年份 1x 值来解释年份 2y,则使用滞后期 4,5,6,7 对应于季度 4,3,2,1

现在假设我们到了年份 3,但我们尚未观测到 y 的值,但我们已经观测到了该年份的第一个季度,即第九个季度。假设我们想要利用这个信息进行预测。第九个季度距离第三个年份有三个高频率的滞后期,因此模型规范现在为:

y~mls(x,3:7,4)

我们还包括去年的所有信息。

因此,如果我的例子与您的问题相关,则是的,只需像您所做的那样更改 from 参数的值即可包含新的高频观测。但是,我强烈建议从一个简单的模型开始,以充分掌握该软件包的工作方式。


然后我尝试使用预测函数 forecast(m,newdata=list(x=rep(NA,3),trend=251)) 进行预测,但是出现了错误信息:Error in mls(x, c(3:20), 4, nealmon) : Incomplete high frequency data - DatamineR
首先尝试不同的起始值。很多事情都取决于它们,所以你至少应该尝试几个。预测函数出现错误,因为您没有提供第一季度的值。如果您正在使用第一季度的现有数据来预测明年,那么您需要提供它。现在您只提供了3个值,而预测期望4个值。请注意,参数“newdata”表示新数据,即在模型估计期间不可用的数据。 - mpiktas
你在哪里找到了 fnscale 参数?我强烈建议阅读有关优化算法和非线性最小二乘问题的内容。MIDAS回归(带限制)是一个非线性模型,因此它对起始值有依赖性,不良的起始值可能会导致误导性拟合。 - mpiktas
我刚刚在select_and_forecast建议的模型中添加了$opt$counts:,然后使用相同的起始值(rep(1,3))自己用midas_r估计了同样的模型,然后出现了略微不同的估计结果,但这很奇怪,因为起始值是相同的... - DatamineR
当你说你添加了$opt$counts时,你的意思是什么?你添加到了什么地方?请注意,select_and_forecast使用信息准则对模型滞后进行选择。这意味着样本大小会调整,以便所有候选模型都使用相同的样本进行估计。这意味着所选模型可能使用较小的样本进行估计。如果手动估计该模型,则使用完整样本。如果模型规范正确且起始值适当,则结果之间的差异应该可以忽略不计。否则,这表明存在问题。 - mpiktas
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接