2017-11-08 18 views
2

residualsregressionに近づけるためにmultidplyrを使用しようとしています。 モデルに適合するfunctionを作成して、residualsを取得しました。このデータに加えて、さらに2つの引数があります。ここでdplyr :: do内で引数を持つ関数をmultidplyrを使用して呼び出す

functionです:

set.seed(1) 
ds <- data.frame(group=c(rep("a",100), rep("b",100),rep("c",100)),sex=rep(sample(c("F","M"),100,replace=T),3),y=rpois(300,10)) 
model.formula <- as.formula("y ~ sex") 
regression.model <- "poisson" 

そして、ここではmultidplyrアプローチがあります:

func <- function(df,reg.mdl,mdl.fmla) 
{ 
    if(reg.mdl == "linear"){ 
    df$resid <- lm(formula = mdl.fmla, data = df)$residuals 
    } else if(reg.mdl == "poisson"){ 
    df$resid <- residuals(object = glm(formula = mdl.fmla,data = df,family = "poisson"),type='pearson') 
    } 
    return(df) 
} 

は、ここで私は私のmultidplyrアプローチを試してみましょうどのデータ例です

ds %>% partition(group) %>% cluster_library("tidyverse") %>% 
    cluster_assign_value("func", func) %>% 
    do(results = func(df=.,reg.mdl=regression.model,mdl.fmla=model.formula)) %>% collect() %>% .$results %>% bind_rows() 

このこのエラーはスローされます:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
    3 nodes produced errors; first error: object 'regression.model' not found 
In addition: Warning message: 
group_indices_.grouped_df ignores extra arguments 

だから、私はdoからfuncに引数を渡している方法が間違っていると思います。

何が正しいのでしょうか?

答えて

5

クラスタに環境にそのようなオブジェクトが含まれていないことが原因で発生したエラー。そのためには、クラスタプロセスに変数を割り当てるために必要とされています

ds %>% 
    partition(group) %>% 
    cluster_library("tidyverse") %>% 
    cluster_assign_value("func", func) %>% 
    cluster_copy(regression.model) %>% 
    cluster_copy(model.formula) %>% 
    do(results = func(
    df = ., 
    reg.mdl = regression.model, 
    mdl.fmla = model.formula 
)) %>% 
    collect() %>% 
    .$results %>% 
    bind_rows() 

それとも別の方法(私が鎖の前にクラスタを設定することを好む):

CL <- makePSOCKcluster(3) 
clusterEvalQ(cl = CL, library("tidyverse")) 
clusterExport(cl = CL, list("func", "regression.model", "model.formula")) 

ds %>% 
    partition(group, cluster = CL) %>% 
    do(results = func(
    df = ., 
    reg.mdl = regression.model, 
    mdl.fmla = model.formula 
)) %>% 
    collect() %>% 
    .$results %>% 
    bind_rows() 

stopCluster(CL) 
関連する問題