我使用刻度数据将其转换为分钟间隔
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
答案 0 :(得分:4)
请开始提供reproducible examples。这是一个可重复的示例:
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)