Como posso usar o comando `td` do pacote` tempdisagg` para desagregar os dados mensais na frequência diária de dados?

9

Tenho dados de frequência mensal que estou tentando desagregar em dados de frequência diária. Então, eu uso o tdcomando do tempdisaggpacote em R usando o código abaixo:

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

Então eu recebo a seguinte mensagem de erro:

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

Os dados que eu uso datsão os seguintes:

insira a descrição da imagem aqui

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

Portanto, embora esses dados datestejam em frequência mensal, o início e o fim ainda não refletem isso. De fato, a data de início é 1/1997 e a data de término é 9/2019.

Posso obter ajuda para desagregar esses dados mensais datem dados de frequência diária, por favor?

Eric
fonte
11
Eric, você pode fornecer os dados em um formato utilizável? Não publique uma imagem de código / dados / erros: não pode ser copiada ou pesquisada (SEO), quebra os leitores de tela e pode não se encaixar bem em alguns dispositivos móveis. Ref: meta.stackoverflow.com/a/285557/3358272 (e xkcd.com/2116 ). Por favor, inclua os dados (por exemplo, dput(head(x))ou data.frame(...)) diretamente. Obrigado!
R2evans
Eu adicionei a coisa dput (head (x)). Está tudo bem agora?
Eric
Isso é estranho. Se sim dput(ts(head(1:50))), entendo structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Sua imagem sugere que você daté uma série temporal, mas a sua c(...)não. Esses dois datsão iguais?
R2evans
Sim, esses dois dados são iguais. Os dados e dat são diferentes.
19419 Eric Eric
11
Quando olho tempdisagg.pdf, não consigo encontrar "daily"nenhum lugar e to=diz que suporta "a frequência de destino de alta frequência como uma sequência de caracteres (" trimestral "ou" mensal ") ou como escalar (por exemplo, 2, 4, 7, 12)" . Onde é sugerido que to="daily"é suportado? Você pode tentar to=1? (Eu realmente não posso ajudar muito além do que eu não sei o pacote bem, pensei que eu poderia ajudar genericamente..)
r2evans

Respostas:

4

Parece que o pacote tempdisagg não permite a desagregação mensal ou diária. Do td()arquivo de ajuda 'para' argumento:

frequência de destino de alta frequência como uma sequência de caracteres ("trimestral" ou "mensal") ou como escalar (por exemplo, 2, 4, 7, 12). Se as séries de entrada forem objetos ts, o argumento será necessário se nenhum indicador for fornecido. Se as séries de entrada são vetores, deve ser um escalar indicando a taxa de frequência.

Sua mensagem de erro "argumento 'to': seqüência de caracteres desconhecida" é porque o to =argumento aceita apenas 'trimestral' ou 'mensal' como seqüências de caracteres.

Há alguma discussão sobre como desagregar dados mensais diariamente na pilha de estatísticas aqui: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Após algumas pesquisas, parece que ninguém usa consistentemente dados desagregados mensalmente e diariamente. O tempdisaggpacote parece ser capaz do que a maioria dos outros considerou possível - anual a trimestral ou mensal, e períodos consistentes até múltiplos.

Eric, adicionei um script abaixo que deve ilustrar o que você está tentando fazer, como eu o entendo.

Aqui, usamos dados reais de preços para passar dos preços diários -> preços mensais -> retornos mensais -> retornos médios diários.

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

Aqui estão três gráficos mostrando 1. somente retornos mensais, 2. média diária dos retornos mensais, 3. ambos juntos. Como são idênticas, a plotagem na terceira imagem mostra apenas uma.

Devoluções mensais

Retorno médio diário do retorno mensal

Média mensal e diária plotada em conjunto

mrhellmann
fonte
No meu caso, o valor mensal é a média, e não a soma, conforme pergunta na sua pergunta. Por exemplo, meus dados mostram uma média de 4% para janeiro. Se estou tentando me transformar em um número diário, estava pensando em usar esses 4% imediatamente em 1º de janeiro e assim por diante. Mas não tenho certeza se isso ainda está correto.
Eric
11
Posso perguntar se você tem alguma idéia sobre este caso (como minha pergunta postada pergunta), por favor?
Eric
Não está claro nos dados que você postou que você tem taxas, parece preços. Você mencionou em um comentário que possui uma taxa média de 0,04 para janeiro. Se você vai passar de uma taxa média mensal -> taxa média diária, o princípio geralmente aceito é a taxa mensal / 30 (eu acho). Para 0,04 (4%) que você mencionou em janeiro, uma taxa diária seria 0,04 / 30 ou ~ 0,001315. Se você puder esclarecer sua pergunta para mim, isso pode ajudar. Você tem dados de preços ou dados de taxa? E qual é o resultado que você está esperando? De qualquer forma, o id não parece ser a solução tempdisagg.
Mrhellmann 31/12/19
11
Os dados que publiquei são um índice mensal com uma referência de 100, por exemplo. Por ser um índice, ele não se soma.
Eric
Está bem. Se você estiver interessado em dados percentuais (devoluções) e tiver dados de preços em uma série temporal regular, poderá usar quantmod::monthlyReturnou PerformanceAnalytics::Return.calculateobter as devoluções (mensais). A partir daí, se você precisar assumir retornos diários, poderá usar o método acima (comentário).
Mrhellmann