【发布时间】: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 包中找到了一个方法,其中包含aggregate 和first 函数。它并不完美,但它的工作原理和速度很快。 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