O R é um programa livre multiplataforma para análises estatísticas que pode ser baixado em seu site ou adicionado na lista de repositórios de máquinas linux. Suas possibilidades de aplicação em diversas áreas são praticamente ilimitadas.
Neste blog postarei o resultado de minha experiência em sua utilização nas áreas de dinâmica de populações de peixes, ciência pesqueira e ecologia.
As postagens deste blog se destina, além de mim mesmo, a iniciantes no R e alunos da minha área de atuação.
Aprendi muito em livros e nas listas de discussão R-help e a R_STAT, mas ainda tenho muito pela frente. Agradeço desde já qualquer contribuição.

sexta-feira, 13 de maio de 2011

Gráfico ordenado com médias e intervalo de confiança

Este gráfico mostra os valores de b (coeficiente angular) e seus intervalos de confiança calculados para diversas espécies. Para melhor vizualização as espécies são ordenadas pelo valor de b e diferentes grupos (peixes, moluscos e crustáceos) são identificados com símbolos especícicos.


SP GRP b ICi ICs
S. brasiliensis P 3,000 2,887 3,114
U. brasiliensis P 2,993 2,931 3,055
U. mystacea P 2,990 2,948 3,032
L. gastrophysus P 2,897 2,841 2,952
C. jamaicensis P 2,874 2,846 2,901
M. ancylodon P 3,101 3,064 3,137
M. americanus P 2,809 2,785 2,833
M. furnieri P 2,946 2,935 2,957
P. punctatus P 3,050 3,030 3,070
L. sanpaulensis M 1,784 1,685 1,886
O. vulgaris M 2,689 2,613 2,766
O. vulgaris F M 2,651 2,539 2,764
O. vulgaris M M 2,731 2,637 2,827
F. brasiliensis C 2,409 2,352 2,466
F. brasiliensis F C 2,350 2,262 2,439
F. brasiliensis M C 2,201 2,011 2,392
F. paulensis C 2,395 2,338 2,453
F. paulensis F C 2,248 2,160 2,336
F. paulensis M C 2,470 2,224 2,716
X. kroyeri C 2,301 2,244 2,358
X. kroyeri F C 2,305 2,228 2,383
X. kroyeri M C 2,149 2,039 2,260

# carregando e verificando dados
rm(list=ls())
dat.bvar <- read.delim("clipboard",dec=",")
summary(dat.bvar)
                 SP     GRP         b              ICi             ICs      
 C. jamaicensis   : 1   C:9   Min.   :1.784   Min.   :1.685   Min.   :1.886 
 F. brasiliensis  : 1   M:4   1st Qu.:2.316   1st Qu.:2.232   1st Qu.:2.404 
 F. brasiliensis F: 1   P:9   Median :2.670   Median :2.576   Median :2.765 
 F. brasiliensis M: 1         Mean   :2.607   Mean   :2.527   Mean   :2.686 
 F. paulensis     : 1         3rd Qu.:2.934   3rd Qu.:2.877   3rd Qu.:2.956 
 F. paulensis F   : 1         Max.   :3.101   Max.   :3.064   Max.   :3.137 
 (Other)          :16                           

# reorganizando a tabela de dados
order(dat.bvar$b) # linhas em ordem crescente de b 
[1] 10 22 16 18 20 21 15 17 14 19 12 11 13  7  5  4  8  3  2  1  9  6
rank(dat.bvar$b) # posição de cada linha quando ordenada por b
[1] 20 19 18 16 15 22 14 17 21  1 12 11 13  9  7  3  8  4 10  5  6  2
dat.bvar$RAN <- rank(dat.bvar$b)
levels(dat.bvar$SP) # níveis de SP
 [1] "C. jamaicensis"    "F. brasiliensis"   "F. brasiliensis F"
 [4] "F. brasiliensis M" "F. paulensis"      "F. paulensis F"  
 [7] "F. paulensis M"    "L. gastrophysus"   "L. sanpaulensis" 
[10] "M. americanus"     "M. ancylodon"      "M. furnieri"     
[13] "O. vulgaris"       "O. vulgaris F"     "O. vulgaris M"   
[16] "P. punctatus"      "S. brasiliensis"   "U. brasiliensis" 
[19] "U. mystacea"       "X. kroyeri"        "X. kroyeri F"    
[22] "X. kroyeri M"
dat.bvar$SP<-ordered(dat.bvar$SP, levels=dat.bvar$SP[order(dat.bvar$b)]) # reordena SP pela ordem de b
levels(dat.bvar$SP) # níveis de SP reordenados
[1] "L. sanpaulensis"   "X. kroyeri M"      "F. brasiliensis M"
[4] "F. paulensis F"    "X. kroyeri"        "X. kroyeri F"    
[7] "F. brasiliensis F" "F. paulensis"      "F. brasiliensis" 
[10] "F. paulensis M"    "O. vulgaris F"     "O. vulgaris"     
[13] "O. vulgaris M"     "M. americanus"     "C. jamaicensis"  
[16] "L. gastrophysus"   "M. furnieri"       "U. mystacea"     
[19] "U. brasiliensis"   "S. brasiliensis"   "P. punctatus"    
[22] "M. ancylodon"
ord.sp<-dat.bvar$SP[order(dat.bvar$b)]

# criando o gráfico
attach(dat.bvar)
par(mar=c(8,4,2,2))
plot(c(1:nrow(dat.bvar)),rep(3,nrow(dat.bvar)),ylab="valores de b",xlab="",ylim=c(min(ICi)*0.97,max(ICs)*1.03),type="n",xaxt="n")
axis(1,1:nrow(dat.bvar),labels=
ord.sp,las=2)
for (i in 1:length(ord.sp)){
segments(i,ICi[SP==ord.sp[i]],i,ICs[SP==ord.sp[i]])
}
points(RAN[GRP=="P"],b[GRP=="P"],pch=19)
points(RAN[GRP=="M"],b[GRP=="M"],pch=17)
points(RAN[GRP=="C"],b[GRP=="C"],pch=15)
legend(locator(1),bty="n",c("Peixes","Moluscos","Crustáceos"),pch=c(19,17,15)) # clique no gráfico para indicar o local da legenda
detach(dat.bvar)

sexta-feira, 3 de dezembro de 2010

Cálculo da moda

O R trás funções para o cálculo da média (mean) e da mediana (median) mas não para moda. A sugestão postada na lista R-Help por Dr. Brian D. Ripley para distribuições discretas foi:
 
statmod <- function(x) {
  z <- table(as.vector(x))
  names(z)[z == max(z)]
}
 
n <- c(1,2,2,2,3,3)
statmod(n)
[1] "2"

quinta-feira, 28 de outubro de 2010

Como colocar vírgulas como separador decimal em gráficos

Muitas vezes em um gráfico a abscissa e/ou a ordenada apresentam valores com casas decimais. O R por padrão utiliza ponto decimal e não vírgula. Para colocar a vírgula decimal podemos sobrescrever ou escrever os valores dos eixos com as funções axis, pretty, chartr, as.character e format. O eixo (axis) 1 é o inferior, o 2 da direita, o 3 o superior e o 4 da esquerda. O número de casas decimais é indicada em nsmall.
Se colocarmos na função plot a indicação axes=F nenhum dos eixos é desenhado. Abaixo estão exemplos de como colocar vírgulas decimais.

x<-c(1,2,3,4,5)
y<-c(0.1,0.3,0.5,0.7,0.9)
plot(x,y)
axis(2,at=pretty(y),labels=chartr(".", ",", as.character(format(pretty(y),nsmall=1))))

plot(x/100,y,axes=F)
axis(1,at=pretty(x/100),labels=chartr(".", ",", as.character(format(pretty(x/100),nsmall=2))))
axis(2,at=pretty(y),labels=chartr(".", ",", as.character(format(pretty(y),nsmall=1))))
box()

terça-feira, 26 de outubro de 2010

Gráfico de barras com números sobre as barras

Para fazer um gráfico de barras com a produção descarregada de diversas frotas e indicar o número de unidades produtivas sobre cada barra utilizei as funções barplot e text. O interessante é que ao criarmos um objeto com o barplot (bp <- barplot(...)) obtemos os pontos médios de cada barra. Assim podemos utilizar estes valores para posicionar corretamente as legendas sobre as barras com text. O comando par(mar=..) indica as margens do gráfico.

Copiando os dados abaixo do clipboard temos:
CAT Prod UP
Petrecho 1 17,5 9
Petrecho 2 15,2 20
Petrecho 3 10,3 500
Petrecho 4 8,4 150
Petrecho 5 20,3 900
dados <- read.delim("clipboard",dec=",",header=T)
barras <- data.frame(dados[,c(2)])
rownames(barras)<-dados[,1]
names(barras)<-c("Prod")
barras 

Prod
Petrecho 1 17,5
Petrecho 2 15,2
Petrecho 3 10,3
Petrecho 4 8,4
Petrecho 5 20,3
   
par(mar=c(12,6,3,2),cex.axis=1.2,cex.lab=1.4)
bp<-barplot(t(as.matrix(barras)),ylim=c(0,max(dados[,2]*1.1)),las=2,ylab="Produção descarregada (t)",col="orange")
box()
text(bp,barras[,1],dados[,3],col="blue",pos=3)

Como reordenar categorias

Independendo da ordem que sejam colocadas, as categorias sempre aparecem em ordem alfabética nos sumários estatísticos e nos gráficos. No entanto muitas vezes queremos que as categorias apareçam em uma ordem determinada, como o nome dos meses. O comando utilizado é o ordered, conforme os exemplos abaixo:

categ <- rep(c("c","b","a"),c(10,10,10))
valor<-c(rnorm(10,5,2),rnorm(10,8,4),rnorm(10,12,3))
dados1<-data.frame(categ,valor)
levels(dados1$categ)
[1] "a" "b" "c"
plot(dados1)
dados1$categ<-ordered(categ, levels=c("b","c","a"))
levels(dados1$categ)
[1] "b" "c" "a"
plot(dados1)

Outra forma, mais complicada, de reordenar as categorias é:

dados1$categ <- factor(dados1$categ,levels(dados1$categ)[c(2,3,1)])
levels(dados1$categ)
[1] "c" "a" "b"
plot(dados1)

segunda-feira, 25 de outubro de 2010

Como importar dados da área de transferência (clipboard)

Uma forma simples de transferir dados de uma planilha (Excel, Calc, etc.) para o R é através da área de transferência (clipboard) através da seguinte função:
read.delim("clipboard",dec=",",header=T)

“clipboard” indica que os dados estão na área de transferência, dec=“,” que é utilizada a vírgula como separador decimal e header=T que a primeira linha contém títulos das colunas.

Considere que em uma planilha você tem os dados

Ct    Pt      Sexo
186  81,0   M
192  88,7   F
195  78,4   M
197  101,2 F
199  77,6  M
199  92,3  M
200  90,3  M
200  91,3  M
202  87,6  M

Selecione a área da planilha com os dados e copie (Ctrl C). No prompt do R escreva read.delim("clipboard",dec=",") e pressione Enter. Os dados estarão transferidos.

Também podemos fazer com que os dados da primeira coluna sejam importados como o nome das linhas, o que é útil em análises multivariadas. Para isto inserimos o parâmetro row.names=1

Para que os dados transferidos fiquem disponíveis devemos atribuí-los a um objeto: dados <- read.delim("clipboard",...) 

Como remover categorias (levels) não utilizadas

Um problema que encontramos ao subdividir um conjunto de dados é que as categorias excluídas continuam aparecendo nos sumários e nos gráficos.

Para se ver livre destas deve-se utilizar a função droplevels, que foi inserida na versão 2.12.0. No exemplo abaixo crio o data.frame dados1 onde a coluna categ possui três níveis: “a”, “b” e “c”. Em seguida crio o data.frame dados2 excluindo as linhas da categoria “b”. Veja que ela ainda conta como um nível e aparece no gráfico. Com a utilização da função droplevels este problema é contornado.

categ <- rep(c("a","b","c"),c(10,10,10))
valor<-c(rnorm(10,5,2),rnorm(10,8,4),rnorm(10,12,3))
dados1<-data.frame(categ,valor)
levels(dados1$categ)
[1] "a" "b" "c"
plot(dados1)
dados2<-subset(dados1,categ!="b")
levels(dados2$categ)
[1] "a" "b" "c"
plot(dados2) 
dados3<-droplevels(subset(dados1,categ!="b"))
levels(dados3$categ)
[1] "a" "c"
plot(dados3) 

Em casos específicos pode-se utilizar:
levels(dados2$categ[,drop=T])
[1] "a" "c"