Introdução ao R - Módulo V

Autor: Pablo Fonseca

04 de Junho de 2018

Pacotes utilizando o R

Provavelmente, uma das grandes vantagens do R é a gigantesca variedade de pacotes que podem ser instalados. Esses pacotes pode executar uma infinidade de funções complementares, sendo muito úteis em diversos processos. Atualmente, mais de 10.000 pacotes já foram criados e disponilizados no repositório oficial do R (CRAN).

Porém, antes de inciarmos o trabalho com pacotes no R, precisamos fazer algumas denifições:

  1. O que é um pacote no R?

Um pacote é uma forma de organizar um conjunto de funções criadas para a execução de uma determinada tarefa. Essas funções podem desenvolver tarefas novas ou potencializar a atividade de funções já presentes de maneira nativa no R. Essas função são executadas por meio de códigos (scripts). É importante ressaltar que os pacotes podem ser compostos por códigos que utilizam outras linguagem além da linguagem R (python, pearl, C++, etc.). Além do “esqueleto” do pacote, que é composto pelo cógido, existem outros elementos que são fundamentais em um pacote. A documentação do pacote também faz parte do mesmo e estará presente em praticamente todos os pacotes disponíveis no r. A documentação é uma parte muito importante, uma vez que é a responsável por descrever o funcionamento do pacote, descrever como as funções devem ser executadas, os input files, etc. A documentação de um pacote pode ser acessada de diversas maneiras. Você pode acessar a página do pacote no repositório oficial do R (o CRAN) ou acessá-la diretamente pelo terminal. Os comandos que permitem acessar a documentação de um pacote pelo terminal são: packageDescription(“pacote”) e help(package = “pacote”). Nesses comandos, a palavra “pacote” deve ser substituída pelo nome do pacote que desejamos obter informações. Além disso, o pacote também pode conter exemplos de input files e de comando, demonstrando o funcionamento das diversas funções, assim como base de dados inclusas para algumas análises. Como dito anteriormente nesse curso, os pacotes no R estão disponíveis em repositórios online.

  1. O que são repositórios?

Um repositório é um local na internet onde são armazenadas informações disponíveis para download e consulta. No caso do R, temos alguns repositórios para encontrar, baixar e instalar pacotes. O repositório oficial do R é o CRAN (https://cran.r-project.org/). O CRAN é um respositório mantido pela R foundation. Os pacotes disponibilizados no CRAN precisam passar por uma série de testes e serem aprovados pela comunidade avaliadora. Portanto, tratando-se de pacotes que passaram por uma curadoria. Além disso, existem doi repositórios não oficiais, mas muito conhecidos e utilizados: Bioconductor (https://www.bioconductor.org/) e Github (https://github.com/). Assim como o CRAN, o Bioconductor possui suas próprias regras para aceite e piblicação de pacotes. O Bioconductor recebe um grupo de pacotes que são especializados para análises voltadas para o campo das ciências biológicas, médicas, da natureza, dentre outras. Muitos pacotes que desempenhas funções extremamente úteis, como por exemplo, análise de expressão diferencial, anotação de sequências nucleotídicas, análises de enriquecimento, etc. A comunidade que mantém o Bioconducor é bastante ativa e realzia diversos encontros todos os anos para discutir sobre a manutenção e melhorias do repositório. O Github é o repositório mais conhecido para os chamaod projetos “open source”. Este tipo de projeto é destinado par aser compartilhado com a comunidade interessada, que pode sugerir melhorias e colaborar com os projetos. Entretando, é necessário se ter cuidado na utilização de pacotes presentes somente no Github, umas vez que não há processo de revisão dos pacotes para publicação no github.

Instalando pacotes utilizando o R
  1. Instalando pacotes utilizando o R Studio

A figura 1 apresenta a forma de instalar pacotes no R por meio da interface gráfica. Na janela presente no canto inferior direito do R Studio, existe uma aba chamada “Packages”. Clicando nessa aba, são apresentadas algumas funcionalidades. Logo abaixo existem os botões “Install” e “Update”. Esses botões podem ser clicados para instalar ou atulizar pacotes no R, respectivamente. Logo abaixo, em “System Library”, é possível notar todos os pacotes já instalados no R. Selecionando as caixas de eleção ao lado dos pacotes, os mesmos serão carregados para esse seção do R. Mais tarde falaremos um pouco mais sobre carregamento de pacotes. Clicando em updates, você poderá selecionar os pacotes que deseja atualizar. Nesse momento iremos focar no processo de instalação. Uma vez que o botão “Install” é clicado, uma nova janela é aberta. Nessa janela, podemos notar que existem algumas opções: “Install from”, “Packages…”, “Install to library” e “Install dependencies”. Na opção “Install from” você consegue selecionar o repositorio no qual você deseja fazer a busca do pacote. Na opção “Package…”, você deve digitar o nome do pacote a ser instalado. Note que os nomes dos pacotes também são diferenciados pela presença de letras maiúsculas ou minúsculas, portanto, preste atenção. No exemplo presente na figura 1, o pacote “psych” está sendo instalado. A opção “Install dependencies” geralmente deve ser marcada. Ela é responsável por autorizar que o R instale outros pacotes ou bibliotecas necessárias para que o pacote em instalação funcione corretamente. Após o preenchimento correto destas opções e clicar em install, uma serie de informações erão printadas no terminal, até o fim do processo de instalação, onde uma mensagem informando que o pacote foi instalado de maneira correta será informada.


Figura 1: Instalação de pacotes por meio da aba “packages” do R Studio.

  1. Instalando pacotes utilizando o terminal

Além da opção de instalar pacotes por meio da interfáce gráfca, é possível intalar pacotes através do terminal. Para pacotes que estão depositados no CRAN, isso pode ser feito por meio do comando “install.packages()”. Esse pacote recebe como argumento o nome do pacote a ser instalado. Por exemplo, para a instalação do pacote psych, podemos executar o seguinte comando: install.packages(“psych”). Esse comando irá executar as mesmas etapas de instalação que foram feitas no comando anterior.

No caso da instalação de pacotes oriundos do repositório Bioconductor, a instalação é um pouco diferente. Como o Bioconductor não é um repositório oficial, devemos informar a url do repositório para o comando “source()”. Esse comando irá determianr que a url informada será a fonte para a busca dos repositórios. Além disso, o Bioconductor possui seu próprio comando de instalação de pacotes, o “biocLite()”. Assim como para o “install.packages()”, devemos informar o nome do pacote desejado. Abaixo, vamos instalar o pacote GenomicFeatures, à partir do Bioconductor. Esse é um pacote utilziado para anotação de transcritos. Uma descrição um pouco mais detalhada pode ser encontrada abaixo, ou aqui: https://bioconductor.org/packages/release/bioc/html/GenomicFeatures.html

A set of tools and methods for making and manipulating transcript centric annotations. With these tools the user can easily download the genomic locations of the transcripts, exons and cds of a given organism, from either the UCSC Genome Browser or a BioMart database (more sources will be supported in the future). This information is then stored in a local database that keeps track of the relationship between transcripts, exons, cds and genes. Flexible methods are provided for extracting the desired features in a convenient format.

#Informando a fonte
source("https://bioconductor.org/biocLite.R")
## Bioconductor version 3.6 (BiocInstaller 1.28.0), ?biocLite for help
## A new version of Bioconductor is available after installing the most
##   recent version of R; see http://bioconductor.org/install
#Instalando GenomicFeatures
biocLite("GenomicFeatures")
## BioC_mirror: https://bioconductor.org
## Using Bioconductor 3.6 (BiocInstaller 1.28.0), R 3.4.3 (2017-11-30).
## Installing package(s) 'GenomicFeatures'
## package 'GenomicFeatures' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\pablo\AppData\Local\Temp\RtmpywZ2Y2\downloaded_packages
## installation path not writeable, unable to update packages: cluster,
##   foreign, MASS, Matrix, mgcv, nlme, rpart, survival
## Old packages: 'stringi'

Toda essa grande sequência de outputs apresentado acima é referente ao processo de instalação do pacote GenomicFeatures e das dependências necessárias para o mesmo.

Carregando pacotes utilizando o R

Agora que já aprendemos a instalar pacotes no R, precisamos aprender a carregá-los para o ambiente. Toda vez que uma nova seção do R é iniciada, é necessário carregar os pacotes, o que é um processo muito rápido. Isso é uma estratégia para que o início das seções seja mais rápido e não consuma tanta memória, com o carregamento de pacotes que não serão utilizados. O carregamento dos pacotes pode ser feito por dois comando: “library()” e “require()”. Ambos os comandos funcionam da mesma maneira. A diferença entre essas funções é que a função “require()” apresenta algumas mensagens de aviso e erros no momento do carregamento do pacote, o que pode ser útil em alguns casos. Além disso, se inserirmos o output de “require()” em um objeto, esse objeto irá receber um valor lógico (TRUE ou FALSE), dependendo do carregamento ou não do pacote. Isso pode ser muito útil no momento de criar scripts que demandam o carregamento de vários pacote, de modo a serem criados diferentes pontos de controle no script.

Abaixo, vamos carregar o pacote psych utilizando ambos os comandos:

#Carregando o pacote com o comando library
library(psych)
## Error in library(psych): there is no package called 'psych'
#Carregando o pacote com o comando require
require(psych)
## Loading required package: psych
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'psych'

Uma vez carregados, todas as funções relativas a esse pacote estão disponíveis e poderão ser executadas por meio do sistema.

Caso você deseje “descarregar” o pacote carregado da sua seção, você pode utilizar o comando “deattach()”. No caso do carregamento do pacote psych, podemos “descarregá-lo” utilizando o comando a seguir:

#Descarregando o pacote psych
detach("package:psych", unload=TRUE)
## Error in detach("package:psych", unload = TRUE): invalid 'name' argument
Verificando pacotes utilizando o R

Um outro conjunto de funções que envolvem o manuseio de pacotes no R é constituido pelas funções: remove.packages(), remove.packages() e update.packages(). Essas funções recbem como argumentos o nome dos pacotes aos quais desejamos aplicar cada um das funções executada por elas. A função reove.packges() é capaz de remover da sua instalação do R um pacote que você instalou anteriormente. Já a função old.packages(), na verdade não necessita receber argumento algum. Ela pode ser executada sem argumento e irá retornar um conjunto de pacotes que possuem novas versões e podem ser atualizados. Aí entra a função update.packages(). essa função recebe como argumento, o nome dos pacotes que você deseja atualziar para a versão mais nova disponível.

Esse é conjunto de funções muito úteis no R, para uma manutenção de sua biblioteca de pacotes. É sempre ficar informado sobre as atulizações dos pacotes que você utilzia constantemente.

Alguns pacotes úteis

Existe uma série de pacotes com funções muito úteis no R. além disso, de maneira lógica, a utilizade de cada pacote está diretamente relacionada â sua demanda de trabalho. Abaixo, serão apresentados alguns pacotes que executam funções bem interessantes.

psych

A proposta principal desse pacote é disponibilizar um grupo de funções para a análise de personalidade, psicometria teórica e psicologia experimental. A grande maioria dessas funções são baseadas em análises de estatísticas multivariadas. Uma das principais funções desse pacote é a função “principal()”. Com essa função, conseguimos decompor nossos dados em diferentes números de componentes. Com isso conseguimos criar medidas dos nossos valores que compõem a base de dados, agrupando valores variáveis que sejam correlacionadas. Além disso, o output da função “principal()” pode ser utilizado para criar uma imagem que represente a relação entre as variáveis e as componentes criadas. Essa imagem pode ser criada por meio da função “fa.diagram()”. Abaixo iremos utilizar um conjunto de dados que é disponibilizado como exemplo pelo pacote para demonstrar o funcionamento da função. Note que aqui não iremos discutir a interpretação do output ou a adequação do número de componentes geradas.

#Carregando o pacote psych
library(psych)
## Error in library(psych): there is no package called 'psych'
#Alocando os dados presentes na base de dados de exemplo em 4 componentes (nfactors=4)
pc <- principal(Harman74.cor$cov,nfactors=4,rotate="varimax")
## Error in principal(Harman74.cor$cov, nfactors = 4, rotate = "varimax"): não foi possível encontrar a função "principal"
#Observando o output da função
pc
## Error in eval(expr, envir, enclos): objeto 'pc' não encontrado
#Plotando o diagrama do número de componentes e a relação entre as variáveis
fa.diagram(pc)
## Error in fa.diagram(pc): não foi possível encontrar a função "fa.diagram"

Note que o output apresenta uma série de metricas que informam a adequação da variável em cada uma das componentes. Por fim, repare no diagrama gerado pela função “fa.diagram()”. Esse diagrama apresenta a relação entre cada medida presente na base de dados com cada um das componentes estimadas. Além disso, nas linhas que conectam as características com as componentes, existe o valor de correlação entre as variáveis e a componente criada.

Existem uma inifinidade de função no pacote psych. Elas são muito úteis para uma série de análises envolvendo estatística multivariada. Portanto, caso seja do seu interesse, visite o manual da função psych.

ggplot2

O ggplot2 é um dos pacotes para a criação de gráficos mais famosos no R. Com ele podemos estilizar os gráficos de maneira extremamente eficiente e bonita. Além disso, o ggplot2 possui uma série de argumentos e funções que permitem executar funções que a função “plot()” não é capaz. Abaixo, iremos criar um conjunto de dados que simule duas condições contendo valores em diferentes distribuições normais. em seguida iremos criar um gráfio de pontos, contendo uma linha de tendência entre as variáveis (como fizemos na aula anterior). Porém, além disso, iremos adicionar uma marca contendo um intervalo de confiança de 95% em torno da linha de tendência.

#Carregando o pacote
library(ggplot2)
## Error in library(ggplot2): there is no package called 'ggplot2'
#Criado a base de dados simulada
data=data.frame(cond = rep(c("condition_1", "condition_2"), each=10), my_x = 1:100 + rnorm(100,sd=9), my_y = 1:100 + rnorm(100,sd=16) )

#Plotando o gráfico de barras com a linha de tendência e o intervalo de confiança de 95%
ggplot(data, aes(x=my_x, y=my_y)) +    geom_point(shape=1) +  geom_smooth(method=lm , color="red", se=TRUE)  # Add linear regression line 
## Error in ggplot(data, aes(x = my_x, y = my_y)): não foi possível encontrar a função "ggplot"

O pacote ggplot2 possui uma série de funções e argumentos que são específicos par aseu funcionamento. É possível, e inclusive já existem, criar cursos somente para ensinar a utilização de diversas funções no pacote ggplot2. Os gráficos ganham bastante em qualidade coma utilização deste pacote. Portanto, com certeza visitar o manual deste pacote e tentar executar alguns comandos nele presentes é algo que compensa muito.

plyr

O pacote plyr foi criado com o intuito de facilitar o manuseio de dados de modo a realizar operações ou funções para diferentes su-grupos de dados presentes em uma base de dados. Por exemplo, ajustar um modelo para cada local de espaço ou ponto de tempo em seu estudo, resumir dados por painéis ou colapsar grupos de dados com estruturas complexas para a execução de uma estatística de descritiva mais simples.

Para exemplificar como o pacote plyr pode tornar uma tarefa inicialmene complexa em um comando relativamente simples, utilizaremos o conjunto de dados mpg disponível no pacote ggplot2. Esse conjunto de dados, assim como o mtcars, apresenta informações osbre potencial, consumo e desempenho de diferentes carros. No comando abaixo, iremos realizar uma ANOVA para comparar se existe diferença entre as médias do número de cilindros para cada tipo de fabricante de carro. Contudo, essa ANOVA deve ser feita para cada um dos sub-conjuntos de carros baseado no tipo de tração. Existem nessa base de dados 3 tipos de tração diferente. Caso desejassemos fazer da maneira convencional, deveríamos dividir essa base de dados em 3 bases novas e executar a ANOVA comparando a média do número de cilíndros por fabricante. Contudo, com a função “dlplyr()”, do pacote plyr, conseguimos fazer isso em um único comando.

#Carregando os pacotes necessários

#ggplot2 para ter acesso à base de dados mpg
library(ggplot2)
## Error in library(ggplot2): there is no package called 'ggplot2'
#Carregando mpg para o sistema
data(mpg)
## Warning in data(mpg): data set 'mpg' not found
#Verificando a estrutura de mpg
str(mpg)
## Error in str(mpg): objeto 'mpg' não encontrado
#Simplificando a base de dados para ter somente as colunas necessárias
data <- mpg[,c(1,7:9)]
## Error in eval(expr, envir, enclos): objeto 'mpg' não encontrado
str(data)
## 'data.frame':    100 obs. of  3 variables:
##  $ cond: Factor w/ 2 levels "condition_1",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ my_x: num  1.13 8.99 -3.13 4.6 -9.36 ...
##  $ my_y: num  -17.03 23.14 6.13 -16.68 6.97 ...
#Criando uma função para executar a ANOVA baseado em uma base de dados
model <- function(data) { aov(cty~manufacturer, data=data) }

#Executando a ANOVA para cada um dos tipos de tração contidos na coluna drv
anova.output <- dlply(data, .(drv), model)
## Error in dlply(data, .(drv), model): não foi possível encontrar a função "dlply"
#Verificando o output de anova.output
anova.output
## Error in eval(expr, envir, enclos): objeto 'anova.output' não encontrado
#Criando uma função para se obter os valores de P
ldply(anova.output, function(x) { c(summary(x)[[1]][["F value"]][[1]], summary(x)[[1]][["Pr(>F)"]][[1]]) })
## Error in ldply(anova.output, function(x) {: não foi possível encontrar a função "ldply"

Um detalhe da função “dlplyr()”, é que ela só aceita outras funções como ação a ser aplicada ao dado. Por isso, não podemos informar a fórmula da ANOVA como último argumento da função. Por isso, uma função foi cirada armazenando a fóruma da ANOVA e essa função foi informada como argumento de “dlplyr()”. Note que no objeto anova.outpt não possuimos os valores de P, nele obtemos os valores que podem ser utilizados para se obter os valores de P, utilizando a função “summary()”, como já mostrado anteriormente. Note também que os resultados estão armazenados em uma lista. Existe uma função no pacote plyr que é especialmente designada para trabalhar com o manuseio de listas, a função “ldplyr()”. Essa função aplica uma ação em cada um dos elementos da lista. No último comando apresentado acima, estamos extraindo os valores da estatística F (F value) e os valores de P (Pr(>F)), para cada um dos outputs gerados através da analise de dada elemento da lista anova.output, pelo comando “summary()”.

Com o conjunto de análises descritos acima, conseguimos em poucas linahs de código realizar um grupo de ações que demoraria bastante tempo caso fosse feita manualmente.

Considerações finais

Com essa aula chegamos ao fim do nosso curso de introdução ao R. Nesse curso foram apresentados uma série de conceitos para a criação de uma base sólida para o trabalho com bases de dados utilizando o ambiente R. É importante ressaltar que mesmo trabalhando com conceitos básicos e visando a formação de uma base, nao é possível abordar todos os tópicos envolvendo os conhecimentos básicos do R. O R é uma ferramenta incrível e com uma diversidade de aplicações mais mais impressionante. Com esse curso, esperamos que você crie familiaridade com o ambiente e tenha as ferramentas e conhecimentos necessários para a busca de mais informações e a identificação de seus problemas. No R, dificilmente alguém conhece todas as soluções para todos os problemas. Contudo, um dos pontos mais importante é saber identificar qual é o seu problema e qual é a sua necessidade. Portanto, como conclusão final desse curso, acredito que não haja síntese melhor do que a seguir:

“A única maneira de se descobrir o que aconteceu quando um sistema complexo é pertubado, é perturbar o sistema, não meramente observar passivamente”

Fred Mosteller e John Tukey, parafraseando George Box

Portanto, ao encontrar um problema, um erro ou uma dúvida, utilize o conhecimento aqui adiquirido e aproveite a situação como uma forma de treinamento, não como um motivo de desespero!

MUITO OBRIGADO A TODOS