我目前正在尝试开发一个新功能,用于按矩阵内的组计算滚动统计数据。
我的数据集如下所示:
ID year ROA CAR
[1,] 1 2009 0.006954926 0.3933436
[2,] 1 2010 0.013286958 0.2892719
[3,] 1 2011 0.012334294 0.2402294
[4,] 1 2012 0.006843720 0.2088247
[5,] 1 2013 0.004888144 0.1757100
[6,] 2 2006 0.010172563 0.0511171
值得注意的是,数据按ID分组,其中包含ROA和CAR的年度观察值。如果您感兴趣,数据来自银行,代表资产回报率和资本与资产比率。
我的目标是创建一个估算标准化z分数的函数,如下所示:
z = (mean(ROA) + mean(CAR)) / sd(ROA)
然而,分数是基于平均值的滚动度量和窗口长度为3的标准差,需要通过ID来计算,因为数据是按ID和年份索引的。
我正在尝试指定我的代码,我想出了类似的东西:
z <- rollapply(data, 3, function(x) x(((rollapply(data[,3], 3, mean))
- (rollapply(data[,4], 3, mean))) / (rollapply(data[,3], 3,
sd)))
值得注意的是,我使用rollapply函数来计算滚动平均值和滚动标准偏差,但是,我不知道如何以ID为基础进行此操作。知道如何这样做会非常有帮助....
答案 0 :(得分:0)
对于给定的数据框df
(蒙特卡罗:模拟您的情况)
df<-data.frame(ID_year=as.numeric(paste0("20",rep(11:20))),ROA=runif(10),CAR=runif(10)*2)
>df
ID_year ROA CAR
1 2011 0.9999123 0.8441209
2 2012 0.5215255 1.4291197
3 2013 0.7282076 0.3001416
4 2014 0.5001218 1.4413248
5 2015 0.8472549 0.1272178
6 2016 0.1250983 1.4753719
7 2017 0.7133057 0.5369519
8 2018 0.2602237 0.9859258
9 2019 0.4741151 1.0675716
10 2020 0.2010236 0.7205617
然后我尝试了:
incr<-2#time window in years
l1<-lapply(seq(from=1,to=nrow(df),by=incr),function(x1) {
x2<-x1+incr;
z<-(mean(df$ROA[x1:x2])+ mean(df$CAR[x1:x2]))/sd(df$ROA[x1:x2])
return(z)
})
> zscore<-unlist(l1)
[1] 6.700638 7.453366 3.319165 5.938582 NA
我多年来一直在尝试:
2011 2012 2013
2013 2014 2015
2015 2016 2017
2017 2018 2019
2019 2020 NA
df_split<-split( df , f = df$ID )#split based on `ID`
然后你可以申请列表中的每个元素上面的函数