2017-09-03 8 views
5

約2250万回の観測データセットのローリングバリューアットリスクを推定したいので、高速計算にsparklyrを使用したいと考えています。ここでは(サンプル・データベースを使用して)私がやったことです:sparklyrを使用した大規模データのロールアップ

library(PerformanceAnalytics) 
library(reshape2) 
library(dplyr) 

data(managers) 
data <- zerofill(managers) 
data<-as.data.frame(data) 
class(data) 
data$date=row.names(data) 
lmanagers<-melt(data, id.vars=c('date')) 

今私はdplyrとPerformanceAnalyticsパッケージを使用したVaRの推定:

library(zoo) # for rollapply() 
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>% 
    mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) 

これが正常に動作します。今私はsparklyrを利用するには、この操作を行います。

library(sparklyr) 
sc <- spark_connect(master = "local") 
lmanagers_sp <- copy_to(sc,lmanagers) 
src_tbls(sc) 

var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>% 
    mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>% 
    collect 

をしかし、これは次のエラー与える:エラーがあると、正しいコードは何です

Error: Unknown input type: pairlist 

を誰も私に教えていただけますか?または、ローリングVaRをより速く推定するための他の解決法もまた、価値がある。

+0

'data $ date = row.names(data)'は、 'Date'ではなく' character'のベクトルを与えます。 'data $ date < - as.Date(row.names(data))'を実行するとどうなりますか? – C8H10N4O2

答えて

3

sparklyrなどのカスタムdplyrの場合、mutateは現在、他のパッケージで定義されている任意のR関数をサポートしていません。したがって、現在rollapply()はサポートされていません。

sparklyrでリスクアットリスクを計算するには、1つのアプローチはextend sparklyr using Scala and Rであり、Estimating Financial Risk with Apache Sparkと同様の方法に従います。

0

私は二つのタスクにあなたの質問を破るしてみましょう:sparklyrインタフェースで

  • 行う方法ローリング自己結合(すなわち、a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10)カスタム関数を使用する方法
  • (すなわち、VaR)とsparklyr インタフェース

01の限られたセットをサポートdplyr動詞、で可能であるかもしれない最初のタスク。おそらく、一般的な例である(lag(return,1) + lag(return,2) + lag(return,3))/(3 - is.na(lag(return,1)) - is.na(lag(return,2)) - is.na(lag(return,3))の行に沿って、本当に醜いものに終わるでしょう。 (残念ながら条件は、例えば、日付の窓を結合unsupporteddplyrに残っている - この質問は、しばしば出てくるように思わ例えばthis one。)

ちょうど直接スパークSQLの最初のタスクを書くためにはるかに容易になります(条件付きで上記の自己結合)をDBI::dbGetQuery()で囲みます。

2番目のタスクは、dplyrまたは直接SQLを使用して簡単に行うことができない統計的なものであり、それはsparklyrがサポートしないことを、ライブラリの依存関係を持っているので、あなたは、スカラ(やPython)user-defined functionを(使用する必要がありますUDF)を使用してVaRを計算します(他の回答にはなど)。

TL; DR最初のタスクはsparklyr(ただし、SQLを使用して、ないdplyr)を介して、なんとかです。 2番目のタスクでは、invoke()からsparklyrまでの外部UDFが必要です。

関連する問題