¿Cómo puedo usar el comando `td` del paquete` tempdisagg` para desglosar los datos mensuales en la frecuencia de datos diaria?


9

Tengo datos de frecuencia mensuales que estoy tratando de desglosar en datos de frecuencia diaria. Entonces uso el tdcomando del tempdisaggpaquete en R usando el siguiente código:

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

Entonces recibo el siguiente mensaje de error:

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

Los datos que uso datson los siguientes:

ingrese la descripción de la imagen aquí

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

Entonces, aunque estos datos datestán en frecuencia mensual, el inicio y el final aún no reflejan esto. De hecho, la fecha de inicio es 1/1997 y la fecha de finalización es 9/2019.

¿Puedo obtener ayuda para desglosar estos datos mensuales daten datos de frecuencia diaria, por favor?


1
Eric, ¿puedes proporcionar los datos en un formato utilizable? No publique una imagen de código / datos / errores: no se puede copiar ni buscar (SEO), rompe los lectores de pantalla y puede que no se ajuste bien en algunos dispositivos móviles. Ref: meta.stackoverflow.com/a/285557/3358272 (y xkcd.com/2116 ). Por favor, solo incluya los datos (por ejemplo, dput(head(x))o data.frame(...)) directamente. ¡Gracias!
r2evans

Agregué la cosa dput (head (x)). ¿Está bien ahora?
Eric

Eso es extraño. Si lo hago dput(ts(head(1:50))), entonces consigo structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Su imagen sugiere que su dates una serie temporal, pero su c(...)no. ¿Son esos dos dats iguales?
r2evans

Sí, esos dos datos son iguales. Los datos y los datos son diferentes.
Eric

1
Cuando miro tempdisagg.pdf, no puedo encontrar "daily"ningún lugar, y to=dice que admite "frecuencia de destino de alta frecuencia como una cadena de caracteres (" trimestral "o" mensual ") o como un escalar (por ejemplo, 2, 4, 7, 12)" . ¿Dónde se sugiere que to="daily"sea ​​compatible? Se puede tratar to=1? (Realmente no puedo ayudar mucho más allá de eso. No conozco bien el paquete, pensé que podría ayudar genéricamente.)
r2evans

Respuestas:


4

Parece que el paquete tempdisagg no permite la desagregación mensual a diaria. Del td()archivo de ayuda 'a' argumento:

frecuencia de destino de alta frecuencia como una cadena de caracteres ("trimestral" o "mensual") o como un escalar (por ejemplo, 2, 4, 7, 12). Si las series de entrada son objetos ts, el argumento es necesario si no se proporciona ningún indicador. Si las series de entrada son vectores, debe ser un escalar que indique la relación de frecuencia.

Su mensaje de error "argumento 'a': cadena de caracteres desconocida" se debe a que el to =argumento solo acepta 'trimestralmente' o 'mensual' como cadenas.

Aquí hay una discusión sobre la desagregación de datos mensuales en el stackstack de estadísticas aquí: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Después de algunas búsquedas, parece que nadie usa constantemente datos desagregados mensualmente a diario. El tempdisaggpaquete parece ser capaz de lo que la mayoría de los demás han descubierto que es posible: anual a trimestral o mensual, y períodos de tiempo que son consistentes, incluso múltiples.

Eric, he agregado un script a continuación que debería ilustrar lo que estás tratando de hacer, tal como lo entiendo.

Aquí usamos datos de precios reales para pasar de los precios diarios -> precios mensuales -> retornos mensuales -> retornos diarios promedio.

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

Aquí hay tres cuadros que muestran 1. retornos mensuales solamente, 2. promedio diario de retornos mensuales, 3. ambos juntos. Como son idénticos, el trazado excesivo en la tercera imagen muestra solo uno.

Devoluciones mensuales

Retorno promedio diario del retorno mensual

Promedio mensual y diario trazados juntos


En mi caso, la cifra mensual es el promedio, no la suma, como pregunta su pregunta posterior. Por ejemplo, mis datos muestran un promedio de 4% para enero. Si estoy tratando de transformarme en una figura diaria, actualmente estaba pensando en usar este 4% de inmediato para el 1 de enero y así sucesivamente. Pero no estoy seguro de si todavía está bien hacerlo.
Eric

1
¿Puedo preguntarle si tiene alguna idea sobre este caso (como pregunta mi pregunta publicada) por favor?
Eric

Según los datos que publicó, no está claro que tenga tarifas, parece que son precios. Usted menciona en un comentario que tiene una tasa promedio de .04 para enero. Si va a pasar de una tasa promedio mensual -> tasa promedio diaria, el principio generalmente aceptado es la tasa mensual / 30 (creo). Para .04 (4%) que mencionó en enero, una tasa diaria sería .04 / 30 o ~ .001315. Si pudiera aclararme su pregunta, eso podría ayudar. ¿Tiene datos de precios o datos de tasas? ¿Y cuál es el resultado que esperas? De cualquier manera, id no parece que tempdisagg sea la solución.
mrhellmann

1
Los datos que publiqué son un índice mensual con un punto de referencia de 100, por ejemplo. Como es un índice, no se suma.
Eric

Okay. Si está interesado en datos de porcentaje (devoluciones) y tiene datos de precios en una serie de tiempo regular, puede usar quantmod::monthlyReturnu PerformanceAnalytics::Return.calculateobtener las devoluciones (mensuales). A partir de ahí, si necesita asumir devoluciones diarias, puede usar el método anterior (comentario).
mrhellmann
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.