我正在使用包中的accuracy函数forecast来计算准确度度量.我用它来计算拟合时间序列模型的度量,例如ARIMA或指数平滑.由于我在不同维度和聚合级别上测试不同的模型类型,我使用的是MUND,即Hyndman等人(2006年,"另一种预测准确度测量")引入的绝对缩放误差,来比较不同的模型在不同的层面上.
现在我也将模型与预测历史进行比较.因为我只有预测值而不是模型,所以我尝试使用该accuracy函数.在函数描述中提到它还允许提供两个向量参数,一个具有预测值,一个具有实际值,以计算度量(而不是拟合模型):
f:类"预测"的对象,或包含预测的数字向量.如果省略x,它也将与Arima,ets和lm对象一起使用 - 在这种情况下,返回样本内准确度度量.
x:可选的数字向量,包含与对象长度相同的实际值.
但我很惊讶所有措施都归还了,期待MASE.所以我想知道是否有人知道原因是什么?为什么MASE没有返回,而在accuracy函数中使用两个向量作为参数?
似乎auto.arima从脚本中的forecast包运行knitr始终会生成警告 - 当我在正常R中运行它时,我不会收到此警告.
knitr Markdown示例代码:
```{r}
library(forecast)
```
Spurious warning from forecast and knitr
========================================
The following generates a warning that I don't think is valid
```{r}
summary(auto.arima(WWWusage))
```
Run Code Online (Sandbox Code Playgroud)
产生这个:

而在R中运行以下内容通常不会产生此类警告:
> library(forecast)
This is forecast 4.02
> summary(auto.arima(WWWusage))
Series: WWWusage
ARIMA(1,1,1)
Coefficients:
ar1 ma1
0.6504 0.5256
s.e. 0.0842 0.0896
sigma^2 estimated as 9.793: log likelihood=-254.15
AIC=514.3 AICc=514.55 BIC=522.08
Training set error measures:
ME RMSE MAE MPE MAPE MASE
0.3035616 3.1137542 2.4052748 0.2805566 1.9174634 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用python statsmodels进行样本预测.我不想仅仅预测训练集末尾的下一个x值,但我想一次预测一个值,并在预测时考虑实际值.换句话说,我想做滚动1期预测,但我不想每次都重新校准模型.我能找到的最近的帖子是:
但是,这使用ARMA而不是ARIMA.如何使用ARIMA实现这一目标还是有更好的方法?我知道我实际上可以拉动系数并自己应用函数但是在我的代码中我使用的ARIMA模型随着时间的推移是动态的,因此系数和滞后值的使用数量不是恒定的.任何帮助将不胜感激.
我想使用高斯过程来解决回归任务.我的数据如下:每个X向量的长度为37,每个Y向量的长度为8.
我正在使用该sklearn软件包,Python但尝试使用高斯过程导致Exception:
from sklearn import gaussian_process
print "x :", x__
print "y :", y__
gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1)
gp.fit(x__, y__)
Run Code Online (Sandbox Code Playgroud)
x:[[136.1377.137. 132. 130. 130. 132. 133. 134.
135. 135. 134. 134. 1139.1019.0.0.0.0.0.0.0.0. 0. 0 0. 0 0. 0 0. 70. 24. 55. 0. 9. 0. 0.] [136. 137. 137. 132. 130. 130. 132. 133. 134. 135. 135. 134. 134. 1139.1019.0.0.0.0.0.0.0.0.0.0.0.0.0,0.70.24. 55. 0.9. 0. 0. [82.76. 80. 103. 135. 155. 159. 156. 145. 138. …
随着forecast包,我有一个时间序列,我想?auto.arima自动选择订单,但我想强迫季节性.函数的默认值允许将seasonal参数设置为TRUE,但这只允许季节性选项而不是强制.
auto.arima(x, d=NA, D=NA, max.p=5, max.q=5,
max.P=2, max.Q=2, max.order=5, max.d=2, max.D=1,
start.p=2, start.q=2, start.P=1, start.Q=1,
stationary=FALSE, seasonal=TRUE,
ic=c("aicc", "aic", "bic"), stepwise=TRUE, trace=FALSE,
approximation=(length(x)>100 | frequency(x)>12), xreg=NULL,
test=c("kpss","adf","pp"), seasonal.test=c("ocsb","ch"),
allowdrift=TRUE, allowmean=TRUE, lambda=NULL, biasadj=FALSE,
parallel=FALSE, num.cores=2)
Run Code Online (Sandbox Code Playgroud) 我有一个包含5年时间序列的.csv文件,每小时分辨率(商品价格).根据历史数据,我想创建第六年的价格预测.
我在www上阅读了几篇关于这些类型的程序的文章,我基本上将我的代码基于那里发布的代码,因为我对Python(尤其是statsmodels)和统计数据的了解最多.
对于那些感兴趣的人来说,这些是链接:
http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/
http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/
首先,这是.csv文件的示例.在这种情况下,数据以月分辨率显示,它不是真实数据,只是随机选择数字来举例说明(在这种情况下,我希望一年足以开发第二年的预测;如果没有,完整的csv文件可用):
Price
2011-01-31 32.21
2011-02-28 28.32
2011-03-31 27.12
2011-04-30 29.56
2011-05-31 31.98
2011-06-30 26.25
2011-07-31 24.75
2011-08-31 25.56
2011-09-30 26.68
2011-10-31 29.12
2011-11-30 33.87
2011-12-31 35.45
Run Code Online (Sandbox Code Playgroud)
我目前的进展如下:
读取输入文件并将日期列设置为日期时间索引后,使用以下脚本开发可用数据的预测
model = sm.tsa.ARIMA(df['Price'].iloc[1:], order=(1, 0, 0))
results = model.fit(disp=-1)
df['Forecast'] = results.fittedvalues
df[['Price', 'Forecast']].plot(figsize=(16, 12))
Run Code Online (Sandbox Code Playgroud)
,它给出以下输出:
现在,正如我所说,我没有统计技能,我几乎不知道如何得到这个输出(基本上,改变第一行内的order属性会改变输出),但'实际'预测看起来非常好,我想再延长一年(2016年).
为此,在数据框中创建了其他行,如下所示:
start = datetime.datetime.strptime("2016-01-01", "%Y-%m-%d")
date_list = pd.date_range('2016-01-01', freq='1D', periods=366)
future = pd.DataFrame(index=date_list, columns= df.columns)
data = pd.concat([df, future])
Run Code Online (Sandbox Code Playgroud)
最后,当我使用statsmodels的.predict函数时:
data['Forecast'] = results.predict(start = 1825, end = 2192, dynamic= True) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Python 和 Statsmodels 进行 ARIMA 预测。具体来说,要使 ARIMA 算法工作,需要通过差分(或类似方法)使数据静止。问题是:如何在进行残差预测后反转差异以返回包括差异化的趋势和季节性的预测?
(我在这里看到了一个类似的问题,但可惜,没有发布任何答案。)
这是我到目前为止所做的(基于掌握 Python 数据分析的最后一章中的示例,Magnus Vilhelm Persson;Luiz Felipe Martins)。数据来自DataMarket。
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels import tsa
from statsmodels.tsa import stattools as stt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA
def is_stationary(df, maxlag=15, autolag=None, regression='ct'):
"""Test if df is stationary using Augmented
Dickey Fuller"""
adf_test = stt.adfuller(df,maxlag=maxlag, autolag=autolag, regression=regression)
adf = adf_test[0]
cv_5 = adf_test[4]["5%"]
result = …Run Code Online (Sandbox Code Playgroud) 我有一个具有季节性(每周)模式的重复时间序列,并且我想返回没有每周趋势的相同时间序列,以第一个值作为起点。
具体来说,第一个值仍然是 39.8,但第八个值也将是 39.8,而不是 17.1。如果只是重复前七个值,那么将会重复出现为期一周的负面趋势,而我希望根本没有趋势(因此第 7 个值 6.2 也会更高)。
有没有一种优雅的方法来做到这一点,尤其是对时间序列中的零值条目具有鲁棒性的方法(我有很多这样的条目)?
我们可以假设时间序列趋势是线性且恒定的(即不仅仅是分段线性)。
demand <- ts(
c(39.8, 33.5, 40.6, 23.6, 11.9, 12.3, 6.2, 17.1, 10.8, 18, 1, -10.7,
-10.4, -16.5, -5.6, -11.9, -4.7, -21.7, -33.4, -33.1, -39.2, -28.2,
-34.6, -27.4, -44.4, -56.1, -55.7, -61.8, -50.9, -57.2, -50.1),
frequency = 7
)
plot(demand)
Run Code Online (Sandbox Code Playgroud)
我尝试估计低音曲线以分析不同群体的创新扩散。到目前为止,我使用nlsLM()该minpack.lm包来估计曲线的参数/以拟合曲线。我遍历不同的起始值以使用此命令为不同的起始值估计最佳拟合:
Bass.nls <- nlsLM(cumulative_y~ M * (((P + Q)^2/P) * exp(-(P + Q) * time))/(1 + (Q/P) * exp(-(P + Q) * time))^2
, start = list(M=m_start, P= p_start, Q=q_start)
, trace = F
, control = list(maxiter = 100, warnOnly = T) )
Run Code Online (Sandbox Code Playgroud)
由于某些组的数据点很少,因此许多组不会收敛。
Venkatesan 和 Kumar (2002)建议在数据稀缺时使用遗传算法方法进行低音模型估计(另见Venkatesan 等人 2004)。我发现了一些在 R 中实现 GA 的包(如GA, genalg, gafit)。但是,由于我是该领域的新手,我不知道该使用哪个包以及如何使用包中的低音公式。
我想预测在服务时间内进入商店的顾客数量。我有每小时的数据
因此,我认为我的时间序列实际上是有规律的,但在某种意义上是非典型的,因为我每天有 10 个小时,每周有 5 天。
我可以通过将非服务时间设置为零来对这个常规的 24/7 时间序列进行建模,但我发现这样做效率低下而且也不正确,因为时间并没有丢失。相反,它们并不存在。
使用旧的ts框架我能够明确指定
myTS <- ts(x, frequency = 10)
Run Code Online (Sandbox Code Playgroud)
然而,在新的tsibble/fable框架内这是不可能的。它检测每小时的数据,预计每天 24 小时,而不是 10 小时。每个后续函数都会提醒我隐含的时间间隙。手动覆盖interval-Attribute 有效:
> attr(ts, "interval") <- new_interval(hour = 10)
> has_gaps(ts)
# A tibble: 1 x 1
.gaps
<lgl>
1 FALSE
Run Code Online (Sandbox Code Playgroud)
但对建模没有影响:
model(ts,
snaive = SNAIVE(customers ~ lag("week")))
Run Code Online (Sandbox Code Playgroud)
我仍然收到相同的错误消息:
snaive [1] 遇到 1 个错误。数据包含隐式时间间隙。您应该检查数据并
tsibble::fill_gaps()根据需要使用将隐式间隙转换为显式缺失值。
任何帮助,将不胜感激。
forecasting ×10
r ×6
time-series ×6
python ×4
statsmodels ×3
fable-r ×1
gaussian ×1
knitr ×1
regression ×1
scikit-learn ×1
trend ×1
tsibble ×1
warnings ×1