`tempdisagg` 패키지에서`td` 명령을 사용하여 월별 데이터를 일일 데이터 빈도로 분리하려면 어떻게해야합니까?


9

월간 빈도 데이터가 있는데 매일 주파수 데이터로 분리하려고합니다. 그래서 아래 코드를 사용하여 R tdtempdisagg패키지 명령을 사용합니다.

 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이고 종료 날짜는 2019 년 9 월입니다.

이 월별 데이터 dat를 일일 빈도 데이터로 분리하는 데 도움을받을 수 있습니까?


1
에릭, 사용 가능한 형식으로 데이터를 제공 할 수 있습니까? 코드 / 데이터 / 오류의 이미지를 게시하지 마십시오. 이미지를 복사하거나 검색 할 수없고 (SEO) 화면 판독기를 손상 시키며 일부 휴대 기기에 적합하지 않을 수 있습니다. 참조 : meta.stackoverflow.com/a/285557/3358272 (및 xkcd.com/2116 ). 데이터를 직접 포함 시키십시오 (예 : dput(head(x))또는 data.frame(...)). 감사!
r2evans 2014

dput (head (x)) 것을 추가했습니다. 지금은 괜찮습니까?
Eric

이상하다. 내가 할 경우 dput(ts(head(1:50))), 그때 얻을 structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). 귀하의 이미지는 귀하 dat가 시계열 임을 암시 하지만 c(...)그렇지 않습니다. 그 둘이 dat같은가요?
r2evans

예, 그 두 데이터는 동일합니다. 데이터와 데이터가 다릅니다.
Eric

1
내가 볼 때 tempdisagg.pdf, 찾을 수없는 "daily"어디서나과 to=가 지원 말한다 "문자열로 고주파 대상 주파수를 ("분기 "또는"매월 ") 또는 스칼라로 (EG2, 4, 7, 12)" . to="daily"지원되는 곳은 어디 입니까? 당신은 시도 할 수 있습니까 to=1? (정말 훨씬 그 이상 도울 수 없어요 내가 잘 패키지를 모르는, 내가 일반적으로 도움이 될 수 생각했다..)
r2evans

답변:


4

tempdisagg 패키지가 월별에서 일일으로 분리를 허용하지 않는 것 같습니다. 로부터 td()인수 '에서'도움말 파일 :

문자열 ( "분기 별"또는 "월별") 또는 스칼라 (예 : 2, 4, 7, 12)로 고주파 대상 주파수. 입력 계열이 ts 객체 인 경우 표시기가 없으면 인수가 필요합니다. 입력 계열이 벡터 인 경우 주파수 비율을 나타내는 스칼라 여야합니다.

오류 메시지 " 'to'argument : unknown character string"은 to =인수가 'quarterly'또는 'monthly'만 문자열로 허용 하기 때문 입니다.

통계에 매일에 월별 데이터를 disaggregating에 대한 몇 가지 논의가 여기 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. 둘 다를 표시하는 세 개의 차트입니다. 그것들이 동일하기 때문에, 세 번째 이미지에서 오버 플로팅은 하나만 보여줍니다.

월별 수익

월별 수익률에서 일일 평균 수익률

월간 및 일일 평균이 함께 표시됨


필자의 경우 월별 수치는 귀하의 질문 게시물이 요구하는 합계가 아닌 평균입니다. 예를 들어, 내 데이터는 1 월 평균 4 %를 보여줍니다. 내가 매일 수치로 바꾸려고한다면, 나는 현재 1 월 1 일 등 으로이 4 %를 바로 사용하려고 생각하고 있습니다. 그러나 이것이 여전히 괜찮은지 확실하지 않습니다.
Eric

1
이 질문에 대한 아이디어가 있는지 (내 게시 된 질문에 따라) 물어봐도 될까요?
Eric

게시 한 데이터에서 요금이 있다는 것은 확실하지 않으며 가격처럼 보입니다. 당신은 1 월 동안 평균 .04의 비율이 있다고 언급했다. 월간 평균 요율-> 일일 평균 요율로 가려면 일반적으로 허용되는 원칙은 월간 요율 / 30입니다 (제 생각에). 1 월에 언급 한 .04 (4 %)의 일일 요금은 .04 / 30 또는 ~ .001315입니다. 나에게 질문을 분명히하면 도움이 될 것입니다. 가격 데이터 또는 요금 데이터가 있습니까? 그리고 당신이 기대하는 결과는 무엇입니까? 어느 쪽이든, id는 tempdisagg가 해결책처럼 보이지 않습니다.
mrhellmann

1
내가 게시 한 데이터는 예를 들어 벤치 마크가 100 인 월별 인덱스입니다. 인덱스이기 때문에 합산되지 않습니다.
Eric

확인. 당신이 일정한 시간 시리즈에 가격 데이터를 백분율 데이터 (수익률)에 관심이 있다면, 당신은 사용할 수 있습니다 quantmod::monthlyReturn또는 PerformanceAnalytics::Return.calculate(월) 수익을 얻을 수 있습니다. 거기에서 일일 반품을 가정 해야하는 경우 위의 (주석) 방법을 사용할 수 있습니다.
mrhellmann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.