Применить ksmooth к временным рядам - PullRequest
2 голосов
/ 30 ноября 2010

У меня следующая проблема:

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

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 не работает.

Я был бы очень признателен за помощь. Это не должно основываться на моей "пробной версии" вообще. большое спасибо Dani

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

"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 

1 Ответ

5 голосов
/ 30 ноября 2010

Проблема в том, что функция ksmooth вернет список, и эти списки будут сохранены как таковые по запросу.Между прочим, я не думаю, что вы даже хотите использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...