gpt4 book ai didi

r - 将 ksmooth 应用于时间序列

转载 作者:行者123 更新时间:2023-12-04 11:32:00 25 4
gpt4 key购买 nike

我有以下问题:

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com