apply.rolling窗口/循环与秩功能

时间:2016-06-27 19:21:32

标签: r loops apply xts rank

如何使用base::rank对数据进行排名时,如何制作滚动窗口/循环(回溯期30天/数据点)?请参阅下文,apply.rolling函数似乎不起作用。

见下面的例子:

# example data
require(xts)
set.seed(3)    
A    <- matrix(runif(900, max=30), ncol=3)
Data <- xts(A, Sys.Date()-300:1)
names(Data) <- c("C1", "C2", "C3")

这导致(仅显示最近7天/数据点):

2016-06-20 16.71131510 12.80074552 19.27525535
2016-06-21 22.92512330 25.11613536 17.45237229
2016-06-22 20.09403965 17.20945809 28.06481040
2016-06-23 28.68593738  4.84698272 18.36108782
2016-06-24 15.52956209 25.54946621  3.97892474
2016-06-25 25.76582707 18.14117193  8.17883282
2016-06-26 25.23925100 16.07418907 15.35118717

我只选择最后30个数据点:

rolldata30 <- tail(Data[,2:3], 30)
rollindex30 <- tail(Data[,1], 30)

我根据原始值对矢量C2C3的数据(最后30个数据点)进行排名。因此,这是期间2016-05-28至2016-6-26 。然后我创建一个新的向量,计算两者的平均值。 factorx显示了我感兴趣的结果。

rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep"))
factor <- cbind(rollindex30, global = rowMeans(rank30))
factorx <- last(factor)

结果是:

2016-06-20 16.711315   14.5
2016-06-21 22.925123    9.5
2016-06-22 20.094040    9.0
2016-06-23 28.685937   19.0
2016-06-24 15.529562   15.0
2016-06-25 25.765827   18.5
2016-06-26 25.239251   17.0

最后一天的数据:

           C1        global
2016-06-26 25.23925     17

我如何进行计算以便为 2016-5-27直到2016-06-26 2016-05-26直到2016-06-进行相同的计算25 等?

使用PerformanceAnalytics::apply.rolling会出错:

xts中的错误(x,order.by = order.by,frequency = frequency,.CLASS =&#34; double&#34;,:   order.by需要适当的基于时间的对象

require(PerformanceAnalytics)
test1 <- apply.rolling(Data, width=30, gap=30, by=1, FUN=function(x) as.xts(-x, 2, rank))

我做了以下功能。 factorz给出了相同的结果。也许这个功能有助于它滚动?

rollrank <- function(x)
{
  a <- tail(x, 30)
  b <- as.xts(apply(-a, 2, rank, na.last= "keep"))
  c <-  cbind(a, global = rowMeans(b))
  d <- last(c)
  return(d)
}
factorz <- rollrank(Data[,2:3])

1 个答案:

答案 0 :(得分:1)

func playVideo () { let url = NSURL(string: "https://drive.google.com/file/d/0B9XuPgWwSkzrdHN5WWUydjJScDg/preview")! let player = AVPlayer(URL: url) let playerViewController = AVPlayerViewController() playerViewController.player = player self.presentViewController(playerViewController, animated: true) { playerViewController.player?.play() } } 的{​​{1}}参数没有意义。我怀疑你的意思是FUN。但是这仍然无效,因为apply.rolling返回一个有多行的对象。

您的FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep"))功能非常接近您的需求,我建议您使用FUN代替rollrank。我建议您根据第一个示例创建一个函数,然后将该函数传递给rollapply

apply.rolling