![](/img/trans.png)
[英]How to calculate correlations between certain columns in a list of dataframes?
[英]How to calculate rolling correlations between several columns and one column in rollapply?
問題
如果我想計算的滾動我的每39股之間在其列stock_returns和market_return(獨立XTS對象,與市場回報只有一列)與rollapply相關(XTS對象):
rolling_3yearcor <- rollapply(stock_returns,width=750,FUN=cor,y=market_return)
我收到此錯誤:
Error in FUN(.subset_xts(data, (i - width + 1):i, j), ...) : incompatible dimensions
即使我將market_return中的單個列作為子集
rolling_3yearcor <- rollapply(stock_returns,width=750,FUN=cor,y=market_return$market)
即使它們具有相同的尺寸,我也會收到錯誤消息! (1行,相同的行數)。
我想要的是:
我想要一個xts對象,該對象具有在750天的滾動窗口中的39個股票列中的每個股票與股票[i]與市場的相關性,而不是stock_returns中的每日收益。
不應該rollapply那樣做嗎?
編輯1:數據樣本用於一天后移的問題
Returns StockA
1997-01-03 -0.0054065397
1997-01-06 0.0024139001
1997-01-07 -0.0030085614
1997-01-08 0.0054329941
1997-01-09 -0.0005990317
1997-01-10 -0.0102205387
...
使用代碼:
ind <- market_return
ind[] <- seq_along(market_return)
rolling_3yearcor <- function(x,y,ind){
rollapply(ind,width=5,function(i) cor(x[i],y[i]))
}
rollcor_3year <- lapply(stock_returns,rolling_3yearcor,market_return,ind)
rollcor_3year <- as.data.frame(rollcor_3year,col.names=names(stock_returns))
colnames(rollcor_3year) <- colnames(stock_returns)
rollcor_3year <- as.xts(rollcor_3year)
給我:
dput(head(rollcor_3year$StockA.N))
structure(c(NA, NA, NA, NA, 0.30868769358199, 0.576490782746284
), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct",
"POSIXt"), .indexTZ = "", tzone = "", class = c("xts", "zoo"), index =
structure(c(852246000,
852505200, 852591600, 852678000, 852764400, 852850800), tzone = "", tclass =
c("POSIXct",
"POSIXt")), .Dim = c(6L, 1L), .Dimnames = list(NULL, "StockA.N"))
然后用:
indexTZ(rollcor_3year) <- "UTC"
dput(head(rollcor_3year$StockA.N))
structure(c(NA, NA, NA, NA, 0.30868769358199, 0.576490782746284
), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct",
"POSIXt"), .indexTZ = c(TZ = "UTC"), tzone = c(TZ = "UTC"), class = c("xts",
"zoo"), index = structure(c(852246000, 852505200, 852591600,
852678000, 852764400, 852850800), tzone = c(TZ = "UTC"), tclass =
c("POSIXct",
"POSIXt")), .Dim = c(6L, 1L), .Dimnames = list(NULL, "StockA.N"))
它給了我:
head(rollcor_3year$StockA.N)
1997-01-02 23:00:00 NA
1997-01-05 23:00:00 NA
1997-01-06 23:00:00 NA
1997-01-07 23:00:00 NA
1997-01-08 23:00:00 0.3086877
1997-01-09 23:00:00 0.5764908
問題是您正在嘗試計算不同長度的向量之間的相關性。 嘗試cor(1:10, 1:9)
直接查看。 rollapply
僅滾動其第一個參數,因此market_return$market
使用了market_return$market
。
解決此問題的一種方法是將向量的索引翻轉(假設兩個向量原本長度相同)。 我無權訪問您的數據,因此一些數據:
set.seed(2)
df1 <- as.data.frame(replicate(5, runif(10), simplify=FALSE))
names(df1) <- paste0("V", 1:5)
vec2 <- runif(10)
查看框架的第一列,我們可以顯示概念驗證:
rollapply(seq_along(vec2), 3, function(i) cor(df1$V1[i], vec2[i]))
# [1] 0.2873624 -0.8522555 -0.9859923 -0.6394554 -0.4626926 0.4939377 0.5590373 0.9994124
為了輕松地將其應用於框架的所有列,我們可以創建一個輔助函數:
rollcor <- function(v1,v2) {
rollapply(seq_along(v1), 3, function(i) cor(v1[i], v2[i]))
}
lapply(df1, rollcor, vec2)
# $V1
# [1] 0.2873624 -0.8522555 -0.9859923 -0.6394554 -0.4626926 0.4939377 0.5590373 0.9994124
# $V2
# [1] 0.79602807 0.16857013 -0.24970680 0.01997719 0.96922386 -0.99937633 -0.32920929
# [8] -0.34819538
# $V3
# [1] 0.78978134 -0.08632500 -0.13991114 -0.26078798 -0.05284222 0.24405994 -0.68231437
# [8] -0.48694537
# $V4
# [1] 0.9850739 0.9823811 0.9743629 0.8470096 0.7337313 -0.9617746 -0.7033091 -0.4968143
# $V5
# [1] -0.6696637 -0.8672182 -0.9074534 -0.7671002 -0.3954844 -0.9864078 -0.2806075 -0.5689732
編輯
既然您說的是時間序列,盡管我們仍然需要使用索引(而不是時間序列向量本身),但是我們可以使用兩種技術來保留時間序列:
在未經修改的代碼上使用zoo:::rollapply.ts
(在此編輯之前)。 不鼓勵這樣做,因為它依賴於未導出的功能。 我認為它通常是安全的,但從長遠來看,它不是一個好的形式。
將相同的時間序列應用於我們將要遍歷的索引。
ind <- vec2 ind[] <- seq_along(vec2) rollapply(ind, 3, function(i) cor(df1$V1[i], vec2[i])) rollcor <- function(v1,v2,ind) { rollapply(ind, 3, function(i) cor(v1[i], v2[i])) } lapply(df1, rollcor, vec2, ind)
將rollapplyr
與所示功能一起使用,並且by.column = FALSE
。
# test data
stock_returns <- xts(anscombe[6:8], as.Date("2000-01-01") + seq(0, length=nrow(anscombe)))
market <- xts(anscombe[, 5], time(stock_returns))
x <- cbind(market, stock_returns)
rollapplyr(x, 5, function(x) cor(x[, 1], x[, -1]), by.column = FALSE)
給予:
2000-01-01 NA NA NA
2000-01-02 NA NA NA
2000-01-03 NA NA NA
2000-01-04 NA NA NA
2000-01-05 0.6912899 -0.19831742 0.8437913
2000-01-06 -0.0904641 -0.08067339 0.3773026
2000-01-07 0.3714166 -0.05974574 0.3604551
2000-01-08 0.9013902 0.90672036 -0.6537459
2000-01-09 0.9059692 0.91388127 -0.7673776
2000-01-10 0.7996265 0.89299770 -0.7032847
2000-01-11 0.7812519 0.89427224 -0.6959074
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.