Сдвиг скользящего среднего выхода из функции свертывания в R - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь построить временной ряд с соответствующим средним за 9 лет.Я использую функцию rollapply из пакета "zoo".

Я не знаю, почему временной ряд "среднее значение" не выровнен должным образом, даже если я изменил "align" в функции.

Временные ряды с 1969 по 2009

Вот данные, которые я использую:

structure(list(Year = 1961:2009, Rain = c(7.6656130268, 8.1981182796, 
14.4514275121, 13.1530337942, 9.2569892473, 14.1592933948, 10.8212829069, 
3.2401689708, 14.5850998464, 9.614093702, 13.1677048572, 4.7452764977, 
20.7346774194, 9.3896697389, 21.9528735632, 22.5482334869, 6.0696620584, 
7.100640041, 4.706154987, 7.9103302611, 9.9548387097, 8.0649001536, 
6.2932888395, 3.8337173579, 23.5, 2.4107142857, 14.7172784575, 
9.7700076805, 7.6785330261, 7.5453917051, 8.8073044123, 7.7576420891, 
17.0896697389, 10.2380952381, 19.1981460882, 7.0900537634, 5.0630184332, 
22.1928955453, 17.3850945495, 14.71593702, 12.7344086022, 6.0408602151, 
8.0338524286, 7.1766513057, 21.8706989247, 10.6695852535, 21.4467185762, 
10.5718894009, 3.9693548387)), .Names = c("Year", "Rain"), class = 
"data.frame", row.names = c(NA, 
-49L))

Вот мой сценарий:

dat<- read.csv("test.csv",header=TRUE,sep=",")
dat[dat == -999]<- NA
dat[dat == -888]<- 0
dat<-data.frame(dat)

dat$mav <- rollapply(dat$Rain,width=9,mean,fill=NA,align="right")


p <- ggplot(dat, aes(x = Year))
p <- p + geom_line(aes(y = Rain,color="test"))
p <- p + geom_point(aes(y = Rain,color="test"),size=1)
p <- p + geom_line(aes(y=mav, color = "9-year running mean") , lwd = 1)
p <- p + theme(panel.background=element_rect(fill="white"),
         plot.margin = unit(c(0.5,0.5,0.5,0.5),"cm"),
         panel.border=element_rect(colour="black",fill=NA,size=1),
         axis.line.x=element_line(colour="black"),
         axis.line.y=element_line(colour="black"),
         axis.text=element_text(size=20,colour="black",family="serif"),
         axis.title=element_text(size=15,colour="black",family="serif"),
         legend.position = "top")
p <- p + scale_colour_manual(name="",values=c("test"="steelblue4","9-year running mean"="green"))
p <- p + scale_y_continuous(breaks=seq(0,50, by=10),limits=c(0,50), expand=c(0,0))
p <- p + scale_x_discrete(limits = c(seq(1961,2009,9)),expand=c(0,0))
p <- p + labs(x="Year",y="Rainfall(mm/day)")

Вотвыходное изображение: Output Image

Что я ожидаю:

[a] Временной ряд скользящего среднего должен начинаться с 1969 года, а последнее значение должно быть на2000. Но в выходном изображении временной ряд смещен вправо и заканчивается в 2009 году.

[b] Когда я устанавливаю 'align' в 'center', скользящее среднее начинается в 1965.

[c] Любое предложение о том, как сделать это правильно в R?

1 Ответ

0 голосов
/ 25 апреля 2018

Я думаю, что вы, возможно, неправильно понимаете, как ширина, заливка и выравнивание работают в режиме прокатки.

vec <- 1:10
rollapply(vec, 5, mean, fill=NA, align='right')
#  [1] NA NA NA NA  3  4  5  6  7  8

Сначала берется значение n=5 и вычисляется среднее значение:

mean(vec[1:5])
# [1] 3

Где это поставить? Поскольку мы сказали align='right', он помещается в крайнее правое место, поэтому индекс 5.

#  [1]  1  2  3  4  5  6  7  8  9 10
#                   ^
#                   3

и так как вы сказали fill=NA, он сохраняет предыдущие пробелы и заполняет их NA

#  [1]  1  2  3  4  5  6  7  8  9 10
#       ^  ^  ^  ^
#  [1] NA NA NA NA  3

Для следующей итерации требуется среднее значение от 2-й до 6-й позиции:

mean(vec[2:6])
# [1] 4

который он затем помещает в 6-ю позицию:

#  [1]  1  2  3  4  5  6  7  8  9 10
#                      ^
#  [1] NA NA NA NA  3  4

Когда мы добираемся до последней итерации, мы вычисляем позиции от len-n+1 (10-5 + 1 = 6) до len (10), поэтому

mean(vec[6:10])
# [1] 8

так что ставится в последнюю позицию

#  [1]  1  2  3  4  5  6  7  8  9 10
#                                  ^
#  [1] NA NA NA NA  3  4  5  6  7  8

Итак, поскольку у нас было width=5 и fill=NA, у нас будет 5-1=4 пробелов, заполненных NA. (Могло бы быть больше, если бы в данных было больше NA.) Если бы мы выбрали вместо width=5 без fill, то у нас было бы 5-1=4 пробелов , пропущенных , что означает

# [1] 3 4 5 6 7 8

Если бы мы сделали width=5, fill=NA, align='left', тогда мы должны увидеть:

rollapply(vec, 5, mean, fill=NA, align='left')
#  [1]  3  4  5  6  7  8 NA NA NA NA

, потому что мы попросили удалить пороки NA s, и мы сказали поместить каждое значение в крайнее левое положение для каждого окна ширины 5. Последняя итерация (mean(vec[6:10]) со значением 8) была помещена в Крайняя левая позиция последнего окна шириной 5, что означает четыре пробела справа с известными неизвестными значениями.

...