2012-01-24 53 views
1

我使用滴答數據,將其轉換成分鐘間隔使用XTS與LM對象和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 
+1

你需要seq'和'lm'之間'分號(或換行)。 –

+0

謝謝@JoshuaUlrich。我這樣做,它給了我一個新的錯誤。我剛剛更新了我的原始帖子,更正和錯誤。 – user1155299

回答

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) 
+0

謝謝Joshua,我會按照我下一篇文章的指導。 – user1155299

+0

@ user1155299:沒有警告,所以我不知道你指的是什麼。我無法複製你的錯誤,但我得到了一個不同的錯誤:「動物園錯誤(rval,index(x)[i]):」x「:嘗試定義無效的zoo對象」。 '?confint'表示函數需要一個「擬合模型對象」。你傳遞給它一個「動物園」對象,所以我並不感到驚訝,它會引發錯誤。看起來你可能需要退一步,重新思考你如何接近你的問題。 –

+0

我犯了一個錯誤,所以我刪除了這個帖子,但是您很快就抓住了它;-) – user1155299