#============================================================================= # Estatística Computacional I www.leg.ufpr.br/ce083 # Curso de Estatística - 2013/2 # Prof. Walmes Zeviani # LEG - DEST - UFPR # # Aula 11 (01/10/2013) # * Tarefas por grupo e por margem; # * Função para obter esatísticas para uma amostra; # * Objetos do tipo lista, criação e atributos; # * Aplicar funções para elementos de uma lista; # * Exportar tabelas no formato texto; # * Salvar gráficos; # * Salvar a imagem da sessão. #============================================================================= #----------------------------------------------------------------------------- # Tarefas por grupo/categoria (níveis de um fator). data(iris) str(iris) # renomeia, princípio da preguiça names(iris) <- c("sl","sw","pl","pw","sp") # média de uma variável por grupo with(iris, tapply(sl, sp, mean)) # média de várias variáveis por grupo with(iris, aggregate(cbind(sl,sw,pl,pw), list(sp=sp), mean)) #----------------------------------------------------------------------------- # Tarefas por margem (linha ou coluna de uma tabela). apply(iris[,1:4], MARGIN=2, FUN=mean) #----------------------------------------------------------------------------- # Uma função que retorna várias estatíscas sobre uma amostra. calc.stats <- function(x){ n <- length(x) # tamanho do vetor de dados x <- na.omit(x) # remove os NA'S k <- length(x) # tamanho sem os NA's fn <- fivenum(x) # extremos e quartis, 5 números de Tukey names(fn) <- NULL m <- mean(x) s <- sd(x) d <- mad(x) # desvio absoluto médio da mediana res <- c(n, k, m, fn[3], fn[2], fn[4], fn[1], fn[5], fn[5]-fn[1], s, d, 100*s/m) names(res) <- c("ntotal","nvalido","média","mediana", "q1","q3", "mínimo","máximo", "amplitude", "desvio-padrão","dam", "cv") return(res) } #----------------------------------------------------------------------------- # Aplicando a função. # Teremos parte da disciplina direcioanda à criar funções. st <- calc.stats(iris$sl) st cbind(st) tb <- apply(iris[,1:4], MARGIN=2, FUN=calc.stats) str(tb) tb #----------------------------------------------------------------------------- # Casas decimais, precisão visual e arredondamento. options()$digits # número de digitos visuais tbr <- round(tb, digits=2) tbr #----------------------------------------------------------------------------- # Exportando a tabela do R para um arquivo de texto. write.table(tbr, file="tabela.txt") ## write.table(tbr, file="tabela.txt", sep="\t", quote=FALSE) write.table(tbr, file="tabela.csv") ## write.table(tbr, file="tabela.csv", sep=";", quote=FALSE) write.table(tbr, file="tabela.xls", quote=FALSE, sep="\t") #----------------------------------------------------------------------------- # Para usuário do editor de documentos Latex, a tabela é gerada assim. require(xtable) xtable(tbr) #----------------------------------------------------------------------------- # Salvando gráficos. boxplot(sl~sp, data=iris) # no formato pdf (é vetorial, alta qualidade, editável em CorelDraw, Gimp) pdf(file="grafico1.pdf", width=7, height=5) boxplot(sl~sp, data=iris) dev.off() # no formato jpg (baixa qualidade mas você pode postar no facebook) jpeg(file="grafico1.jpg", w=800, h=600) boxplot(sl~sp, data=iris) dev.off() #----------------------------------------------------------------------------- # Salvando a imagem da sessão. ls() # objetos existentes na memória na atual sessão # salva a sessão save.image(file="grr20002000.RData") # no futuro você carrega essa sessão com ## load("grr20002000.RData") # colocar no início do scrip #----------------------------------------------------------------------------- # A maravilhosa família *apply. apropos("apply$") tapply() # tarefas por grupo apply() # tarefas por margem de uma tabela ou arranjo (array) lapply() # tarefas por elementos de uma lista sapply() # idem à lapply só que simplifica o resultado quando possível #----------------------------------------------------------------------------- # Uma lista onde os elementos são vetores. L <- list(A=c(30,40,21,30,80), B=c(21,23,34), C=seq(0,7,1), D=runif(12)) class(L) names(L) length(L) str(L) L #----------------------------------------------------------------------------- # Operações usando a lapply() e sapply(). lapply(L, length) lapply(L, mean) lapply(L, range) lapply(L, sort) sapply(L, length) # simplificou para um vetor sapply(L, range) # simplificou para uma matriz sapply(L, sort) # não foi possível simplificar #----------------------------------------------------------------------------- # Uma lista cujos elementos não são mais da mesma classe. L <- list(A=c(30,40,21,30,80), B=c(21,23,34), # vetores C=matrix(1:9, 3, 3), # matriz D=subset(iris, sp=="vesicolor")) # data.frame class(L) lapply(L, class) sapply(L, class) #----------------------------------------------------------------------------- # Fazendo estatísticas por margim separadas por grupo. # sem separar por grupo tb <- apply(iris[,1:4], MARGIN=2, FUN=calc.stats) str(tb) tb str(iris) levels(iris$sp) L <- list(A=subset(iris, sp=="setosa"), B=subset(iris, sp=="versicolor"), C=subset(iris, sp=="virginica")) str(L) names(L) <- levels(iris$sp) str(L) tba <- lapply(L, function(d){ apply(d[,1:4], MARGIN=2, FUN=calc.stats) }) str(tba) tba #----------------------------------------------------------------------------- # Juntando as elementos da lista num único data.frame (empilhando). n <- sapply(tba, nrow) tbb <- do.call(rbind, tba) str(tbb) # é uma matriz tbb <- cbind(sp=rep(names(n), n), # cria coluna com nome da espécie stat=rownames(tbb), # cria coluna com nome da estatística as.data.frame(tb)) # converte para data.frame tbb #----------------------------------------------------------------------------- ## O pacote plyr extende as funcionalidades da familia *apply trazendo mais ## parentes para a festinha, as funções **ply e outras. #----------------------------------------------------------------------------- # Exportando essa tabela. write.table(tbb, file="tabelona.xls", quote=FALSE, row.names=FALSE, sep="\t") #-----------------------------------------------------------------------------