Як я можу використовувати команду `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). Якщо ряд вхідних даних є об'єктами, аргумент необхідний, якщо не вказано індикатора. Якщо вхідні ряди є векторами, повинен бути скаляр, що вказує на співвідношення частоти.

Ваше повідомлення про помилку "'to' аргумент: рядок невідомого символу" пояснюється тим, що to =аргумент приймає лише "квартальний" або "щомісячний" як рядки.

Тут є певна дискусія щодо дезагрегації щомісячних даних на щоденні на статистиці stackexchage тут: /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. обидва разом. Оскільки вони однакові, перенапруження на третьому зображенні показує лише одне.

Щомісячні прибутки

Середньодобова віддача від місячної віддачі

Щомісячні та щоденні серпні складаються разом


У моєму випадку показник щомісяця - це не середня сума, як запит вашого запитання. Наприклад, мої дані показують в середньому 4% за січень. Якщо я намагаюся перетворитись на щоденну фігуру, я зараз думав використовувати ці 4% відразу для 1 січня тощо. Але не впевнений, чи все ще добре це зробити.
Ерік

1
Чи можу я запитати, чи маєте ви якусь ідею щодо цієї справи (як запитає моє розміщене запитання)?
Ерік

З даних, які ви опублікували, незрозуміло, що у вас є ставки, це схоже на ціни. У коментарі ви згадуєте, що середній показник для січня у вас є середнім .04. Якщо ви збираєтесь переходити від середньомісячної ставки -> середньоденної ставки, загальноприйнятим принципом є місячна ставка / 30 (я думаю). Для .04 (4%), яку ви згадали у січні, денна ставка складе 0,04 / 30 або ~ .001315. Якщо ви зможете уточнити, що ви ставите мені питання, це може допомогти. Чи є у вас дані про ціни чи дані про тарифи? І який результат ви очікуєте? У будь-якому випадку ідентифікатор не схожий на tempdisagg - це рішення.
mrhellmann

1
Опубліковані мною дані є, наприклад, щомісячний індекс із орієнтиром 100. Оскільки це індекс, він не складається.
Ерік

Добре. Якщо вас цікавлять відсоткові дані (доходи) і маєте дані про ціни в регулярному часовому ряду, ви можете використовувати quantmod::monthlyReturnабо PerformanceAnalytics::Return.calculateотримувати (щомісячні) декларації. Звідти, якщо вам потрібно приймати щоденні прибутки, ви можете скористатися вищевказаним (коментарним) методом.
mrhellmann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.