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