2016-01-16 2 views
-1

У меня есть ежедневные данные по более чем 100 лет, что выглядит какскользящие средние

01.01.1856 12 
02.01.1956 9 
03.01.1956 -12 
04.01.1956 7 
etc. 

Я хочу, чтобы вычислить 30 лет скользящее среднее для этого больших объемов данных. Я попытался преобразовать данные в временные ряды, но пока не понял, как это сделать. Я предпочел бы простой метод, связанный с работой с data.frame.

+0

Это не должно быть временное (но представляющее собой ряд наблюдений), посмотрите http://www.inside-r.org/packages/cran/zoo/docs/rollmean или http://svitsrv25.epfl.ch/R-doc/library/caTools/html/runminmax.html – MLavoie

+0

Пакет 'TTR' предоставляет все скользящие средние, о которых можно подумать. – RHertel

+0

Функция 'movav()' из пакета 'prostr' также делает это – Frank

ответ

1

Я думаю, что подготовка - это трудность с учетом некоторых прыжков. Так что я пытаюсь показать способ подготовки, прежде чем использовать уже упомянутую функцию runmean пакета require(caTools). Сначала мы создаем примерные данные (которые вам не нужны, но для понимания). Во-вторых, я разделяю фрейм данных на список фреймов данных, по одному на каждый год и принимая средние значения за каждый год. Эти два шага можно было сделать сразу, но я думаю, что разделенный путь легче понять и адаптировать.

#example data 
Days  <- seq(as.Date("1958-01-01"), as.Date("2015-12-31"), by="days") 
Values  <- runif(length(Days)) 
DF   <- data.frame(Days = Days, Values = Values) 
#start of script 
Years  <- format(DF$Days, "%Y") 
UniqueYears <- unique(format(DF$Days, "%Y")) 
#Create subset of years 
#look for every unique year which element of days is in this year. 
YearlySubset <- lapply(UniqueYears, function(x){ 
       DF[which(Years == x), ] 
      }) 
YearlyMeanValues <- sapply(YearlySubset, function(x){ 
       mean(x$Values) 
      }) 

Теперь ход означает прикладывается:

#install.packages("caTools") 
require(caTools) 
RM <- data.frame(Years = UniqueYears, RunningMean30y = runmean(YearlyMeanValues, 30)) 

Просто, если я не получил вас прямо на первый, и вы хотите, чтобы некоторые бегущий в виду каждый день в течение примерно 30 лет, конечно, вы могли бы просто сделать:

RM <- cbind(DF, runmean(DF$Values, 365 * 30)) 

И учитывая ваши проблемы, создающей таймсериях:

DF[ , 1] <- as.Date(DF[ , 1], format = "%Y.%m.%d") 
1

Я хотел бы также предложить исследовать RcppRoll в сочетании с dplyr, который обеспечивает достаточно удобное решение для расчета прокатки средних значений, суммы и т.д.

Code

# Libs 
library(RcppRoll) # 'roll'-ing functions for R vectors and matrices. 
library(dplyr)  # data grammar (convenience) 
library(zoo)  # time series (convenience) 
library(magrittr) # compound assignment pipe-operator (convenience) 

# Data 
data("UKgas") 
## Convert to data frame to make example better 
UKgas <- data.frame(Y = as.matrix(UKgas), date = time(UKgas)) 

# Calculations 
UKgas %<>% 
    # To make example more illustrative I converted the data to a quarterly format 
    mutate(date = as.yearqtr(date)) %>% 
    arrange(date) %>% 
    # The window size can be changed to reflect any period 
    mutate(roll_mean = roll_mean(Y, n = 4, align = "right", fill = NA)) 

Notes

Как предусмотрено данные в примере был довольно скромным, я использовал ежеквартальные данные по потреблению газа в Великобритании, доступные через функцию data в пакете utils.

Смежные вопросы