在R中使用多核来分析GWAS数据

时间:2011-12-13 11:35:33

标签: r foreach statistics multicore lapply

我使用R来分析全基因组关联研究数据。我有大约500,000个潜在的预测变量(单核苷酸多态性或SNP),并希望测试它们之间的关联和连续结果(在这种情况下血液中的低密度脂蛋白浓度)。

我已经编写了一个没有问题的脚本。简要说明一下,我有一个名为“Data”的数据对象。每行对应于研究中的特定患者。有年龄,性别,体重指数(BMI)和血液LDL浓度的列。 SNP数据还有50万个其他列。

我目前正在使用for循环运行线性模型五十万次,如图所示:

# Repeat loop half a million times
for(i in 1:500000) {

# Select the appropriate SNP
SNP <- Data[i]

# For each iteration, perform linear regression adjusted for age, gender, and BMI and save the result in an object called "GenoMod"
GenoMod  <- lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data)

# For each model, save the p value and error for each SNP. I save these two data points in columns 1 and 2 of a matrix called "results"
results[i,1] <- summary(GenoMod)$coefficients["Geno","Pr(>|t|)"]
results[i,2] <- summary(GenoMod)$coefficients["Geno","Estimate"]
}

所有这一切都很好。但是,我真的想加快我的分析。因此,我一直在尝试使用多核,DoMC和foreach软件包。

我的问题是,有人可以帮助我使用foreach方案调整此代码吗?

我在Linux服务器上运行该脚本,该服务器显然有16个可用核心。我尝试过试用foreach包,而且使用它的结果相对较差,这意味着使用foreach运行分析需要更长

例如,我尝试保存线性模型对象,如下所示:

library(doMC)
registerDoMC()
results <- foreach(i=1:500000) %dopar% { lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) }

这比使用常规for循环花费的时间长两倍多。任何有关如何更好或更快地做到这一点的建议将不胜感激!我理解使用lapply的并行版本可能是一个选项,但也不知道如何执行此操作。

一切顺利,

亚历

1 个答案:

答案 0 :(得分:8)

为您提供启动:如果您使用Linux,则可以执行multicore包中包含的parallel方法。虽然你需要在使用例如foreach包时设置整个东西,但这种方法不再需要了。您只需执行以下操作即可在16个核心上运行代码:

require(parallel)

mylm <- function(i){
  SNP <- Data[i]
  GenoMod  <- lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data)
  #return the vector
  c(summary(GenoMod)$coefficients["Geno","Pr(>|t|)"],
    summary(GenoMod)$coefficients["Geno","Estimate"])
}

Out <- mclapply(1:500000, mylm,mc.cores=16) # returns list
Result <- do.call(rbind,Out) # make list a matrix

在这里,您创建一个函数,返回具有所需数量的向量,并将索引应用于此。我无法检查这一点,因为我无法访问数据,但它应该可以工作。