Friday, April 27, 2012

Real Time Structural Break

Yesterday as I played with bfast I kept thinking “Yes, but this is all in hindsight.  How can I potentially use this in a system?”  Fortunately, one of the fine authors very generously commented on my post Structural Breaks (Bull or Bear?):

Jan Verbesselt Apr 27, 2012 02:01 AM

Nice application! you can also detect seasonal breaks. also check some new near real-time disturbance detection functionality using bfastmonitor()
cheers, Jan”

And away I went on an unexpected but very pleasant journey into bfastmonitor.  Please see the following paper for all the details.

Jan Verbesselt, Achim Zeileis, Martin Herold (2011). Near Real-Time Disturbance
  Detection in Terrestrial Ecosystems Using Satellite Image Time Series: Drought
  Detection in Somalia. Working Paper 2011-18. Working Papers in Economics and
  Statistics, Research Platform Empirical and Experimental Economics, Universitaet
  Innsbruck. URL

Doing a walk-forward test seemed like the best method of testing and illustration, so I chose the excruciating and incredibly volatile period from late 2008 to early 2009 as our example.  Amazingly, it picked with no optimizing or manual intervention March 2009 as the breakpoint. Of course, we would not know this until the end of March, but picking real-time with only a month lag is unbelievable to me.  Please try it out, and let me know your results.  Of course, I already have the 30 year bond bull in mind as a next trial.

Thanks to Yihui Xie who resurfaced again (see posts on knitr) with his animation package, which I used to create a good old-fashioned animated GIF.  I wish I had time to play more with the prettier and more robust options offered by the package.


R code from GIST:


  1. New to R and the entier scene. When I try to run the script, get the following error:

    Error: could not find function "bfastmonitor"

    I have ensured that all the required packages are installed and available.

    Any suggestions?

  2. Glad you are reading and trying. The key line here is (remove the #):

    #install r-forge development version of bfast
    #install.packages("bfast", repos="")

    bfastmonitor is in the development version. Let me know if you have any more trouble.

  3. I did install the bfast package separately and still couldnt get it working. Following errors and warnings appear:

    Warning: dependency ‘raster’ is not available
    trying URL ''
    Content type 'application/zip' length 96007 bytes (93 Kb)
    opened URL
    downloaded 93 Kb

    package ‘bfast’ successfully unpacked and MD5 sums checked

    The downloaded packages are in
    Loading required package: bfast
    Loading required package: strucchange
    Loading required package: sandwich
    Loading required package: MASS
    Loading required package: forecast
    Loading required package: parallel
    Loading required package: tseries
    Failed with error: ‘package ‘tseries’ could not be loaded’
    In addition: Warning messages:
    1: package ‘strucchange’ was built under R version 2.14.2
    2: package ‘sandwich’ was built under R version 2.14.2
    3: In library(pkg, character.only = TRUE, logical.return = TRUE, lib.loc = lib.loc) :
    there is no package called ‘tseries’
    Error: could not find function "bfastmonitor"

  4. Thanks for the reply. I already have installed 'bfast' package manually. Still the same error and additional info as follows:
    Loading required package: fracdiff
    Failed with error: ‘package ‘fracdiff’ could not be loaded’
    In addition: Warning message:
    In library(pkg, character.only = TRUE, logical.return = TRUE, lib.loc = lib.loc) :
    there is no package called ‘fracdiff’
    Loading required package: quantmod
    Loading required package: Defaults
    Loading required package: xts
    Loading required package: TTR
    Loading required package: animation
    Error: could not find function "bfastmonitor"

    package 'fracdiff' could not be found in CRAN.

  5. Further to the above, i installed one by one all the required packages shown in errors. Now i got stuck at

    I cannot find ImageMagick with convert = "convert"
    Warning messages:
    1: running command 'convert --version' had status 4
    2: In im.convert(img.files, output =, convert = convert, :
    ImageMagick not installed yet!

    Now there are no package or function for 'ImageMagick'.

    Will keep on exploring.

  6. well done with persistence. Unless you just really want the animated GIF, you can # comment out the lines

    and then the closing ) below }

    If you would like the animated GIF then install ImageMagick

    Let me know if I can be of any help.

  7. Nice application of bfastmonitor. What bothers me is that the blue line fit is nowhere close to the actual time series. It is supposed to be the fit to the last "model-stable" period in the training set. I wonder what would happen if tested with the training set ending sometime in early 2005, and whether it would pick the lower slope after 2005 as a structural break in the time series. Thanks for your article.