Накопительная сумма с нормой амортизации 1 процент - PullRequest
0 голосов
/ 29 августа 2018

Если говорить более конкретно, у меня есть несбалансированный набор данных панели, который содержит переменную, которая измеряет уровень демократии в стране с течением времени. Я хотел бы суммировать показатели демократии в каждой стране, начиная с первого наблюдения и до настоящего времени, с годовым уровнем амортизации в 1 процент.

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Хочешь что-нибудь подобное?

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
0 голосов
/ 29 августа 2018

Предполагается, что вы имеете в виду амортизацию в 1 процент от каждого значения в год, а не в процентах.

И при условии, что у вас есть одно измерение в год.

Вы можете использовать:

## Example data
var <- 10:20

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

Где length(var):1 - это последовательность целых чисел, отсчитывающая от количества значений в var до 1.

0.99^[integer] представляет снижение на один процент в год / значение Эти значения умножаются на соответствующие индексы в var.

Наконец, все значения суммируются с sum()

0 голосов
/ 29 августа 2018

Я не думаю, что вы сможете сделать лучше, чем написать цикл 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 при необходимости).

0 голосов
/ 29 августа 2018

Пример данных:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...