【问题标题】:percent change over several years几年的百分比变化
【发布时间】:2016-04-18 21:42:40
【问题描述】:

我正在尝试计算从 2011 年到 2015 年所有 5 个变量的总百分比变化。以下函数将为我提供每年的百分比变化,但我的目标是总体百分比。如何在 R 中重写它?

pcchange=function(x,lag=1) c(diff(x,lag),rep(NA,lag))/x



> ssample
  year  100 100F 100I 100X
1 2011 6632    6  472   11
2 2012 6783    6  513   11
3 2013 7346    7  672    6
4 2014 8017    9  682   10
5 2015 8996    3  815   11
> dput(ssample)
structure(list(year = c(2011, 2012, 2013, 2014, 2015), `100` = c(6632L, 
6783L, 7346L, 8017L, 8996L), `100F` = c(6L, 6L, 7L, 9L, 3L), 
    `100I` = c(472L, 513L, 672L, 682L, 815L), `100X` = c(11L, 
    11L, 6L, 10L, 11L)), class = "data.frame", .Names = c("year", 
"100", "100F", "100I", "100X"), row.names = c(NA, -5L))

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    保持简单,试试

    subset(ssample, year == 2015, -1) / subset(ssample, year == 2011, -1) * 100
    

    【讨论】:

      【解决方案2】:

      使用 quantmod 包中的 ROC 函数进行简单的回报计算

      require(quantmod)
      
      
      apply(ssample[,-1],2,function(x) ROC(x,type="discrete"))
      #            100       100F       100I       100X
      #[1,]         NA         NA         NA         NA
      #[2,] 0.02276840  0.0000000 0.08686441  0.0000000
      #[3,] 0.08300162  0.1666667 0.30994152 -0.4545455
      #[4,] 0.09134223  0.2857143 0.01488095  0.6666667
      #[5,] 0.12211550 -0.6666667 0.19501466  0.1000000
      

      如您所见,百分比变化多年来变化很大。我想你真正需要的是复合年增长率或复合年增长率,即定义为回报几何平均值的时期内的平均回报

      annual.growth.rate <- function(a,period_length,m = 1){
      
      
        FinalValue <- tail(a,1)
        InitialValue <- head(a,1)
        cagr <- ((FinalValue/InitialValue)^(1/(period_length/m))) -1
      
        return(cagr)
      }
      
      num_of_years <- tail(ssample$year,1)-head(ssample$year,1)
      
      apply(ssample[,-1],2,function(x) annual.growth.rate(a=x,period_length = num_of_years ,m = 1))
       #       100        100F        100I        100X 
       #0.07919825 -0.15910358  0.14631481  0.00000000 
      

      xts、quantmod 和 PerformanceAnalytics 包对于时间序列分析非常方便

      【讨论】:

        【解决方案3】:

        这是样本数据的一种可能性:

        totalChange <- sapply(ssample[ssample$year %in% range(ssample$year), -1], 
                             function(x) pcchange(x))[1,]
        

        【讨论】:

          猜你喜欢
          • 2023-01-02
          • 1970-01-01
          • 2019-02-24
          • 2023-01-14
          • 2020-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多