Come posso usare il comando `td` dal pacchetto` tempdisagg` per disaggregare i dati mensili nella frequenza giornaliera?


9

Ho una frequenza mensile che sto cercando di disaggregare in una frequenza giornaliera. Quindi uso il tdcomando dal tempdisaggpacchetto in R usando il codice seguente:

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

Quindi ricevo il seguente messaggio di errore:

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

I dati per cui utilizzo datsono i seguenti:

inserisci qui la descrizione dell'immagine

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

Quindi, sebbene questi dati datsiano in frequenza mensile, l'inizio e la fine non riflettono ancora questo. In effetti, la data di inizio è 1/1997 e la data di fine è 9/2019.

Posso ricevere assistenza per disaggregare questi dati mensili datin dati di frequenza giornalieri, per favore?


1
Eric, puoi fornire i dati in un formato utilizzabile? Si prega di non pubblicare un'immagine di codice / dati / errori: non può essere copiato o cercato (SEO), rompe gli screen reader e potrebbe non adattarsi bene su alcuni dispositivi mobili. Rif: meta.stackoverflow.com/a/285557/3358272 (e xkcd.com/2116 ). Ti preghiamo di includere direttamente i dati (ad es. dput(head(x))O data.frame(...)). Grazie!
r2evans,

Ho aggiunto la cosa dput (head (x)). Va bene adesso?
Eric

È strano. Se lo faccio dput(ts(head(1:50))), allora ottengo structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). La tua immagine suggerisce che la tua datè una serie temporale, ma la tua c(...)no. Quei due sono datuguali?
r2evans,

Sì, quei due dati sono uguali. I dati e i dati sono diversi.
Eric,

1
Quando guardo tempdisagg.pdf, non riesco a trovare da "daily"nessuna parte e to=dice che supporta "la frequenza di destinazione ad alta frequenza come stringa di caratteri (" trimestrale "o" mensile ") o come scalare (ad es. 2, 4, 7, 12)" . Dove viene suggerito che to="daily"è supportato? Puoi provare to=1? (Non posso davvero aiutare molto oltre a questo. Non conosco bene il pacchetto, ho pensato di poter aiutare genericamente.)
r2evans

Risposte:


4

Sembra che il pacchetto tempdisagg non consenta la disaggregazione mensile o giornaliera. Dal td()file della guida "a" argomento:

frequenza di destinazione ad alta frequenza come stringa di caratteri ("trimestrale" o "mensile") o scalare (ad es. 2, 4, 7, 12). Se le serie di input sono oggetti ts, l'argomento è necessario se non viene fornito alcun indicatore. Se le serie di input sono vettori, deve essere uno scalare che indica il rapporto di frequenza.

Il tuo messaggio di errore "argomento" ": stringa di caratteri sconosciuta" è perché l' to =argomento accetta solo "trimestrale" o "mensile" come stringhe.

C'è qualche discussione sul disaggregare i dati mensili su quotidiani sullo stack stack di statistiche qui: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Dopo alcune ricerche, sembra che nessuno utilizzi costantemente dati disaggregati su base mensile o giornaliera. Il tempdisaggpacchetto sembra essere in grado di ciò che la maggior parte degli altri ha scoperto essere possibile - da annuale a trimestrale o mensile e periodi di tempo coerenti anche multipli.

Eric, ho aggiunto una sceneggiatura che dovrebbe illustrare cosa stai cercando di fare, come ho capito.

Qui utilizziamo dati sui prezzi reali per passare dai prezzi giornalieri -> prezzi mensili -> rendimenti mensili -> rendimenti giornalieri medi.

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

Ecco tre grafici che mostrano 1. solo rendimenti mensili, 2. media giornaliera dai rendimenti mensili, 3. entrambi insieme. Poiché sono identici, la sovraincisione nella terza immagine ne mostra solo una.

Ritorni mensili

Rendimento medio giornaliero dal rendimento mensile

Media mensile e giornaliera tracciati insieme


Nel mio caso, la cifra mensile è la media non la somma richiesta dal post della domanda. Ad esempio, i miei dati mostrano una media del 4% per gennaio. Se sto cercando di trasformarmi in una figura quotidiana, al momento stavo pensando di usare questo 4% immediatamente per il 1 ° gennaio e così via. Ma non sono sicuro che sia ancora ok farlo.
Eric,

1
Posso chiederti se hai qualche idea su questo caso (come richiesto dalla mia domanda postata) per favore?
Eric,

Dai dati che hai pubblicato non è chiaro che hai tariffe, sembra che i prezzi. In un commento hai menzionato che hai un tasso medio di 0,04 per gennaio. Se hai intenzione di passare da un tasso medio mensile -> tasso medio giornaliero, il principio generalmente accettato è il tasso mensile / 30 (credo). Per .04 (4%) che hai citato a gennaio, una tariffa giornaliera sarebbe di 0,04 / 30 o ~ .001315. Se potessi chiarire la tua domanda per me, questo potrebbe aiutare. Hai dati di prezzo o dati di tariffa? E qual è il risultato che ti aspetti? Ad ogni modo, id non sembra che tempdisagg sia la soluzione.
mrhellmann,

1
I dati che ho pubblicato sono ad esempio un indice mensile con un benchmark di 100. Perché è un indice, non si somma.
Eric,

Ok. Se sei interessato a dati percentuali (resi) e disponi di dati sui prezzi in serie temporali regolari, puoi utilizzare quantmod::monthlyReturno PerformanceAnalytics::Return.calculateper ottenere i rendimenti (mensili). Da lì se è necessario assumere rendimenti giornalieri, è possibile utilizzare il metodo sopra (commento).
mrhellmann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.