使用R中的tslm对时间序列进行预测

5

我对R还很陌生,遇到了一个问题我似乎无法解决。

我想要预测我的时间序列数据。 我有今年的每日数字:y和去年的每日数字,我想将其用作预测变量。 这些数字显示出周周期。我尝试了以下代码。(为清晰起见使用虚假数字)

x = rnorm(60,0,1)
y = rnorm(60,0 ,1) + 2*cos(2*pi*1:60/7) + 10*x
new_x = rnorm(10,0,1) 

y <- ts(y,frequency = 7)
fit <- tslm(y ~ trend + season + x)

fcast = forecast.lm(fit, h = 10, newdata = new_x)

我收到了错误信息:
    Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
      variable lengths differ (found for 'x')
    In addition: Warning message:
'newdata' had 10 rows but variables found have 60 rows

有什么提示能告诉我哪里出了问题吗?

1
?forecast.lmnewdata是一个可选的数据框。new_x是一个向量。 - user3710546
3个回答

6

从您的fit对象中:

Call:
lm(formula = formula, data = "y", na.action = na.exclude)

Coefficients:
(Intercept)        trend      season2      season3      season4      season5      season6      season7            x  
  1.1644029    0.0009672   -1.5575562   -3.6723105   -3.1824001   -1.5658857    0.0789683    0.3053541    9.9233635  

最后一个变量的名字是 x。而 forecast.lm 的帮助文件中说 newdata 是一个可选的 data.frame。您需要将 new_x 转换为一个 data.frame,其中 x 作为列名。
library(forecast)

x = rnorm(60,0,1)
y = rnorm(60,0 ,1) + 2*cos(2*pi*1:60/7) + 10*x
new_x = rnorm(10,0,1) 

y <- ts(y,frequency = 7)
fit <- tslm(y ~ trend + season + x)

# You can directly use `forecast`, as `fit` is an lm object
# and you don't need `h`, as you provide new data.
fcast = forecast(fit, newdata = data.frame(x=new_x)) 

#          Point Forecast       Lo 80      Hi 80        Lo 95      Hi 95
# 9.571429     -3.1541222  -4.5886075  -1.719637  -5.37216743 -0.9360771
# 9.714286     12.5962250  11.1367496  14.055700  10.33953926 14.8529108
# 9.857143     10.5924632   9.1480030  12.036924   8.35899443 12.8259321
#10.000000     15.9419378  14.4775444  17.406331  13.67764776 18.2062278
#10.142857     -7.1887433  -8.6444741  -5.733013  -9.43963897 -4.9378477
#10.285714     -9.4133170 -10.8470152  -7.979619 -11.63014523 -7.1964887
#10.428571      2.2702132   0.8331488   3.707278   0.04818005  4.4922464
#10.571429      0.3519401  -1.1037991   1.807679  -1.89896851  2.6028487
#10.714286    -11.8348209 -13.2930857 -10.376556 -14.08963475 -9.5800070
#10.857143      1.0058209  -0.4435763   2.455218  -1.23528154  3.2469233

非常感谢!太棒了。 - Nick Mars

0

你可以将new_x转换为data.frame,这样你的初始代码也能够正常工作。

new_x变量是数字类型,需要将其转换为data.frame以便于输入到forecast.lm中。

祝好!

Ganesh Bhat


-1

错误看起来很明显:

new_data有10个随机变量,而y和x都有60个。您能否更新new_data以拥有60个随机变量,并验证错误是否还会发生?

祝好,

Ganesh


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