我有以下问题:
我有一个看起来或多或少的数据框“test”:
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
答案 0 :(得分:5)
问题是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))
})
然后可以使用将转换为动物园对象
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)