簡體   English   中英

在lm和rollapply中使用xts對象

[英]using xts object with lm and rollapply

我正在使用刻度數據將其轉換為分鍾間隔

test <- to.minutes(x, OHLC=TRUE)
colnames(test) <- c("Open","High","Low","Close")
test
2011-06-07 14:23:00  435  435  435  435   
2011-06-07 14:26:00  430  435  430  435   
2011-06-07 14:32:00  435  435  430  430   
2011-06-07 14:35:00  430  430  430  430 
str(test)

  An ‘xts’ object from 2011-03-10 to 2011-06-08 23:56:00 containing:
  Data: num [1:20426, 1:4] 350 360 375 375 370 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Open" "High" "Low" "Close"
  Indexed by objects of class: [POSIXct,POSIXt] TZ: 
  xts Attributes:  
 NULL

現在我嘗試如下使用rollapply:

test1<-rollapply(test, width=20, FUN=function(x) {x$xt <-seq(1-nrow(x),0); lm(Close ~poly(xt,4),x)}, by.column=FALSE, align="right")

但這產生了

    Error in eval(expr, envir, enclos) : object 'Close' not found
In addition: Warning message:
In x$xt <- seq(1 - nrow(x), 0) : Coercing LHS to a list

請開始提供可復制的示例 這是一個可重現的示例:

library(xts)
data(sample_matrix)
test <- as.xts(sample_matrix)

myFun <- function(x) {
  x$xt <- seq(1-nrow(x),0)
  lm(Close ~ poly(xt,4), data=x)
}
test1 <- rollapplyr(test, width=20, FUN=myFun, by.column=FALSE)

警告是一個很好的提示。 看一下zoo:::rollapply.zoo的源代碼,您會看到它在作為矩陣的coredata(your_data)上運行您的函數。 $函數不適用於矩陣子集,因此您需要使用cbind

但是lm需要一個data.frame而不是一個矩陣,所以這樣做:

myFun2 <- function(x) {
  x <- data.frame(x, xt=seq(1-nrow(x), 0))
  lm(Close ~ poly(xt,4), x)
}
test1 <- rollapplyr(test, width=20, FUN=myFun2, by.column=FALSE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM