R — средние месячные суммы временных рядов

#r #time-series #mean #zoo #hydrotsm

#r #временные ряды #среднее #зоопарк #hydrotsm

Вопрос:

У меня есть длинный временной ряд (зоопарк) данных об осадках, я знаю, как получить среднее значение за месяц:

 library(hydroTSM)
ma= monthlyfunction(data, mean, na.rm=TRUE)
  

Я также знаю, как получить месячную сумму значений:

 su= monthlyfunction(data, sum, na.rm=TRUE)
  

но с последним я получаю ежемесячную сумму за весь период временного ряда. Я хотел бы получить среднее значение сумм за месяц, я имею в виду, например:

 jan 1980 (sum)= 150
jan 1981 (sum)= 180
jan 1982 (sum)= 90

expected value for january = average(150,180,90)= 140
  

Есть ли функция для этого вместо среднего и суммы?

Комментарии:

1. можете ли вы предоставить свои данные, чтобы мы могли попробовать первыми?

2. @TheRimalaya, Вот ссылка на пример-файл: link

3. Это ежедневные данные?

4. @TheRimalaya ja, ежедневные данные за 79 лет

Ответ №1:

 library(hydroTSM)

#This data is daily streamflows, but is similar to Precipitation
data(OcaEnOnaQts)
x <- OcaEnOnaQts

#In case you want monthly precipitation in "precipitation / 30 days" (what is common) you can use
monthlyfunction(x, FUN=mean, na.rm=TRUE) * 30

#In case you want the precipitation per days in specific month you can use
monthlyfunction(x, FUN=mean, na.rm=TRUE) * as.vector(dwi(x, out.unit = "months") * mean(dwi(x)) / sum(dwi(x)))

#or approximately
monthlyfunction(x, FUN=mean, na.rm=TRUE)*c(31,28.25,31,30,31,30,31,31,30,31,30,31)


#Add: Some ways to come to the mean monthly precipitation
p1980 <- c(rep(0,28), 50, 50, 50) #sum = 150
p1981 <- c(rep(0,28), 60, 60, 60) #sum = 180
p1982 <- c(rep(0,28), 30, 30, 30) #sum = 90
#
mean(c(sum(p1980), sum(p1981), sum(p1982))) # = 140 This is how you want it to be calculated
mean(c(p1980, p1981, p1982))*31 # = 140 This is how I suggested to come to the result
#Some other ways to come to the mean monthly precipitation
mean(c(mean(p1980), mean(p1981), mean(p1982)))*31 # = 140
sum(c(p1980, p1981, p1982))/3 # = 140
  

Комментарии:

1. спасибо, но это не мой случай, у меня есть ежедневный временной ряд за 79 лет, я ожидаю получить из него вектор из 12 значений (по одному на каждый месяц), это единственное значение для каждого месяца должно представлять среднее значение всех месячных значений за каждый год. пожалуйста, дайте мне знать, если я объясню себя ясно

2. Если количество наблюдений одинаковое, например, за январь каждого из ваших лет, результат должен быть одинаковым. С помощью mean вы вычисляете среднее количество осадков за день. Если вы умножите это на количество дней в месяце, вы получите среднее количество осадков за месяц, равное среднему значению всех месячных сумм.

3. НЕТ. когда я говорю сумму, я имею в виду накопленное значение (сумму значений с 01 по 30 день каждого месяца). Это значение будет отличаться для следующего года, и для следующего года и так далее, мне нужно среднее значение этих накопленных значений за каждый месяц с учетом всех лет.

4. в конце я должен получить среднее значение за каждый месяц. Я надеюсь, что мое объяснение понятно

5. Вам просто нужен результат среднемесячных осадков или есть срочная необходимость точно следовать ожидаемому способу их расчета? Пожалуйста, взгляните на «Добавить» в моем ответе, который показывает, что существует более одного способа прийти к желаемому результату. Единственным условием для других способов является то, что ваши данные также включают наблюдение за 0 осадками, что обычно имеет место для наблюдений за осадками.