2011-12-13 2 views
7

저는 R을 사용하여 게놈 전체 연관 연구 데이터를 분석하고 있습니다. 나는 약 50 만개의 잠재적 인 예측 변수 (single-nucleotide polymorphisms, SNPs)를 가지고 있으며 그들 각각과 지속적인 결과 (이 경우 혈중 저밀도 지단백질 농도) 사이의 연관성을 테스트하고 싶다.R에서 멀티 코어를 사용하여 GWAS 데이터 분석

나는 문제없이이 작업을 수행하는 스크립트를 이미 작성했습니다. 간단히 설명하면, 나는 "데이터"라는 데이터 객체를 가지고있다. 각 행은 연구의 특정 환자에 해당합니다. 연령, 성별, 체질량 지수 (BMI), 혈액 LDL 농도에 대한 칼럼이 있습니다. SNP 데이터에는 50 만 개의 다른 열이 있습니다.

나는 현재와 같이 선형 모델을 50 만 번 실행 루프를 사용하고 있습니다 :

# 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) } 

이 루프를 위해 단지 정기적를 사용하여 두 배 길이보다 더 걸립니다. 이 방법을 더 잘 또는 더 빨리 수행하는 방법에 대한 조언을 받으실 수 있습니다! lapply의 병렬 버전을 사용하는 것이 옵션 일 수도 있지만이를 수행하는 방법을 알지 못합니다.

모든 최선을,

알렉스

+0

R 2.14로 업데이트하고'parallel' 패키지를 사용하십시오. 우리가 작업하는 동안 재현 할 수있는 예제를 제공하면 확실하게 도움이 될 것입니다. [이 질문을 참조하십시오] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

Joris, 조언 주셔서 감사합니다. 필자는 http://www.biomedcentral.com/content/pdf/1471-2105-9-390.pdf에서'parallel'에 대한 문서를 찾았으며 지금 읽을 것입니다. – Alexander

+0

'snowfall' 패키지가 테이블에서 떨어 졌습니까 (Dirk)? –

답변

7

당신에게 시동을 제공하려면, 당신이 리눅스를 사용하는 경우, 당신은 parallel 패키지에 포함 된 multicore 접근 할 수 있습니다. 예를 들어 foreach 패키지를 사용할 때 모든 것을 설정해야했지만,이 방법은 더 이상 필요하지 않습니다. 여기

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 

당신이 원하는 수량과 벡터를 반환하는 기능을하고,이를 통해 인덱스를 적용 코드는 단순히 수행하여 16 개 개의 코어에서 실행됩니다. 데이터에 액세스 할 수 없기 때문에이를 확인할 수는 없지만 작동해야합니다.

+0

Joris, 도움 주셔서 감사합니다! 솔루션을 구현했으며 외관상으로는 효과가있었습니다. 나는 단지 이전에 12 시간 이상 걸렸고 15 분 만에 오븐 밖으로 나왔다.이제 저는 3 달 전에이 질문을했으면합니다. – Alexander

관련 문제