Jak mogę użyć polecenia `td` z pakietu` tempdisagg`, aby rozdzielić dane miesięczne na częstotliwość danych dziennych?


9

Mam miesięczne dane o częstotliwości, które staram się podzielić na dane o częstotliwości dziennej. Więc używam tdpolecenia z tempdisaggpakietu w R, używając poniższego kodu:

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

Następnie pojawia się następujący komunikat o błędzie:

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

Dane, których używam, datsą następujące:

wprowadź opis zdjęcia tutaj

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

Więc chociaż dane te datsą z częstotliwością miesięczną, początek i koniec jeszcze tego nie odzwierciedlają. W rzeczywistości data początkowa to 1/1997, a data końcowa to 9/2019.

Czy mogę uzyskać pomoc w podziale tych miesięcznych danych datna dzienne dane dotyczące częstotliwości?


1
Eric, czy możesz podać dane w użytecznym formacie? Proszę nie publikować obrazu kodu / danych / błędów: nie można go skopiować ani przeszukać (SEO), psuje czytniki ekranu i może nie pasować do niektórych urządzeń mobilnych. Patrz: meta.stackoverflow.com/a/285557/3358272 (i xkcd.com/2116 ). Proszę tylko podać dane (np. dput(head(x))Lub data.frame(...)) bezpośrednio. Dzięki!
r2evans

Dodałem rzecz dput (head (x)). Czy teraz jest dobrze?
Eric,

To dziwne. Jeśli tak dput(ts(head(1:50))), to rozumiem structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Twój obraz sugeruje, że datjest to szereg czasowy, ale c(...)nie. Czy te dwie datrzeczy są takie same?
r2evans

Tak, te dwa dane są takie same. Dane i dane są różne.
Eric,

1
Kiedy patrzę tempdisagg.pdf, nie mogę "daily"nigdzie znaleźć , i to=mówi, że obsługuje „docelową częstotliwość o wysokiej częstotliwości jako ciąg znaków („ kwartalny ”lub„ miesięczny ”) lub jako skalar (np. 2, 4, 7, 12)” . Gdzie sugeruje się, że to="daily"jest obsługiwany? Można spróbować to=1? (Naprawdę nie mogę nic na to
poradzić

Odpowiedzi:


4

Wygląda na to, że pakiet tempdisagg nie pozwala na codzienną dezagregację. Z td()argumentu „do” pliku pomocy:

częstotliwość docelowa wysokiej częstotliwości jako ciąg znaków („kwartalny” lub „miesięczny”) lub jako skalar (np. 2, 4, 7, 12). Jeśli szereg wejściowy jest obiektem ts, argument jest konieczny, jeśli nie podano żadnego wskaźnika. Jeśli szeregami wejściowymi są wektory, musi to być skalar wskazujący stosunek częstotliwości.

Twój komunikat o błędzie „” na „argument: ciąg znaków nieznany” jest spowodowany tym, że to =argument przyjmuje tylko ciąg „ kwartalny” lub „miesięczny”.

Trwa dyskusja na temat dezagregacji danych miesięcznych do dziennych na stosie statystyk: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Po kilku poszukiwaniach wygląda na to, że nikt nie korzysta konsekwentnie z dezagregowanych danych miesięcznych do dziennych. ThetempdisaggPakiet wydaje się być zdolna do tego, co większość innych znalazły się możliwe - corocznie na kwartał lub co miesiąc, a okresy, które są zgodne nawet wielokrotności.

Eric, dodałem poniżej skrypt, który powinien ilustrować to, co próbujesz zrobić, tak jak rozumiem.

Tutaj wykorzystujemy rzeczywiste dane cenowe, aby przejść od cen dziennych -> cen miesięcznych -> miesięcznych zwrotów -> średnich dziennych zwrotów.

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

Oto trzy wykresy pokazujące 1. tylko miesięczne zwroty, 2. średnią dzienną z miesięcznych zwrotów, 3. oba razem. Ponieważ są one identyczne, nadpisywanie na trzecim obrazie pokazuje tylko jeden.

Miesięczne zwroty

Średni dzienny zwrot z miesięcznego zwrotu

Średnia miesięczna i dzienna kreślona razem


W moim przypadku liczba miesięczna jest średnią, a nie sumą, o którą pyta Twój post. Na przykład moje dane pokazują średnio 4% w styczniu. Jeśli próbuję przekształcić się w dzienną liczbę, obecnie zastanawiałem się nad wykorzystaniem tych 4% od 1 stycznia i tak dalej. Ale nie jestem pewien, czy nadal jest to w porządku.
Eric

1
Czy mogę zapytać, czy masz jakiś pomysł w tej sprawie (jak zadają moje pytania)?
Eric

Z opublikowanych danych nie wynika jasno, że masz stawki, wygląda jak ceny. W komentarzu wspominasz, że masz średnią stawkę 0,04 za styczeń. Jeśli zamierzasz przejść od średniej stawki miesięcznej -> średniej stawki dziennej, ogólnie przyjętą zasadą jest stawka miesięczna / 30 (tak myślę). Dla 0,04 (4%), o którym wspominałeś w styczniu, stawka dzienna wynosiłaby 0,04 / 30 lub ~ 0,001315. Jeśli możesz wyjaśnić mi pytanie, może to pomóc. Czy masz dane dotyczące ceny lub stawki? A czego oczekujesz? Tak czy inaczej, id nie wygląda na tempdisagg jest rozwiązaniem.
mrhellmann

1
Dane, które opublikowałem, to na przykład indeks miesięczny z testem porównawczym wynoszącym 100. Ponieważ jest to indeks, nie sumuje się.
Eric

Ok. Jeśli interesują Cię dane procentowe (zwroty) i masz dane cenowe w regularnych szeregach czasowych, możesz użyć quantmod::monthlyReturnlub PerformanceAnalytics::Return.calculateuzyskać (miesięczne) zwroty. Stamtąd, jeśli chcesz zakładać codzienne zwroty, możesz użyć powyższej (komentarz) metody.
mrhellmann
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.