Wie kann ich den Befehl `td` aus dem Paket` tempdisagg` verwenden, um monatliche Daten in tägliche Datenhäufigkeit zu disaggregieren?

9

Ich habe monatliche Frequenzdaten, die ich in tägliche Frequenzdaten aufteilen möchte. Also benutze ich den tdBefehl aus dem tempdisaggPaket in R mit dem folgenden Code:

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

Dann erhalte ich folgende Fehlermeldung:

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

Die Daten, für die ich verwende, datlauten wie folgt:

Geben Sie hier die Bildbeschreibung ein

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

Obwohl diese Daten datmonatlich vorliegen, spiegeln Start und Ende dies noch nicht wider. Tatsächlich ist das Startdatum 1/1997 und das Enddatum 9/2019.

Darf ich datbitte Hilfe bei der Aufteilung dieser monatlichen Daten in tägliche Frequenzdaten erhalten?

Eric
quelle
1
Eric, können Sie die Daten in einem verwendbaren Format bereitstellen? Bitte posten Sie kein Bild von Code / Daten / Fehlern: Es kann nicht kopiert oder durchsucht werden (SEO), es bricht Bildschirmleser und es passt möglicherweise nicht gut auf einige mobile Geräte. Ref: meta.stackoverflow.com/a/285557/3358272 (und xkcd.com/2116 ). Bitte geben Sie einfach die Daten (zB dput(head(x))oder data.frame(...)) direkt an. Vielen Dank!
R2evans
Ich habe das dput (head (x)) Ding hinzugefügt. Ist es jetzt ok?
Eric
Das ist seltsam. Wenn ich das tue dput(ts(head(1:50))), dann bekomme ich structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Ihr Bild deutet darauf hin, dass dates sich um eine Zeitreihe handelt, Ihre c(...)jedoch nicht. Sind diese beiden datgleich?
R2evans
Ja, diese beiden Daten sind gleich. Die Daten und Daten sind unterschiedlich.
Eric
1
Wenn ich mir das ansehe,tempdisagg.pdf kann ich "daily"nirgendwo etwas finden und to=sage , dass es "hochfrequente Zielfrequenz als Zeichenfolge (" vierteljährlich "oder" monatlich ") oder als Skalar (z. B. 2, 4, 7, 12)" unterstützt . Wo wird vorgeschlagen, dass to="daily"unterstützt wird? Kannst du es versuchen to=1? (Ich kann nicht wirklich viel darüber hinaus helfen. Ich kenne das Paket nicht gut, dachte, ich könnte generisch helfen.)
R2evans

Antworten:

4

Es sieht so aus, als ob das Tempdisagg-Paket keine monatliche bis tägliche Disaggregation zulässt. Aus dem td()Argument 'bis' der Hilfedatei:

Hochfrequenz-Zielfrequenz als Zeichenfolge ("vierteljährlich" oder "monatlich") oder als Skalar (z. B. 2, 4, 7, 12). Wenn die Eingabeserien ts Objekte sind, ist das Argument erforderlich, wenn kein Indikator angegeben ist. Wenn die Eingangsreihen Vektoren sind, muss to ein Skalar sein, der das Frequenzverhältnis angibt.

Ihre Fehlermeldung "'to' Argument: unbekannte Zeichenfolge" ist, weil die to = Argument nur 'vierteljährlich' oder 'monatlich' als Zeichenfolgen akzeptiert.

Es gibt einige Diskussionen über die Disaggregation von monatlichen Daten zu täglichen Daten auf dem Statistik-Stapelaustausch hier: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Nach einigem Suchen sieht es so aus, als würde niemand konsequent disaggregierte monatliche bis tägliche Daten verwenden. Das tempdisaggPaket scheint in der Lage zu sein, das zu tun, was die meisten anderen für möglich gehalten haben - jährlich bis vierteljährlich oder monatlich und Zeiträume, die sogar um ein Vielfaches konsistent sind.

Eric, ich habe unten ein Skript hinzugefügt, das veranschaulichen soll, was Sie versuchen, so wie ich es verstehe.

Hier verwenden wir reale Preisdaten, um von Tagespreisen -> monatlichen Preisen -> monatlichen Renditen -> durchschnittlichen täglichen Renditen zu wechseln.

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))

Hier sind drei Diagramme, die 1. nur monatliche Renditen, 2. Tagesdurchschnitt aus monatlichen Renditen, 3. beide zusammen zeigen. Da sie identisch sind, zeigt die Überzeichnung im dritten Bild nur eine.

Monatliche Rendite

Tägliche durchschnittliche Rendite aus monatlicher Rendite

Monatlicher und täglicher Durchschnitt zusammen aufgetragen

mrhellmann
quelle
In meinem Fall ist die monatliche Zahl der Durchschnitt und nicht die Summe, die in Ihrem Fragenbeitrag abgefragt wird. Zum Beispiel zeigen meine Daten einen Durchschnitt von 4% für Januar. Wenn ich versuche, mich in eine tägliche Zahl zu verwandeln, habe ich derzeit darüber nachgedacht, diese 4% sofort für den 1. Januar zu verwenden und so weiter. Aber nicht sicher, ob dies noch in Ordnung ist.
Eric
1
Darf ich fragen, ob Sie eine Idee zu diesem Fall haben (wie in meiner gestellten Frage angegeben)?
Eric
Aus den von Ihnen veröffentlichten Daten geht nicht hervor, dass Sie Preise haben, es sieht aus wie Preise. Sie erwähnen in einem Kommentar, dass Sie eine durchschnittliche Rate von 0,04 für Januar haben. Wenn Sie von einer monatlichen Durchschnittsrate -> einer täglichen Durchschnittsrate ausgehen, ist das allgemein akzeptierte Prinzip die monatliche Rate / 30 (glaube ich). Für .04 (4%), die Sie im Januar erwähnt haben, wäre ein Tagessatz .04 / 30 oder ~ .001315. Wenn Sie Ihre Frage an mich klären könnten, könnte das helfen. Haben Sie Preisdaten oder Preisdaten? Und was ist das Ergebnis, das Sie erwarten? In beiden Fällen sieht id nicht so aus, als wäre Tempdisagg die Lösung.
Mrhellmann
1
Die Daten, die ich veröffentlicht habe, sind ein monatlicher Index mit einer Benchmark von beispielsweise 100. Da es sich um einen Index handelt, summiert er sich nicht.
Eric
OK. Wenn Sie an prozentualen Daten (Renditen) interessiert sind und Preisdaten in einer regelmäßigen Zeitreihe haben, können Sie die (monatlichen) Renditen verwenden quantmod::monthlyReturnoder PerformanceAnalytics::Return.calculateabrufen. Von dort aus können Sie die obige (Kommentar-) Methode verwenden, wenn Sie von einer täglichen Rendite ausgehen müssen.
Mrhellmann