【问题标题】:Shifting of running mean output from the rollapply function in R从 R 中的 rollapply 函数转移运行平均输出
【发布时间】:2018-04-25 04:51:01
【问题描述】:

我正在尝试绘制具有相应 9 年运行平均值的时间序列。我正在使用“zoo”包中的 rollapply 函数。

我不知道为什么“运行均值”时间序列没有正确对齐,即使我更改了函数中的“对齐”。

时间序列是从 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)")

这是输出图像:

我的期望:

[a] 移动平均的时间序列应该从 1969 年开始,最后一个值应该在 2000 年。但是在输出图像中,时间序列向右移动并在 2009 年结束。

[b] 当我将“对齐”设置为“中心”时,运行平均值从 1965 年开始。

[c] 关于如何在 R 中正确执行此操作的任何建议?

【问题讨论】:

  • 试试rollapply(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)在两侧分开。这样想:ith 值应该是前一个 (align='left')、周围 (align='center') 或后续 (align='right') 值的平均值。因此,通过使用align='right',您是说将返回值放在最右边的位置。这意味着右侧永远不应有间隙。

标签: r zoo rollapply


【解决方案1】:

我认为您可能误解了滚动应用中的宽度、填充和对齐方式。

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=5fill=NA,所以我们将有5-1=4 空格填充NA。 (如果数据中有更多的NAs,可能还有更多。)如果我们选择了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

因为我们要求删除 NAs 副,并且我们说将每个宽度为 5 的窗口的每个值放在最左边。最后一次迭代(mean(vec[6:10]) 的值为 8)放在宽度为 5 的最后一个窗口的最左侧位置,这意味着右侧有四个具有已知未知值的空格。

【讨论】:

  • 非常感谢您的帮助。你说的对。我误解了函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多