Làm cách nào tôi có thể sử dụng lệnh `td` từ gói` tempdisagg` để phân chia dữ liệu hàng tháng thành tần số dữ liệu hàng ngày?


9

Tôi có dữ liệu tần suất hàng tháng mà tôi đang cố gắng phân tách thành dữ liệu tần suất hàng ngày. Vì vậy, tôi sử dụng tdlệnh từ tempdisagggói trong R bằng cách sử dụng mã dưới đây:

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

Sau đó, tôi nhận được thông báo lỗi sau:

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

Dữ liệu tôi sử dụng datnhư sau:

nhập mô tả hình ảnh ở đây

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

Vì vậy, mặc dù dữ liệu datnày có tần suất hàng tháng, nhưng bắt đầu và kết thúc chưa phản ánh điều này. Trên thực tế, ngày bắt đầu là 1/1997 và ngày kết thúc là 9/2019.

Tôi có thể nhận trợ giúp về việc phân chia dữ liệu hàng tháng này datthành dữ liệu tần suất hàng ngày không?


1
Eric, bạn có thể cung cấp dữ liệu ở định dạng có thể sử dụng không? Vui lòng không đăng hình ảnh về mã / dữ liệu / lỗi: không thể sao chép hoặc tìm kiếm (SEO), nó phá vỡ trình đọc màn hình và nó có thể không phù hợp trên một số thiết bị di động. Tham chiếu: meta.stackoverflow.com/a/285557/3358272 (và xkcd.com/2116 ). Vui lòng chỉ bao gồm dữ liệu (ví dụ, dput(head(x))hoặc data.frame(...)) trực tiếp. Cảm ơn!
r2evans

Tôi đã thêm điều dput (head (x)). Bây giờ có ổn không
Eric

Thật ki quặc. Nếu tôi làm dput(ts(head(1:50))), sau đó tôi nhận được structure(1:6, .Tsp = c(1, 6, 1), class = "ts"). Hình ảnh của bạn cho thấy rằng bạn datlà một chuỗi thời gian, nhưng bạn c(...)thì không. Hai datcái đó có giống nhau không?
r2evans

Có hai dat là như nhau. Dữ liệu và dat là khác nhau.
Eric

1
Khi tôi nhìn vào tempdisagg.pdf, tôi không thể tìm thấy "daily"bất cứ nơi nào và to=nói rằng nó hỗ trợ "tần số đích tần số cao dưới dạng chuỗi ký tự (" hàng quý "hoặc" hàng tháng ") hoặc dưới dạng vô hướng (ví dụ 2, 4, 7, 12)" . Nó được đề xuất ở đâu to="daily"được hỗ trợ? Bạn có thể thử to=1không (Tôi thực sự không thể giúp nhiều hơn thế. Tôi không biết rõ về gói hàng, nghĩ rằng tôi có thể giúp đỡ một cách khái quát.)
revevans

Câu trả lời:


4

Có vẻ như gói tempdisagg không cho phép phân chia hàng tháng đến hàng ngày. Từ td()đối số 'đến' tệp trợ giúp:

tần số đích tần số cao dưới dạng chuỗi ký tự ("hàng quý" hoặc "hàng tháng") hoặc dưới dạng vô hướng (ví dụ 2, 4, 7, 12). Nếu chuỗi đầu vào là các đối tượng ts, thì đối số là cần thiết nếu không có chỉ số nào được đưa ra. Nếu chuỗi đầu vào là vectơ, phải là vô hướng cho biết tỷ số tần số.

Thông báo lỗi của bạn "đối số ': chuỗi ký tự không xác định" là do to =đối số chỉ chấp nhận' hàng quý 'hoặc' hàng tháng 'dưới dạng chuỗi.

Có một số cuộc thảo luận về việc phân chia dữ liệu hàng tháng thành hàng ngày trên thống kê stackexchage tại đây: /stats/258810/disaggregate-monthly-forferences-into-daily-data

Sau một số tìm kiếm, có vẻ như không ai liên tục sử dụng dữ liệu phân tách hàng tháng đến hàng ngày. Các tempdisagggói dường như có khả năng điều mà hầu hết những người khác đã tìm thấy là có thể - hàng năm để quý hoặc hàng tháng, và khoảng thời gian đó là bội thậm chí nhất quán.

Eric, tôi đã thêm một kịch bản dưới đây để minh họa những gì bạn đang cố gắng làm, như tôi hiểu.

Ở đây chúng tôi sử dụng dữ liệu giá thực tế để chuyển từ giá hàng ngày -> giá hàng tháng -> lợi nhuận hàng tháng -> lợi nhuận trung bình hàng ngày.

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

Dưới đây là ba biểu đồ hiển thị 1. chỉ lợi nhuận hàng tháng, 2. trung bình hàng ngày từ lợi nhuận hàng tháng, 3. cả hai cùng nhau. Vì chúng giống hệt nhau, quá mức trong hình ảnh thứ ba chỉ hiển thị một.

Lợi nhuận hàng tháng

Lợi nhuận trung bình hàng ngày từ lợi nhuận hàng tháng

Hàng tháng và hàng ngày avg âm mưu với nhau


Trong trường hợp của tôi, con số hàng tháng là trung bình không phải là tổng số như câu hỏi của bạn yêu cầu. Ví dụ, dữ liệu của tôi hiển thị trung bình 4% cho tháng một. Nếu tôi đang cố gắng biến thành một con số hàng ngày, hiện tại tôi đã nghĩ đến việc sử dụng 4% này ngay lập tức vào ngày 1 tháng 1, v.v. Nhưng không chắc chắn liệu điều này vẫn ổn để làm như vậy.
Eric

1
Tôi có thể hỏi liệu bạn có ý kiến ​​gì về trường hợp này không (như câu hỏi đã đăng của tôi)?
Eric

Không rõ ràng từ dữ liệu mà bạn đã đăng mà bạn có tỷ lệ, có vẻ như giá cả. Bạn đề cập trong một bình luận rằng bạn có tỷ lệ trung bình 0,04 cho tháng một. Nếu bạn sẽ đi từ tỷ lệ trung bình hàng tháng -> tỷ lệ trung bình hàng ngày, nguyên tắc được chấp nhận chung là tỷ lệ hàng tháng / 30 (tôi nghĩ). Đối với 0,04 (4%) bạn đã đề cập vào tháng 1, tỷ lệ hàng ngày sẽ là 0,04 / 30 hoặc ~ 0,001315. Nếu bạn có thể làm rõ câu hỏi của bạn cho tôi, điều đó có thể giúp đỡ. Bạn có dữ liệu giá hoặc dữ liệu tỷ lệ? Và kết quả mà bạn mong đợi là gì? Dù bằng cách nào, id không giống như tempdisagg là giải pháp.
mrhellmann

1
Dữ liệu tôi đã đăng là một chỉ mục hàng tháng với điểm chuẩn là 100 chẳng hạn. Bởi vì nó là một chỉ mục, nó không thêm vào.
Eric

Đồng ý. Nếu bạn quan tâm đến dữ liệu tỷ lệ phần trăm (lợi nhuận) và có dữ liệu giá theo chuỗi thời gian thông thường, bạn có thể sử dụng quantmod::monthlyReturnhoặc PerformanceAnalytics::Return.calculateđể nhận được lợi nhuận (hàng tháng). Từ đó nếu bạn cần giả định lợi nhuận hàng ngày, bạn có thể sử dụng phương pháp (bình luận) ở trên.
mrhellmann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.