Aylık verileri günlük veri frekansına ayırmak için tempdisagg paketindeki `td` komutunu nasıl kullanabilirim?


9

Günlük sıklık verilerine ayırmaya çalıştığım aylık sıklık verilerim var. Bu yüzden aşağıdaki kodu kullanarak R paketinden tdkomutu kullanın tempdisagg:

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

Sonra aşağıdaki hata iletisini alıyorum:

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

Benim için kullandığım veriler dataşağıdaki gibidir:

resim açıklamasını buraya girin

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

Dolayısıyla, bu veriler dataylık sıklıkta olsa da, başlangıç ​​ve bitiş henüz bunu yansıtmamaktadır. Aslında, başlangıç ​​tarihi 1/1997 ve bitiş tarihi 9/2019'dur.

Bu aylık verilerin datgünlük sıklık verilerine ayrıştırılması konusunda yardım alabilir miyim ?


1
Eric, verileri kullanılabilir bir formatta verebilir misin? Lütfen kod / veri / hataların bir görüntüsünü göndermeyin: kopyalanamaz veya aranamaz (SEO), ekran okuyucularını kırar ve bazı mobil cihazlara iyi uymayabilir. Ref: meta.stackoverflow.com/a/285557/3358272 (ve xkcd.com/2116 ). Lütfen sadece verileri (ör . dput(head(x))Veya data.frame(...)) doğrudan ekleyin . Teşekkürler!
r2evans

Dput (head (x)) şeyi ekledim. Şimdi iyi mi?
Eric

Bu garip. Eğer yaparsam dput(ts(head(1:50))), anlarım structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Resminiz sizin datzaman serileriniz olduğunu, ancak c(...)olmamanızı önerir . Bu ikisi dataynı mı?
r2evans

Evet, bu iki dat aynı. Veriler ve veriler farklıdır.
Eric

1
Ben baktığımda tempdisagg.pdf, ben bulamıyorum "daily"her yerde ve to=desteklediği diyor "bir karakter dizesi olarak yüksek frekanslı hedef frekansını (" üç aylık "veya 'aylık') veya bir sayısal olarak (eg2, 4, 7, 12)" . Nerede to="daily"desteklendiği öneriliyor ? Deneyebilir to=1misin? (Bunun ötesinde gerçekten çok yardım edemem. Paketi iyi bilmiyorum, genel olarak yardım edebileceğimi düşündüm.)
r2evans

Yanıtlar:


4

Tempdisagg paketi aylıktan günlük ayrışmaya izin vermiyor gibi görünüyor. Gönderen td()argüman 'için' yardım dosyası:

karakter dizesi ("üç aylık" veya "aylık") veya skaler (ör. 2, 4, 7, 12) olarak yüksek frekanslı hedef frekansı. Giriş serisi ts nesnesiyse, hiçbir gösterge verilmezse argüman gereklidir. Giriş serileri vektörse, frekans oranını gösteren bir skaler olmalıdır.

Hata iletiniz "" ila "argüman: bilinmeyen karakter dizesi", to =bağımsız değişkenin yalnızca "üç aylık" veya "aylık" dizeler olarak kabul etmesidir.

Aylık verilerin günlük yığınına günlük ayrıştırılması hakkında bazı tartışmalar var: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Bazı aramalardan sonra, aylık olarak günlük verilere ayrıştırılmış olarak hiç kimse sürekli olarak kullanıyor gibi görünüyor. tempdisaggPaketi en diğerleri mümkün olduğu tespit ne yeteneğine sahip görünüyor - yılda dört, ya da aylık için ve tutarlı eşit katlı süreler.

Eric, aşağıya anlamaya çalıştığım şekilde ne yapmaya çalıştığınızı gösteren bir senaryo ekledim.

Burada günlük fiyatlardan -> aylık fiyatlardan -> aylık getirilerden -> ortalama günlük getirilerden hareket etmek için gerçek fiyatlandırma verilerini kullanıyoruz.

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

İşte üç grafik gösteren 1. sadece aylık getiri, 2. aylık getiri günlük ortalama, 3. ikisi birlikte. Aynı olduklarından, üçüncü görüntüde fazla çizmek sadece bir tane gösterir.

Aylık getiriler

Aylık getiriden günlük ortalama getiri

Aylık ve günlük ortalama birlikte çizildi


Benim durumumda, aylık rakam soru postanızın sorguladığı toplam değil ortalamadır. Örneğin, verilerim Ocak için ortalama% 4 gösteriyor. Günlük bir rakama dönüşmeye çalışıyorsam, şu anda bu% 4'ü 1 Ocak için kullanmayı düşünüyordum. Ama bunun hala iyi olup olmadığından emin değilim.
Eric

1
Bu konuda herhangi bir fikriniz olup olmadığını sorabilir miyim (gönderdiğim soru sorar gibi) lütfen?
Eric

Gönderdiğiniz verilerden oranların olduğu açık değil, fiyatlara benziyor. Bir yorumda Ocak için ortalama .04 oranınız olduğunu belirtiyorsunuz. Aylık ortalama orandan başlayacaksanız -> günlük ortalama oran, genel kabul edilen ilke aylık oran / 30'dur (sanırım). Ocak ayında bahsettiğiniz .04 (% 4) için günlük oran .04 / 30 veya ~ .001315 olacaktır. Bana soruyu netleştirebilirsen, bu yardımcı olabilir. Fiyat veya fiyat verileriniz var mı? Peki beklediğiniz sonuç nedir? Her iki durumda da, çözüm tempdisagg gibi görünmüyor.
mrhellmann

1
Gönderdiğim veriler, örneğin 100'lük bir ölçütle aylık bir dizindir. Bir dizin olduğu için toplanmaz.
Eric

Tamam. Yüzde verileri (getiri) ile ilgileniyorsanız ve normal bir zaman serisinde fiyat verileri varsa , (aylık) getiri elde etmek için quantmod::monthlyReturnveya PerformanceAnalytics::Return.calculatedüğmesini kullanabilirsiniz . Günlük getirileri almanız gerekiyorsa, yukarıdaki (yorum) yöntemini kullanabilirsiniz.
mrhellmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.