R基于需要来自诸如β的列的两个子集的分组来计算公式

时间:2013-06-05 09:18:02

标签: r data.table

今天有一天的问题。

鉴于以下数据:=

set.seed(1234)
a = data.table(date=seq(ymd('2001-6-30'),ymd('2003-6-30'),by='weeks'),a=rnorm(105),b=rnorm(105),c=rnorm(105))
b = data.table(date=seq(ymd('2001-6-30'),ymd('2003-6-30'),by='weeks'),a=rnorm(105),b=rnorm(105),c=rnorm(105))
a[,idkey:='port']
b[,idkey:='bm']
setkeyv(a,names(a))
setkeyv(b,names(b))
beta=merge(a,b,all=T)

如果我尝试使用以下代码计算投资组合中每列的测试版

beta[,lapply(.SD,function(x)cov(x[idkey=='port'],x[idkey=='bm'])/var(x[idkey=='bm'])),.SDcols=2:5]

我收到错误

Error: is.numeric(x) || is.logical(x) is not TRUE

我怀疑是因为idkey列是非.numeric。

以下代码可以正常使用

for(i in 2:4){
  be = cov(beta[idkey=='port',i,with=F],beta[idkey=='bm',i,with=F])/var(beta[idkey=='bm',i,with=F])
  print(be)
}

我的问题是 - 我如何使用data.tables来计算beta,而不必沿着笨拙的for循环路线走下去?

1 个答案:

答案 0 :(得分:1)

我没有看到避免循环功能的方法。但是,您应该使用二进制搜索:

setkeyv(beta,c("idkey", "date"))
sapply(list("a","b","c"),
    function(x) cov(beta['port',x,with=FALSE], 
                    beta['bm',x,with=FALSE])/var(beta['bm',x,with=FALSE]))