0

今天有一点时间来提问。

给定以下数据:=

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

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列是非数字的。

以下代码工作正常

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-loop 路线?

4

1 回答 1

1

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

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

..x意思是“向上一层”

于 2013-06-05T09:49:16.020 回答