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[,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 を使用してベータを計算するにはどうすればよいですか?

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「1 レベル上を調べる」という意味です。

于 2013-06-05T09:49:16.020 に答える