Gráficos de barras com intervalo de confiança em R

Ontem, precisei criar um gráfico de barras com intervalo de confiança decente. Resolvi usar R. Problema: pouco conhecimento de R. Para evitar que você passe mesmo aperto, vou mostrar aqui como fiz.

Contextualizando

Estava comparando dois softwares, chamarei-os de A e B. Cada uma deles, foi submetido a uma série de experimentos em quatro cenários distintos. No fim dos experimentos, produzi um arquivo com os valores das médias e dos intervalos de confiança tanto para A quanto para B nos quatro cenários. O arquivo tinha o seguinte formato:

A AICI AICS B BICI BICS
60 55 65 50 45 50
90 85 95 80 78 82
120 115 125 90 86 94
150 145 155 100 90 110

Onde cada linha representa os valores de um determinado cenário, com exceção da primeira linha (representa o nome das colunas). Enquanto as colunas seguem a seguinte definição:

  • Coluna A: Os valores das médias de A.
  • Coluna AICI: Os intervalos de confiança inferior de A.
  • Coluna AICS: Os intervalos de confiança superior de A.
  • Coluna B: Os valores das médias de B.
  • Coluna BICI: Os intervalos de confiança inferior de B.
  • Coluna BICS: Os intervalos de confiança superior de B.

Assim, o script R abaixo resolveu o problema:

library(gplots)

# carrega o arquivo com os dados
data <- read.table("results.dat", header=T, sep=" ")

# nome do arquivo .png onde o gráfico será plotado
png(filename="results-barplot.png", bg="white")

# auto-descritivo
legenda <- c("Cenário 1","Cenário 2","Cenário 3","Cenário 4")
cores <- c("lightblue", "mistyrose", "lightcyan", "lavender")

# crio uma matriz com 2 colunas: médias de A e B, respectivamente.
medias <- as.matrix(data[, c(1, 4)])

# crio uma matriz com 2 colunas:
# intervalos de confiança inferior de A e B, respectivamente.
ic.inferior <- as.matrix(data[, c(2, 5)])

# crio uma matriz com 2 colunas:
# intervalos de confiança superior de A e B, respectivamente.
ic.superior <- as.matrix(data[, c(3, 6)])

# Importante: As matrizes criadas acima (medias, ic.inferior e ic.superior)
# precisam ter as mesmas dimensões.

barplot2(medias, # A matriz a ser plotada
  beside=TRUE, # Plota as barras lado-a-lado
  col=cores, # As cores das barras
  legend=legenda, # A legenda
  ylim=c(0, 200), # O limite máximo do eixo y
  main="A x B", # Titulo principal
  ylab="Valor", # Label do eixo y
  plot.ci=TRUE, # TRUE, deve-se plotar os intervalos de confiança
  ci.l=ic.inferior, # A matriz dos limites inferiores dos intervalos de confiança
  ci.u=ic.superior, # A matriz dos limites superiores dos intervalos de confiança
  font.main=4, cex.axis=1.2, cex.lab=1.5, cex.names=1.5 # Firulas adicionais
)

E, o gráfico produzido foi este:

Gráficos de barras com intervalo de confiança em R

Brincando com números primos, usando Scala!

Nos últimos meses, tenho dedicado algum tempo para aprender Scala. Então, decidi que é chegada a hora de ajudar a divulgar esta excelente linguagem. Nada como um problema clássico para começar: calcular números primos utilizando o Crivo de Eratóstenes. Vale lembrar que o foco deste post não é mostrar como calcular números primos usando o Crivo de Eratóstenes, mas como fazê-lo em Scala. A imagem abaixo mostra como funciona o Crivo, mais informações sobre podem ser obtidas aqui.

Crivo de Eratóstenes

Fonte: Wikipedia

Sem meias palavras, a solução COMPLETA é listada em seguida:

def primos = crivo(Stream from 2)
def crivo(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, crivo(s.tail filter { _ % s.head != 0 }))

Explicando…

O código acima define duas funções: primos e crivo. A primeira, primo, retorna uma lista de todos os números primos a partir de 2 — mas não se preocupe, os números apenas serão calculados à medida que forem necessários, isto é possivel utilizando-se Streams. A segunda, crivo, executa a lógica do crivo. Utilizando Streams ela seleciona o primeiro elemento(que é primo) da lista de números passada como argumento e elimina/filtra todos os múltiplos do número selecionado da cauda da lista. Pelo que vc já deve ter percebido, Streams consistem de um elemento inicial, a cabeça da lista(head), e uma lista representando os demais elementos, a cauda(tail).

Playground!

Agora que temos uma lista de números primos, vamos usá-la para:

Calcular e imprimir os N primeiros números primos

primos take 10 foreach println

Calcular e imprimir todos os números primos menores que 120 (como aparece na imagem acima)

primos takeWhile {_ < 120} foreach println

Calcular e imprimir o 100° número primo

print(primos(100))

Calcular e imprimir do 100° ao 110° número primo

primos.slice(100,110)foreach println

Há várias outras possibilidades. Veja documentação da classe Stream e divirta-se!

Até a próxima!

Dica Linux: Aumente sua produtividade ao usar o comando 'cd'

Um dos comandos mais utilizados durante a utilização de um terminal Linux/Unix, sem dúvida, é o cd. Para melhorar sua produtividade apresentarei alguns hacks para este comando.

1. Subindo na árvore de diretórios eficientemente com aliases

Navegar em uma estrutura de diretórios muito profunda é bastante cansativo. Imagine o trabalho de Shrek para voltar para o seu diretório /home/shrek:

shrek@pantano:~/fotos/viagem/reino/tao/tao/tao/distante $ cd ../../../../../../..
shrek@pantano:~ $

Ao invés de executar cd ../../../../../../.. para subir na árvore de diretórios, adicione os seguintes aliases para o seu ~/.bashrc e reinicie o terminal:

alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."
alias ..6="cd ../../../../../.."
alias ..7="cd ../../../../../../.."

Usando:

shrek@pantano:~/fotos/viagem/reino/tao/tao/tao/distante $ ..7
shrek@pantano:~ $

2. Alternar entre os dois últimos diretórios

shrek@pantano:~ $ cd fotos/viagem/reino/tao/tao/tao/distante
shrek@pantano:~/fotos/viagem/reino/tao/tao/tao/distante $ pwd
/home/shrek/fotos/viagem/reino/tao/tao/tao/distante
shrek@pantano:~/fotos/viagem/reino/tao/tao/tao/distante $ cd -
shrek@pantano:~ $ cd -
shrek@pantano:~/fotos/viagem/reino/tao/tao/tao/distante $

3. Usar shopt -s cdspell para corrigir automagicamente nomes de diretórios digitados errados

jonhnny@pc$ cd Docmentos
bash: cd: Docmentos: Arquivo ou diretório inexistente
jonhnny@pc$ shopt -s cdspell
jonhnny@pc$ cd Docmentos
jonhnny@pc:~/Documentos $ pwd
/home/jonhnny/Documentos

Nota: “Esqueci” de digitar a letra ‘u’ de ‘Documentos’!

4. Usando CDPATH ou como tornar o comando cd promíscuo

A variável de ambiente CDPATH define o diretório base para o comando cd, em outras palavras, você poderá navegar entre os diretórios sem especificar o diretório-pai.

jonhnny@pc$ pwd
/home/jonhnny
jonhnny@pc$ cd projeto-x
bash: cd: projeto-x: Arquivo ou diretório inexistente
jonhnny@pc$ export CDPATH=/local/workspace
jonhnny@pc$ cd projeto-x
/local/workspace/projeto-x
jonhnny@pc:/local/workspace/projeto-x $ pwd
/local/workspace/projeto-x

Nota: Não foi preciso especificar o diretório-pai: /local/workspace

Gostou disto? Não?! Então ignore. Caso sim, exporte a variável CDPATH no seu ~/.bashrc e reinicie o terminal para usufruir deste hack:

export CDPATH=.:~:/local/workspace