# R/timeseriessim.R In learnstats: An Interactive Environment for Learning Statistics

#### Documented in timeseressim

```#' Run the Time Series Simulation script.
#'
#' @export
#' @examples
#' \dontrun{timeseriessim()}
timeseressim<-function()
{
### time series script for R.
### by Omar Chavez
### 1.0   - First version as cribbed from prob.R

##' Given a prompt and acceptable inputs, query user for input until they enter an acceptable value.
##' @author Omar Chavez
getvalidinput <- function(prompt, error, validinput = NULL, low=0, high=0)
{
if(is.null(validinput) && low == high) stop("Must either input validinput or both low and high!")
while(TRUE)
{
if(input %in% validinput)
{
return(input)
}
if(!is.na(as.numeric(input)))
{
if(low < high && low < high && low <= as.numeric(input) && as.numeric(input) <= high)
{
return(input)
}
}
cat(error)
}
}

options(warn=-1) # make this 0 for testing, -1 for production
options(scipen=4) #Don't give numbers like 1e-4, instead do .0001

cat("Are you ready for some nice graphics to help illustrate stability in time plots?\n")
cat("At each step, type your response and press \"Enter\"\n\n")

while(TRUE)
{
cat("\nHow many data points would you like to simulate?\n")
# getvalidinput is a function that does exactly what it sounds like. See documentation above.
data.size <- getvalidinput("Enter a number between 1 and 10000 or 'q'to Quit: ", "Invalid selection! Choose a number from 1 to 10000!\n",
validinput = 'q', low = 1, high = 1e4);
if(data.size == 'q') { cat("Quitting!\n"); break() }
data.size <- as.numeric(data.size)
stable.unstable <- getvalidinput("\nWould you like to generate stable or unstable plots?\n1) stable plots\n2) unstable plots \nPlease enter your selection or q to quit: ", "Invalid selection! enter1, 2 or q \n", validinput = c('1', '2', 'q'))
if(stable.unstable == 'q') { cat("\nQuitting!\n"); break() }
stable.unstable <- as.numeric(stable.unstable)

#if unstable plot selected get info about mean and variance
if(stable.unstable == 2){

mean = 0
variance = 1
mean.and.variance = getvalidinput("\nWould you like to have \n1) changing mean only? \n2) changing variance only? \n3) both changing mean AND changing variance? \nPlease enter your selection or q to quit: ",   "Invalid selection! enter 1, 2, 3 or q.\n",
validinput = c('1', '2', '3', 'q'))
if( mean.and.variance == 'q') { cat("\nQuitting!\n"); break() }
mean.and.variance <- as.numeric(mean.and.variance)

#changing mean
if(mean.and.variance == 1 | mean.and.variance == 3){

mean.selection <- getvalidinput("\nWould you like the mean to \n1) Increase?\n2) Decrease?\n3) Oscillate (fluctuate)? \nPlease enter your selection or q to quit: ", "Invalid selection! enter 1,2,3 or q \n", validinput = c('1', '2', '3', 'q'))
if(mean.selection == 'q') { cat("\nQuitting!\n"); break() }
mean.selection <- as.numeric(mean.selection)
#increasing mean
if(mean.selection == 1){

mean = c(1:data.size)* (3/data.size)
if(mean.and.variance == 1){
description = "increasing mean, constant variance"
}
if(mean.and.variance == 3){
description = "increasing mean"
}

}
#decreasing mean
if(mean.selection == 2){

mean = c(data.size:1)* (3/data.size)
if(mean.and.variance == 1){
description = "decreasing mean, constant variance"
}
if(mean.and.variance == 3){
description = "decreasing mean"
}

}
#oscillating mean
if(mean.selection == 3){

mean = 2 * cos( c(1:data.size)*4*pi/data.size )
if(mean.and.variance == 1){
description = "oscillating (fluctuating) mean, constant variance"
}
if(mean.and.variance == 3){
description = "oscillating (fluctuating) mean"
}

}
}

#changing variance
if(mean.and.variance == 2 | mean.and.variance == 3){

variance.selection <- getvalidinput("\nWould you like the variance to \n1) Increase?\n2) Decrease?\n3) Oscillate (fluctuate)? \nPlease enter your selection or q to quit: ", "Invalid selection! enter 1,2,3 or q \n", validinput = c('1', '2', '3', 'q'))
if(variance.selection == 'q') { cat("\nQuitting!\n"); break() }
variance.selection <- as.numeric(variance.selection)

#increasing variance
if(variance.selection == 1){

variance = c(1:data.size)* (3/data.size)
if(mean.and.variance == 2){
description = "constant mean, increasing variance"
}
if(mean.and.variance == 3){
description = paste(description, ", increasing variance")
}

}
#decreasing variance
if(variance.selection == 2){

variance = c(data.size:1)* (3/data.size)
if(mean.and.variance == 2){
description = "constant mean, decreasing variance"
}
if(mean.and.variance == 3){
description = paste(description, ", decreasing variance")
}

}
#oscillating variance
if(variance.selection == 3){

variance = 2 * cos( c(1:data.size)*4*pi/data.size )
if(mean.and.variance == 2){
description = "constant mean, oscillating (fluctuating) variance"
}
if(mean.and.variance == 3){
description = paste(description, ", oscillating (fluctuating) variance")
}

}
}

}

switch(stable.unstable,
{
#stable plots
series1 = rnorm(data.size)
series2 = rnorm(data.size)
series3 = rnorm(data.size)
series4 = rnorm(data.size)
},
{
#unstable plots
series1 = variance * rnorm(data.size) + mean
series2 = variance * rnorm(data.size) + mean
series3 = variance * rnorm(data.size) + mean
series4 = variance * rnorm(data.size) + mean
}) # end switch

#generate
par(mfrow = c(2,2), omi = c(0,0, .5,0), mar = c(4,4, 9,1))
if(stable.unstable == 1){
plot(series1, type = 'l', main = "Simulation 1")
plot(series2, type = 'l', main = "Simulation 2")
plot(series3, type = 'l', main = "Simulation 3")
plot(series4, type = 'l', main = "Simulation 4")
mtext(paste("Stable Plots"), side = 3, line = -1, cex = 2, outer = TRUE)
mtext("constant mean, constant variance", side = 3, line = -3, cex = 1, outer = TRUE)
}
if(stable.unstable == 2){
plot(series1, type = 'l', main = "Simulation 1")
plot(series2, type = 'l', main = "Simulation 2")
plot(series3, type = 'l', main = "Simulation 3")
plot(series4, type = 'l', main = "Simulation 4")
mtext(paste("Unstable Plots"), side = 3, line = -1, cex = 2, outer = TRUE)
mtext(paste(description), side = 3, line = -3, cex = 1, outer = TRUE)
}
################################################
#                                              #
#           option to save plots here          #
#                                              #
################################################
saveplots <- getvalidinput("Do you want to save your plot to the desktop? y/n: ", "Enter (y)es or (n)o!\n", validinput=c('y','n', 'q'))
if(saveplots == 'q') { cat("Quitting!\n"); break() }
if(saveplots == 'y')
{
while(TRUE)
{
if(nchar(titlename) > 0) break()
}
os <- .Platform\$OS
td <- gsub(":", ".", as.character(Sys.time()))
td <- gsub(" ", "_", td)
if(os == 'unix') #unix == linux or mac
{
name <- paste("~/Desktop/time_series_Rplot_", td, sep="")
}
if(os == 'windows')
{
name <- strsplit(as.character(Sys.getenv('HOME')), 'Documents')
name <- paste(name, "Desktop\\time_series_Rplot_", td, sep="")
}
name <- paste(name, ".jpg", sep="")
jpeg(name)

#generate plots to save
if(stable.unstable == 1){
par(mfrow = c(2,2), omi = c( 0,0, .25,0), mar = c(4,4, 9,1))
plot(series1, type = 'l', main = "Simulation 1",xlab = "index", ylab = "time series value")
plot(series2, type = 'l', main = "Simulation 2",xlab = "index", ylab = "time series value")
plot(series3, type = 'l', main = "Simulation 3",xlab = "index", ylab = "time series value")
plot(series4, type = 'l', main = "Simulation 4",xlab = "index", ylab = "time series value")
mtext(paste("Stable Plots - ", "constant mean, constant variance"), side = 3, line = -1, cex = 1, outer = TRUE)
mtext(paste("by ",titlename), side = 3, line = -3, cex = 1, outer = TRUE)
}
if(stable.unstable == 2){
par(mfrow = c(2,2), omi = c(0,0, .25,0), mar = c(4,4, 9,1))
plot(series1, type = 'l', main = "Simulation 1",xlab = "index", ylab = "time series value")
plot(series2, type = 'l', main = "Simulation 2",xlab = "index", ylab = "time series value")
plot(series3, type = 'l', main = "Simulation 3",xlab = "index", ylab = "time series value")
plot(series4, type = 'l', main = "Simulation 4",xlab = "index", ylab = "time series value")
mtext(paste("Unstable Plots - ", description), side = 3, line = -1, cex = 1, outer = TRUE)
mtext(paste("by ", titlename), side = 3, line = -3, cex = 1, outer = TRUE)
}

dev.off()

}

################################################
} # end while loop
}
```

## Try the learnstats package in your browser

Any scripts or data that you put into this service are public.

learnstats documentation built on May 1, 2019, 6:33 p.m.