【发布时间】: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<-split(data,data$ID);l<-lapply(l,yourprocedure);do.call(rbind,l). -
嗨,尼古拉,谢谢。这看起来很有希望,但是我不熟悉这些技术。我现在尝试拆分数据,并出现以下错误:$ operator is invalid for atomic vectors 我想这意味着我不能将我的矩阵变成一个列表?
-
如果
data是matrix,请尝试data2<-as.data.frame(data)并将上述应用到data2。 -
非常感谢,我会尽快尝试。很抱歉延迟回复。
标签: r function matrix nested rollapply