ฉันจะใช้คำสั่ง `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
Eric คุณสามารถให้ข้อมูลในรูปแบบที่ใช้ได้หรือไม่? โปรดอย่าโพสต์ภาพรหัส / ข้อมูล / ข้อผิดพลาด: มันไม่สามารถคัดลอกหรือค้นหา (SEO), มันทำลายตัวอ่านหน้าจอและอาจไม่เหมาะกับอุปกรณ์มือถือบางรุ่น Ref: meta.stackoverflow.com/a/285557/3358272 (และxkcd.com/2116 ) โปรดระบุข้อมูล (เช่นdput(head(x))หรือdata.frame(...)) โดยตรง ขอบคุณ!
r2evans

ฉันเพิ่มสิ่ง dput (หัว (x)) มันโอเคไหม?
Eric

มันแปลกมาก ถ้าผมทำแล้วผมได้รับdput(ts(head(1:50))) structure(1:6, .Tsp = c(1, 6, 1), class = "ts")ภาพของคุณแสดงให้เห็นว่าคุณdatเป็นซีรีย์เวลา แต่คุณc(...)ไม่ได้ สองคนนั้นdatเหมือนกันหรือไม่
r2evans

ใช่ทั้งสอง dat นั้นเหมือนกัน ข้อมูลและ dat แตกต่างกัน
Eric

1
เมื่อฉันมองไปที่tempdisagg.pdfผมไม่สามารถหา"daily"ได้ทุกที่และto=บอกว่าจะสนับสนุน"ความถี่ปลายทางความถี่สูงเป็นสตริงตัวอักษร (" ไตรมาส "หรือ 'รายเดือน') หรือเป็นสเกลาร์ (eg2, 4, 7, 12)" แนะนำว่าto="daily"รองรับที่ไหน? คุณลองได้to=1ไหม (ฉันไม่สามารถช่วยได้มากไปกว่านั้นฉันไม่รู้แพ็คเก็จที่ดีคิดว่าฉันสามารถช่วยได้โดยทั่ว ๆ ไป)
r2evans

คำตอบ:


4

ดูเหมือนว่าแพ็คเกจ tempdisagg ไม่อนุญาตให้มีการกระจายรายเดือนหรือรายวัน จากtd()อาร์กิวเมนต์ไฟล์ช่วยเหลือ 'ถึง':

ความถี่ปลายทางความถี่สูงเป็นสตริงอักขระ ("รายไตรมาส" หรือ "รายเดือน") หรือเป็นสเกลาร์ (เช่น 2, 4, 7, 12) หากซีรี่ย์อินพุตเป็นวัตถุ ts อาร์กิวเมนต์จำเป็นถ้าไม่มีตัวบ่งชี้กำหนด หากซีรีย์อินพุตเป็นเวกเตอร์จะต้องเป็นสเกลาร์ที่แสดงอัตราส่วนความถี่

ข้อความแสดงข้อผิดพลาด "'ถึง' อาร์กิวเมนต์: สตริงอักขระที่ไม่รู้จัก" เป็นเพราะ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. ทั้งคู่เข้าด้วยกัน เนื่องจากพวกมันเหมือนกันการ overplotting ในภาพที่สามจะแสดงเพียงภาพเดียว

ผลตอบแทนรายเดือน

ผลตอบแทนเฉลี่ยรายวันจากผลตอบแทนรายเดือน

เฉลี่ยรายเดือนและรายวันพล็อตด้วยกัน


ในกรณีของฉันตัวเลขรายเดือนคือค่าเฉลี่ยไม่ใช่ผลรวมตามที่โพสต์คำถามของคุณสอบถาม ตัวอย่างเช่นข้อมูลของฉันแสดงค่าเฉลี่ย 4% สำหรับเดือนมกราคม ถ้าฉันกำลังพยายามที่จะแปลงร่างเป็นตัวเลขรายวันฉันกำลังคิดที่จะใช้ 4% ทันทีในวันที่ 1 มกราคมเป็นต้นไป แต่ไม่แน่ใจว่าจะทำเช่นนั้นได้หรือไม่
Eric

1
ฉันขอถามได้ไหมว่าคุณมีความคิดใด ๆ ในกรณีนี้ (ตามที่ฉันถามคำถามที่โพสต์) โปรด?
Eric

ยังไม่ชัดเจนจากข้อมูลที่คุณโพสต์ว่าคุณมีอัตราดูเหมือนว่าราคา คุณพูดถึงในความคิดเห็นที่คุณมีอัตราเฉลี่ย 0.04 สำหรับเดือนมกราคม หากคุณจะไปจากอัตราเฉลี่ยรายเดือน -> อัตราเฉลี่ยรายวันหลักการที่ยอมรับโดยทั่วไปคืออัตรารายเดือน / 30 (ฉันคิดว่า) สำหรับ. 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.