如何在r中的矩阵中找到增加或减少的趋势?

时间:2017-03-22 03:21:00

标签: r time-series trend

我有一个名为trendtable的时间序列矩阵,其中包含1960年至2010年的数据(57列),适用于175个国家。列名称为年份,并给出了相应的值。我需要找到它们之间的区别用于查找每个国家/地区趋势的列,以查找趋势是上升还是下降。得到的趋势值应该在新表中。我写的代码如下所述,但我猜错了。

for (i in 1:175) {
  Trend=0

for (j in 5:56) {


   Dif=TimeSeriesCO2[i,j]-TimeSeriesCO2[i,j+1]
   if(Dif<0){ 
     Trend--}
   else{
     Trend++}
   }
  TrendTable<-rbind(TrendTable,Trend)
}

1 个答案:

答案 0 :(得分:0)

这是一个伪造的假数据:

set.seed(42)
nc <- 9 ; nr <- 5
mtx <- t(replicate(nr, cumsum(sample(-3:3, size = nc, replace = TRUE))))
dimnames(mtx) <- list(LETTERS[seq_len(nr)], 2000 + seq_len(nc))
mtx
#   2001 2002 2003 2004 2005 2006 2007 2008 2009
# A    3    6    5    7    8    8   10    7    8
# B    1    1    3    6    4    4    7   10    7
# C    0    0    3    0    3    6    3    3    2
# D    3    3    5    7    9    8    9    6    8
# E   -3   -5   -2   -1   -2   -2   -5   -2   -2

所以我用五个字母模拟你的175个国家,用9个字母模拟57年。

第一次削减可能是确定一年是否大于或等于上一年。

t(apply(mtx, 1, diff) >= 0)
#    2002  2003  2004  2005  2006  2007  2008  2009
# A  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
# B  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
# C  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE
# D  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
# E FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE

tapply的结果进行调整的必要性可能不直观,但却是处理它的事实。如果没有t ranspose,可能有办法做到这一点,但没有我知道在基地R中是直接的。)

请注意,列数少于原始数据集中的列数。如果累积增加与否,我想在每年跟踪,有人可能会这样做:

t(apply(mtx, 1, function(a) cumsum(diff(a) >= 0)))
#   2002 2003 2004 2005 2006 2007 2008 2009
# A    1    1    2    3    4    5    5    6
# B    1    2    3    3    4    5    6    6
# C    1    2    2    3    4    4    5    5
# D    1    2    3    4    4    5    5    6
# E    0    1    2    2    3    3    4    5

但我不一定能找到更多信息。

从您的代码中看,您可能希望每个国家(字母)都有一个号码,在这种情况下,您可以进一步简化为:

apply(mtx, 1, function(a) sum(diff(a) >= 0))
# A B C D E 
# 6 6 5 6 5 

至于以某种方式将此添加到您当前的数据中,我既不确定您想要的内容(来自您的示例),也不建议将摘要数据附加到原始矩阵。唯一的例外是立即可视化,而不是存储。