我是 R 的 n00b 和堆栈溢出的 n00b(刚刚加入),所以如果我没有使用标记(我不知道)或错过了自述文件中的某些内容,请原谅我。
如果您不介意,我将在这里解决我的全部问题,因为也许您会很友善地了解我应该如何最好地解决这个问题!
阶段1
为每个 TS1 构建单独的时间序列对象 请在下面找到一个数据示例。本质上,我正在加载一个包含多个不规则时间序列的 csv 文件(例如 TS1、TS2),因此在理想的世界中,我会将它们拆分为单独的不规则时间序列对象(例如动物园?),所以TS1,TS2,...这里讨论了这个问题( R/zoo: handle non-unique index entries but not lose data? ),但我反复尝试使用这种方法,但失败了。
Date TS Data
21/05/2014 TS1 0.95
17/04/2014 TS1 1.02
27/03/2014 TS1 0.90
30/01/2014 TS1 0.80
12/12/2013 TS1 0.70
18/09/2013 TS1 0.67
01/11/2012 TS1 0.71
01/11/2012 TS1 0.70
21/05/2014 TS2 0.47
20/05/2014 TS2 0.51
16/05/2014 TS2 0.49
15/05/2014 TS2 0.55
10/05/2014 TS2 0.63
07/05/2014 TS2 0.77
可以看出,问题是由于
01/11/2012
的重复日期索引引起的。对于导致 read.zoo
的 TS1不要创建我的拆分数据对象。第二阶段
然后我想做的是,在每个不规则日期,将该日期的所有数据加在一起。由于所有时间序列都是不规则的,并且具有不同的规律性,我想使用
TS
的先验值.例如。为 21/05/2014
,这个例子中的计算很简单,因为 TS1 和 2 都有一个条目,所以答案是 0.47 + 0.95
.但是对于 20/05
, 仅 TS2
有一个条目,所以 TS1
的值应该使用的是截至该日期的最新版本,即 17/04/2014
1.02
的值,所以计算 20/05/2014
应该是 0.51 + 1.02
.实现这一点的最简单方法可能是将每个 TS 转换为每日值,以便使用先前的值直到新的数据点?但这对于下面的第 3 阶段来说是浪费的/不必要的。第三阶段
创建了所有 TS 的聚合数据总和后,我想做多项式曲线拟合。我还想区分这个曲线拟合,以找到由这条拟合曲线预测的今天日期的变化率。
任何帮助将非常感激!我觉得在这个阶段反复用头撞墙比做任何事情都有趣!!
谢谢
更新:感谢 Grothendieck,我现在有如下代码。
library(scales)
library(zoo)
library(ggplot2)
f <- function (z) {
zz <- read.zoo(z, header = TRUE, split = 2, format = "%d/%m/%Y", aggregate = mean);
z.fill <- na.locf(zz);
z.fill <- (z.fill >= 0.5) * z.fill;
z.fill <- na.fill(z.fill,0);
zfill.mat = matrix(z.fill, NROW(z.fill));
z.sum <- rowSums(zfill.mat);
zsum <- zoo(z.sum,time(z.fill));
return(zsum);
}
DF <- read.csv(file.choose(), header = TRUE, as.is = TRUE);
DF.S <- split(DF[-2], DF[[2]]);
user <- DF[1,2];
Ret <- lapply(DF.S, f);
我还有一个问题:
Ret 包含一个数据框列表。我可以通过键入 Ret$user 来访问它,但由于用户不同,我需要使其动态化。我试图构建一个动态表达式,例如:
x <- paste("Ret$'",user,"'",sep = "");
情节(x)
但无法对此进行评估。
最佳答案
read.zoo
有一个 aggregate=
参数采用一个函数,该函数用于聚契约(Contract)一系列中重复时间的值。这里我们取mean
系列中重复的天数,但您可以使用 sum
或任何其他功能。 (如果数据来自文件,我们会将 text = Lines
中的 read.zoo
参数替换为类似 "myfile.dat"
的内容。)然后我们使用 na.locf
填写 NA,对行求和,我们使用 na.omit
放弃任何领先的 NA 给予 zsum
.接下来我们计算一个规则间隔的时间网格 g
和样条函数 splfun
在网格上评估该函数及其导数,在转换回动物园后,给出 zspl
和 zder
.最后我们绘制它们。
Lines <- "Date TS Data
21/05/2014 TS1 0.95
17/04/2014 TS1 1.02
27/03/2014 TS1 0.90
30/01/2014 TS1 0.80
12/12/2013 TS1 0.70
18/09/2013 TS1 0.67
01/11/2012 TS1 0.71
01/11/2012 TS1 0.70
21/05/2014 TS2 0.47
20/05/2014 TS2 0.51
16/05/2014 TS2 0.49
15/05/2014 TS2 0.55
10/05/2014 TS2 0.63
07/05/2014 TS2 0.77"
library(zoo)
z <- read.zoo(text = Lines, header = TRUE, split = 2, format = "%d/%m/%Y",
aggregate = mean)
zsum <- na.omit(zoo(rowSums(na.locf(z)), time(z)))
g <- seq(start(zsum), end(zsum), "day")
splfun <- splinefun(time(zsum), coredata(zsum))
zspl <- zoo(splfun(g), g)
zder <- zoo(splfun(g, deriv = 1), g)
plot(merge(zspl, zder))
关于R:具有重复时间索引条目的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25812673/