Comment puis-je utiliser la commande `td` du package` tempdisagg` pour désagréger les données mensuelles en fréquence de données quotidiennes?

9

J'ai des données de fréquence mensuelles que j'essaie de désagréger en données de fréquence quotidiennes. J'utilise donc la tdcommande du tempdisaggpackage dans R en utilisant le code ci-dessous:

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

Ensuite, j'obtiens le message d'erreur suivant:

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

Les données que j'utilise datsont les suivantes:

entrez la description de l'image ici

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

Ainsi, bien que ces données datsoient en fréquence mensuelle, le début et la fin ne le reflètent pas encore. En fait, la date de début est 1/1997 et la date de fin est 9/2019.

Puis-je obtenir de l'aide sur la ventilation de ces données mensuelles en données de datfréquence quotidiennes, s'il vous plaît?

Eric
la source
1
Eric, pouvez-vous fournir les données dans un format utilisable? Veuillez ne pas publier une image de code / données / erreurs: elle ne peut pas être copiée ou recherchée (SEO), elle casse les lecteurs d'écran et peut ne pas bien s'adapter sur certains appareils mobiles. Réf: meta.stackoverflow.com/a/285557/3358272 (et xkcd.com/2116 ). Veuillez simplement inclure les données (par exemple, dput(head(x))ou data.frame(...)) directement. Merci!
r2evans
J'ai ajouté la chose dput (head (x)). C'est bon maintenant?
Eric
C'est étrange. Si je le fais dput(ts(head(1:50))), alors j'obtiens structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Votre image suggère que votre datest une série chronologique, mais ce c(...)n'est pas le cas. Ces deux datsont-ils les mêmes?
r2evans
Oui, ces deux dat sont identiques. Les données et dat sont différentes.
Eric
1
Quand je regarde tempdisagg.pdf, je ne trouve "daily"nulle part, et to=dit qu'il prend en charge "la fréquence de destination haute fréquence en tant que chaîne de caractères (" trimestrielle "ou" mensuelle ") ou en tant que scalaire (par exemple 2, 4, 7, 12)" . Où est-il suggéré que cela to="daily"soit pris en charge? Pouvez-vous essayer to=1? (Je ne peux pas vraiment aider bien au-delà. Je ne connais pas bien le paquet, j'ai pensé que je pouvais aider de manière générique.)
r2evans

Réponses:

4

Il semble que le package tempdisagg ne permette pas une ventilation mensuelle à quotidienne. Du td()fichier d'aide 'à' argument:

fréquence de destination haute fréquence sous forme de chaîne de caractères ("trimestrielle" ou "mensuelle") ou sous forme scalaire (par exemple 2, 4, 7, 12). Si les séries en entrée sont des objets ts, l'argument est nécessaire si aucun indicateur n'est donné. Si les séries d'entrée sont des vecteurs, to doit être un scalaire indiquant le rapport de fréquence.

Votre message d'erreur "argument" à ": chaîne de caractères inconnue" est dû au fait que l' to =argument n'accepte que "trimestriellement" ou "mensuellement" comme chaînes.

Il y a une discussion sur la désagrégation des données mensuelles au quotidien sur les statistiques stackexchage ici: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Après quelques recherches, il semble que personne n'utilise systématiquement des données mensuelles à quotidiennes désagrégées. Le tempdisaggpaquet semble être capable de ce que la plupart des autres ont trouvé possible - annuel à trimestriel ou mensuel, et des périodes de temps cohérentes même multiples.

Eric, j'ai ajouté un script ci-dessous qui devrait illustrer ce que vous essayez de faire, si je comprends bien.

Ici, nous utilisons des données de tarification réelles pour passer des prix quotidiens -> prix mensuels -> rendements mensuels -> rendements quotidiens moyens.

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

Voici trois graphiques montrant 1. les rendements mensuels seulement, 2. la moyenne quotidienne des rendements mensuels, 3. les deux ensemble. Comme ils sont identiques, le surplotage dans la troisième image n'en montre qu'une seule.

Retours mensuels

Rendement quotidien moyen par rapport au rendement mensuel

Moyenne mensuelle et quotidienne tracées ensemble

mrhellmann
la source
Dans mon cas, le chiffre mensuel est la moyenne et non la somme comme le demande votre question. Par exemple, mes données montrent une moyenne de 4% pour janvier. Si j'essaie de me transformer en chiffre quotidien, je pensais actuellement à utiliser ce 4% tout de suite pour le 1er janvier et ainsi de suite. Mais je ne sais pas si c'est toujours possible de le faire.
Eric
1
Puis-je vous demander si vous avez une idée sur ce cas (comme ma question posée le demande) s'il vous plaît?
Eric
Il ne ressort pas clairement des données que vous avez publiées que vous avez des tarifs, cela ressemble à des prix. Vous mentionnez dans un commentaire que vous avez un taux moyen de 0,04 pour janvier. Si vous allez passer d'un taux moyen mensuel -> taux moyen quotidien, le principe généralement accepté est le taux mensuel / 30 (je pense). Pour 0,04 (4%) que vous avez mentionné en janvier, un taux journalier serait de 0,04 / 30 ou ~ 0,001315. Si vous pouviez clarifier votre question pour moi, cela pourrait aider. Avez-vous des données sur les prix ou les taux? Et quel résultat attendez-vous? Quoi qu'il en soit, id ne semble pas que tempdisagg soit la solution.
mrhellmann
1
Les données que j'ai publiées sont un indice mensuel avec un indice de référence de 100 par exemple. Parce que c'est un index, il ne s'additionne pas.
Eric
D'accord. Si vous êtes intéressé par les données de pourcentage (retours) et que vous avez des données de prix dans une série chronologique régulière, vous pouvez utiliser quantmod::monthlyReturnou PerformanceAnalytics::Return.calculatepour obtenir les retours (mensuels). De là, si vous devez assumer des retours quotidiens, vous pouvez utiliser la méthode ci-dessus (commentaire).
mrhellmann