# Analysis of Short Time Series

Using Fourier Transform as coefficients in short time series data helps with prediction.

time series
r
forecasting
Author

Michael DeWitt

Published

July 19, 2018

I enjoy reading Rob Hyndman’s blog. The other day he did some analysis of a short times series. More about that is available at his blog here. The neat thing that he shows is that you don’t need a tremendous amount of data to decompose seasonality. Using fourier transforms1.

He sets up a small data set:

``````df <- ts(c(2735.869,2857.105,2725.971,2734.809,2761.314,2828.224,2830.284,
2758.149,2774.943,2782.801,2861.970,2878.688,3049.229,3029.340,3099.041,
3071.151,3075.576,3146.372,3005.671,3149.381), start=c(2016,8), frequency=12)``````

Which only has 20 months of data in it. He then applies a time series linear model with 2 sine/ cosine pair terms.

``library(forecast)``
``````Registered S3 method overwritten by 'quantmod':
method            from
as.zoo.data.frame zoo ``````
``````library(ggplot2)
decompose_df <- tslm(df ~ trend + fourier(df, 2))``````

We can see the coefficients of the model here:

``summary(decompose_df)``
``````
Call:
tslm(formula = df ~ trend + fourier(df, 2))

Residuals:
Min       1Q   Median       3Q      Max
-100.572  -33.513    5.743   24.430   79.728

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)         2637.357     24.862 106.080  < 2e-16 ***
trend                 24.541      2.077  11.816 1.14e-08 ***
fourier(df, 2)S1-12   76.553     17.105   4.475 0.000523 ***
fourier(df, 2)C1-12   -4.281     17.105  -0.250 0.806010
fourier(df, 2)S2-12   36.931     16.203   2.279 0.038850 *
fourier(df, 2)C2-12   10.402     16.802   0.619 0.545780
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 50.98 on 14 degrees of freedom
Multiple R-squared:  0.917, Adjusted R-squared:  0.8874
F-statistic: 30.94 on 5 and 14 DF,  p-value: 4.307e-07``````

From there tou can see the trends for each of the components.

``````trend <- coef(decompose_df)[1] + coef(decompose_df)['trend']*seq_along(df)
components <- cbind(
data = df,
trend = trend,
season = df - trend - residuals(decompose_df),
remainder = residuals(decompose_df)
)
autoplot(components, facet=TRUE)``````
``````Warning in autoplot.mts(components, facet = TRUE): partial argument match of
'facet' to 'facets'``````

``out <-forecast(decompose_df, newdata = df)``
``````Warning in forecast.lm(decompose_df, newdata = df): newdata column names not
specified, defaulting to first variable required.``````
``autoplot(out)``

## Footnotes

1. Read more about Fourier series and transforms on wikipedia. They are in my opinion a modern marvel of mathematics↩︎

## Citation

BibTeX citation:
``````@online{dewitt2018,
author = {Michael DeWitt and Michael DeWitt},
title = {Analysis of {Short} {Time} {Series}},
date = {2018-07-19},
url = {https://michaeldewittjr.com/programming/2018-07-19-analysis-of-short-time-series},
langid = {en}
}
``````
For attribution, please cite this work as:
Michael DeWitt, and Michael DeWitt. 2018. “Analysis of Short Time Series.” July 19, 2018. https://michaeldewittjr.com/programming/2018-07-19-analysis-of-short-time-series.