我正在使用 R 分析全基因组关联研究数据。我有大约 500,000 个潜在的预测变量(单核苷酸多态性,或 SNP),并想测试它们中的每一个与连续结果(在这种情况下是血液中的低密度脂蛋白浓度)之间的关联。
我已经编写了一个可以毫无问题地执行此操作的脚本。简单解释一下,我有一个数据对象,称为“数据”。每行对应于研究中的特定患者。有年龄、性别、体重指数 (BMI) 和血液 LDL 浓度列。还有 50 万列包含 SNP 数据。
我目前正在使用 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 方案调整此代码吗?
我在显然有 16 个内核可用的 Linux 服务器上运行脚本。我尝试过使用 foreach 包,但使用它的结果相对较差,这意味着使用 foreach 运行分析需要更长的时间。
例如,我尝试保存线性模型对象,如下所示:
library(doMC)
registerDoMC()
results <- foreach(i=1:500000) %dopar% { lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) }
这比仅使用常规 for 循环花费的时间多一倍。任何有关如何更好或更快速地做到这一点的建议将不胜感激!我知道使用并行版本的 lapply 可能是一种选择,但也不知道该怎么做。
一切顺利,
亚历克斯