2013-03-20 55 views
1

我有过去20年的时间序列数据。这个变量每年都被测量过,所以我有20个值。我有一个制表符分隔的文件,第一列代表年份和第二列的值。 这里是什么样子:在R中外推时间序列数据

 
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,所以如果你甚至可以帮助我使用代码来读取制表符分隔的文件中的数据,那么这将是非常棒的。

感谢

+0

-1。有成千上万的资源如何将数据读入R.问题的另一部分更适合于stats.stackexchange.com。 – EDi 2013-03-20 22:34:01

+0

更不用提[数据输入/输出的整个手册](http://cran.r-project.org/doc/manuals/R-data.html) – 2013-03-20 22:47:28

+4

试试这个:'library(zoo);库(预测); z < - read.zoo(“file.dat”); f < - 预测(z);印刷(F);绘制(f)'并在这里阅读5个小插曲(PDF文档):http://cran.r-project.org/web/packages/zoo/index.html – 2013-03-20 23:08:51

回答

5

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

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

,看read.table manpage

来推断数据:

EDiDirk SA你需要做一些阅读。决定你想要什么样的外推:线性(Hmisc::approxExtrap线性外推; approxfun做内插但不外推),样条(stats::splinefunsplines包)等。splinefun可能适合您的情况。 专门用于预测时间序列,请参见forecast(您还应该浏览相关的SO问题)。 在您浏览这些手册页之后,尝试一些内容,发布一些代码并告诉我们您卡在哪里,可以做出更多回应。否则,你会无情地惹火,你的问题可能会被关闭,因为'Give me teh codez' ;-)

+0

感谢smci指出我在正确的方向。让我继续研究并提出一个代码。非常感谢。 – user1985425 2013-03-20 23:01:56

+1

小修正:'approxfun'线性内插,但不是线性外推 - 而是返回NA或“最接近数据极值的值”。 – jbaums 2014-04-11 10:14:03

+1

@jbaums true,但'Hmisc :: approxExtrap' does – RockScience 2014-10-15 08:10:54

6

以下是可帮助您入门的草图。

## 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) 

在这种情况下,我们的模型表示该线不会过零。如果这没有意义,那么你会想要选择一个不同的模型。无论您选择哪种模型,都要将结果与数据一起绘制,以便您可以看到自己的表现。

+0

我认为在第40行中应该是geom_line(aes(y = tmp $ pred1),color =“red”)而不是geom_line(aes(y = pred1),颜色=“红色”) – Tungurahua 2015-01-14 19:04:32

+0

@Tungurahua在创建p1之前或者定义'tmp $ pred1',或者使geom_line再次用'geom_line(aes(y = pred1),color =“red”,data = tmp)' – Ista 2015-01-15 20:20:49

+0

@Tungurahua我编辑了答案,首先定义了'tmp $ pred1'。 – Ista 2015-01-15 20:28:08