2017-06-22 39 views
1

我有一個具有多個變量的XTS對象,我想向每個變量添加自定義屬性。 xtsvignette就此提供了一些指導(第20頁)。我希望XTS對象(或對象列表)中的每個變量都具有這些屬性的單獨值。我相信xtsAttributes不能被分配到xts查詢。這是正確的,如果是的話,以下哪種解決方案最好(或提供備用)?向XTS過濾器/查詢的結果添加xts-attributes

a)將XTS對象拆分爲XTS對象列表,並分別指定屬性。 (可能是較好的選擇,但不理想,因爲我想保持綁定到同一個時間指數中的所有變量)

B)保持屬性的索引查找表與單XTS對象一起和檢索這些屬性分別。 (亂)

三)擴大xts類來處理這個(可疑)

碼參考:

a<-xts(matrix(1:4, ncol=2, nrow=2), as.Date(c("2015-01-01","2018-01-01"))) 
xtsAttributes(a[,1])<-list(myattr="foo") 
xtsAttributes(a[,1]) 
#NULL 
xtsAttributes(a)<-list(myattr="foo") 
xtsAttributes(a) 
#[1] "foo" 

回答

1

這裏有一些意見/建議:

「我有一個XTS具有多個變量的對象,我想爲每個變量添加自定義屬性。「

一個xts對象沒有「多個變量」。基本上是一個數據矩陣(數字或字符類型的典型)和時間向量(類型爲日期或POSIXct)的xts對象撮合。

「我希望XTS對象(或對象的列表)中的每個變量有不同的價值觀,這些屬性。我相信xtsAttributes不能分配給XTS查詢」

這沒有引起太大對我來說很重要,但我會推測你可能意味着你需要不同列名的不同屬性。如果是這種情況,可以使列表的名稱反映xts對象中的列名稱。例如

xtsAttributes(a)<-list(Open = "a", Close = list(1:10, rep("A", 3)), Volume = "NYSE") 

訪問使用xtsAttributes(a)$Open屬性值等

xtsAttributes簡單的元數據附加到XTS對象的方式,如果你不喜歡的東西的子集(按時間),它不會消失的XTS目的。使用你的例子:

> str(a) 
An ‘xts’ object on 2015-01-01/2018-01-01 containing: 
    Data: int [1:2, 1:2] 1 2 3 4 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 1 
$ myattr: chr "foo" 
> b <- a["2015"] 
> str(b) 
An ‘xts’ object on 2015-01-01/2015-01-01 containing: 
    Data: int [1, 1:2] 1 3 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 1 
$ myattr: chr "foo" 

b仍然包含元數據foo

如果你想對你的元數據的時間索引,然後在單獨的XTS對象用於此目的:

> xx <-xts(matrix(c("Annoucement1", "Announcement2")), as.Date(c("2015-01-01","2018-01-01"))) 
> xx 
      [,1]   
2015-01-01 "Annoucement1" 
2018-01-01 "Announcement2" 
# Return all announcements up to 2016 
> xx["/2016"] 
      [,1]   
2015-01-01 "Annoucement1" 

a)和b)或許可以更好地解決其他的方式,如果他們不是活得t「永恆」的元數據,可以在xtsAttributes。也許data.frame項目列表(其中每個列表項對應於一個特定的符號)將更好地工作。

c)聽起來有點像過早優化(代碼)...只有這樣做,如果你真的確定你有一個重複使用的情況下擴展的課堂你想的。

就我個人而言,我從來沒有發現需要xtsAttributes。考慮財務數據的這種用例作爲解決您的問題的一種方式:將您的財務數據的相關數據存儲在股票或其他相關對象內的金融工具上。例如,R quantstrat庫使用stock對象(來自FinancialInstrument包),這些對象與xts對象中股票的時間序列財務數據關聯。有關更多信息,請參閱quantstrat演示。在這種情況下,財務數據(xts對象)和元數據(在「股票對象」中)之間的「地圖」/「鍵」是股票的名稱。

例如:

library(quantmod) 
library(FinancialInstrument) 

> getSymbols("AAPL") 
> head(AAPL) 
      AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
2007-01-03 95.539 95.860 90.679 83.80000 309579900  10.81246 
2007-01-04 93.059 95.163 92.804 85.66000 211815100  11.05245 
2007-01-05 94.964 95.440 93.447 85.04999 208685400  10.97374 
2007-01-08 95.174 95.805 94.421 85.47000 199276700  11.02793 
2007-01-09 95.716 102.946 94.277 92.57000 837324600  11.94403 
2007-01-10 104.906 108.283 103.467 97.00000 738220000  12.51562 

currency("USD") 
[1] "USD" 
# You could add meta data here: 
> stock("AAPL", currency = "USD", tick_size = 0.01, identifiers = list("foo" = 1233, "blah" = "text")) 
[1] "AAPL" 
# Want to get meta data for the `AAPL` xts object 
> getInstrument("AAPL") 
primary_id :"AAPL" 
currency :"USD" 
multiplier :1 
tick_size :0.01 
identifiers:List of 2 
..$ foo :1233 
..$ blah:"text" 
type  :"stock" 
+0

謝謝 - 在TS上下文變量等同於在XTS對象列。我確實看過quantstrat軟件包,但選擇不使用它,因爲這是一個普遍的時間序列問題(不僅僅涉及金融/交易)。元數據不受時間限制,並且如您所建議的,可能最好在單獨的data.frame/tbl中進行管理,併爲XTS對象提供一組通用ID。非常感謝您的詳細回覆。 – Schwartz