今天有一天的问题。
鉴于以下数据:=
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循环路线走下去?
答案 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]))