Sto utilizzando R per analizzare i dati di studio dell'associazione a livello dell'intero genoma. Ho circa 500.000 variabili predittive potenziali (polimorfismi a singolo nucleotide o SNP) e voglio testare l'associazione tra ciascuna di esse e un risultato continuo (in questo caso la concentrazione di lipoproteine a bassa densità nel sangue).Utilizzo di multicore in R per analizzare i dati GWAS
Ho già scritto uno script che lo fa senza problemi. Per spiegare brevemente, ho un oggetto dati, chiamato "Dati". Ogni riga corrisponde a un particolare paziente nello studio. Ci sono colonne per età, sesso, indice di massa corporea (BMI) e concentrazione di LDL nel sangue. Ci sono anche mezzo milione di altre colonne con i dati SNP.
Attualmente sto usando un ciclo for per eseguire il modello lineare mezzo milione di volte, come mostrato:
# 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"]
}
Tutto questo funziona benissimo. Tuttavia, mi piacerebbe davvero accelerare la mia analisi. Ho quindi sperimentato i pacchetti multicore, DoMC e foreach.
La mia domanda è: qualcuno potrebbe aiutarmi ad adattare questo codice utilizzando lo schema foreach?
Sto eseguendo lo script su un server Linux che apparentemente dispone di 16 core disponibili. Ho provato a sperimentare con il pacchetto foreach e i risultati che ne ho ricavato sono stati comparativamente peggiori, il che significa che è necessario più lungo per eseguire l'analisi utilizzando foreach.
Per esempio, ho provato salvare gli oggetti modello lineare come mostrato:
library(doMC)
registerDoMC()
results <- foreach(i=1:500000) %dopar% { lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) }
questo richiede più di due volte più a lungo utilizzando solo un normale ciclo for. Qualunque consiglio su come farlo meglio o più rapidamente sarebbe apprezzato! Capisco che l'uso della versione parallela di lapply potrebbe essere un'opzione, ma non so come fare neanche questo.
Tutto il meglio,
Alex
Aggiornamento a R 2.14 e uso del pacchetto 'parallelo'. E mentre ci siamo, fornendoci un esempio riproducibile con cui lavorare, sarà sicuramente d'aiuto. Vedi [questa domanda] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –
Joris, grazie per il consiglio. Ho trovato la documentazione per 'parallelo' a http://www.biomedcentral.com/content/pdf/1471-2105-9-390.pdf e lo leggerò ora. – Alexander
Il pacchetto 'snowfall' è fuori dal tavolo (non colpirmi, Dirk)? –