我有以下数据:
Lines = "20/03/2014,9996792524
21/04/2014,8479115468
21/09/2014,11394750532
16/10/2014,9594869828
18/11/2014,10850291677
08/12/2014,10475635302
22/01/2015,10116010939
26/02/2015,11206949341
20/03/2015,11975140317
09/04/2015,11526960332
29/04/2015,9986194500
16/09/2015,11501088256
13/10/2015,11833183163
10/11/2015,13246940910
16/12/2015,13255698568
27/01/2016,13775653990
23/02/2016,13567323648
22/03/2016,14607415705
11/04/2016,13835444224
04/04/2016,14118970743"
我把它读到R:
z <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:1, tz = "", format = "%d/%m/%Y")
我希望插入数据,以便我可以将这个不规则间隔的时间序列转换为常规时间序列。时间间隔无关紧要,只要它是常规的,但每月,每周或每两周一次的间隔就可以。
如何在R
或Matlab
?
注意:我意识到插值可能不是很准确,可能会误传信息,但是我需要学习如何做到这一点,我可以放弃一些准确性。
答案 0 :(得分:2)
好的,首先,警告:如果你要进行插值然后进行测试或通用统计估计,你的结果会(严重)有偏见,除非你有一些很好的理由(领域知识?)到假设您的插值方法将生成来自原始点的相同分布的点。不,“情节看起来不错”不是评估这个的好标准:) 话虽如此,让我们来看看数据:
# Lines contains your data
library(zoo)
fmt <- "%d/%m/%Y"
z <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:1, tz = "", format = fmt)
t <- time(z)
plot(z,type="p",xaxt="n",pch=19,col="cyan",cex=1.5)
labs <- format(t,fmt)
axis(side = 1, at = t, labels = labs,cex.axis = 0.7)
它看起来大部分缺失的数据都与2014年夏季和2015年夏季有关。我很想知道这些数据是什么......无论如何,看起来您的大多数数据间隔至少2周:< / p>
diff(t)
# Time differences in days
# [1] 153 25 33 20 45 35 22 20 20 140 27 28 36 42 27 28 13 7
因此,让我们通过首先创建一个虚拟zoo
对象来插入双周序列:
t.biweekly <- seq(from = min(t), to=max(t),by="2 weeks")
dummy <- zoo(,t.biweekly)
将虚拟系列与你的系列合并:
z.interpolated <- merge(z,dummy,all=TRUE)
如果您查看新系列,您会看到dummy
中始终存在NA值,这些值在z
中没有相应的时间。让我们用线性插值来填充这些点并查看结果:
z.interpolated <- na.approx(z.interpolated)
plot(z.interpolated, type = "b")
points(z,pch=19,col="cyan",cex=1.5)
瞧!请记住,建立模型以推断出这件事是一个坏主意......