在R中对时间序列数据进行外推

3
我有过去20年的时间序列数据,该变量每年都有测量值,因此我有20个值。我有一个制表符分隔的文件,第一列表示年份,第二列表示值。 它看起来像这样:
1991    438
1992    408
1993    381
1994    361
1995    338
1996    315
1997    289
1998    261
1999    229
2000    206
2001    190
2002    173
2003    151
2004    141
2005    126
2006    108
2007    99
2008    93
2009    85
2010    77
2011    71
2012    67
我想要推断出未来几年的第二列值。第二列的值下降速度也在下降,所以我认为我们不能使用线性回归。我希望知道第二列将在哪一年接近零值。我从未使用过R,如果您能帮我编写用于从制表符分隔的文件中读取数据的代码,那就太好了。
谢谢

有成千上万的资源可以教你如何将数据读入R。问题的另一部分更适合在stats.stackexchange.com上提问。 - EDi
更不用说专门为数据输入/输出编写的整个手册了。 - Dirk Eddelbuettel
4
尝试这个:library(zoo); library(forecast); z <- read.zoo("file.dat"); f <- forecast(z); print(f); plot(f),并阅读这里的5个小品文(PDF文档):http://cran.r-project.org/web/packages/zoo/index.html - G. Grothendieck
1
@EDi:不,关于如何编写外推程序的基本问题在这里非常适用。我最近自己也进行了研究,并发现这是SO知识库中的一个空白,因此我发布了我的答案。坦率地说,R在插值/外推方面非常混乱。 - smci
1
但是,将这个问题与读取文件的问题混合在一起并不利于获得良好的响应。 - smci
2个回答

10
以下是一份草图,可以帮助您入门。
## get the data
tmp <- read.table(text="1991    438
1992    408
1993    381
1994    361
1995    338
1996    315
1997    289
1998    261
1999    229
2000    206
2001    190
2002    173
2003    151
2004    141
2005    126
2006    108
2007    99
2008    93
2009    85
2010    77
2011    71
2012    67", col.names=c("Year", "value"))

library(ggplot2)

## develop a model
tmp$pred1 <- predict(lm(value ~ poly(Year, 2), data=tmp))

## look at the data
p1 <- ggplot(tmp, aes(x = Year, y=value)) +
  geom_line() +
  geom_point() +
  geom_hline(aes(yintercept=0))

print(p1)

## check the model
p1 +
  geom_line(aes(y = pred1), color="red")

## extrapolate based on model
pred <- data.frame(Year=1990:2050)
pred$value <- predict(lm(value ~ poly(Year, 2), data=tmp),newdata=pred)

p1 +
  geom_line(color="red", data=pred)
在这种情况下,我们的模型表示这条线永远不会穿过零点。如果这听起来毫无意义,那么您将需要选择另一个模型。无论选择哪个模型,都应该将结果与数据绘制在一起,以便您可以看到自己的表现如何。

在这种情况下,我们的模型表示这条线永远不会穿过零点。如果这听起来毫无意义,那么您将需要选择另一个模型。无论选择哪个模型,都应该将结果与数据绘制在一起,以便您可以看到自己的表现如何。


我认为在第40行应该是geom_line(aes(y = tmp$pred1), color="red")而不是geom_line(aes(y = pred1), color="red")。 - Tungurahua
@Tungurahua 要么在创建 p1 之前定义 tmp$pred1,要么使用 geom_line(aes(y = pred1), color="red", data = tmp) 重新读取数据。 - Ista
@Tungurahua 我已经编辑了答案,首先定义tmp$pred1 - Ista

6

读取格式化文件中的数据:

require(utils)  # (make sure you have 'utils' package installed!)
data <- read.table('<filename>', header=FALSE, colnames=c('Year','Value'))

要推断数据:

正如EDiDirk所说,您需要进行一些阅读。决定您想要什么类型的外推函数:线性(Hmisc :: approxExtrap用于线性外推;approxfun进行插值但不进行外推),样条(stats :: splinefunsplines包),等等。对于您的情况,splinefun可能是可以的。 特别是对于预测时间序列,请参见预测(您还应浏览相关的SO问题)。 在您浏览这些手册页面之后,尝试一些东西,发布一些代码并告诉我们您卡住了哪里,我们可以做出更多回应。否则,您将遭到无情的攻击,您的问题很可能会被关闭为“给我teh codez”;-)

并查看read.table manpage


感谢smci指出正确的方向,让我可以着手解决问题并编写代码。非常感谢。 - user1985425
1
小修正:approxfun 线性插值,但并不是线性外推 - 它会返回 NA 或“最接近数据极值的值”。 - jbaums
1
@jbaums 是的,但是 Hmisc::approxExtrap 可以。 - RockScience

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