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


9

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

 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、終了日は2019年9月です。

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


1
エリック、使用可能な形式でデータを提供できますか?コード/データ/エラーの画像を投稿しないでください。コピーまたは検索(SEO)できず、スクリーンリーダーが壊れ、一部のモバイルデバイスにうまく適合しない場合があります。参照:meta.stackoverflow.com/a/285557/3358272(およびxkcd.com/2116)。データ(dput(head(x))または、などdata.frame(...))を直接含めてください。ありがとう!
r2evans

dput(head(x))を追加しました。今大丈夫?
Eric

それは変だ。私がするならdput(ts(head(1:50)))、私は得るstructure(1:6, .Tsp = c(1, 6, 1), class = "ts")。あなたの画像はあなたdatが時系列であることを示唆していますが、あなたc(...)はそうではありません。これら2つdatは同じですか?
r2evans

はい、これら2つのデータは同じです。データとデータは異なります。
Eric

1
を見るとtempdisagg.pdf"daily"どこにも見つからず、「文字列(「四半期」または「月間」)またはスカラー(例:2、4、7、12)として高頻度の宛先頻度をto=サポートしていると表示されます。to="daily"サポートされていることはどこに示唆されていますか?やってみto=1ませんか?(私はそれ以上はあまり役に立ちません。パッケージをよく知らないので、一般的には助けられると思いました。)
r2evans

回答:


4

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

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

エラーメッセージ "to to argument:unknown character string"は、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つだけを示しています。

毎月の返品

月次収益からの毎日の平均収益

一緒にプロットされた月次および日次平均


私の場合、月次の数値は平均であり、質問の投稿が求める合計ではありません。たとえば、私のデータは1月の平均4%を示しています。私が毎日の数値に変換しようとしている場合、私は現在、この4%をすぐに1月1日などに使用することを考えていました。しかし、これで問題ないかどうかはわかりません。
Eric

1
(私の投稿された質問が要求するように)このケースについて何か考えがありますか?
Eric

あなたが投稿したデータからはレートがあることは明らかではありません、それは価格のように見えます。コメントで、1月の平均レートは.04であると述べています。月平均レート->日平均レートから行く場合、一般的に受け入れられている原則は月レート/ 30(私は思う)です。.04(4%)の場合、1月に1日の料金は.04 / 30または〜.001315になります。質問を明確にしていただければ助かります。価格データまたは料金データはありますか?そして、あなたが期待している結果は何ですか?どちらにしても、idはtempdisaggが解決策であるようには見えません。
mrhellmann

1
私が投稿したデータは、たとえばベンチマークが100の月次インデックスです。インデックスなので足しません。
Eric

OK。パーセンテージデータ(収益)に興味があり、定期的な時系列の価格データがある場合は、quantmod::monthlyReturnまたはPerformanceAnalytics::Return.calculateを使用して(月次)収益を取得できます。そこから毎日の返品を想定する必要がある場合は、上記の(コメント)メソッドを使用できます。
mrhellmann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.