Как я могу использовать команду `td` из пакета` tempdisagg` для дезагрегации ежемесячных данных по ежедневной частоте?

9

У меня есть данные о частоте за месяц, которые я пытаюсь разбить на данные о частоте за день. Поэтому я использую tdкоманду из tempdisaggпакета в R, используя код ниже:

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

Тогда я получаю следующее сообщение об ошибке:

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

Я использую datследующие данные:

введите описание изображения здесь

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

Таким образом, хотя эти данные datявляются ежемесячными, начало и конец еще не отражают это. Фактически, дата начала - 1/1997, а дата окончания - 9/2019.

Могу ли я получить помощь в разбивке этих ежемесячных данных datна ежедневные данные о частоте, пожалуйста?

Эрик
источник
1
Эрик, вы можете предоставить данные в удобном для вас формате? Пожалуйста, не публикуйте изображение кода / данных / ошибок: его нельзя скопировать или найти (SEO), оно нарушает работу программ чтения с экрана и может не подходить для некоторых мобильных устройств. Ссылка: meta.stackoverflow.com/a/285557/3358272xkcd.com/2116 ). Пожалуйста, просто включите данные (например, dput(head(x))или data.frame(...)) напрямую. Спасибо!
r2evans
Я добавил вещь dput (head (x)). Теперь нормально?
Эрик
Это странно. Если я это сделаю dput(ts(head(1:50))), то я получу structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Ваше изображение предполагает, что ваш datвременной ряд, а ваш c(...)нет. Эти два datодинаковы?
r2evans
Да, эти два значения одинаковы. Данные и данные разные.
Эрик
1
Когда я смотрю tempdisagg.pdf, я "daily"нигде не могу найти и to=говорит, что он поддерживает «частоту назначения высокой частоты как строку символов (« ежеквартально »или« ежемесячно ») или как скаляр (например, 2, 4, 7, 12)» . Где это предлагается, что to="daily"поддерживается? Ты можешь попробовать to=1? (Я не могу действительно помочь намного кроме этого. Я не знаю пакет хорошо, думал, что мог бы помочь в общем.)
r2evans

Ответы:

4

Похоже, что пакет tempdisagg не допускает разбивки по месяцам и дням. Из td()файла справки аргумент «до»:

частота высокочастотного назначения в виде строки символов («ежеквартально» или «ежемесячно») или в виде скаляра (например, 2, 4, 7, 12). Если входные серии являются объектами ts, аргумент необходим, если не указан индикатор. Если входные серии являются векторами, то должен быть скаляр, указывающий отношение частот.

Сообщение об ошибке «аргумент to: неизвестная строка символов» вызвано тем, что to =аргумент принимает только «ежеквартально» или «ежемесячно» в качестве строк.

Здесь обсуждается разукрупнение ежемесячных данных по дням в стеке статистики здесь: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

После некоторого поиска, похоже, что никто не использует последовательно дезагрегированные ежемесячные и ежедневные данные. tempdisaggПакет , кажется, способен то , что большинство других нашли возможным - раз в год ежеквартально или ежемесячно, и периоды времени, которые соответствуют кратны.

Эрик, я добавил скрипт ниже, который должен иллюстрировать то, что ты пытаешься сделать, насколько я понимаю.

Здесь мы используем реальные данные о ценах, чтобы перейти от дневных цен -> месячных цен -> месячных прибылей -> средних дневных прибылей.

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

Вот три графика, показывающие 1. только месячные доходы, 2. среднесуточные данные по ежемесячным доходам, 3. оба вместе. Поскольку они совпадают, в третьем изображении оверплоттинг показывает только один.

Ежемесячные возвраты

Среднесуточный доход от ежемесячного дохода

Ежемесячный и ежедневный средний график

mrhellmann
источник
В моем случае месячная цифра - это средняя сумма, а не сумма, которую запрашивает ваш вопрос. Например, мои данные показывают в среднем 4% за январь. Если я пытаюсь превратиться в ежедневную цифру, я сейчас думаю использовать эти 4% сразу для 1 января и так далее. Но не уверен, что это все еще нормально.
Эрик
1
Могу ли я спросить, есть ли у вас какие-либо идеи по этому делу (как спрашивает мой опубликованный вопрос), пожалуйста?
Эрик
Из опубликованных вами данных не ясно, что у вас есть ставки, это похоже на цены. В комментарии вы упоминаете, что у вас средний показатель за январь - 0,04. Если вы собираетесь перейти от среднемесячной ставки -> среднесуточной ставки, то общепринятым принципом является месячная ставка / 30 (я думаю). Для 0,04 (4%), которую вы упомянули в январе, дневная ставка будет равна .04 / 30 или ~ .001315. Если бы вы могли уточнить ваш вопрос для меня, это могло бы помочь. У вас есть данные о ценах или тарифах? И какого результата вы ожидаете? В любом случае, id не выглядит как tempdisagg - это решение.
mrhellmann
1
Данные, которые я разместил, представляют собой месячный индекс с эталоном 100, например. Поскольку это индекс, он не складывается.
Эрик
Хорошо. Если вас интересуют процентные данные (возвраты) и данные о ценах в регулярном временном ряду, вы можете использовать quantmod::monthlyReturnили, PerformanceAnalytics::Return.calculateчтобы получить (ежемесячные) возвраты. Оттуда, если вам нужно принять ежедневные доходы, вы можете использовать метод выше (комментарий).
mrhellmann