首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr中的参数调用函数::do使用multidplyr

使用dplyr中的参数调用函数::do使用multidplyr
EN

Stack Overflow用户
提问于 2017-11-08 19:19:23
回答 1查看 402关注 0票数 5

我正在尝试使用multidplyr来加速从regression fit中获取residuals。我已经创建了一个适合regression模型的regression,以获得除了数据之外的residuals,它还会获得另外两个参数。

这是function

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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()

但是,这会引发此错误:

代码语言:javascript
复制
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

因此,我想我将参数从func传递给do的方式是错误的。

知道正确的方法是什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 10:02:03

由于集群在它们的环境中没有这样的对象而引起的错误。因此,需要为集群进程分配变量:

代码语言:javascript
复制
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()

或者另一种方式(我更喜欢在链之前建立集群):

代码语言:javascript
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47187940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档