【问题标题】:Nested function, matrix R嵌套函数,矩阵 R
【发布时间】:2017-05-22 15:21:06
【问题描述】:

我目前正在尝试开发一个新函数,该函数可以按矩阵中的组计算滚动统计信息。

我的数据集如下所示:

     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 执行此操作。知道我该怎么做会非常有帮助....

【问题讨论】:

  • 无需尝试优化您所做的事情,您只需split(data,data$ID),将z 行应用于每个元素,然后重新组合在一起。例如:l&lt;-split(data,data$ID);l&lt;-lapply(l,yourprocedure);do.call(rbind,l).
  • 嗨,尼古拉,谢谢。这看起来很有希望,但是我不熟悉这些技术。我现在尝试拆分数据,并出现以下错误:$ operator is invalid for atomic vectors 我想这意味着我不能将我的矩阵变成一个列表?
  • 如果datamatrix,请尝试data2&lt;-as.data.frame(data) 并将上述应用到data2
  • 非常感谢,我会尽快尝试。很抱歉延迟回复。

标签: r function matrix nested rollapply


【解决方案1】:

对于给定的数据框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

PS:

多年来我一直在努力:

 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`

那么你就可以为列表的每个元素申请上面的函数了

【讨论】:

  • 看起来像是做类似事情的另一种方法,但问题是每个 ID 都有一组年度观察结果。例如: ID = 1 有 year = 2000, 2001, ... , 2005 并且 ID = 2 有 year = 2003, 2004, ... , 2008 这意味着必须同时针对不同的 ID 和年份执行计算。 . 我确信有一些方法可以做到这一点,但我对 R 很陌生,因此我不确定哪个库可能是合适的。
  • 现在我对 R 有了更好的理解,我明白这条评论可能已经解决了这个问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2019-12-28
  • 2022-12-14
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多