首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R计算不同区间长度的年增长率或归一化增长率

R计算不同区间长度的年增长率或归一化增长率
EN

Stack Overflow用户
提问于 2015-06-22 19:40:26
回答 1查看 496关注 0票数 1

我有一个数据框架的结构如下所示。我想计算年增长率。问题是,并非所有模型的时间步长是相同的。在下面的例子中,提醒以5年间隔交付数据,而TIAM-ECN每隔10年交付数据一次.

代码语言:javascript
复制
model     scenario  region  year  value
REMIND    Base  NORTH_AM    2010  314.1330
REMIND    Base    CHINA+    2010  1325.9220
REMIND    RefPol  NORTH_AM  2010  314.1330
REMIND    RefPol  CHINA+    2010  1325.9220
TIAM-ECN  Base    NORTH_AM  2010  344.4005
TIAM-ECN  Base    CHINA+    2010  1341.3352
TIAM-ECN  RefPol  NORTH_AM  2010  344.4005
TIAM-ECN  RefPol  CHINA+    2010  1341.3352
REMIND    Base    NORTH_AM  2015  327.6270
REMIND    Base    CHINA+    2015  1354.3180
REMIND    RefPol  NORTH_AM  2015  327.6270
REMIND    RefPol  CHINA+    2015  1354.3180
REMIND    Base    NORTH_AM  2020  340.8490
REMIND    Base    CHINA+    2020  1372.4630
REMIND    RefPol  NORTH_AM  2020  340.8490
REMIND    RefPol  CHINA+    2020  1372.4630
TIAM-ECN  Base    NORTH_AM  2020  374.2647
TIAM-ECN  Base    CHINA+    2020  1387.7915
TIAM-ECN  RefPol  NORTH_AM  2020  374.2647
TIAM-ECN  RefPol  CHINA+    2020  1387.7915

计算不同间隔的增长率很简单:

代码语言:javascript
复制
library(dplyr)

tmp_gr <- group_by(df, model, scenario, region) %>%
  mutate(value = value / lag(value) - 1) %>%
  ungroup()

收益率(我忽略了2010年的NAs ):

代码语言:javascript
复制
model     scenario region   year    value
REMIND    Base     NORTH_AM 2015    -0.7557456
REMIND    Base     CHINA+   2015    3.1337191
REMIND    RefPol   NORTH_AM 2015    -0.7580871
REMIND    RefPol   CHINA+   2015    3.1337191
REMIND    Base     NORTH_AM 2020    -0.7483242
REMIND    Base     CHINA+   2020    3.0266012
REMIND    RefPol   NORTH_AM 2020    -0.7516516
REMIND    RefPol   CHINA+   2020    3.0266012
TIAM-ECN  Base     NORTH_AM 2020    -0.7273044
TIAM-ECN  Base     CHINA+   2020    2.7080483
TIAM-ECN  RefPol   NORTH_AM 2020    -0.7303164
TIAM-ECN  RefPol   CHINA+   2020    2.7080483

但是现在,用区间增长率除以区间长度来计算年增长率。

代码语言:javascript
复制
tmp_gr_yearly <- group_by(df, model, scenario, region) %>%
  mutate(value = (value / lag(value) - 1) / (year - lag(year))) %>%
  ungroup()

产量:

代码语言:javascript
复制
model     scenario region   year   value
REMIND    Base     NORTH_AM 2015    -0.1511491
REMIND    Base     CHINA+   2015    Inf
REMIND    RefPol   NORTH_AM 2015    -Inf
REMIND    RefPol   CHINA+   2015    Inf
REMIND    Base     NORTH_AM 2020    -0.1496648
REMIND    Base     CHINA+   2020    Inf
REMIND    RefPol   NORTH_AM 2020    -Inf
REMIND    RefPol   CHINA+   2020    Inf
TIAM-ECN  Base     NORTH_AM 2020    -Inf
TIAM-ECN  Base     CHINA+   2020    Inf
TIAM-ECN  RefPol   NORTH_AM 2020    -Inf
TIAM-ECN  RefPol   CHINA+   2020    Inf

我不明白Inf是从哪里来的。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-22 19:57:38

我计算简单、非正常化增长率的例子已经错了。

总之,我想我自己想出来了:

代码语言:javascript
复制
tmp_gr <- group_by(df, model, scenario, region) %>%
  mutate(value = lag(value, n=0, order_by=year) / lag(value, order_by=year) - 1) %>%
  ungroup()

 tmp_gr_yearly <- group_by(df, model, scenario, region) %>%
   mutate(value = (lag(value, n=0, order_by=year) / lag(value, order_by=year) - 1) / (lag(year, n=0, order_by=year) - lag(year, order_by=year))) %>%
 ungroup()

通过对所有值使用滞后运算符并显式地告诉顺序,所有事情都对无序数据具有鲁棒性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30988424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档