如何使用tempdisagg软件包中的td命令将每月数据分解为每日数据频率?


9

我有一个每月频率数据,试图将其分解为每日频率数据。所以我使用下面的代码tdtempdisaggR中的包中使用命令:

 dat=ts(data[,2])
 result=td(dat~1, conversion = "average", to = "day", method = "chow-lin-maxlog")

然后我收到以下错误消息:

 Error in td(dat ~ 1, conversion = "average", to = "day", method = "chow-lin-maxlog") : 'to' argument: unknown character string

我使用的数据dat如下:

在此处输入图片说明

 > dput(head(dat))
 c(82.47703009, 84.63094431, 70.00659987, 78.81135651, 74.749746,82.95638213)

因此,尽管此数据dat以每月频率显示,但开始和结束尚未反映出来。实际上,开始日期是1/1997,结束日期是9/2019。

在将此月度数据dat分解为每日频率数据方面,我可以得到帮助吗?


1
埃里克,您能以可用格式提供数据吗?请不要张贴代码/数据/错误的图像:无法复制或搜索(SEO),它会破坏屏幕阅读器,并且在某些移动设备上可能不合适。参考:meta.stackoverflow.com/a/285557/3358272(和xkcd.com/2116)。请直接添加数据(例如dput(head(x))data.frame(...))。谢谢!
r2evans '19

我添加了dput(head(x))东西。现在可以吗?
艾瑞克(Eric)

真奇怪 如果我这样做dput(ts(head(1:50))),我就会得到structure(1:6, .Tsp = c(1, 6, 1), class = "ts")。您的图像表明您dat是一个时间序列,但您c(...)不是。那两个dat相同吗?
r2evans '19

是的,那两个孩子是一样的。数据和数据不同。
埃里克

1
当我查看时tempdisagg.pdf,找不到"daily"任何位置,并to=说它支持“高频目标频率作为字符串(“每季度”或“每月”)或标量(例如,2、4、7、12)。建议在哪里to="daily"支持?你可以试试to=1吗?(我真的不能提供更多帮助。我不太了解这个软件包,以为我可以提供一般帮助。)
r2evans

Answers:


4

看起来tempdisagg软件包不允许进行每月到每天的分类。从td()帮助文件“ to”参数中:

高频目标频率,例如字符串(“每季度”或“每月”)或标量(例如2、4、7、12)。如果输入序列是ts对象,则在没有给出指示符的情况下该参数是必需的。如果输入序列是向量,则to必须是表示频率比的标量。

您的错误消息“'to'参数:未知字符串”是因为该to =参数仅接受“每季度”或“每月”作为字符串。

这里有一些关于在统计堆栈交换上将每月数据分解为每日的讨论:https : //stats.stackexchange.com/questions/258810/disaggregate-monthly-forecasts-into-daily-data

经过一番搜索后,似乎没人连续使用每月分类的数据。该tempdisagg软件包似乎能够满足大多数其他人的可能-每年一次,每季度一次或每月一次,并且时间段甚至是整数倍。

埃里克(Eric),根据我的理解,我在下面添加了一个脚本,该脚本应说明您正在尝试执行的操作。

在这里,我们使用实际定价数据从每日价格->每月价格->每月收益->平均每日收益转移。

library(quantmod)
library(xts)
library(zoo)
library(tidyverse)
library(lubridate)

# Get price data to use as an example
getSymbols('MSFT')

#This data has more information than we want, remove unwanted columns:
msft <- Ad(MSFT) 

#Add new column that acts as an 'indexed price' rather than 
# actual price data.  This is to show that calculated returns
# don't depend on real prices, data indexed to a value is fine.
msft$indexed <- scale(msft$MSFT.Adjusted, center = FALSE)

#split into two datasets  
msft2 <- msft$indexed
msft$indexed <- NULL


#msft contains only closing data, msft2 only contains scaled data (not actual prices)
#  move from daily data to monthly, to replicate the question's situation.
a <- monthlyReturn(msft)
b <- monthlyReturn(msft2)

#prove returns based on rescaled(indexed) data and price data is the same:
all.equal(a,b)

# subset to a single year
a <- a['2019']
b <- b['2019']

#add column with days in each month
a$dim <- days_in_month(a) 
a$day_avg <- a$monthly.returns / a$dim  ## <- This must've been left out

day_avgs <- data.frame(day_avg = rep(a$day_avg, a$dim))


# daily averages timesereis from monthly returns.
z <- zoo(day_avgs$day_avg, 
         seq(from = as.Date("2019-01-01"), 
             to = as.Date("2019-12-31"), 
             by = 1)) %>%
  as.xts()

#chart showing they are the same:
PerformanceAnalytics::charts.PerformanceSummary(cbind(a$monthly.returns, z))

这是三个图表,显示1. 1.仅月度收益; 2.月度收益的每日平均值; 3.两者合计。由于它们是相同的,因此在第三幅图像中进行的过度绘图仅显示一个。

月收益

每日平均回报与每月回报

每月平均和每日平均绘制在一起


就我而言,每月数字是平均值而不是您的问题帖子所要求的总和。例如,我的数据显示一月份的平均值为4%。如果要转换为每日数字,我目前正在考虑立即在1月1日使用这4%,以此类推。但不确定这样做是否还可以。
埃里克(Eric)

1
请问您对此案有任何想法吗?
艾瑞克(Eric)

从您发布的数据中尚不清楚您是否拥有费率,看起来像是价格。您在评论中提到一月份的平均比率为.04。如果您要从每月平均费率->每日平均费率出发,通常公认的原则是每月费率/ 30(我认为)。您在一月份提到的.04(4%),每日汇率将是.04 / 30或〜.001315。如果您可以为我澄清您的问题,那可能会有所帮助。您有价格数据还是价格数据?您期望得到什么结果?无论哪种方式,id都不像tempdisagg是解决方案。
mrhellmann '19

1
我发布的数据是一个月度索引,例如基准为100。因为它是一个索引,所以它不会累加。
艾瑞克(Eric)

好。如果您对百分比数据(收益)感兴趣,并有固定时间序列的价格数据,则可以使用quantmod::monthlyReturnPerformanceAnalytics::Return.calculate获取(每月)收益。从那里开始,如果您需要承担每日收益,则可以使用上述(评论)方法。
mrhellmann '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.