user3115933
user3115933

Reputation: 4443

Why am I getting this error message even after transforming my data set into a ts file for time series analysis?

I intend to perform a time series analysis on my data set. I have imported the data (monthly data from January 2015 till December 2017) from a csv file and my codes in RStudio appear as follows:

library(timetk)
library(tidyquant)
library(timeSeries)
library(tseries)    
library(forecast)

mydata1 <- read.csv("mydata.csv", as.is=TRUE, header = TRUE)
mydata1
        date   pkgrev
1   1/1/2015 39103770
2   2/1/2015 27652952
3   3/1/2015 30324308
4   4/1/2015 35347040
5   5/1/2015 31093119
6   6/1/2015 20670477
7   7/1/2015 24841570

mydata2 <- mydata1 %>% 
           mutate(date = mdy(date))
mydata2

         date   pkgrev
1  2015-01-01 39103770
2  2015-02-01 27652952
3  2015-03-01 30324308
4  2015-04-01 35347040
5  2015-05-01 31093119
6  2015-06-01 20670477
7  2015-07-01 24841570

class(mydata2)
[1] "data.frame"

It is when running this piece of code that things get a little weird (for me at least):

mydata2_ts <- ts(mydata2, start=c(2015,1), freq=12)
mydata2_ts

          date   pkgrev
Jan 2015 16436 39103770
Feb 2015 16467 27652952
Mar 2015 16495 30324308
Apr 2015 16526 35347040
May 2015 16556 31093119
Jun 2015 16587 20670477
Jul 2015 16617 24841570

I don't really understand the values in the date column! It seems the dates have been converted into numeric format.

class(mydata2_ts)
[1] "mts"    "ts"     "matrix"

Now, running the following codes give me an error:

stlRes <- stl(mydata2_ts, s.window = "periodic")

Error in stl(mydata2_ts, s.window = "periodic") : 
  only univariate series are allowed

What is wrong with my process?

Upvotes: 2

Views: 2241

Answers (1)

yihan
yihan

Reputation: 688

The reason that you got this error is because you tried to feed a data set with two variables (date + pkgrev) into STL's argument, which only takes a univariate time series as a proper argument.

To solve this problem, you could create a univariate ts object without the date variable. In your case, you need to use mydata2$pkgrev (or mydata2["pkgrev"] after mydata2 is converted into a dataframe) instead of mydata2 in your code mydata2_ts <- ts(mydata2, start=c(2015,1), freq=12). The ts object is already supplied with the temporal information as you specified start date and frequency in the argument.

If you would like to create a new dataframe with both the ts object and its corresponding date variable, I would suggest you to use the following code:

mydata3 = cbind(as.Date(time(mydata2_ts)), mydata2_ts)
mydata3 = as.data.frame(mydata3)

However, for the purpose of STL decompostion, the input of the first argument should be a ts object, i.e., mydata2_ts.

Upvotes: 4

Related Questions