累计折旧率为1%

时间:2018-08-29 13:26:59

标签: r dplyr stock

更具体地说,我有一个不平衡的面板数据集,其中包含一个变量,该变量衡量一段时间内各国的民主水平。我想将从第一次观察到现在的每个国家的民主得分加起来,每年的折旧率为1%。

4 个答案:

答案 0 :(得分:0)

示例数据:

df = data.frame(year = 1990:2018, theVariable = rnorm(29))

由于要根据年份使用不同的权重,因此必须创建它们。 0.99,因为每年-1%:

weights = 0.99^(0:28)

现在,您可以将它们乘以权重:

new_var = sum(df$theVariable * weights[2019 - df$year])

如果您想要加权平均值:

new_var = sum(df$theVariable * weights[2019 - df$year]) / sum(weights)

答案 1 :(得分:0)

假设您的意思是每年贬值每个值的1%,而不是百分点。

假设您每年进行一次测量。

您可以使用:

## Example data
var <- 10:20

sum(var*0.99^(length(var):1))

其中length(var):1是一个整数序列,从var中的值数到1递减。

0.99^[integer]表示每年/价值下降1% 这些值乘以var中的相应索引。

最后,所有值都与sum()

相加

答案 2 :(得分:0)

我认为您不能为此写一个for循环而做得更好。有些软件包提供指数移动平均值,该相似但不完全相同。

decay_sum <- function(tm, vl, decay) {
  last_time <- 0
  current_sum <- 0
  sums <- numeric(length(vl))
  ldecay <- log(1-decay)
  for (i in 1:length(vl)) {
    delta <- as.numeric(tm[i] - last_time)
    current_sum <- current_sum * exp(ldecay * delta/365) + vl[i]
    last_time <- tm[i]
    sums[i] <- current_sum
  }
  sums
}

作为测试用例:

> df2 <- data.frame(when=Sys.time() + 365 * 24 * 60 * 60 * 1:50,value=1)
> df2 %>% mutate(dis=decay_sum(when, value, .1))
                  when value      dis
1  2019-08-29 10:35:32     1 1.000000
2  2020-08-28 10:35:32     1 1.900000
3  2021-08-28 10:35:32     1 2.710000
4  2022-08-28 10:35:32     1 3.439000

这假定日期列是有序的(因此,如有必要,您可以放入arrange)。

答案 3 :(得分:0)

您想要这样的东西吗?

set.seed(1)
input <- sample(1:10,5)
input # [1] 3 4 5 7 2

decay = 0.01
output <- Reduce(function(x,y) x*(1-decay)+y,input,accumulate = TRUE)
output # [1]  3.00000  6.97000 11.90030 18.78130 20.59348

output[3] == 3*0.99^2 + 4*0.99 + 5 # [1] TRUE