Búsqueda sistemática pubmed con R


Métodos

Utilizamos los paquetes RISmed y easyPubMed dispuestos en el CRAN de R, para realizar las consultas a las bases de datos indexadas a través de términos de consulta. A su vez, con el paquete rcrossref se extrajo la cantidad de citaciones de los articulos.

Los paquetes RISmed y easyPubMed se diferencian en la velocidad de conexión a las bases de datos, y el os objetos que crean al final. Adicionalmente, son excluyentes en algunos resultados de consulta como el país y el lenguaje del artículo.

El ejemplo a continuación se centra en la búsqueda del método PET-CT para Cáncer en humanos en el año 2015. Para agilizar la construcción de las bases de datos y consultas, se usaron paqutes y funciones de computación en paralelo.

Búsqueda

Para realizar las búsquedas es necesario contar con conexión a internet. Se establece los términos de búsqueda y se consultan los Query’s adicionales para complementar los mismo, finalmente se hace el proceso de extracción de la información con easyPubMed::articles_to_list y/o RISmed::EUtilsGet.

Es posible poner límite al número de artículos a consultar con la opción retmax, para este caso se extrajo el total consultado, es decir, 3081 publicaciones.

Construcción de las bases de datos

# función para extraer el número de citaciones por DOI en rcrossref sin errores
Ncitation <- function(doi){
  if(nchar(doi)==0){
    cit <- data.frame(doi=doi,count=NA)
  }else{
    cit <- cr_citation_count(doi,async = T)
  }
  names(cit) <- c("doi","Num_Citation")
  return(cit)
}

# Base de datos con la información adicional dada por RISmed
pubmed_data <- data.frame(pmid=PMID(records),
                          Language = Language(records),
                          country=Country(records),stringsAsFactors = F)

# Proceso de paralelización para construir la base de datos final
cl <- makeCluster(8) #de acuerdo al número de núcleos que cuente el PC
registerDoParallel(cl)

fullDF <- tryCatch(
  {foreach(x=all_xml, 
           .packages = 'easyPubMed',
           .combine = rbind) %dopar% article_to_df(
             pubmedArticle = x,
             autofill = T, #Llena todos los campos
             max_chars = -1, #Extrae el abstract completo
             getKeywords = T,
             getAuthors = T)},
  error = function(e) {NULL}, #si encuentra un error no se para el código
  finally = {stopCluster(cl)}) #parar los núcleos

# Extraer información del número de citaciones del DOI
cit <- do.call("rbind",lapply(unique(FinalDF$doi),Ncitation))

# Extraer tipo de publicación
tyPub <- data.frame(pmid=records@PMID,
                    PubType=sapply(records@PublicationType,
                                   function(x) paste(x,collapse = " ")),
                    stringsAsFactors = F)

# Unir las dos bases de datos según PMID
FinalDF <- left_join(x = fullDF,y = pubmed_data,"pmid")

# Base de datos final
FinalDF <- left_join(x = FinalDF,y = cit,"doi")
FinalDF <- left_join(x = FinalDF,y = tyPub,"pmid")

# Terminos Mesh
Mesh <- records@Mesh
names(Mesh) <- records@PMID

# remover memoria para ganar velocidad
rm(my_abstracts_xml,all_xml)
rm(cit,fullDF,pubmed_data)

# Resultados únicos reduciendo texto en título, abstract y keywords
FinalDF %>% mutate(abstract=substr(abstract,1,40),
                   title=substr(title,1,20),
                   keywords=substr(keywords,1,20)) %>%
  distinct(pmid,.keep_all = T) %>% DT::datatable()

Exploración de la base de datos

Word cloud

Extraer abstracts que contengan la frase “Clinical Trial”

Extract abstracts containing the phrase ‘Cohort’

Modelamiento de tópicos (cluster para abstracts)