固定利率衰减的累积沉积

时间:2019-05-31 13:40:57

标签: r dplyr

我正在尝试模拟每年沉积的死木中生物量的积累。木材每年以4.6%的速度腐烂。

我的数据已格式化:

颜色:治疗,年份,新存款 处理(A,B,C ...) 年(0:105) New.deposit(数字)

在过去的几天中,我尝试了如下所示的功能组合,但最终得到了错误的组合-也许我使事情变得太困难了:

#OBS! These code attempts are incorrect.
df <- df %>% group_by(Treatment) %>% mutate(Accumulated.deposits = cumsum(lag(New.deposit, n=1, default=0))*(1-0.046))

df <- df %>% group_by(Treatment) %>% mutate(Accumulated.deposits = cumsum((lag(Accumulated.deposits, n=1, default=0)*(1-0.046))) + new.deposit

My goal is to have one variable, Accumulated.biomass.yearY = deposit.year0 *  (1-0.046)^(Y) + deposit.year1 * (1-0.046)^(Y-1) + deposit.year2 * (1-0.046)^(Y-2)..... deposit.yearY * (1-0.046)^(Y-Y).

我希望矩阵显示X年的每年存款中剩余的生物量。

2 个答案:

答案 0 :(得分:0)

欢迎来到stackoverflow。你可以尝试这样的事情吗?我喜欢分解步骤,以便更轻松地了解正在发生的事情。如果我不完全理解,请发表评论,我将更新我的答案。您也可以在问题中使用此示例数据框,并向我们显示您希望看到的输出,以便我们继续学习。

library(tidyverse)

df <-
  tibble(
    treatment = rep(LETTERS[1:2], 5),
    years = rep(0:4, each = 2),
    new_deposit = rep(1:5*10, each = 2)
  ) %>% 
  arrange(treatment, years, new_deposit)


df %>%
  arrange(treatment, years) %>%
  group_by(treatment) %>%
  mutate(
    prev_deposit = lag(new_deposit, default = 0),  
    running_sum = cumsum(prev_deposit),
    accumulated = running_sum * (1-0.046)^(years)
  ) %>% 
  ungroup()

#  treatment years new_deposit prev_deposit running_sum accumulated
#  <chr>     <int>       <dbl>        <dbl>       <dbl>       <dbl>
#  A             0          10            0           0        0   
#  A             1          20           10          10        9.54
#  A             2          30           20          30       27.3 
#  A             3          40           30          60       52.1 
#  A             4          50           40         100       82.8 

答案 1 :(得分:0)

数据

set.seed(1)
df <- data.frame(treatment = rep(c('A','B'), each=5), years = rep(1:5, times=2), new_deposit=runif(10))

   treatment years new_deposit
1          A     1  0.26550866
2          A     2  0.37212390
3          A     3  0.57285336
4          A     4  0.90820779
5          A     5  0.20168193
6          B     1  0.89838968
7          B     2  0.94467527
8          B     3  0.66079779
9          B     4  0.62911404
10         B     5  0.06178627

自定义功能

custom <- function(z, decay) { ans <- accumulate(z, function(x, y) { (x + y) * (1-decay) }, .init=0); tail(ans, -1) }

该函数将采用向量z和衰减率decay,并使用purrr::accumulate递归地应用公式(x+y)*(1-decay),其中x是{{向量中的第1}}个元素,向量i中的第y个元素。我将向量i+1填充为起始值0,然后不填充.init=0而返回答案。

用法

tail(ans, -1)