我是 R 的 n00b 和堆栈溢出的 n00b(刚刚加入),所以如果我未能使用标记(我不知道)或错过了自述文件中的某些内容,请原谅我。
如果您不介意,我将在这里解决我的完整问题,因为也许您可能会好心地告诉我应该如何最好地解决这个问题!
Stage 1
为每个 TS1 构建单独的时间序列对象 请参阅下面的数据示例。本质上,我正在加载一个 csv 文件,其中包含下面的多个不规则时间序列(例如 TS1、TS2),因此在理想的世界中,我会将它们分成单独的、不规则时间序列对象(例如动物园?),所以TS1,TS2,...这个问题在这里讨论过(R/zoo:处理非唯一索引条目但不丢失数据? https://stackoverflow.com/questions/8570716/r-zoo-handle-non-unique-index-entries-but-not-lose-data/25812246#25812246)但我多次尝试使用这种方法,但都失败了。
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
对于 TS1 这会导致read.zoo
不要创建我的分割数据对象。
Stage 2
然后我想做的是,在每个不规则的日期,将截至该日期的所有数据添加在一起。由于所有时间序列都是不规则的,并且具有不同的规律,我想使用先验值TS
。例如。为了21/05/2014
,示例中的计算很简单,因为 TS1 和 2 都有一个条目,因此答案是0.47 + 0.95
。但对于20/05
, only TS2
有一个条目,因此该值TS1
应使用截至该日期的最新日期,即17/04/2014
的价值1.02
,因此计算为20/05/2014
应该0.51 + 1.02
。实现这一目标的最简单方法可能是将每个 TS 转换为每日值,以便使用先前的值直到出现新的数据点?但这对于下面的第 3 阶段来说是浪费/不必要的。
Stage 3
创建了所有 TS 的聚合数据总和后,我想要进行多项式曲线拟合。我还想对这条曲线拟合进行微分,以找到该拟合曲线所预测的截至今天的日期的变化率。
任何帮助将非常感激!我觉得在这个阶段反复用头撞墙比做任何事情都更有趣!
Thanks
更新:感谢 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 绘图(x)
但无法对此进行评估。