我是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
可以看出,问题是由于TS1的01/11/2012
重复日期索引导致read.zoo
不创建我的拆分数据对象。
第2阶段
我想要做的是,在每个不定期的日期,将所有数据添加到该日期。由于所有时间序列都是不规则的,并且具有不同的规律性,因此我想使用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阶段来说是浪费/不必要的。
第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&lt; - paste(“Ret $'”,user,“'”,sep =“”);
情节(x)
但无法对此进行评估。
答案 0 :(得分:3)
read.zoo
有一个aggregate=
参数,它接受一个函数,用于在同一系列中重复聚合值。在这里,我们采用系列中重复日期的mean
,但您可以使用sum
或任何其他功能。 (如果数据来自文件,我们会用text = Lines
替换read.zoo
中的"myfile.dat"
参数。)然后我们使用na.locf
填写NAs,求和行,我们使用na.omit
删除任何提供zsum
的主要NAs。接下来,我们计算一个规则间隔的时间网格g
和一个样条函数splfun
,评估该函数及其在网格上的导数,在转换回动物园后,给出zspl
和{{1} }。最后我们绘制它们。
zder