Skip to content

response.ar_model

Classes

ARModel

ARModel(p)

Autoregressive (AR) model implementation from scratch.

Parameters:

Name Type Description Default
p int

Order of the AR model (number of lagged observations)

required
Source code in pydmoo/response/ar_model.py
def __init__(self, p):
    self.p = p  # AR order
    self.coef_ = None  # Model coefficients (including intercept if present)
    self.resid_ = None  # Residuals after fitting

Functions

fit
fit(y, trend='c')

Fit AR model to time series data.

Parameters:

Name Type Description Default
y (ndarray, shape(M))

Time series data of length M

required
trend str

'c' for constant (default), 'n' for no intercept

'c'

Returns:

Name Type Description
self returns an instance of self
Source code in pydmoo/response/ar_model.py
def fit(self, y, trend="c"):
    """
    Fit AR model to time series data.

    Parameters
    ----------
    y : ndarray, shape (M,)
        Time series data of length M
    trend : str, optional
        'c' for constant (default), 'n' for no intercept

    Returns
    -------
    self : returns an instance of self
    """
    M = len(y)
    if M <= self.p:
        raise ValueError(f"Time series length M={M} must be > order p={self.p}")

    # Construct design matrix X and target vector Y
    X = np.zeros((M - self.p, self.p))
    for i in range(self.p):
        X[:, i] = y[(self.p - i - 1) : (M - i - 1)]

    Y = y[self.p :]

    # Add intercept if specified
    if trend == "c":
        X = np.column_stack([np.ones(X.shape[0]), X])

    # Solve least squares problem
    self.coef_ = np.linalg.lstsq(X, Y, rcond=None)[0]

    # Store residuals
    self.resid_ = Y - X @ self.coef_

    return self
predict
predict(y, steps=1)

Predict future values using the fitted AR model.

Parameters:

Name Type Description Default
y (ndarray, shape(K))

Input sequence (K >= p)

required
steps int

Number of steps to predict (default=1)

1

Returns:

Name Type Description
predictions (ndarray, shape(steps))

Predicted values

Source code in pydmoo/response/ar_model.py
def predict(self, y, steps=1):
    """
    Predict future values using the fitted AR model.

    Parameters
    ----------
    y : ndarray, shape (K,)
        Input sequence (K >= p)
    steps : int, optional
        Number of steps to predict (default=1)

    Returns
    -------
    predictions : ndarray, shape (steps,)
        Predicted values
    """
    if len(y) < self.p:
        raise ValueError(f"Input length {len(y)} must be >= model order {self.p}")
    if self.coef_ is None:
        raise ValueError("Model must be fitted before prediction")

    predictions = np.zeros(steps)
    history = y[-self.p :].copy()  # Last p observations

    for i in range(steps):
        # Prepare input vector
        x = history[-self.p :][::-1]  # Latest p observations in reverse order

        # Add intercept if present (coef[0] is intercept)
        if len(self.coef_) == self.p + 1:
            x = np.insert(x, 0, 1)

        # Make prediction
        pred = np.dot(x, self.coef_)
        predictions[i] = pred

        # Update history
        history = np.append(history, pred)

    return predictions