【问题标题】:calculation of anomalies on time-series计算时间序列上的异常
【发布时间】:2013-05-01 11:29:30
【问题描述】:

我想计算具有多个站点的时间序列上的每月温度异常。 我在这里称“异常”为单个值与按周期计算的平均值的差异。

我的数据框看起来像这样(我们称之为“数据”):

Station Year Month Temp
A 1950 1 15.6
A 1980 1 12.3
A 1990 2 11.4
A 1950 1 15.6
B 1970 1 12.3
B 1977 2 11.4
B 1977 4 18.6
B 1980 1 12.3
B 1990 11 7.4

首先,我制作了一个包含 1980 年到 1990 年间的子集:

data2 <- subset(data, Year>=1980& Year<=1990)

其次,我使用 plyr 计算了每个站点在 1980 年到 1990 年之间的月平均值(我们称之为“MeanBase”):

data3 <- ddply(data2, .(Station, Month), summarise,
               MeanBase = mean(Temp, na.rm=TRUE))

现在,我想为每一行数据计算相应的 MeanBase 和 Temp 值之间的差异......但我不确定是否正确(我看不到如何使用数据3).

【问题讨论】:

  • 是温度...我改了

标签: r time-series plyr


【解决方案1】:

您可以在 base R 中使用 ave 来获取此信息。

transform(data, 
          Demeaned=Temp - ave(replace(Temp, Year < 1980 | Year > 1990, NA), 
                              Station, Month, FUN=function(t) mean(t, na.rm=TRUE)))

#   Station Year Month Temp Demeaned
# 1       A 1950     1 15.6 3.3
# 2       A 1980     1 12.3 0.0
# 3       A 1990     2 11.4 0.0
# 4       A 1950     1 15.6 3.3
# 5       B 1970     1 12.3 0.0
# 6       B 1977     2 11.4 NaN
# 7       B 1977     4 18.6 NaN
# 8       B 1980     1 12.3 0.0
# 9       B 1990    11  7.4 0.0

对于指定范围内没有年份的 Month-Station 组合,结果列将包含 NaNs。

【讨论】:

  • 抱歉,我(再次)更改了我的第一篇文章:必须计算 1980 年到 1990 年之间的平均值,但必须计算初始数据集所有年份的异常
  • 我不认为这算出我想要的。也许我的解释不清楚。我想得到的是:i)每个站和每个月,1980 年到 1990 年之间的平均值 ii)每个站,每个月,以及数据集的所有年份,得到平均值之间的差异(计算1980 年和 1990 年)和记录值……这就是我所说的“异常”
  • 这就是它的作用,但它会从每个温度中减去该平均值。取出 'Temp - ' 看看是什么意思。
  • 那么,怎么可能得到NaN呢?
  • 因为 B 站和第 4 个月的范围内没有年份。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2019-10-13
相关资源
最近更新 更多