今日は質問の時間です。
次のデータが与えられた場合:=
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
列が非数値であるためです。
次のコードは正常に動作します
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)
}
私の質問は、面倒な for ループ ルートをたどることなく、両方の data.tables を使用してベータを計算するにはどうすればよいですか?