2011-12-13 26 views
7

Genom çapında ilişkilendirme çalışma verilerini analiz etmek için R kullanıyorum. Yaklaşık 500,000 potansiyel belirleyici değişkenim (tek nükleotid polimorfizmleri veya SNP'ler) var ve bunların her biri ile sürekli bir sonucu arasındaki ilişkiyi test etmek istiyorum (bu durumda, kandaki düşük yoğunluklu lipoprotein konsantrasyonu).GWAS verilerini analiz etmek için çok çekirdekli R'yi kullanma

Zaten bunu sorunsuz yapan bir komut dosyası yazdım. Kısaca açıklamak gerekirse, "Data" adlı bir veri nesnesine sahibim. Her sıra, çalışmadaki belirli bir hastaya karşılık gelir. Yaş, cinsiyet, vücut kitle indeksi (BMI) ve kan LDL konsantrasyonu için sütunlar vardır. SNP verileriyle birlikte yarım milyon başka sütun da var.

Şu anda görüldüğü gibi, doğrusal modele yarım milyon kez çalıştırmak için döngü için kullanıyorum:

# 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"] 
} 

Bunların hepsi iyi çalışır. Ancak, analizimi hızlandırmak isterim. Bu nedenle çok çekirdekli, DoMC ve foreach paketlerini denedim.

Soruma göre, birisi bu kodu foreach şemasını kullanarak uyarlamama yardımcı olabilir mi?

Komutu, görünüşte 16 çekirdeği olan bir Linux sunucusunda çalıştırıyorum. Foreach paketi ile denemeyi denedim ve bunu kullanarak sonuçları karşılaştırmalı olarak kötü oldu, yani foreach kullanarak analizi çalıştırmak için uzun alır. gösterildiği gibi

Örneğin, ben lineer model nesneleri tasarrufu denedim:

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

Bu döngü sadece normal kullanma gibi iki kat uzun daha fazla sürer. Bunu daha iyi ya da daha hızlı nasıl yapacağınıza dair herhangi bir tavsiye memnuniyetle karşılanacaktır! Lapa'nın paralel versiyonunu kullanmanın bir seçenek olabileceğini, ancak bunu nasıl yapacağımı bilmediğimi anlıyorum.

Tüm iyi,

Alex

+0

R 2.14'e güncelleyin ve 'parallel' paketini kullanın. Ve biz de bizler üzerinde çalışırken, bize yeniden üretilebilecek bir örnek vererek, kesinlikle yardımcı olacaktır. [Bu soru] bölümüne bakın (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

Joris, tavsiye için teşekkürler. Http://www.biomedcentral.com/content/pdf/1471-2105-9-390.pdf adresinde 'parallel' dokümantasyonunu buldum ve şimdi okuyacağım. – Alexander

+0

Paket 'kar yağışı 'masanın dışında mı (bana vurma, Dirk)? –

cevap

7

sana bir başlangıç ​​vermek için: Linux kullanıyorsanız, parallel paketin içinde yer alan multicore yaklaşımı yapabilirsiniz. Örneğin, foreach paketini kullanırken her şeyi ayarlamanız gerektiğinde, bu yaklaşımla artık gerekli değildir. İşte

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 

Eğer istenilen miktarda bir vektör döndüren bir işlev yapmak ve bunun üzerinde indeksleri geçerlidir: Kodunuz basitçe yaparak 16 çekirdek üzerinde çalışan olacaktır. Bunu kontrol edemedim, çünkü veriye erişimim yok, ama işe yaramalı.

+0

Joris, yardımın için teşekkürler! Çözümü uyguladım ve görünüşte işe yaradı. Daha önce 12 saatten fazla süren bir iş yaptım ve 15 dakika içinde fırından çıktı!Şimdi sadece üç ay önce size bu soruyu sormamı diliyorum! – Alexander