Introduction
The purpose of assignment three is to pick a time series of my choosing and build three models that we learned in this class. My data is scraped instances of the word “poll” in POLITICO articles as a percentage of overall publication volume. The data set covers search results from January 2007 to October 2017 on politico.com
. To get poll-related volume, I searched for the word poll on the site and scraped the dates of all articles returned from that search. For total volume, I searched for periods (“.”) which I assume every article on their site has at least one of. I’ve aggregated the data on on a monthly level for this post.
head(ts.pol)
Data Exploration
Right off the bat, as might be expected, there are seasonal patterns in coverage of polls with spikes every November when there are major national elections in the US. The general trend is less clear but appears to exhibit some cyclicality that more closely traces major federal elections.
library(ggplot2)
library(yaztheme)
p <- ts.pol[,'pct_polls']
autoplot(decompose(p, 'additive'))+theme_yaz()

There are decently strong positive autocorrelations for the most recent two months. There is a slight positive skew to the data with the bulk of weeks seeing around about 10% of stories discuss polling while some weeks approached 40%. Finally, from this visual we can see a 24 month cycle for the data.
library(gridExtra)
grid.arrange(
ggAcf(p)+
labs(title = 'ACF: Polling Publication Volume')+
theme_yaz(),
ggplot(politico, aes(x = pct_polls))+
geom_density(fill = yaz_cols[1])+
coord_flip()+
theme_yaz()+
labs(title = 'Distribution of Weekly Percentages',
x = 'Percentage of Stories Mentioning Polling',
y = 'Density'),
nrow = 1
)

Model Development
The three models I’ve chosen for this project are ARIMA, a neural network, and Holt-Winters seasonal smoothing.
ARIMA
The auto ARIMA function selected an ARIMA (2,0,0) model. There also appears to be some damping built into the projections as polling coverage is expected to spike initially then level off. For the most part, the in-sample data fits the pattern of observed values nicely.

Neural Network
The neural network (NNAR(13,1,7)[12]) fit the data better than the last time I tried this! There is a lag of several months before the fitted values start and there are some interesting patterns in the confidence intervals, but the forecast does largely follow a realistic pattern where polling news picks up in 2018 and then again in early 2020.

Holt-Winters
The Holt-Winters seasonal method applies exponential smoothing functions to the trend, seasonality, and level of a time series. The forecast from the HW model is troubling because it starts off at such a low level and the confidence intervals dip below zero.
hw.fit <- hw(p)
fcast.hw <- forecast(hw.fit, h = 24, PI = TRUE)
autoplot(fcast.hw)+
autolayer(fitted(hw.fit), series = 'Fitted')+
theme_yaz()+
labs(y = 'Polling As Share of News')+
scale_color_manual(values = yaz_cols[6])

Comparison and Evaluation
I’m comparing these models on RMSE and MAE. The Neural network wins out on both metrics by a lot! The surprise was in the second place slot though. Holt-Winters actually beat ARIMA models by a small margin. Holt-Winters was specifically developed for seasonal data while the auto.arima()
function requires additional manual imput to specify seasonality.

LS0tDQp0aXRsZTogIkhXMyAtIFBPTElUSUNPIEZvcmVjYXN0aW5nIg0KYXV0aG9yOiAnSm9zaCBZYXptYW4nDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIEludHJvZHVjdGlvbg0KVGhlIHB1cnBvc2Ugb2YgYXNzaWdubWVudCB0aHJlZSBpcyB0byBwaWNrIGEgdGltZSBzZXJpZXMgb2YgbXkgY2hvb3NpbmcgYW5kIGJ1aWxkIHRocmVlIG1vZGVscyB0aGF0IHdlIGxlYXJuZWQgaW4gdGhpcyBjbGFzcy4gTXkgZGF0YSBpcyBzY3JhcGVkIGluc3RhbmNlcyBvZiB0aGUgd29yZCAicG9sbCIgaW4gUE9MSVRJQ08gYXJ0aWNsZXMgYXMgYSBwZXJjZW50YWdlIG9mIG92ZXJhbGwgcHVibGljYXRpb24gdm9sdW1lLiBUaGUgZGF0YSBzZXQgY292ZXJzIHNlYXJjaCByZXN1bHRzIGZyb20gSmFudWFyeSAyMDA3IHRvIE9jdG9iZXIgMjAxNyBvbiBgcG9saXRpY28uY29tYC4gVG8gZ2V0IHBvbGwtcmVsYXRlZCB2b2x1bWUsIEkgc2VhcmNoZWQgZm9yIHRoZSB3b3JkIHBvbGwgb24gdGhlIHNpdGUgYW5kIHNjcmFwZWQgdGhlIGRhdGVzIG9mIGFsbCBhcnRpY2xlcyByZXR1cm5lZCBmcm9tIHRoYXQgc2VhcmNoLiBGb3IgdG90YWwgdm9sdW1lLCBJIHNlYXJjaGVkIGZvciBwZXJpb2RzICgiLiIpIHdoaWNoIEkgYXNzdW1lIGV2ZXJ5IGFydGljbGUgb24gdGhlaXIgc2l0ZSBoYXMgYXQgbGVhc3Qgb25lIG9mLiBJJ3ZlIGFnZ3JlZ2F0ZWQgdGhlIGRhdGEgb24gb24gYSBtb250aGx5IGxldmVsIGZvciB0aGlzIHBvc3QuIA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KcG9saXRpY28gPC0gcmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qb3NoeWF6bWFuL3JhbmRvbS1wcm9qZWN0cy9tYXN0ZXIvcG9saXRpY28tc2NyYXBlL3BvbGl0aWNvX2RhdGEuY3N2JyklPiUNCiAgbXV0YXRlKG1vbnRoID0gZmxvb3JfZGF0ZShkYXRlX2RheSwgdW5pdCA9ICdtb250aHMnKSklPiUNCiAgZ3JvdXBfYnkobW9udGgpJT4lDQogIHN1bW1hcmlzZShwY3RfcG9sbHMgPSByb3VuZCgoc3VtKHBvbGwsIG5hLnJtID0gVCkqMTAwKS9zdW0oYWxsLCBuYS5ybSA9IFQpLCAyKSklPiUNCiAgZmlsdGVyKG1vbnRoICE9ICcyMDA3LTAxLTE0JykNCg0KDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KdHMucG9sIDwtIHRzKHBvbGl0aWNvLCBmcmVxdWVuY3kgPSAxMiwgc3RhcnQgPSBjKDIwMDcsMDEsMDEpKQ0KaGVhZCh0cy5wb2wpDQpgYGANCg0KIyBEYXRhIEV4cGxvcmF0aW9uDQpSaWdodCBvZmYgdGhlIGJhdCwgYXMgbWlnaHQgYmUgZXhwZWN0ZWQsIHRoZXJlIGFyZSBzZWFzb25hbCBwYXR0ZXJucyBpbiBjb3ZlcmFnZSBvZiBwb2xscyB3aXRoIHNwaWtlcyBldmVyeSBOb3ZlbWJlciB3aGVuIHRoZXJlIGFyZSBtYWpvciBuYXRpb25hbCBlbGVjdGlvbnMgaW4gdGhlIFVTLiBUaGUgZ2VuZXJhbCB0cmVuZCBpcyBsZXNzIGNsZWFyIGJ1dCBhcHBlYXJzIHRvIGV4aGliaXQgc29tZSBjeWNsaWNhbGl0eSB0aGF0IG1vcmUgY2xvc2VseSB0cmFjZXMgbWFqb3IgZmVkZXJhbCBlbGVjdGlvbnMuIA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHlhenRoZW1lKQ0KcCA8LSB0cy5wb2xbLCdwY3RfcG9sbHMnXQ0KYXV0b3Bsb3QoZGVjb21wb3NlKHAsICdhZGRpdGl2ZScpKSt0aGVtZV95YXooKQ0KYGBgDQoNClRoZXJlIGFyZSBkZWNlbnRseSBzdHJvbmcgcG9zaXRpdmUgYXV0b2NvcnJlbGF0aW9ucyBmb3IgdGhlIG1vc3QgcmVjZW50IHR3byBtb250aHMuIFRoZXJlIGlzIGEgc2xpZ2h0IHBvc2l0aXZlIHNrZXcgdG8gdGhlIGRhdGEgd2l0aCB0aGUgYnVsayBvZiB3ZWVrcyBzZWVpbmcgYXJvdW5kIGFib3V0IDEwJSBvZiBzdG9yaWVzIGRpc2N1c3MgcG9sbGluZyB3aGlsZSBzb21lIHdlZWtzIGFwcHJvYWNoZWQgNDAlLiBGaW5hbGx5LCBmcm9tIHRoaXMgdmlzdWFsIHdlIGNhbiBzZWUgYSAyNCBtb250aCBjeWNsZSBmb3IgdGhlIGRhdGEuIA0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZSgNCiAgZ2dBY2YocCkrDQogICAgbGFicyh0aXRsZSA9ICdBQ0Y6IFBvbGxpbmcgUHVibGljYXRpb24gVm9sdW1lJykrDQogICAgdGhlbWVfeWF6KCksDQogIGdncGxvdChwb2xpdGljbywgYWVzKHggPSBwY3RfcG9sbHMpKSsNCiAgICBnZW9tX2RlbnNpdHkoZmlsbCA9IHlhel9jb2xzWzFdKSsNCiAgICBjb29yZF9mbGlwKCkrDQogICAgdGhlbWVfeWF6KCkrDQogICAgbGFicyh0aXRsZSA9ICdEaXN0cmlidXRpb24gb2YgV2Vla2x5IFBlcmNlbnRhZ2VzJywNCiAgICAgICAgIHggPSAnUGVyY2VudGFnZSBvZiBTdG9yaWVzIE1lbnRpb25pbmcgUG9sbGluZycsDQogICAgICAgICB5ID0gJ0RlbnNpdHknKSwNCiAgbnJvdyA9IDENCikNCmBgYA0KDQojIE1vZGVsIERldmVsb3BtZW50DQpUaGUgdGhyZWUgbW9kZWxzIEkndmUgY2hvc2VuIGZvciB0aGlzIHByb2plY3QgYXJlIEFSSU1BLCBhIG5ldXJhbCBuZXR3b3JrLCBhbmQgSG9sdC1XaW50ZXJzIHNlYXNvbmFsIHNtb290aGluZy4gIA0KDQojIyBBUklNQQ0KVGhlIGF1dG8gQVJJTUEgZnVuY3Rpb24gc2VsZWN0ZWQgYW4gQVJJTUEgKDIsMCwwKSBtb2RlbC4gVGhlcmUgYWxzbyBhcHBlYXJzIHRvIGJlIHNvbWUgZGFtcGluZyBidWlsdCBpbnRvIHRoZSBwcm9qZWN0aW9ucyBhcyBwb2xsaW5nIGNvdmVyYWdlIGlzIGV4cGVjdGVkIHRvIHNwaWtlIGluaXRpYWxseSB0aGVuIGxldmVsIG9mZi4gRm9yIHRoZSBtb3N0IHBhcnQsIHRoZSBpbi1zYW1wbGUgZGF0YSBmaXRzIHRoZSBwYXR0ZXJuIG9mIG9ic2VydmVkIHZhbHVlcyBuaWNlbHkuIA0KYGBge3J9DQphcmltYS5maXQgPC0gYXV0by5hcmltYShwLCBzZWFzb25hbCA9IFQpDQoNCmF1dG9wbG90KGZvcmVjYXN0KGFyaW1hLmZpdCwgaCA9IDI0KSkrDQogIGF1dG9sYXllcihmaXR0ZWQoYXJpbWEuZml0KSwgc2VyaWVzID0gJ0ZpdHRlZCcpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSsNCiAgdGhlbWVfeWF6KCkrDQogIGxhYnMoeSA9ICdQb2xsaW5nIEFzIFNoYXJlIG9mIE5ld3MnKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHlhel9jb2xzWzZdKQ0KYGBgDQoNCiMjIE5ldXJhbCBOZXR3b3JrDQpUaGUgbmV1cmFsIG5ldHdvcmsgKE5OQVIoMTMsMSw3KVsxMl0pIGZpdCB0aGUgZGF0YSBiZXR0ZXIgdGhhbiB0aGUgbGFzdCB0aW1lIEkgdHJpZWQgdGhpcyEgVGhlcmUgaXMgYSBsYWcgb2Ygc2V2ZXJhbCBtb250aHMgYmVmb3JlIHRoZSBmaXR0ZWQgdmFsdWVzIHN0YXJ0IGFuZCB0aGVyZSBhcmUgc29tZSBpbnRlcmVzdGluZyBwYXR0ZXJucyBpbiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGJ1dCB0aGUgZm9yZWNhc3QgZG9lcyBsYXJnZWx5IGZvbGxvdyBhIHJlYWxpc3RpYyBwYXR0ZXJuIHdoZXJlIHBvbGxpbmcgbmV3cyBwaWNrcyB1cCBpbiAyMDE4IGFuZCB0aGVuIGFnYWluIGluIGVhcmx5IDIwMjAuIA0KDQpgYGB7cn0NCm5uLmZpdCA8LSBubmV0YXIocCkNCmZjYXN0Lm5uIDwtIGZvcmVjYXN0KG5uLmZpdCwgaCA9IDI0LCBQSSA9IFRSVUUpDQphdXRvcGxvdChmY2FzdC5ubikrDQogIGF1dG9sYXllcihmaXR0ZWQobm4uZml0KSwgc2VyaWVzID0gJ0ZpdHRlZCcpKw0KICB0aGVtZV95YXooKSsNCiAgbGFicyh5ID0gJ1BvbGxpbmcgQXMgU2hhcmUgb2YgTmV3cycpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0geWF6X2NvbHNbNl0pDQpgYGANCg0KIyMgSG9sdC1XaW50ZXJzDQpUaGUgSG9sdC1XaW50ZXJzIHNlYXNvbmFsIG1ldGhvZCBhcHBsaWVzIGV4cG9uZW50aWFsIHNtb290aGluZyBmdW5jdGlvbnMgdG8gdGhlIHRyZW5kLCBzZWFzb25hbGl0eSwgYW5kIGxldmVsIG9mIGEgdGltZSBzZXJpZXMuIFRoZSBmb3JlY2FzdCBmcm9tIHRoZSBIVyBtb2RlbCBpcyB0cm91YmxpbmcgYmVjYXVzZSBpdCBzdGFydHMgb2ZmIGF0IHN1Y2ggYSBsb3cgbGV2ZWwgYW5kIHRoZSBjb25maWRlbmNlIGludGVydmFscyBkaXAgYmVsb3cgemVyby4gDQoNCmBgYHtyfQ0KaHcuZml0IDwtIGh3KHApDQpmY2FzdC5odyA8LSBmb3JlY2FzdChody5maXQsIGggPSAyNCwgUEkgPSBUUlVFKQ0KYXV0b3Bsb3QoZmNhc3QuaHcpKw0KICBhdXRvbGF5ZXIoZml0dGVkKGh3LmZpdCksIHNlcmllcyA9ICdGaXR0ZWQnKSsNCiAgdGhlbWVfeWF6KCkrDQogIGxhYnMoeSA9ICdQb2xsaW5nIEFzIFNoYXJlIG9mIE5ld3MnKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHlhel9jb2xzWzZdKQ0KYGBgDQoNCiMgQ29tcGFyaXNvbiBhbmQgRXZhbHVhdGlvbg0KSSdtIGNvbXBhcmluZyB0aGVzZSBtb2RlbHMgb24gUk1TRSBhbmQgTUFFLiBUaGUgTmV1cmFsIG5ldHdvcmsgd2lucyBvdXQgb24gYm90aCBtZXRyaWNzIGJ5IGEgbG90ISBUaGUgc3VycHJpc2Ugd2FzIGluIHRoZSBzZWNvbmQgcGxhY2Ugc2xvdCB0aG91Z2guIEhvbHQtV2ludGVycyBhY3R1YWxseSBiZWF0IEFSSU1BIG1vZGVscyBieSBhIHNtYWxsIG1hcmdpbi4gSG9sdC1XaW50ZXJzIHdhcyBzcGVjaWZpY2FsbHkgZGV2ZWxvcGVkIGZvciBzZWFzb25hbCBkYXRhIHdoaWxlIHRoZSBgYXV0by5hcmltYSgpYCBmdW5jdGlvbiByZXF1aXJlcyBhZGRpdGlvbmFsIG1hbnVhbCBpbXB1dCB0byBzcGVjaWZ5IHNlYXNvbmFsaXR5Lg0KDQpgYGB7cn0NCm1ldGhvZCA8LSByZXAoYygnQVJJTUEnLCdOZXVyYWwgTmV0JywnSG9sdC1XaW50ZXJzJyksMikNCm1ldHJpYyA8LSBjKHJlcCgncm1zZScsMyksIHJlcCgnbWFlJywzKSkNCnZhbHVlcyA8LSBjKGFjY3VyYWN5KGFyaW1hLmZpdClbMl0sIGFjY3VyYWN5KG5uLmZpdClbMl0sIGFjY3VyYWN5KGh3LmZpdClbMl0sDQogICAgICAgICAgICBhY2N1cmFjeShhcmltYS5maXQpWzNdLCBhY2N1cmFjeShubi5maXQpWzNdLCBhY2N1cmFjeShody5maXQpWzNdKQ0KDQpkYXRhLmZyYW1lKG1ldGhvZCwgbWV0cmljLCB2YWx1ZXMpJT4lDQogIGdncGxvdChhZXMoeCA9IG1ldGhvZCwgeSA9IHZhbHVlcywgZmlsbCA9IG1ldHJpYykpKw0KICBnZW9tX2NvbCgpKw0KICBmYWNldF93cmFwKH5tZXRyaWMpKw0KICB0aGVtZV95YXooKSsNCiAgbGFicyh0aXRsZSA9ICdSTVNFIGFuZCBNQUUgb2YgRGlmZmVyZW50IE1vZGVscycsDQogICAgICAgeCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICB5ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg==