r - 将 ksmooth 应用于时间序列

标签 r time-series

我有以下问题:

我有一个数据框“测试”,看起来或多或少像这样:

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(return, price, 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)

这可能有问题,因为 R 提示了。 然后我想到了使用 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 

最佳答案

问题是 ksmooth 函数将返回一个列表,并且这些列表被 rollaplly 保存为该列表。顺便说一句,我认为您甚至不想使用 rollaplly,因为它不会对每个日期都这样做,而是在数据帧上“滚动”。根据您的解释,我相信这不是所需的行为。

我无法使用 zoo 对象真正解决这个问题,因为它非常严格。也许其他人会告诉你。您可以使用 plyr 包中的 ddply 函数构造该数据框:

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)

关于r - 将 ksmooth 应用于时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4313188/

相关文章:

使用 apply 函数对排序后的数据集进行排名

r - 如何在 R Shiny 应用程序中存储 react 变量的先前状态?

java - 在这种情况下如何设置R.string.resource_name

java - Cassandra 上准备好的语句的最大数量

'caret' 中 'randomForest' : set different ntree parameter for the first forest 的递归特征消除

r - mutate_if - 警告消息

python - Pandas - 重新采样/按日期时间索引进行分组并执行计算

r - 使用 data.table 滞后面板数据

r - mtsdi中的arima方法

sql - 如何使用时间刻度 time_bucket_gapfill() 设置最大范围条件,以便不填充真正的缺失值?