R中rollapply函数的运行平均输出移位
我正试图绘制a时间序列及其相应的9年运行平均值。我正在使用“zoo”包中的rollapply函数 我不知道为什么“运行平均值”时间序列没有正确对齐,即使我更改了函数中的“对齐” 时间序列是从1969年到2009年 以下是我正在使用的数据:R中rollapply函数的运行平均输出移位,r,zoo,rollapply,R,Zoo,Rollapply,我正试图绘制a时间序列及其相应的9年运行平均值。我正在使用“zoo”包中的rollapply函数 我不知道为什么“运行平均值”时间序列没有正确对齐,即使我更改了函数中的“对齐” 时间序列是从1969年到2009年 以下是我正在使用的数据: structure(list(Year = 1961:2009, Rain = c(7.6656130268, 8.1981182796, 14.4514275121, 13.1530337942, 9.2569892473, 14.1592933948,
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)")
dat我认为您可能误解了滚动应用中的宽度、填充和对齐方式
vec <- 1:10
rollapply(vec, 5, mean, fill=NA, align='right')
# [1] NA NA NA NA 3 4 5 6 7 8
放在哪里?因为我们说的是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
# [1] 1 2 3 4 5 6 7 8 9 10
# ^
# [1] NA NA NA NA 3 4
然后将其置于第6位:
mean(vec[2:6])
# [1] 4
# [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),所以
所以它被放在最后一个位置
# [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
s,可能会有更多)如果我们选择了width=5
而没有fill
,那么我们就会有5-1=4
空格缺失,这意味着
如果我们做了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的窗口的最左侧位置,这意味着右侧有四个空间,其中有已知的未知值。尝试rollappy(1:10,5,mean,fill=NA,align='right')
,您将看到非NA
的值范围为指数5-10;这意味着第一个n-1
值是NA
,所有其他值都是可用值。在宽度为9的数据中,这意味着前8个值应为NA
,其余值(到2009年)可用。至于“正确地做它”。。。如果你预计它会失去前8个和最后9个,这不意味着你的宽度应该是18吗?否则,正确的做法是一个观点问题,我恐怕在这一点上会站在R一边。嗨。我明白你的意思。但我的意思是,当宽度小于9时,在我的例子中,它应该用NA填充。所以两端的9个时间步应该是空的。间隙应为n-1
,而不是n
,且仅应(a)全部在一侧,或(b)在两侧分开。这样想:i
th值应该是前面(align='left'
)、周围(align='center'
)或后面(align='right'
)值的平均值。因此,通过使用align='right'
,可以将返回值放置在最右边的位置。这意味着右边永远不应该有空隙。非常感谢你的帮助。你是对的。我误解了功能。
rollapply(vec, 5, mean, fill=NA, align='left')
# [1] 3 4 5 6 7 8 NA NA NA NA