首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使R中的MIDAS回归的所有月份都有相同的天数(例如22天)

如何使R中的MIDAS回归的所有月份都有相同的天数(例如22天)
EN

Stack Overflow用户
提问于 2015-03-02 02:26:20
回答 1查看 1.1K关注 0票数 3

这是这两个职位的后续问题。

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提到

你必须使所有的月份都有相同的天数。然后把频率设为这个数字。您可以通过丢弃数据、填充NAs或外推来实现这一点。

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

我尝试了不同的搜索方法,但没有找到一个容易实现的方法。

我用dplyr让每个月有31天的7-11天。

代码语言:javascript
复制
# 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)

我怀疑这造成了一个问题,因为太多的NAs。

我把新的每日数据放入R.的MIDAS回归中,结果无效。所有的重量功能都不起作用。

代码语言:javascript
复制
# 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将根据参数添加NAs。

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

代码语言:javascript
复制
# 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天的数据。

代码语言:javascript
复制
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个NAs。 2应在响应变量的频率上收集数据。就我而言,它是季度的。

该函数可用于zoo中的zoo函数。我猜它与group_by + dodplyr中的工作相同:拆分、操作和返回结果列表。我试试这个

代码语言:javascript
复制
tsxdaily <- aggregate(tsx.zoo, yearqtr, padd_nas, 66)

yearqtr是响应变量的频率。

EN

回答 1

Stack Overflow用户

发布于 2015-03-02 09:29:22

以下是如何添加NAs的一种可能的方法。

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

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

代码语言:javascript
复制
> 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天(例如)。

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

代码语言:javascript
复制
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)
        }
}

下面是一个示例,说明该函数是如何工作的:

代码语言:javascript
复制
> padd_nas(1:4,7)
[1] NA NA NA  1  2  3  4
> 

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

代码语言:javascript
复制
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]>  

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

代码语言:javascript
复制
> pv <- pdt$pv %>% unlist
> pv
 [1] NA  1  2  3  4  5  6 NA NA NA  7  8  9 10

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

代码语言:javascript
复制
> 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进行比较。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28801815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档