如何在R或Matlab中将这个不规则的时间序列转换(插值)为一个规则间隔的序列?

5
我有以下数据:
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中实现这一功能?
注意:我知道插值值可能不是非常准确,并且可能会误导信息,但我需要学习如何做到这一点,即使失去一些准确性也没有关系。

你可以根据数据点之间的值建立一个模型,但简单的事实是,你无法知道你没有测量的数据的价值。 - Sycorax
1个回答

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)    

enter image description here

看起来你缺失的数据大部分属于2014年夏季和2015年夏季。我很想知道这些数据是什么...无论如何,看起来你的大部分数据至少相隔2周:

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)

在此输入图片描述

看,这个东西建模进行推理是不好的...


谢谢!虽然我知道在预测模型中使用这些插值值是一个坏主意,但我还是很想看看结果。所以我尝试了:fcst <- forecast(z.interpolated, h=5),它说:Error in ets(object, lambda = lambda, allow.multiplicative.trend = allow.multiplicative.trend, : You've got to be joking. I need more data! In addition: Warning message: In ets(object, lambda = lambda, allow.multiplicative.trend = allow.multiplicative.trend, : Missing values encountered. Using longest contiguous portion of time series。哪些缺失的值? - learnerX
1
我看你真的想自己给自己开枪:D,继续吧,但你应该知道forecast(以及包forecast中的大多数其他函数)是基于ts对象而不是zoo对象的。如何将zoo对象转换为ts对象是另一个问题,无法在评论中回答,但是有一种快速的方法可能会搞乱你的日期(但仍然可以让你获得预测),请参见此问题 - DeltaIV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接