Параллельные вычисления в R - PullRequest
0 голосов
/ 19 июня 2020

У меня есть вопрос о параллельных вычислениях в R. Я собираюсь использовать параллельные вычисления для отправки каждого из четырех вычислений bootstrap стандартных ошибок (по одному для каждого ответа: Total_lignin, Gluosis, Xylose и арабиноза) в другой core, а также сообщают оценки каждого максимума с соответствующими стандартными ошибками. Концентрация - это предиктор.

Я уже создал функцию под названием seBootFun, которая принимает в ответ, предиктор, B и данные и возвращает стандартное отклонение начальных оценок, и это работает, когда глюкоза рассматривается как ответ. но это не удается, когда я использовал параллельные вычисления. Не могли бы вы помочь мне с этим? Отображается ошибка. enter image description here

# Load the libraries
library(dplyr)
library(tidyverse)

# Read the .csv and only use M.giganteus and S.ravennae.
dat <- read_csv('concentration.csv') %>% 
  filter(variety == 'M.giganteus' | variety == 'S.ravennae') %>% 
  arrange(variety)

# Set seed for reproducibility purpose
set.seed(12)

# Sample size
n <- nrow(dat)

# Create the function to return the sd of the estimates
seBootFun <- function(resp, pred, B, data){
  # A function for return the max value of predictor
  max <- function(resp, pred, data){
    # Draw the sample size from the dataset
    sample <- slice_sample(.data = dat, n, prop = 1, replace = TRUE)

    # A quadratic model fit
    y <- as.matrix(sample[, resp])
    x <- as.matrix(sample[, pred])
    fit <- lm(y ~ x + I(x^2))

    # Derive the max of the value of concentration
    max <- -fit$coefficients[2]/(2*fit$coefficients[3])

  return(max)
  }

  maxs <- replicate(B, max(resp, pred, 
                           data = dat))

  return(c(mean(maxs), sd(maxs)))

}

# Output

result <- seBootFun(resp = 'Glucose', pred = 'concentration', B = 5000, data = dat)
names(result) <- c('estimated', 'sd')
result

# Load the `parallel` library
library(parallel)

# Set seed and iterated times
set.seed(8)

# Set up cores
cores <- detectCores()
cluster <- makeCluster(cores - 1)

clusterExport(cluster, list("seBootFun", "max", "maxs"))
clusterEvalQ(cluster, library(tidyverse)) 
clusterEvalQ(cluster, library(dplyr)) 

result.1 <- 
  parLapply(cluster, fun = seBootFun(resp = 'Total_lignin', pred = 'concentration', B = 5000, data = dat))

Это ссылка для набора данных: https://drive.google.com/file/d/1CZbG6DqDr8MBQvPMRTTll8iyhhBzgTSu/view?usp=sharing

...