Uma das grandes vantagens de se utilizar o R é a capacidade que o mesmo possui de produzir gráficos e figuras de maneira extremamente eficiente e representativa. Nesse módulo, iremos apresentar os conceitos básicos que envolvem a criação e edição de gráficos no R. além disso, iremos abordar alguns tipos específicos de gráficos que são constantemente utilizados em rotinas de pesquisa, como por exemplo, Gráfico de barras, Box-plots, Histogramas, Gráfico de pizza e Heatmap.
Nessa aula, iremos utilizar a base de dados apresentada na aula anterior para criarmos a maior parte dos exemplos mostrados. A base de dados é nomeada “Modulo4_DataBase_CrohnD.txt” e está disponível na pasta do Dropbox do curso.
Contudo, para iniciarmos, iremos trabalhar com um conjunto de dados mais simples. Com isso, poderemos focar nos argumentos principais utilizados na função mais básica para a criação de gráficos (plots) utilizando o R: a função plot().
Iremos criar dois objetos para introduzirmos a utilização da função plot(). O primeiro objeto será composto por uma sequência de números que inicia em 1 e vai até 10 sendo incrementado de 1 em 1. O segundo objeto será composto por uma sequência de números que inicia em 10 e vai até 100 sendo incrementado de 10 em 10.
#Criando os objetos contendo as sequências de números
objeto1<-seq(from=1, to=10, by=1)
objeto1
## [1] 1 2 3 4 5 6 7 8 9 10
objeto2<-seq(from=10, to=100, by=10)
objeto2
## [1] 10 20 30 40 50 60 70 80 90 100
O primeiro gráfico a ser criado será o mais simples possível, utilizando os argumentos essenciais para o funcionamento da função plot(). Os dois argumentos básicos da função plot são os argumentos “x=” e “y=”. Esses argumentos recebem como input os elementos a serem plotados no eixo-x e eixo-y, respectivamente. No exemplo a seguir, iremos plotar o objeto1 no eixo-x e o objeto2 no eixo-y.
#Plotando objeto1 e objeto2
plot(x=objeto1, y=objeto2)
Note a estrutura básica do gráfico criado. Ele é composto por pontos, os eixos x e y possuem uma sequência pré-determinada para a apresentação dos valores e o nome dos eixos é referente ao nome dos objetos utilizados nos argumentos.
Esse é um gráfico muito simples, apesar de apresentar todos os componentes necessários. Dessa forma, podemos aplicar uma série de melhorias no gráfico. A seguir, iremos trabalhar de uma maneira sequencial, introduzindo novos argumentos que irão realizar edições nos gráficos baseados em 3 grupos: edições envolvendo os eixos, edições envolvendo os caracteres plotados e edições envolvendo a estrutura do plot.
Partindo do plot criado anteriormente, iremos apresentar uma série de argumentos relacionados com a edição dos eixos presentes no gráfico. Com esses comandos iremos alterar algumas características do plot como o nome presente nos eixos, o tamanho da fonte utilizada nos eixos, inserir títulos nos gráficos, alterar o tamanho dos números apresentados nos eixos, o intervalos plotados nos eixos, etc.
Abaixo iremos alterar o nome dos eixos x e y e iremos inserir um título para o gráfico, por meio dos argumentos “xlab=”, “ylab=” e “main=”, respectivamente. Além disso, iremos aumentar o tamanho da fonte utilizada no nome dos eixos do plot por meio do argumento “cex.lab=”. Por fim, iremos aumentar a fonte dos números apresentados nos eixos do gráfico por meio do argumento “cex.axis=”.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2)
Note o gráfico gerado pelo comando acima e compare com o primeiro gráfico criado. O nome dos eixos foram alterados em função do nome informado para os argumentos “xlab=” e “ylab=”. Além disso, repare que o tamanho da fonte do título dos eixos e dos números contidos nos eixos foi aumentado. Esse aumento foi relizado por meio dos argumentos “cex.lab=” e “cex.axis=”. É importante ressaltar que os valores informados para esses argumentos funcionam de uma maneira referencial. O valor referencial para a plotagem das fontes é 1. Assim, valores maiores que 1 resultam em um aumento proporcional da fonte e valores menores que 1, resultam em uma diminuição proporcional da fonte. Por fim, note que um título foi inserido no gráfico, referente ao nome informado à função “main=”.
DICA: Procure alterar o nome dos eixos e o tamanho das fontes com valores à sua escolha.
Além das alterações realizadas acima, ainda podemos fazer algumas modificações referentes aos eixos. A seguir, vamos inserir mais alguns argumentos no comando utilizado previamente para gerar o gráfico. Nesse novo comando, além das modificações anteriores, iremos alterar os valores minímos e máximos presentes nas escalas dos eixos x e y por meio dos argumentos “xlim=” e “ylim=”, respectivamente.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,20), ylim=c(0,150))
Note que no gráfico apresentado os eixos tiveram seus intervalos de valores alterados. Agora, o eixo-y apresenta valores de 0 até 150 e o eixo-x apresenta valores de 0 a 20. Contudo, é importante notar que os valores presentes nos argumentos “x=” e “y=” não foram alterados. Portando a distribuição dos pontos dentro do gráfico não foi alterada. A utilização dos argumentos “xlim=” e “ylim=” deve ser feita de maneira bem precisa, de modo a não afetar as proporções dos dados (como aconteceu no gráfico gerado no comando anterior). Para os próximos gráficos iremos utilizar como valores mínimos e máximos para os eixos y e x c(0,100) e c(0,10), respectivamente.
A seguir iremos adicionar alguns argumentos que alteram as características dos caracteres plotados no gráfico.
O primeiro argumentos que iremos utilizar é o argumento “type=”. Esse argumento quando especificado dentro da função plot(), permite a seleção do tipo de caracter plotado. Por exemplo, caso seja necessário plotar os dados em linha ao invés de pontos, podemos informar a esse argumento o valor “l”. Pontos são os caracteres padrão da função plot, o valor que representa pontos para o argmento “type=” é “p”. No caso de ser necessário plotar pontos e linhas, podemos utilizar o valor “b”.
Mais informações sobre os valores aceitos pelo argumento “type=” podem ser encontrados utilizando o comando ?plot().
A seguir vamor transformar o nosso gráfico em um gráfico contando linhas e pontos.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b")
Note que pela simples adição do argumento “type=”b“”, mudamos a forma como os dados foram apresentados. Tente mudar a apresentação dos dados por meio de outros valores informados para o argumento “type=”.
Uma outra forma de alteração dos caracteres apresentados é por meio do argumento “pch=”. Esse argumento representa qual o caracter que será plotado no gráfico. Nos comandos anteriores fomos capazes de notar que o caracter padrão é um círculo sem preenchimento. Contudo, como apresentado na figura 1, vários caracteres podem ser utilizados na criação de gráficos no R. Esses caracteres recebem valores específicos que deverão ser informados para o argumento “pch=”.
Figura 1: Codificação para diferentes tipos de caracteres a serem plotados no R.Note que na figura as cores vermelho e amarelo foram escolhidas para apresentas os caracteres. Contudo, o padrão de apresentação no R é a cor preta.
Abaixo, iremos editar o gráfico anterior de maneira a apresentarmos um gráfico contendo linhas e triângulos preenchidos (pch=17) como caracteres representando os dados.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17)
Tente criar gráficos com diferentes tipos de pch.
Um outro conjunto de alterações envolvendo os caracteres presentes nos plots é a alteração do tamanho dos caracteres e sua cor. Essas alterações são feitas por meio dos argumentos “cex=” e “col=”, respectivamente. Abaixo iremos dobrar o tamanho dos caracteres (cex=2) e alterarmos a cor para vermelho (col=“red”).
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red")
Note como o tamanho dos critérios cresceu de maneira proporcional ao valor de referência (cex=1). Além disso, agora os caracteres são vermelhos.
Existe uma infinidade de cores possíveis de serem selecionadas no R. Para um melhor detalhamento das opções de cores no R, acesse o link a seguir para visualizar a palheta de cores disponível no R, assim como os nomes que devem ser informados ao argumento “col=” para obter essas cores: http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf
Esse terceiro grupo de alterações irá ser referente a alterações que podemos fazer na composição do plot. Seja na presença de margem em torno do plot, na sequência númerica contida nos eixos ou em parâmetros gráficos da janela do plot.
A primeira alteração que iremos abordar é a remoção da linha que compõem a margem em torno do plot. Essa é uma modificação puramente estética. Contudo, essa é uma das vantagens do R, você consegue editar praticamente todos os critérios estéticos do seus gráficos. Essa remoção das margens pode ser feito por meio do argumento “bty=. Para removermos as margens, devemos informar a esse argumento o valor”n“.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n")
Em alguns casos, a eliminação das margens auxiliam na visualização dos dados. Contudo, como dito anteriormente trata-se mais deum critério estético e de preferencial pessoal.
Uma outro alteração na estrutura do dos plots é a alteração do padrão de incremento dos eixos x e y. Baseado na distribuição dos valores utilizados, o R seleciona uma escala de incremento para os eixos. No caso do exemplo que estamos utilizando, o eixo-y foi incrementado de 20 em 20 e o eixo-x de 2 em 2. Em alguns casos, para facilitar a interpretação do dados, podemos querer alterar esse padrão. Isso é possível por meio da utilização de uma outra função, complementar à função plot. Essa é a função axis(). Com essa função somos capazes de informar vários argumentos que irão guiar o padrão de preenchimento dos eixos do gráfico. Contudo, antes de criarmos novos eixos, precisamos desabilitar os eixos criados automaticamente pela função plot(). Essa desabilitação dos eixos é feito pelo argumento “axes=”. Para removermos os eixos padrão da função plot(), precisamos informar o valor lógico “FALSE” para o argumento “axes=”.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n", axes=F)
Note que no ouput acima os eixos foram desabilitados. Dessa forma, somos capazes de criarmos novos eixos, seguindo o padrão desejados por nós, para o gráfico.
Uma vez retirados os eixos, a função axis() pode ser utilizada logo após a função plot() para criarmos os novos eixos. O funcionamento dessa função é bem simples. Os argumentos básicos a serem informados para a função axis() são: “side=”, “at=” e “labels=”. Esses argumentos determinam qual eixo será preenchido, qual a posição dos valores no eixo e a sequência de valores a ser preencida, respectivamente. O argumento “side=” recebe valores que vão de 1 a 4: 1= eixo inferior, 2= eixo lateral esquerdo, 3= eixo superior, 4= eixo lateral direito. Ou seja, partindo do eixo inferior (eixo-x), os valores aumentam até 4 seguindo o sentindo horário para os 4 lados do plot. Portanto, como desejamos determinar uma nova sequência para os eixos x e y, devemos executar a função axis() duas vezes, uma informando o valor 1 para o argumento *side=" e uma segunda informando o valor 2 para o argumento “side=”. Assim, iremos criar novas sequências para os eixos x e y, respectivamente.
Abaixo iremos incrementar o eixo x de 1 em 1 e o eixo y de 10 em 10.
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n", axes=F)
#Criando o novo eixo-x contendo valores incrementados de 1 em 1
axis(side=1, at=seq(1,10,1), labels=seq(1,10,1), cex.axis=0.7)
#Criando o novo eixo-y contendo valores incrementados de 10 em 10
axis(side=2, at=seq(10,100,10), labels=seq(10,100,10), cex.axis=0.7)
Notem como agora os eixos estão sendo incrementados nos respectivos padrões selecionados. É importante ressaltar que eu optei por diminuir o tamanho da fonte dos valores nos eixos para que fosse possível notarmos todos os valores nos eixos. Contudo, podemos continuar mantendo uma fonte maior e resolvermos o problema da falta de espaço para que todos os valores apareçam no momento da exportação do gráfico.
A última alteração envolvendo a estrutura da janela do plot que será apresentada está relacionada com o número de plots presentes em uma única janela. No R, existem diversas formas de criar janelas contendo mais de um gráfico. Aqui, iremos iremos utilizar a função mfrow(). Essa função é na verdade um parâmetro gráfico que pode ser informada à função par(). A função par() é responsável por determinar uma série de parâmetros gráficos que serão aplicados a todos os plots criados após a sua utilização. Aqui, iremos focar somente na criação de janelas com mais de um plot. Para isso, devemos informar à função mfrow() o número de linhas e colunas que teremos em nossa janela, onde serão plotados os gráficos.
A seguir, iremos plotar o primeiro gráfico criado nessa aula ao lodo do último gráfico criado. Para isso, devemos informar que teremos uma linha e duas colunas em nossa janela.
#Determinando os parâmetros gráficos
par(mfrow=c(1,2))
#Plotando objeto1 e objeto2 como no primeiro gráfico
plot(x=objeto1, y=objeto2)
#Plotando o segundo gráfico
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n", axes=F)
#Criando o novo eixo-x contendo valores incrementados de 1 em 1
axis(side=1, at=seq(1,10,1), labels=seq(1,10,1), cex.axis=0.7)
#Criando o novo eixo-y contendo valores incrementados de 10 em 10
axis(side=2, at=seq(10,100,10), labels=seq(10,100,10), cex.axis=0.7)
#Resetando os prâmetros gráficos anteriores
dev.off()
## null device
## 1
IMPORTANTE: Note que após determinaros novos parâmetros gráficos e executarmos todos os comandos envolvidos com essas alterações, o comando dev.off() foi utilizado. Esse comando precisa ser executado para que os parâmetros gráficos sejam “resetados” para os valores padrão.
A seguir, iremos apresentar 3 formas de exportar um gráfico criado no ambiente para o seu computador. Para os exemplos a seguir, utilizaremos o último plot criado. Contudo, ao invés de utilizarmos cex.axis=0.7, iremos utilizar cex.axis=2. Nesse caso, iremos apresentar como fazer para que todos os números dos eixos tornem-se visíveis no output.
Na figura 2 são apresentados alguns dos passos para exportar um gráfico criado, por meio da aba Plot. Uma vez que o gráfico foi criado, ele será apresentado na aba plot, na janela inferior direita do R studio. Nessa janela, podemos notar a presença do botão “export”. Clicando nesse botão, nos é apresentado as opções de exportação do gráfico. As opções apresentadas são: “Save as Image…”, “Save as pdf…” e “Copy to clipboard”. A opção “Copy to clipboard” simplesmente realiza um “ctrl+c” da imagem, possibilitando colá-la em outro software, como o Power Point. Aqui, iremos focar nas opções apresentadas para salvar a figura como imagem.
Após a seleção de “Save as Image…”, uma nova janela é aberta. Nessa janela, no canto superior esquerdo, temos a opção de salvar como diferentes formatos de imagem. Nesse exemplo, iremos selecionar o formato “.png”. Após a seleção do formato, logo abaixo existe o botão “Directory”. Clicando nesse botão somos capazes de selecionar em qual diretório desejamos salvar o gráfico. O detalhe é que o diretório de trabalho atual já estará selecionado. Logo abaixo do botão “Directory”, existe a opção “File name”. Nessa opção devemos informar qual o nome que desejamos dar ao arquivo “.png” que será criado.
No canto superior direito estão localizadas as opções que irão nos permitir salvar o gráfico de uma maneira onde todos os números presentes nos eixos sejam visíveis, mesmo aumentado o tamanho da fonte. Essas opção são: “width” e “height”. Essas opções especificam a largura e altura do gráfico a ser salvo, especificamente. No exemplo contido na figura 2, determinamos que o gráfico possuirá 1200 por 1200 pixels. Por fim, clique em “save”, no canto inferior direito para salvar o gráfico com as opções selecionadas. Note que no output presente na pasta do Dropbox, “plot_modulo4_aula2_utilizando_janela.png”, todos números são visíveis.
Figura 2: Passo a passo para exportação do gráfico criado por meio da aba Plot.
Além da utilização da aba Plot para exportar um arquivo no formato “.png”, existe a posibilidade de realizar o mesmo procedimento por meio do terminal. Isso é possível por meio da função “png()”. Essa função deve ser executada anteriormente aos comandos que irão gerar o gráfico. A função “png()” recebe como argumentos básicos “file=”, “height=” e “width=”. O argumento “file=” recebe o nome com que o arquivo será salvo. É importante ressaltar que no nome informado ao argumento “file=”, devemos também adicionar a extensão “.png” ao nome. Os argumentos “width=” e “height=” recebem os valores referentes à largura e altura do arquivo. Além disso, existem outros dois argumentos que podem ser informados: “units=” e “res=”. Esses argumentos alteram a unidade dos valores informados para os argumentos “width=” e “height=” e a resolução da imagem criada, respectivamente. No exemplo abaixo não iremos abordar esses dois argumentos. Contudo, mais informações podem ser encontradas aqui: https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/png.html
#Criando o arquivo .png que irá receber o gráfico
png(file="plot_modulo4_aula2_utilizando_terminal.png", width=1200, height=1200)
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n", axes=F)
#Criando o novo eixo-x contendo valores incrementados de 1 em 1
axis(side=1, at=seq(1,10,1), labels=seq(1,10,1), cex.axis=0.7)
#Criando o novo eixo-y contendo valores incrementados de 10 em 10
axis(side=2, at=seq(10,100,10), labels=seq(10,100,10), cex.axis=0.7)
#Resetando os prâmetros gráficos anteriores
dev.off()
## png
## 2
Note que assim como quando criamos uma janela contendo dois gráficos, a função dev.off() foi executada para “resetar” os parâmetros gráficos. Isso é de extrema importância, uma vez que o gráfico só será realmente salvo no arquivo “.png” se essa função for executada. Repare no arquivo “plot_modulo4_aula2_utilizando_terminal.png” que foi gerado com o comando acima e está presente na pasta do Dropbox. Esse arquivo é exatamente igual ao arquivo criado pela exportação por meio da aba Plot.
VANTAGEM: A vantagem de utilizar a função png(), ou outras semelhantes (bmp(), tiff(), jpeg(), etc.), é que essas funções permitem uma automatização do processo, não dependendo que tenhamos que executar o comando manualmente, assim interrompendo o andamento do script.
Uma outra forma de exportarmos imagens e gráficos criados no ambiente e por meio de arquivos do tipo “.pdf”. Esse procedimento é executado pela função pdf(). Essa função recebe os mesmos argumentos da função png(). Note que assim como na função png(), também devemos informar a extensão ao nome do arquivo. Portanto, no fim do nome selcionado, devemos adicionar a extensão “.pdf”.
#Criando o arquivo .png que irá receber o gráfico
pdf(file="plot_modulo4_aula2_utilizando_terminal.pdf", width=10, height=10)
#Plotando objeto1 e objeto2 e editando alguns critérios dos eixos
plot(x=objeto1, y=objeto2, xlab="Sequência 1 (1 a 10)", ylab="Sequência 2 (10 a 100)", main="Gráfico simples", cex.lab=1.5, cex.axis=2, xlim=c(0,10), ylim=c(0,100), type="b", pch=17, cex=2, col="red", bty="n", axes=F)
#Criando o novo eixo-x contendo valores incrementados de 1 em 1
axis(side=1, at=seq(1,10,1), labels=seq(1,10,1), cex.axis=0.7)
#Criando o novo eixo-y contendo valores incrementados de 10 em 10
axis(side=2, at=seq(10,100,10), labels=seq(10,100,10), cex.axis=0.7)
#Resetando os prâmetros gráficos anteriores
dev.off()
## png
## 2
IMPORTANTE: Note que diferentemente da função png(), a unidade padrão para os valores informados aos argumento “width=” e “height=” é polegadas e não pixels. Por isso utilizamos os valores 10 e 10 para esses argumentos.
Verifique o arquivo “plot_modulo4_aula2_utilizando_terminal.pdf” presente na pasta do Dropbox para visualizar o output dos comandos anteriores.
À partir dos comandos acima, crie novos comandos alterando o nome dos arquivos salvos, os formatos e suas dimensões. Verifique o que é alterado por meio de cada modificação feita por você.
Nos exemplos anteriores, utilizamos dois objetos simples para aprentar os argumentos básicos para edição de plots no R. À partir de agora, iremos utilizar a base de dados “Modulo4_DataBase_CrohnD.txt” para a criação de alguns plots muito úteis em rotinas de pesquisa. Além disso, iremos abordar alguns tópicos de estatística descritiva não abordados na aula antrior devido a necessidade de criação de gráficos para potencializar a interpretação dos resultados.
Primeiramente, iremos inserir a base de dados “Modulo4_DataBase_CrohnD.txt” na variável crohn_data.
#Determinando diretório de trabalho
setwd("E:\\Doutorado\\curso_R\\Aula4")
#Carregando a base de dados para a variável
crohn_data<-read.table("Modulo4_DataBase_CrohnD.txt", h=T, sep="\t")
#Verificando a importação
head(crohn_data)
## ID nrAdvE BMI height country sex age weight treat
## 1 19908 4 25.22 163 c1 F 47 67 placebo
## 2 19909 4 23.80 164 c1 F 53 64 d1
## 3 19910 1 23.05 164 c1 F 68 62 placebo
## 4 20908 1 25.71 165 c1 F 48 70 d2
## 5 20909 2 25.95 170 c1 F 67 75 placebo
## 6 20910 2 28.70 168 c1 F 54 81 d1
A estimativa de correlação entre duas variáveis pode ser algo muito útil para se entender a relação entre as variáveis presentes em uma base de dados. No R, a correlação entre duas variáveis é calculada por meio da função cor.test(). É importante ressaltar que existem outras funções que também realizam testes de correlação. Contudo, a função cor.test() foi escolhida devido ao fato de executar também um teste de siginificância para a correlação. A função cor.test() recebe como argumentos “x=” e “y=”. Esses argumentos recebem os conjuntos de valores em que desejamos testar a correlação. Além disso, podemos selecionar as hipóteses alternativas para o teste por meio do argumento “alternative=” (“two.sided”, “greater”, ou “less”); o metodo para estimar a correlação por meio do argumento “method=” ( “pearson”, “kendall”, ou “spearman”), dentre outros argumentos. Contudo, no exemplo a seguir utilizaremos as definições padrão da função.
A seguir, vamos calcular a correlação entre o índice de massa corporal e altura, presentes nas coluna “BMI” e “heigth” da Data frame crohn_data. O resultado da correlação será inserido na variável “cor.result”.
#Calculando a correlação entre BMI e heigth
cor.result<-cor.test(x=crohn_data$BMI, crohn_data$height)
#Exibindo o resultado de cor.result
cor.result
##
## Pearson's product-moment correlation
##
## data: crohn_data$BMI and crohn_data$height
## t = -1.1928, df = 115, p-value = 0.2354
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.28633347 0.07244009
## sample estimates:
## cor
## -0.1105466
#Verificando a estrutura de cor.result
str(cor.result)
## List of 9
## $ statistic : Named num -1.19
## ..- attr(*, "names")= chr "t"
## $ parameter : Named int 115
## ..- attr(*, "names")= chr "df"
## $ p.value : num 0.235
## $ estimate : Named num -0.111
## ..- attr(*, "names")= chr "cor"
## $ null.value : Named num 0
## ..- attr(*, "names")= chr "correlation"
## $ alternative: chr "two.sided"
## $ method : chr "Pearson's product-moment correlation"
## $ data.name : chr "crohn_data$BMI and crohn_data$height"
## $ conf.int : atomic [1:2] -0.2863 0.0724
## ..- attr(*, "conf.level")= num 0.95
## - attr(*, "class")= chr "htest"
Note que o output da função cor.test() apresenta um valor de p para a significância da correlação, a hipotese alternativa para o teste de significância realizado, o intervalo de confiância e o valor da correlação. Observamos uma pequena correlação negativa (cor=-0.1105466) e não siginificativa (p-value=0.2354) entre as variáveis. Uma forma de representar graficamente essa correlação é por meio da utilização do gráfico de pontos entre as duas variáveis.
#Plotando BMI e heigth
plot(x=crohn_data$BMI, y=crohn_data$heigth, xlab="BMI", ylab="Heigth", cex.lab=1.5, cex.axis=2, pch=16, cex=2, bty="n")
Existem algumas edições que podem ser feitas no gráfico apresentado acima, para que o mesmo fique ainda mais informativo. Podemos adicionar uma “trend line”, indicando a tendência da correlação entre os dados. Além disso, podemos plotar um texto contendo os calores da correlação e o valor de p. Essas informações podem ser adicionadas pelas funções abline() e text().
A função abline() permite que a linha de tendência entre os dados seja plotada. Para isso, devemos informar como argumento principal o resultado de um modelo de regressão linear entre as variáveis. Nesse curso, não iremos entrar em detalhes quanto a interpretação do output de modelos lineares. Porém, para criarmos a linha de tendência, iremos realizar a regressão linear entre “BMI” e “height”, por meio da função lm(). O resultado dessa função será o primeiro argumento para a função abline(). Além disso, também iremos informar a cor e a espessura da linha que iremos plotar por meio dos argumentos “col=” e “lwd=”.
A função text(), recebe como argumentos básicos as posições no eixo-x e eixo-y onde será plotado o texto informado. Essas posições são informadas por meio dos argumentos “x=” e “y=”. Além disso, devemos informar o texto a ser plotado. O texto deve ser informado para o argumento “labels=”. Nesse exemplo, iremos extrair o valor da correlação diretamente da lista contendo os resultados do comando cor.test(), veja o output da função str() para mais detalhes. De modo a combinar textos com os valores extraídos do output armazendado na variável “cor.result”, iremos utilizar a função paste(). A função paste recebe como argumentos combinações de textos e objetos que serão combinados por um padrão que deve ser informado para o argumento “sep=”.
#Plotando BMI e heigth
plot(x=crohn_data$BMI, y=crohn_data$heigth, xlab="BMI", ylab="Heigth", cex.lab=1.5, cex.axis=2, pch=16, cex=2, bty="n")
#Plotando a linha de tendência
abline(lm(crohn_data$BMI~crohn_data$height), col="red", lwd=2)
#Plotando o texto com os valores de correlação e p-value
text(x=20, y=42, labels=paste("cor= ",round(cor.result$estimate,3), "; ", "p-value= ", round(cor.result$p.value,3), sep=""))
Note o gráfico gerado pelos comandos acima. Perceba os novos elementos. Nesse ponto do curso, atingimos um nível de combinação entre funções, estruturas de recuparação de dados em variáveis e programação que já é bastante complexo. Repare que a função round() foi utilizada para tornar os números mais apresentáveis por meio do arredondamento para 3 casas decimais.
DICA: Note que a linha de tendência reflete bem o valor de correlação. A inclinação da linha é bem leve e possuí um coeficiente de inclinação (o sentido do decaimento da curva) negativo. Isso é condizente com o valor de correlação obtido (-0.111).
Adicionalmente às informações que foram inseridas nos comandos anteriores, podemos alterar os caracteres utilizados no plot, em função de alguma das classes de nossa base de dados. Por exemplo, vamos alterar o plot caracter e a cor do gráfico em função do sexo dos participantes. Iremos fazer isso adicionando mais opções aos argumentos “pch=” e “col=”. Porém, deveremos utilizar uma estrutura de conexão entre as opções e as classes de nossa base de dados. Isso será feito com a utilização do “” logo após as opções informadas para cada argumento. Vamos determinar que homens serão representados por triângulos azuis e mulheres por círculos vermelhos. Além disso, um novo comando, que insere um novo parâmetro gráfico será apresentado. Nesse gráfico iremos inserir uma legenda, por meio da função legend(). Essa função deve ser utilizada logo após a criação do gráfico. A função legend() recebe como argumentos “x=” e “y=”, que irão informar as coordenadas para que a legenda seja plotada. Contudo, “x=” e “y=” podem ser substituídos pelas palavras: “topright”, “topleft”, “bottomright” e “bottomleft”. Essas palavras irão determinar que a legenda seja plotada no canto superior esquerdo, canto superior direito, canto inferior esquerdo e canto inferior direito, respectivamente. Além disso, devemos informar as cores e qual caracter desejamos utilizar para representar as cores na legenda. Essas escolhas são feitas por meio dos argumentos já conhecidos: “col=” e “pch=”, respectivamente. Por fim, devemos informar o texto que será adicionado para cada caracter da legenda. Isso é feito por meio do uso do argumento “legend=”. Adicionalmente, existem outros argumentos que podem ser utilizados, como para eliminar as bordas em torno da legenda, adicionar/alterar título, mudar a espessura da bordar em torno da legenda, preenchimento, etc.
#Plotando BMI e heigth
plot(x=crohn_data$BMI, y=crohn_data$heigth, xlab="BMI", ylab="Heigth", cex.lab=1.5, cex.axis=2, pch=c(16,17)[crohn_data$sex], col=c("red","blue")[crohn_data$sex], cex=2, bty="n")
#Plotando a linha de tendência
abline(lm(crohn_data$BMI~crohn_data$height), col="red", lwd=2)
#Plotando o texto com os valores de correlação e p-value
text(x=20, y=42, labels=paste("cor= ",round(cor.result$estimate,3), "; ", "p-value= ", round(cor.result$p.value,3), sep=""))
#Plotando a legenda no gráfico no canto superos direito
legend("topright", pch=c(16,17), col=c("red","blue"), legend=c("Mulheres", "Homens"))
Note como “[crohn_data$sex]” foi utilizado logo após os valores informados aos argumentos “pch=” e “col=”. Essa estrutura permite que seja feita a conexão entre os valroes informados e as classes. Contudo, sempre é necessário voltar ao output da função str(), uma vez que o primeiro valor informado ao argumento, será conectado à primeira classe presente no vetor contendo os grupos. Por exemplo, se avaliarmos o output de str(crohn_data), veremos que a primeira classe da coluna “sex” é “F”, de female. Portanto, a cor “red”, informada para o argumento “col=” será associada às mulheres, assim consequentemente para as outras classes, no mesmo padrão.
DETALHE: Os gráficos de pontos são constatemente chamados de “scatter plots”. Geralmente esses gráficos são utilizados para representar o padrão de relação entre quaisquer duas variáveis.
A normalidade de um dado reflete a distribuição do mesmo. Mais especificamente, se esse dados está dentro de uma distribuição normal. Como o objetivo desse curso não é discutir conteúdo estatístico, mais informações sobre a distribuição normal podem ser encontradas aqui: http://www.portalaction.com.br/probabilidades/62-distribuicao-normal
Contudo, é importante saber que identificar se um dado possui ou não uma distribuição normal é um pressuposto para vários testes estatísticos, como por exemplo, o teste de Bartlett e a ANOVA.
Existe uma série de testes para avaliar se um número está dentro de uma distribuição normal ou não. Aqui, iremos utilizar a função shapiro.test(). Essa função executa o teste de normalidade de Shapiro-Wilk para avaliar se o dado está em uma distribuição normal.Além dos testes, é sempre recomendado que seja feita uma inspeção visual da distribuição do dado. Geralmente, essa insperção é feita por meio de histogramas. Os histogramas são criado no R, por meio da função hist(). Abaixo, iremos comparar dois tipos de dados. Primeiramente iremos simular uma distribuição normal com média 5 e desvio padrão 3, contendo 100 valores por meio da função rnorm(). Além disso, também iremos avaliar a normalidade dos valores contidos em “BMI” na base de dados crohn_data. Em seguida iremos plotar os histogramas de ambos os valores, lado a lado.
#Criando um grupo de valores com distribuição normal, com média igual a 5 e désvio-padrão igua a 3
norm.data<-rnorm(100, mean = 5, sd = 3)
#Avaliando a normalidade do dado norm.data por meio da função shapiro.test
shapiro.test(rnorm(100, mean = 5, sd = 3))
##
## Shapiro-Wilk normality test
##
## data: rnorm(100, mean = 5, sd = 3)
## W = 0.98659, p-value = 0.4107
#Avaliando a normalidade do dado BMI por meio da função shapiro.test
shapiro.test(crohn_data$BMI)
##
## Shapiro-Wilk normality test
##
## data: crohn_data$BMI
## W = 0.92364, p-value = 5.061e-06
#Plotando ambos os histogramas, lado a lado
#Determinando os parâmetros gráficos
par(mfrow=c(1,2))
#Plotando o histograma para norm.data
hist(x=norm.data, ylab="Frequência", xlab="Observações", main="Histograma de norm.data", cex.axis=2, cex.lab=1.5)
#Plotando o histograma para BMI
hist(x=crohn_data$BMI, ylab="Frequência", xlab="Observações", main="Histograma de BMI", cex.axis=2, cex.lab=1.5)
#Resetando parâmetros gráficos
dev.off()
## null device
## 1
Para interpretarmos os resultados do teste de Shapiro-Wilk, precisamos saber que a H0 desse teste considera que o dado possui uma distribuição normal. Portanto, no caso da presença de valores de p que estejam abaixo do valor de alfa pré-determinado (geralmente, p<0.05), rejeitamos H0 e consideramos que os dados não seguem uma distribuição normal.
Note que para o objeto norm.data, o valor de p para o teste de Shapiro-Wilk foi 0.8777, assim, não rejeitando H0 e considerando o dado como possuindo uma distribuição normal. Isso já era esperado, uma vez que criamos o dado com essa característica. Já para os valores em BMI, obtivemos um valor de p igual a 5.061e-06, o que é muito menor que 0.05. Dessa forma, rejeitamos H0. Assim, considerando que o dado não segue uma distribuição normal.
Adicionalmente, quando comparamos os histogramas de ambos os dados podemos notar que o histograma de norm.data possui um padrão que se assemelha muito mais ao formato de sino, característico da distribuição normal. Já para o histograma de BMI, esse padrão de sino não é observado. Além disso, somos capazes de perceber uma assimetria entre as extremidades do gráfico, algo que é bastante decisivo para determinarmos que o dado não possui distribuição normal. O que inclusive, pode ser uma das causas para um valor de p tão baixo obtido no teste de Shapiro-Wilk.
DICA: Geralmente é aconselhado a aplicação de mais de um teste de normalidade para avaliar a distribuição do dado. Outros exemplos de teste de normalidade presentes no R são o teste de Anderson-Darling e o teste de Kolmogorov-Smirnov. Esses testes podem ser executados pelas funções ad.test() e ks.test(), respectivamente. A utilização da função ad.test() depende da instalação do pacote “nortest”.
Um tipo de gráfico amplamente utilizado para a representação de valores entre diferentes classes presentes em uma base de dados, é o gráfico de barras. No R, o gráfico de barras pode ser gerado por meio da função barplot(). O funcionamento da função barplot() é um pouco distinto dos gráficos apresentados anteriormente. Ao invés de apresentarmos os argumentos que serão plotados nos eixos x e y, devemos informar à função a altura de cada uma das barras que serão plotadas no gráfico. Esses valores devem ser informados ao argumento “heigth=”. Além disso, um outro argumento pode ser informado à função barplot() para determinar o nome presente abaixo de cada barra. Esse argumento é o “names.arg=”. Outros argumentos podem ser informados à função barplot(), a maioria deles trata-se de argumentos já apresentados nessa aula e que realizam alterações na estrutura e estilo do plot. Porém, existem alguns argumentos específicos da função barplot() que podem ser alterado. Para mais detalhes, utilize o comando “?barplot()”.
Como exemplo da utilização da função barplot(), vamos plotar um gráfico de barras contendo o número de participantes presentes em cada classe da coluna “treat”, da data base crohn_data. Para a obtenção da quantidade de indivíduos presentes em cada tratamento, iremos utilizar a combinação das funções table() e as.data.frame(), já apresentadas na aula anterior.
#Criando uma Data frame com o número de indivíduos para cada tratamento
data.treat<-as.data.frame(table(crohn_data$treat))
#Visualizando a Data frame criada
data.treat
## Var1 Freq
## 1 d1 39
## 2 d2 39
## 3 placebo 39
#Plotando o gráfico de barras para os valores obtidos
barplot(height = data.treat$Freq, names.arg = c("Droga 1", "Droga 2", "Placebo"), ylab="Número de indivíduos", xlab="Tipo de tratamento", cex.axis=2, cex.lab=1.5,bty="n", ylim=c(0,50))
Note que assim como já observado anteriormente, todos os grupos possuem o mesmo número de indivíduos (39). Além disso, note que na função barplot(), optei por utilizar o argumento “ylim=”. Para esse argumento utilizei como valor mínimo 0 e valor máximo 50. Isso foi devido ao fato do valor máximo presente no argumento “heigth=” ser 39 e a incrementação do eixo-y, pré-determianda pelo R, ser de 10 em 10. Como na forma padrão o R utiliza o maior valor como o limite superior do eixo, não é possível incrementar até 40, já que o valor máximo é 39. Portanto, na ausência do argumento ylim=c(0,50), o eixo-y teria sido incrementado somente até 30. Tente executar o comando acima retirando o argumento ylim=c(0,50) para visualizar o resultado. Além disso, tente mudar a cor das barras do plot.
Uma forma intressante de se criar gráficos de barras é plotando as barras para observações de mais de um grupo, lado a lado. Por exemplo, vamos plotar o número de particpantes de cada tratamento em função do sexo. Para isso, vamos usar o output da função table() para as duas variáveis, sexo e tratamento. Isso será informado para o argumento “heigth=”. Além disso, vamos colorir as barras utilizando o mesmo padrão de cores utilziados no gráfico de pontos.
#Obtendo a tabela com os valores por cada combinação entre tratamento e sexo
counts <- table(crohn_data$sex, crohn_data$treat)
#Visualizando o conteúdo de counts
counts
##
## d1 d2 placebo
## F 34 34 32
## M 5 5 7
#Plotando o gráfico de barras para os valores obtidos
barplot(height= counts, names.arg = c("Droga 1", "Droga 2", "Placebo"), col=c("red", "blue"), ylab="Número de indivíduos", xlab="Tipo de tratamento", cex.axis=2, cex.lab=1.5,bty="n", ylim=c(0,50), beside=T)
#Plotando a legenda no gráfico no canto superos direito
legend("topright", pch=c(15,15), col=c("red","blue"), legend=c("Mulheres", "Homens"))
Note que para gerar esse tipo de gráfico, fizemos duas alterações. Primeiro, foi informado a tabela contendo a quantidade de indivíduos para cada combinação entre sexo e tratamento, obtido por meio do comando table(). Além disso, um novo argumento foi inserido em barplot. Esse argumento foi o “beside=”. Quando inserimos uma resposta lógica igual a verdadeiro (“TRUE”) para esse argumento, plotamos as diferentes colunas presentes em counts lado a lado no plot.
O gráfico de pizza é constantemente utilizado para representar as proporções entre diferentes classes em uma base de dados. No R, os gráficos de pizza são criados por meio da função pie(). Essa função recebe como argumentos principais “x=” e “labels=”. Em “x=”, devemos informar as proporções de cada fatia do gráfico de pizza. Para “labels=”, são informados os nomes de cada fatia. Além desses argumentos, podemos informar o argumento “col=”. Com esse argumento podemos determinar as cores que serão utilizadas em cada fatia. Assim como para as demais funções de plot apresentadas até aqui, outros argumentos específicos são possíveis de serem utilizados. Mais informações podem ser sempre encontradas por meio da leitura do manual da função. No caso da função pie(), o manual pode ser acessado utilizando o comando “?pie()”.
Como exemplo da criação de gráficos de pizza no R, iremos criar um gráfico de barras para as proporções entre os sexos na base de dados crohn_data. Para calcular as proporções, iremos utilizar a função table(), já apresentada na aula anterior. Além disso, iremos deixar os nomes de cada fatia do gráfico um pouco mais informativos por meio do uso da função paste(). Para a porção do plot referente aos homens, iremos utilizar azul. Para a porção do plot referente às mulheres, iremos utilizar vermelho.
#Criando uma Data frame com as proporções de cada sexo na base de dados
data.prop<-as.data.frame(table(crohn_data$sex))
#Verificando o output inserido em data.prop
data.prop
## Var1 Freq
## 1 F 100
## 2 M 17
#Criando as proporções para serem utilizadas em labels
labels.prop<-c(round(((data.prop[,2])/sum(data.prop[,2]))*100,2))
#Criando as porcentagens para utilizarmos no argumento labels
labels.comp<-paste(labels.prop, "%", sep="")
#Criando o gráfico de pizza para as proporções contidas em data.prop
pie(x=c(data.prop[1,2],data.prop[2,2]), labels=labels.comp, col=c("red", "blue"), main="Proporção entre homens e mulheres em crohn_data")
#Plotando a legenda no gráfico no canto superos direito
legend("topright", pch=15, col=c("red","blue"), legend=c("Mulheres", "Homens"))
Os box-plots são uma classe de gráficos muito úteis para a apresentação de dados em estatística descritiva. Com o box-plot somos capazes de representar uma série e elementos que descrevem bem o comportamento de nossos dados. No box-plot conseguimos retirar informações referentes à mediana, primeiro quatil, terceiro quartil, o limite superior, o limite inferior e presença de outliers. Mais informações sobre a interpretação de box-plots podem ser encontradas aqui: https://pt.wikipedia.org/wiki/Diagrama_de_caixa
No R, os box-plots são criados por meio da função boxplot(). Geralmente, o box-plot é utilizado para a comparação de diversos grupos em um mesmo gráficos. Aqui, iremos comparar o número de eventos adversos para cada grupo de tratamento. Para isso, a função boxplot() recebe como argumento uma fórmula que representa a relação entre o conjunto de dados de número de eventos adversos e o conjunto de dados que determina cada observação para um dos grupos. Essa relação é feita por meio da tulização do caracter já descrito previamente, “~”. Contudo, caso alguém deseje criar um box-plot contendo somente a representação de um grupo ou de um conjunto de dados sem grupos, isso pode ser feito de uma meneira muito simples. Para isso, devemos informar somente o conjunto de dados para o argumento “x=”, na função boxplot().
#Criando o box-plot para o número de reações adversas para cada grupo de tratamento
boxplot(crohn_data$nrAdvE ~ crohn_data$treat, names=c("Droga 1", "Droga 2", "Placebo"),ylab="Número de reações adversas", xlab="Observações", cex.axis=2, cex.lab=1.5)
Observe o output criado. Podmeos notar nos box-plots que a mediana (linha preta dentro da caixa) do número de rações adversas para a droga 1 é menor do que a mediana para a droga 1 e o placedo. No entanto, entre a droga 2 e o placebo, as medianas são iguais. A altura das caixas representa os valores do primeiro quartil (representado pela parte inferior da caixa) e o terceiro quartil (representado pela parte inferior da caixa). As linhas e barras acima das caixas representam os respectivos limites superiores para um intervalo de confiança de 95%. Repare que não há linhas abaixo, pois o primeiro quartil coincide com o limite inferior do intervalo de confiânça. Além disso, conseguimos notar alguns pontos no box-plot. Esses pontos são os chamados outliers, valores que estão fora do intervalo de confiânça de 95%. Da mesma forma que fizemos para o plot anterior, podemos colorir os box-plots em função das classes. Tente executar essa ação.
Nesse módulo foi apresentado uma série de funções relacionadas à criação de gráficos no ambiente R. Existem uma infinidade de outros gráficos e edições possíveis de serem feitos no R. Portanto, os próximos passos para o aprendizado de novos comandos devem ser guiados pela demanda de cada um de vocês. Aqui, cobrimos uma boa parte dos comandos básicos, o que fará o processo de aprendizado desses novos comandos algo bem mais fácil. Além disso, existem outros pacotes criados somente para a produção de gráficos mais complexos ou com uma estetíca mais aprimorada. Alguns exemplos são o “ggplot2” e o “plotly”. Esses pacotes possuem os seus próprio grupos de funções e argumentos, assim como as específicidades de seus outputs. Cada um desses pacotes poderiam ser o assunto de cursos específicos, dado a grande variedade de funções.
Um site muito útil para aprender sobre diferentes plots e sobre o uso de outras ferramentas para criação de gráficos no R é o R-graph gallery. Nesse site, podemos encontrar diversos tipos de plots explicados e com os códigos utilizados para criá-los. Procure acesar o site, copiar e colar os comandos em seu terminal e ir isolando cada um dos comandos contidos na comando maior. Com isso, você conseguirá notar o que cada uma das informações passadas como argumentos alteram no gráfico final. Como dito no início do curso, o processo de aprendizagem envolvendo programação demanda treino e memorização. Para isso, devemos sempre praticar o uso das novas ferramentas aprendidas.