web-dev-qa-db-ja.com

`tempdisagg`パッケージの` td`コマンドを使用して月次データを日次データ頻度に分解するにはどうすればよいですか?

月別の頻度データがあり、それを日別の頻度データに分解しようとしています。そこで、以下のコードを使用して、Rのtdパッケージのtempdisaggコマンドを使用します。

 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に使用するデータは次のとおりです。

enter image description here

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

したがって、このデータdatは毎月の頻度ですが、開始と終了はまだこれを反映していません。実際、開始日は1/1997、終了日は2019年9月です。

この月次データdatを日次頻度データに分解する方法について教えてください。

9
Eric

Tempdisaggパッケージは毎月から毎日の分解を許可していないようです。 td()ヘルプファイルの「to」引数から:

文字列( "quarterly"または "monthly")またはスカラー(2、4、7、12など)としての送信先の頻度。入力系列がtsオブジェクトの場合、インジケーターが指定されていなければ引数が必要です。入力系列がベクトルの場合、toは周波数比を示すスカラーでなければなりません。

エラーメッセージ「「to」引数:不明な文字列」は、to =引数は、「quarterly」または「monthly」のみを文字列として受け入れます。

Stats stackexchageの月次データを毎日に分解することについての議論があります: https://stats.stackexchange.com/questions/258810/disaggregate-monthly-forecasts-into-daily-data

少し調べたところ、月次データから日次データに分解されたデータを一貫して使用している人はいないようです。 tempdisaggパッケージは、他のほとんどの人が可能であると判断したもの(年単位から四半期単位または月単位、および倍数でも一定の期間)を実行できるようです。

エリック、私が理解しているように、あなたが何をしようとしているのかを説明するスクリプトを以下に追加しました。

ここでは、実際の価格設定データを使用して、日次価格->月次価格->月次収益->平均日次収益から移動します。

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つの月次収益のみ、2。月次収益の日次平均、3。両方を示す3つのグラフです。それらは同一であるため、3番目の画像のオーバープロットは1つだけを示しています。

Monthly returns

Daily average return from monthly return

Monthly and daily avg plotted together

4
mrhellmann