Точки графика из любой функции данных временных рядов в R

Я пытаюсь построить точки на любых данных TS. Моя основная проблема заключается в том, как передать данные этой функции. Он должен быть в состоянии построить точки для этого TS, т.е. увеличение на 5% из года в год.

require(datasets)
require(zoo)
## ploting
MyPlot <- function(x=ldeaths,Events, pch = 19, col = 'red', cex = 1)
{ 
 plot(x)
 myData <- as.zoo(x)
 points(myData[Events], pch = pch, col = col, cex = cex)
  }

### My problem
MyPlot(x = anyTimeSeriesdata, Events = anyFunOperatingOnTS)

Как определить anyFunOperatingOnTS?


person Garf    schedule 15.01.2017    source источник
comment
Это данные временного ряда, поэтому представьте, что вы хотите построить график ts, а затем нанести некоторые определенные точки на график ts. т.е. увеличение продаж из месяца в месяц более чем на 5%.   -  person Garf    schedule 17.01.2017


Ответы (1)


Проверьте эту функцию. Вы можете передать percent = 0.05 вместо >5% или другое значение по мере необходимости.

MyPlot <- function(x = ldeaths, Events = TRUE, pch = 19, col = 'red', 
                        cex = 1, xlab = "Date", ylab = "Deaths", percent = 0.05){     
    #Convert x to data.frame 
    intermediate_data = as.data.frame(t(matrix(x, 12,
                        dimnames = list(month.abb, unique(floor(time(x)))))))

    #Make year (from rownames) a column
    intermediate_data$year = rownames(intermediate_data)

    #Melt data into long form 
    require(reshape2)
    intermediate_data = melt(intermediate_data, id = "year")

    #Convert to POSIXct format (I've added 15 as day for each month)
    intermediate_data$date = as.POSIXct(paste(intermediate_data$year,
           intermediate_data$variable,"15",sep = "/"),format = "%Y/%b/%d")

    #Retain only the relevant columns                       
    intermediate_data = intermediate_data[,c(4,3)]

    #Order by date
    intermediate_data = intermediate_data[with(intermediate_data, order(date)), ]

    #Compute difference
    intermediate_data$diff = c(0,diff(x = intermediate_data$value,
                        lag = 1, differences = 1))

    #Find out the rows for which difference is greater than percent (default is 5%)
    for (i in 2:nrow(intermediate_data)){
        if (intermediate_data$diff[i]/intermediate_data$value[i-1] > percent){
            intermediate_data$Remarks[i] = paste(">",percent,sep="")
        } else {
            intermediate_data$Remarks[i] = paste("!>",percent,sep="")
        }
    }

    #Separate the ones with greater than 5% into another data.frame
    timeseries = subset(intermediate_data, 
             intermediate_data$Remarks == paste(">",percent,sep=""))

    #Plot the lines
    plot(x = intermediate_data$date, y = intermediate_data$value, 
                         type = "l", xlab = xlab, ylab = ylab)

    #Plot the points for greater than percent if EVENTS == TRUE
    if (Events == TRUE){
        points(x = timeseries$date, y = timeseries$value, 
                       pch = pch, col = col, cex = cex)
    }
}
person d.b    schedule 17.01.2017
comment
Отличный ответ. Хорошо написанный. Спасибо. - person Garf; 24.01.2017