Применить ksmooth к временным рядам

У меня такая проблема:

У меня есть "тест" фрейма данных, который выглядит примерно так:

Date         return     price      vol   
20100902     0.3        15         8.5
20100902     0.4        17         8.6
20100902     0.6        19         8.7
.....
20100903     0.2        13         8.2
20100903     0.4        17         8.6
20100903     0.8        21         9.0
.....

Итак, я привел значения для каждой даты (10 в день). Что я хотел бы сделать сейчас, так это применить ksmooth () к каждой дате, например, ksmooth (возврат, цена, n.points = 50) для каждой даты. Это должно дать мне 50 наблюдений для каждой даты. Кроме того, мне нужна отметка времени для интерполированных значений. Так что получившийся кадр должен понравиться

Date         return     price         
20100620     0.3        15  
20100620     0.31       15.2
20100620     0.32       15.3 
20100620     0.4        17         
20100620     0.6        19        
.....
20100621     0.2        13     
20100621     0.21       13.1
20100621     0.22       13.2
20100621     0.4        17         
20100621     0.8        21     
etc.

при 50 наблюдениях в день. Итак, вот что я ищу: возьмите первые 10 наблюдений (например, дата 1 = 20102006, интерполируйте и поставьте отметку времени на интерполированные значения (20100620). Затем возьмите вторые 10 наблюдений (дата = 20100621), интерполируйте и поставить отметку времени на интерполированные значения (20100621) и так далее.

Я новичок в R, но это то, что я пробовал. Я подумал об использовании для этого функции zoo (). Прежде чем что-либо реализовать, я хотел сделать свои записи даты уникальными, поэтому я просто добавил часы к каждой записи.

test <- read.zoo("test.txt", format = "%Y%m%d")
test <- zoo(test, as.POSIXct(time(test)) + 1:26)

Вероятно, в этом что-то не так, потому что Р. пожаловался. Затем я подумал об использовании функции rollapply ().

roll.test <- rollapply(test, 10, FUN = function(x,y) ksmooth(test$return,    
+ test$price, "normal", bandwidth = 20, n.points = 50) )

К сожалению, результат очень запутанный. И запрос by.column = FALSE не работает.

Я был бы очень признателен за помощь. Он вовсе не обязательно должен основываться на моей «пробной версии». Большое спасибо Дэни

Мои данные выглядят так:

"date" "days" "return" "price" 
"66" 20100620 91 0.18 1389.373 
"67" 20100620 91 0.19 1370.57 
"68" 20100620 91 0.19 1353.122 
"69" 20100620 91 0.19 1336.291 
"70" 20100620 91 0.20 1319.774 
"71" 20100620 91 0.20 1303.341 
"72" 20100620 91 0.21 1286.656 
"326" 20100621 91 0.18 1386.28 
"327" 20100621 91 0.18 1367.694 
"328" 20100621 91 0.19 1350.375 
"329" 20100621 91 0.19 1333.615 
"330" 20100621 91 0.20 1317.164 
"331" 20100621 91 0.20 1300.783 
"332" 20100621 91 0.21 1284.113 

person Dani    schedule 30.11.2010    source источник
comment
Всегда полезно предоставить набор данных игрушек для тестирования кода. Поскольку у нас нет test.txt, трудно сказать, почему R жалуется.   -  person Joris Meys    schedule 30.11.2010
comment
вы можете проверить функцию dput(). Если вы дадите этот вывод, мы просто можем скопировать и вставить его в R и получить точно такой же объект. Или, как вариант, сделайте то же, что я сделал в своем решении, чтобы убедиться, что нам просто нужно скопировать код и получить объект.   -  person Joris Meys    schedule 30.11.2010


Ответы (1)


Проблема в том, что функция ksmooth вернет список, и эти списки будут сохранены с помощью rollaplly. Между прочим, я не думаю, что вы даже хотите использовать rollaplly, поскольку это не делает этого для каждой даты, а «перекатывает» фрейм данных. Я считаю, из вашего объяснения, что это нежелательное поведение.

Я не мог решить это с помощью объекта зоопарка, так как он довольно ограничен. Может быть, кто-нибудь еще покажет вам это. Вы можете построить этот фрейм данных, используя функцию ddply из пакета plyr:

tt <- ddply(test,.(Date),
  function(x) { 
       as.data.frame(ksmooth(x$return,x$price,"normal",bandwidth=2,n.points=50))
  })

tt затем можно преобразовать в объект зоопарка, используя

tt2 <- zoo(tt, as.POSIXct(tt$Date) + 1:50)

В качестве альтернативы вы можете сделать это вручную, немного манипулируя списком. опять же, полученный tt может быть преобразован строкой выше в объект зоопарка.

tt <- split(test,test$Date)

tt <- lapply(tt,function(x){
        as.data.frame(ksmooth(x$return,x$price,"normal",bandwidth=2,n.points=50))
      })

tt <- do.call(rbind,tt)
names(tt) <- c("return","price")
tt$Date <- as.Date(gsub("\\.\\d+","",rownames(tt)))

Имейте в виду, я использовал read.table() для построения теста:

zz <- textConnection(
"Date    ,     return ,    price  ,    vol
20100902 ,    0.3  ,      15   ,      8.5
20100902 ,    0.4  ,      17   ,      8.6
20100902 ,    0.6  ,      19   ,      8.7
20100903 ,    0.2  ,      13   ,      8.2
20100903 ,    0.4  ,      17   ,      8.6
20100903 ,    0.8  ,      21   ,      9.0"
)
test <- read.table(zz,header=T,sep=",")
test$Date <- as.Date(as.character(test$Date),format="%Y%m%d")
close(zz)
person Joris Meys    schedule 30.11.2010
comment
Большое спасибо, Джорис, это выглядит многообещающим! Постараюсь, чтобы в следующий раз вам было легче читать =) - person Dani; 30.11.2010