ARIMA. Time-series forecasting in browsers and Node.js
Emscripten port of the native C package ctsa for time series analysis and forecasting
This CommonJS module includes:
- ARIMA (Autoregressive Integrated Moving Average)
- SARIMA (Seasonal ARIMA)
- SARIMAX (Seasonal ARIMA with exogenous variables)
- AutoARIMA (ARIMA with automatic parameters)
Installation of the ARIMA module
npm install arima
Initialization
const ARIMA = require('arima')
const arima = new ARIMA(options)
Where the options
object can include:
auto
- automatic ARIMA (default: false
)p
, d
, q
params for ARIMA (default: p: 1, d: 0, q: 1
)P
, D
, Q
, s
seasonal params (default: 0
s). Setting them to non-zero values makes the ARIMA model seasonalmethod
- ARIMA method (default: 0, described below)optimizer
- optimization method (default: 6, described below)transpose
- transpose exogenous array when fitting SARIMAX (default: false
)verbose
- verbose output (default: true
)
Also for AutoARIMA
only:
approximation
- approximation method (default: 1
),search
- search method (default: 1
)p
, d
, q
, P
, D
, Q
params define max values for a search algorithm
Train/Predict
ARIMA, SARIMA, AutoARIMA:
arima.train(ts)
arima.predict(10)
SARIMAX:
arima.train(ts, exog)
arima.predict(10, exognew)
Running in browsers
As described in the issue #10 Chrome prevents compilation of wasm modules >4kB.
There are two ways to overcome this:
- Load
arima
in a Web Worker - Use the
arima/async
module
Example of async loading:
const ARIMAPromise = require('arima/async')
ARIMAPromise.then(ARIMA => {
const ts = Array(10).fill(0).map((_, i) => i + Math.random() / 5)
const arima = new ARIMA({ p: 2, d: 1, q: 2, P: 0, D: 0, Q: 0, S: 0, verbose: false }).train(ts)
const [pred, errors] = arima.predict(10)
})
All following examples use synchronous compilation (Node.js, Firefox). They will not work in Chrome.
Example: ARIMA
const ARIMA = require('arima')
const ts = Array(24).fill(0).map((_, i) => i + Math.random() / 5)
const arima = new ARIMA({
p: 2,
d: 1,
q: 2,
verbose: false
}).train(ts)
const [pred, errors] = arima.predict(12)
Example: SARIMA
const sarima = new ARIMA({
p: 2,
d: 1,
q: 2,
P: 1,
D: 0,
Q: 1,
s: 12,
verbose: false
}).train(ts)
const [pred, errors] = sarima.predict(12)
Example: SARIMAX
const f = (a, b) => a * 2 + b * 5
const exog = Array(30).fill(0).map(x => [Math.random(), Math.random()])
const exognew = Array(10).fill(0).map(x => [Math.random(), Math.random()])
const ts = exog.map(x => f(x[0], x[1]) + Math.random() / 5)
const sarimax = new ARIMA({
p: 1,
d: 0,
q: 1,
transpose: true,
verbose: false
}).fit(ts, exog)
const [pred, errors] = sarimax.predict(12, exognew)
Example: AutoARIMA
const autoarima = new ARIMA({ auto: true }).fit(ts)
const [pred, errors] = autoarima.predict(12)
ARIMA Method (method)
0 - Exact Maximum Likelihood Method (Default)
1 - Conditional Method - Sum Of Squares
2 - Box-Jenkins Method
Optimization Method (optimizer)
Method 0 - Nelder-Mead
Method 1 - Newton Line Search
Method 2 - Newton Trust Region - Hook Step
Method 3 - Newton Trust Region - Double Dog-Leg
Method 4 - Conjugate Gradient
Method 5 - BFGS
Method 6 - Limited Memory BFGS (Default)
Method 7 - BFGS Using More Thuente Method
Old functional API (still works)
The old interface of the arima
package was only one function that took 3 arguments:
- a 1D array with observations over time
- a number of time steps to predict
- a javascript object with ARIMA parameters
p
, d
, q
and other options
It returned two vectors - predictions and mean square errors.
const arima = require('arima')
const [pred, errors] = arima(ts, 20, {
method: 0,
optimizer: 6,
p: 1,
d: 0,
q: 1,
verbose: true
})
Web demo
You can try ARIMA online in the StatSim Forecast app: https://statsim.com/forecast/.
It uses the arima
package under the hood and applies random search to find the best values of p
, d
and q
.