在R中使用神经网络进行时间序列预测的示例

10

有没有一个简短的教育性示例可以说明如何使用神经网络(R中的nnet)进行预测?以下是一个R语言时间序列的示例:

T = seq(0,20,length=200)
Y = 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
plot(T,Y,type="l")

Many thanks

David


5
“nnet”是否只适用于定性变量,即分类问题? 您可以尝试使用“neuralnet”或“AMORE”软件包。 另外请注意,由于您的函数无界,S型转移函数(不是唯一的选择,但通常是默认值)不太可能给出可用的结果。对于时间序列,为了考虑自回归,人们通常使用“循环网络”,这更加复杂... - Vincent Zoonekynd
1
这不是一个编程问题,更适合在http://stats.stackexchange.com/上提问。 - Joshua Ulrich
2
谢谢大家,至少你们给了我一些想法。有人告诉我神经网络可以用来预测“跳跃季节性”时间序列。可以应用一种转换使时间序列有界。我也会去看看stats.stackexchage :) - DKK
2个回答

17

我认为你可以使用caret包,特别是train函数。

This function sets up a grid of tuning parameters for a number 
      of classification and regression routines.
require(quantmod) 
require(nnet)
require(caret)
T = seq(0,20,length=200)
y = 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
dat <- data.frame( y, x1=Lag(y,1), x2=Lag(y,2))
names(dat) <- c('y','x1','x2')
dat <- dat[c(3:200),] #delete first 2 observations
#Fit model
model <- train(y ~ x1+x2 , 
               dat, 
               method='nnet', 
               linout=TRUE, 
               trace = FALSE)
ps <- predict(model, dat)

#Examine results

plot(T,Y,type="l",col = 2)
lines(T[-c(1:2)],ps, col=3)
legend(5, 70, c("y", "pred"), cex=1.5, fill=2:3)

enter image description here


1
太好了!谢谢你,agstudy。这个跟主题无关,但是上传所有这些包(以及它们的附件)真的很痛苦,我可以问一下你有没有快速的方法吗? - DKK
3
如果您要预测时间为30的值,您会如何做?为什么选择x1=Lag(y,1)、x2=Lag(y,2),这种方法只适用于这个时间序列吗? - DKK
2
为什么这么痛苦?只有两个包!caretnnetquantomod用于滞后! - agstudy
4
尝试使用install.packages("caret", dependencies=TRUE)安装。 - GSee
2
关于软件包依赖性,你绝对要考虑使用 RStudio。它可以确保所需的依赖项被加载,让这个过程变得非常简单。 - Ram Narasimhan
显示剩余4条评论

1
@agstudy提出的解决方案很有用,但样本内拟合并不能可靠地指导样本外的预测准确性。在预测准确度测量中,金标准是使用保留样本。从训练样本中删除最后的5个、10个或20个观测值(取决于时间序列的长度),将模型拟合到其余数据上,使用拟合的模型预测保留样本,并仅仅使用平均绝对偏差(MAD)或加权平均绝对百分比误差(wMAPEs)比较保留样本的准确度。 因此,您可以按以下方式更改上面的代码:
require(quantmod) 
require(nnet)
require(caret)
t = seq(0,20,length=200)
y = 1 + 3*cos(4*t+2) +.2*t^2 + rnorm(200)
dat <- data.frame( y, x1=Lag(y,1), x2=Lag(y,2))
names(dat) <- c('y','x1','x2')
train_set <- dat[c(3:185),]
test_set <- dat[c(186:200),]
#Fit model
model <- train(y ~ x1+x2 , 
               train_set, 
               method='nnet', 
               linout=TRUE, 
               trace = FALSE)
ps <- predict(model, test_set)

#Examine results

plot(T,Y,type="l",col = 2)
lines(T[c(186:200)],ps, col=3)
legend(5, 70, c("y", "pred"), cex=1.5, fill=2:3)

这两行代码输出模型预测的wMAPE。
sum(abs(ps-test_set["y"]))/sum(test_set)

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