【问题标题】:How to make all the months to have an equal number of days (for example 22 days) for a MIDAS regression in R如何使所有月份在 R 中的 MIDAS 回归具有相同的天数(例如 22 天)
【发布时间】:2015-05-02 08:01:04
【问题描述】:

这是这两个帖子的后续问题。

How to deal with impossible dates for midasr package

https://stats.stackexchange.com/questions/77495/what-can-i-do-with-these-two-time-series

我需要使用 R 中 MIDAS 包中的 mls 函数将高频(每日)财务数据转换为低频(季度)宏观经济数据。

作者@mpiktas 提到

您必须使所有月份的天数相等。然后 将频率设置为该数字。您可以通过丢弃数据来实现这一点, 填充 NA 或外推。

您可以使用 zoo 对象使填充更容易,但最后 应该传递简单的数字向量。

我尝试了不同的搜索方式,但没有找到一种简单的实现方式。

我使用 dplyr 让每个月有 31 天,NA 为 7-11。

# generate the date vector
library(midasr)
library(dplyr)
library(quantmod) 
tsxdate <- as.Date( paste(1979, rep(1:12, each=31), 1:31, sep="-") )

for (year in 1980:2015){
    tsxdate <- c(tsxdate,as.Date( paste(year, rep(1:12, each=31), 1:31, sep="-") ))
    }
# transform to dataframe
tsxdate.df <- as.data.frame(tsxdate)
# get the stock market index from yahoo
tsxindex <- getSymbols("^GSPTSE",src="yahoo", from = '1977-01-01', auto.assign = FALSE)
# merge two data frame to get each month with 31 days
tsx.df <- left_join(tsxdate.df, tsxindex)

我怀疑这是否会因为 NA 太多而导致问题。

我将新的每日数据放入 R 中的 MIDAS 回归中。它不起作用。权重函数都不起作用。

# since each month has 31 days. one quarter yy correspond to 93 days data. 
midas_r(midas_r(yy~trend+fmls(zz,30,93,nealmon) ,start=list(zz=rep(0,4))), Ofunction="nls")

您能告诉我如何使所有月份的天数相等吗?

更新:

最后,我在zoo 包中找到了一个方法,其中包含aggregatefirst 函数。它并不完美,但它的工作原理和速度很快。 first会根据参数添加NA。

我仍然需要弄清楚如何将其融入 MIDAS 回归。

# get data
tsx <- getSymbols("^GSPTSE",src="yahoo", from = '1977-01-01', auto.assign = FALSE)
# subset 
# generate a zoo object
library(zoo)
tsx.zoo <- zoo(tsx$GSPTSE.Adjusted)
# group by yearmonth and take first 22 days data.
days <-aggregate(tsx.zoo, as.yearmon, first, 22)

看起来像这样:每一行是一个月,有 22 天的数据。

Jun 1979 1614.29      NA      NA      NA      NA      NA      NA      NA      NA      NA
Jul 1979 1614.29 1598.73 1579.88 1582.57 1582.27 1576.19 1559.23 1529.81 1533.50 1547.66
Aug 1979 1554.14 1556.94 1553.84 1553.84 1551.95 1561.23 1562.52 1571.00 1578.08 1580.28
Sep 1979 1685.11 1657.58 1690.10 1720.92 1716.53 1711.34 1722.71 1714.63 1727.50 1724.51
Oct 1979 1749.05 1767.40 1775.98 1786.35 1800.12 1800.12 1735.88 1685.21 1681.52 1670.65
Nov 1979 1599.33 1606.81 1596.54 1592.94 1574.49 1569.20 1583.97 1608.70 1611.00 1619.78

Jun 1979      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
Jul 1979 1556.94 1546.86 1548.46 1553.54 1542.07 1543.17 1552.85 1566.01 1573.99 1564.12
Aug 1979 1596.64 1602.82 1615.09 1636.53 1653.09 1660.97 1657.78 1665.46 1674.44 1674.64
Sep 1979 1714.73 1717.53 1732.59 1736.48 1731.19 1732.49 1746.75 1754.33 1747.45      NA
Oct 1979 1639.03 1613.19 1616.29 1635.34 1593.44 1533.40 1522.12 1534.49 1517.24 1523.92
Nov 1979 1628.55 1621.57 1624.36 1627.56 1620.27 1647.51 1677.93 1683.81 1690.70 1698.97

Jun 1979      NA      NA
Jul 1979 1554.14      NA
Aug 1979 1674.24 1675.43
Sep 1979      NA      NA
Oct 1979 1538.68 1552.25

再次更新:

@mpiktas 提供了一种更好、更正确的方法。

每个周期开始时应填充 1 个 NA。

2 数据应以响应变量的频率收集。就我而言,它是每季度一次。

他的函数可以在aggregate函数中使用zoo。我猜它和group_by 中的do 做同样的工作dplyr:拆分、操作并返回结果列表。我试试这个

tsxdaily <- aggregate(tsx.zoo, yearqtr, padd_nas, 66)

yearqtr是响应变量的频率。

【问题讨论】:

  • 你说没有一个权重函数起作用。给出了什么错误信息?您能否发布一个涉及调用midas_r 的可重现示例?
  • 我了解到您的响应变量是季度的,因此您需要将您的每日数据与季度对齐,而不是月。
  • 谢谢@mpiktas。现在可以了。是的,我使用每日数据来预测季度 GDP。我正在比较 MIDASr 和贝叶斯变量选择 (spikeslab)。我认为权重函数可以减少维度。其他尺寸减小也应该起作用。我想尝试一些类似 Lasso 或 boosting 的东西。我想知道我是否可以跳过称重功能并直接使用其他方法来减少尺寸。许多研究人员在他们的论文中提到,即使他们同时使用其他方法,他们仍然会估计权重函数中的参数。
  • 那是哪张纸?可以给个引用吗?
  • 嗨@mpiktas,我不确定是否需要开始新帖子。其中一篇论文是Variable Selection in Predictive MIDAS Models。作者在第 6 页说kernel mK() which smooths out the K past values of the variable xt。在他的贝叶斯变量选择部分,他仍然在第 11 页估计了权重函数中的 theta(an Independence Chain Metropolis Hasting algorithm (iMH) within the Gibbs sampler to draw the posterior conditional distribution of theta.)。

标签: r time-series xts zoo forecasting


【解决方案1】:

这是添加 NA 的一种可能方式。

首先,请注意 MIDAS 回归将重点放在周期的最后一个值上,因此您需要将 NA 放在前面,而不是放在后面。

假设我们有以下虚拟数据:

> dt <- data.frame(Day=1:10,Quarter=c(rep(1,6),rep(2,4)),value=1:10)
> dt
   Day Quarter value
1    1       1     1
2    2       1     2
3    3       1     3
4    4       1     4
5    5       1     5
6    6       1     6
7    7       2     7
8    8       2     8
9    9       2     9
10  10       2    10

在这个例子中,有两个季度,第一个有 6 天,第二个有 4 天。假设我们要协调数据,使季度有 7 天(例如)。

定义在数据开头添加 NA 的简单函数:

padd_nas <- function(x, desired_length) {
    n <- length(x)
    if(n < desired_length) {
        c(rep(NA,desired_length-n),x)
    } else {
        tail(x,desired_length)
        }
}

下面是一个说明这个函数如何工作的例子:

> padd_nas(1:4,7)
[1] NA NA NA  1  2  3  4
> 

现在为每个季度添加 NA,并确保数据按天排序:

library(dplyr)
pdt <- dt %>% arrange(Day) %>% group_by(Quarter) %>% do(pv = padd_nas(.$value, 7))  

> pdt
Source: local data frame [2 x 2]
Groups: <by row>

  Quarter       pv
1       1 <int[7]>
2       2 <int[7]>  

要获得填充结果,只需在 pv 列上使用 unlist

> pv <- pdt$pv %>% unlist
> pv
 [1] NA  1  2  3  4  5  6 NA NA NA  7  8  9 10

现在我们可以使用mls 为 MIDAS 回归做准备。假设每个季度只有最后 3 天是相关的:

> library(midasr)
> mls(pv, 0:2, 7)
     X.0/m X.1/m X.2/m
[1,]     6     5     4
[2,]    10     9     8

将此与原始数据dt 进行比较。

这种方法可以推广到任何低频和高频数据配置。

【讨论】:

  • 谢谢@mpiktas。有用。它使生活更轻松。这条线给了我我想要的一切。而且我发现您的函数也适用于 zoo 包中的 aggregate 函数。 tsxdaily &lt;- aggregate(tsx.zoo, as.yearqtr, padd_nas, 66) 这个方法很类似dplyr。而且我刚刚意识到dplyr中的do可以给出一个对象列表,这非常有用。再次感谢您。
猜你喜欢
  • 2012-08-23
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2021-11-25
相关资源
最近更新 更多