Bagaimana saya bisa menggunakan perintah `td` dari paket` tempdisagg` untuk memisahkan data bulanan menjadi frekuensi data harian?


9

Saya memiliki data frekuensi bulanan yang saya coba pisahkan menjadi data frekuensi harian. Jadi saya menggunakan tdperintah dari tempdisaggpaket di R menggunakan kode di bawah ini:

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

Lalu saya mendapatkan pesan kesalahan berikut:

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

Data yang saya gunakan datadalah sebagai berikut:

masukkan deskripsi gambar di sini

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

Jadi meskipun data datini dalam frekuensi bulanan, awal dan akhir belum mencerminkan ini. Bahkan, tanggal mulai adalah 1/1997 dan tanggal akhir adalah 9/2019.

Bolehkah saya mendapatkan bantuan untuk memisahkan data bulanan ini datmenjadi data frekuensi harian?


1
Eric, dapatkah Anda memberikan data dalam format yang dapat digunakan? Tolong jangan memposting gambar kode / data / kesalahan: itu tidak dapat disalin atau dicari (SEO), itu merusak pembaca layar, dan mungkin tidak cocok pada beberapa perangkat seluler. Ref: meta.stackoverflow.com/a/285557/3358272 (dan xkcd.com/2116 ). Harap sertakan data (misalnya, dput(head(x))atau data.frame(...)) secara langsung. Terima kasih!
r2evans

Saya menambahkan hal dput (head (x)). Apakah baik-baik saja sekarang?
Eric

Itu aneh. Jika saya melakukannya dput(ts(head(1:50))), maka saya mengerti structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Gambar Anda menunjukkan bahwa Anda datadalah rangkaian waktu, tetapi Anda c(...)tidak. Apakah keduanya datsama?
r2evans

Ya kedua dat itu sama. Data dan dat berbeda.
Eric

1
Ketika saya melihat tempdisagg.pdf, saya tidak dapat menemukan di "daily"mana pun, dan to=mengatakan itu mendukung "frekuensi tujuan frekuensi tinggi sebagai string karakter (" triwulanan "atau" bulanan ") atau sebagai skalar (eg2, 4, 7, 12)" . Di mana itu disarankan yang to="daily"didukung? Bisakah kamu mencoba to=1? (Saya benar-benar tidak bisa membantu lebih dari itu. Saya tidak tahu paketnya dengan baik, saya pikir saya bisa membantu secara umum.)
r2evans

Jawaban:


4

Sepertinya paket tempdisagg tidak memungkinkan disagregasi bulanan ke harian. Dari td()argumen file bantuan 'ke':

frekuensi tujuan frekuensi tinggi sebagai string karakter ("triwulanan" atau "bulanan") atau sebagai skalar (mis. 2, 4, 7, 12). Jika seri input adalah objek ts, argumen diperlukan jika tidak ada indikator yang diberikan. Jika seri input adalah vektor, harus berupa skalar yang menunjukkan rasio frekuensi.

Pesan kesalahan Anda "ke 'argumen: string karakter tidak dikenal" adalah karena to =argumen hanya menerima' triwulanan 'atau' bulanan 'sebagai string.

Ada beberapa diskusi tentang pemisahan data bulanan setiap hari di statistik stackexchage di sini: /stats/258810/disaggregate-monthly-forecasts-into-daily-data

Setelah beberapa pencarian, sepertinya tidak ada yang secara konsisten menggunakan data bulanan ke data harian terpilah. The tempdisaggpaket tampaknya mampu apa yang telah ditemukan kebanyakan orang lain menjadi mungkin - tahunan untuk kuartalan atau bulanan, dan periode waktu yang bahkan kelipatan konsisten.

Eric, saya telah menambahkan skrip di bawah ini yang harus menggambarkan apa yang Anda coba lakukan, seperti yang saya mengerti.

Di sini kami menggunakan data penetapan harga riil untuk berpindah dari harga harian -> harga bulanan -> pengembalian bulanan -> pengembalian harian rata-rata.

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

Berikut adalah tiga grafik yang menunjukkan 1. pengembalian bulanan saja, 2. rata-rata harian dari pengembalian bulanan, 3. keduanya bersamaan. Karena mereka identik, overplotting pada gambar ketiga hanya menunjukkan satu.

Pengembalian bulanan

Pengembalian rata-rata harian dari pengembalian bulanan

Rata-rata bulanan dan harian diplot bersama


Dalam kasus saya, angka bulanan adalah rata-rata bukan jumlah yang ditanyakan oleh posting pertanyaan Anda. Misalnya, data saya menunjukkan rata-rata 4% untuk bulan Januari. Jika saya mencoba untuk berubah menjadi angka harian, saya saat ini sedang berpikir untuk menggunakan 4% ini langsung untuk 1 Januari dan seterusnya. Tetapi tidak yakin apakah ini masih ok untuk melakukannya.
Eric

1
Bolehkah saya bertanya apakah Anda punya ide tentang kasus ini (seperti pertanyaan saya yang diposting bertanya) tolong?
Eric

Tidak jelas dari data yang Anda poskan bahwa Anda memiliki tarif, sepertinya harga. Anda menyebutkan dalam komentar bahwa Anda memiliki tingkat rata-rata 0,04 untuk Januari. Jika Anda akan beralih dari tarif rata-rata bulanan -> tarif rata-rata harian, prinsip yang berlaku umum adalah tarif bulanan / 30 (saya pikir). Untuk 0,04 (4%) yang Anda sebutkan di bulan Januari, tarif hariannya adalah 0,04 / 30 atau ~ 0,001315. Jika Anda dapat mengklarifikasi pertanyaan Anda untuk saya, itu mungkin membantu. Apakah Anda memiliki data harga atau data tingkat? Dan apa hasil yang Anda harapkan? Either way, id tidak terlihat seperti tempdisagg adalah solusinya.
mrhellmann

1
Data yang saya posting adalah indeks bulanan dengan tolok ukur 100 misalnya. Karena ini adalah indeks, itu tidak bertambah.
Eric

Baik. Jika Anda tertarik pada data persentase (pengembalian) dan memiliki data harga dalam rangkaian waktu reguler, Anda dapat menggunakan quantmod::monthlyReturnatau PerformanceAnalytics::Return.calculateuntuk mendapatkan pengembalian (bulanan). Dari sana jika Anda perlu mengasumsikan pengembalian harian, Anda dapat menggunakan metode (komentar) di atas.
mrhellmann
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.