Como plotar intervalos de confiança em um gráfico no R

No post anterior vimos como calcular os intervalos de confiança para um conjunto de dados. Irei utilizar nos exemplos os mesmos conjuntos de dados e funções do post anterior.

Para construir um gráfico com essas informações no R segue uma função adaptada da solução que encontrei aqui:

plot_inter_conf <- function(x, y, upper, lower=upper, length=0.1,...){
 if(length(x) != length(y) | length(y) !=length(lower) | length(lower) != length(upper))
 stop("vectors must be same length")
 arrows(x,upper, x, lower, angle=90, code=3, length=length, ...)
}

grafico <- barplot(mean(lista), names.arg=c(1),ylim=c(0,6), col="blue", axis.lty=1, xlab="", ylab="")

plot_inter_conf(grafico, mean(lista), inter_conf(lista)[2], inter_conf(lista)[1])

Como calcular intervalos de confiança de um conjunto de dados em R

Para encontrar os valores do intervalo de confiança de um determinado conjunto de dados vamos utilizar funções da biblioteca boot e para tal precisamos carregá-la no R:

> library(boot)

Agora definimos uma lista qualquer de valores para fazer os teste:

> lista = c(1,2,3,4,5,6)
> mean(lista)
[1] 3.5

Executamos a função boot pois o retorno dela é necessário para o passo seguinte que contém os valores do intervalo de confiança.

Estamos aqui utilizando a operação de média, que é definida na função boot.

> boot_resultado = boot(lista, function(x,j) mean(x[j]), R=1000) 
> boot_resultado

ORDINARY NONPARAMETRIC BOOTSTRAP

Call:

boot(data = lista, statistic = function(x, j) mean(x[j]), R = 1000)

Bootstrap Statistics :
 original bias std. error
t1* 3.5 0.0035 0.6858388

A função boot.ci utiliza os valores do resultado da função boot e nos retorna os valores do intervalo de confiança.

> boot.ci(boot_resultado)
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 1000 bootstrap replicates

CALL : 
boot.ci(boot.out = boot_resultado)

Intervals : 
Level Normal Basic 
95% ( 2.152, 4.841 ) ( 2.167, 4.833 )

Level Percentile BCa 
95% ( 2.167, 4.833 ) ( 2.133, 4.667 ) 
Calculations and Intervals on Original Scale
Warning message:
In boot.ci(boot_resultado) :
 bootstrap variances needed for studentized intervals

Aqui segue uma função que retorna uma lista com os valores do intervalo de confiança para tornar mais prática a utilização das funções nas execuções que você desejar:

> inter_conf <- function(i){ 
   boot_value <- boot(i, function(x,j) mean(x[j]), R=1000)
   if(apply(boot_value$t, 2, sd) == 0) {
     return(c(boot_value$t0,boot_value$t0))
   }else {
     return((boot.ci(
       boot_value,
       type=c("perc")
      )
     )$percent[4:5])
   }
 }
> inter_conf(lista)
[1] 2.000000 4.833333

Operações para selecionar dados no R

Em um outro post falamos um pouco sobre como trabalhar com tabelas no R. Neste post vamos explicar, baseado nesse post em inglês, sobre como selecionar seus dados uma vez eles carregados no R.

Vamos utilizar o mesmo arquivo de dados do post anterior, chamado fumantes.csv como base dos exemplos, que contém dados fictícios de 356 pessoas. A primeiro coluna representa o estado atual da pessoa em relação ao cigarro, podendo ser: fumante, ex-fumante e não fumante. Para cada uma das pessoas existe também a informação sócio-econômica: baixa, média, alta.

> dados_fumantes <- read.csv(file='fumantes.csv',sep=',',header=T)
> head(dados_fumantes)
 Fumante SE
 1 Ex-fumante Alta
 2 Ex-fumante Alta
 3 Ex-fumante Alta
 4 Ex-fumante Alta
 5 Ex-fumante Alta
 6 Ex-fumante Alta

Para selecionar colunas pelo nome:

> dados_fumantes[,c('Fumante','SE')])
 Fumante SE
 1 Ex-fumante Alta
 2 Ex-fumante Alta
 3 Ex-fumante Alta
 4 Ex-fumante Alta
 5 Ex-fumante Alta
 6 Ex-fumante Alta
 ...

Para selecionar linhas e colunas:

> dados_fumantes[122:127,c('Fumante','SE')]
 Fumante SE
 122 Fumante Alta
 123 Fumante Alta
 124 Fumante Alta
 125 Fumante Alta
 126 Fumante Alta
 127 Fumante Alta

Para selecionar linhas que contém determinada informação, outros operadores como >, >=, < e <= também podem ser utilizados:

> dados_fumantes[dados_fumantes$SE=="Alta",]
 Fumante SE
 1 Ex-fumante Alta
 2 Ex-fumante Alta
 3 Ex-fumante Alta
 4 Ex-fumante Alta
 5 Ex-fumante Alta
 6 Ex-fumante Alta
 ...

Você pode utilizar dados a função grep para seleção:

> dados_fumantes[grep("ex",dados_fumantes$Fumante, ignore.case=T),]
 Fumante SE
 1 Ex-fumante Alta
 2 Ex-fumante Alta
 3 Ex-fumante Alta
 4 Ex-fumante Alta
 5 Ex-fumante Alta
 6 Ex-fumante Alta
 ...

O nome das linhas no R não são necessariamente únicos como nos exemplos anteriores sendo númerico de 1 a 356.
Por exemplo a matrix mat seguinte:

> mat = matrix(1:18, nrow=6, ncol=3)
 > rownames(mat) <- c('a', 'a', 'a', 'b', 'b', 'b')
 > colnames(mat) <- c('foo', 'bar', 'bat')
 > mat
 foo bar bat
 a 1 7 13
 a 2 8 14
 a 3 9 15
 b 4 10 16
 b 5 11 17
 b 6 12 18

Quando você tenta selecionar pelo nome das linhas apenas a primeira linha é retornada:

> mat['a',]
 foo bar bat
 1 7 13
> mat['b',]
 foo bar bat
 4 10 16

Mas este outro comando funciona como esperado:

> mat[rownames(mat)=='a',]
 foo bar bat
 a 1 7 13
 a 2 8 14
 a 3 9 15

Trabalhando com tabelas de dados no R

R é uma ferramenta estatística que pode ser utilizada para manipular dados e criar gráficos.

Muitas vezes trabalhar com tabelas pode ser prático para manipulação dos dados. Essa explicação é baseada nesta página, inclusive os dados e exemplos são os mesmos traduzidos.

Vamos utilizar o arquivo fumantes.csv como base dos exemplos, que contém dados fictícios de 356 pessoas. A primeiro coluna representa o estado atual da pessoa em relação ao cigarro, podendo ser: fumante, ex-fumante e não fumante. Para cada uma das pessoas existe também a informação sócio-econômica: baixa, média, alta.

Para ler os dados do arquivo e listar o sumário basta utilizar os comandos abaixo:

> dados_fumantes <- read.csv(file='fumantes.csv',sep=',',header=T)
> summary(dados_fumantes)
 Fumante SE 
 Ex-fumante :141 Alta :211 
 Fumante :116 Baixa: 93 
 Não fumante: 99 Média: 52

O comando read.csv lê um arquivo no formato csv e carrega os dados para dentro do R. O comando summary devolve o sumário dos dados informados.

Você pode criar uma tabela a partir dos dados usando o seguinte comando:

> tabela_fumantes <- table(dados_fumantes$Fumante,dados_fumantes$SE)
> tabela_fumantes

 Alta Baixa Média
 Ex-fumante 92 28 21
 Fumante 51 43 22
 Não fumante 68 22 9

Por exemplo podemos ver que existem 51 fumantes da classe socio-ecônomica alta.

Para criar uma tabela de maneira indireta fazemos primeiro uma matrix com os valores e então convertemos para tabela.

> fumantes <- matrix(c(51,43,22,92,28,21,68,22,9),ncol=3,byrow=TRUE)
> colnames(fumantes) <- c("Alta","Média","Baixa")
> rownames(fumantes) <- c("Fumante","Ex-fumante","Não-fumante")
> fumantes <- as.table(fumantes)
> fumantes
 Alta Média Baixa
Fumante 51 43 22
Ex-fumante 92 28 21
Não-fumante 68 22 9

Existem vários formatos para transformar os dados em gráficos. No exemplo seguinte o primeiro comando, barplot, cria um gráfico com barras e o segundo, plot, com caixas.

> barplot(fumantes,legend=T,beside=T,main='Estado de Fumante por Classe Socio-Ecônomica')
> plot(fumantes,main="Estado de Fumante por Classe Socio-Ecônomica")