====== Daniel Magalhães Lima ====== ===== Médico Veterinário formado pela FMVZ-USP ===== {{ :bie5782:01_curso_atual:alunos:trabalho_final:daniel.magalhaes.lima:dsc00657_2_.jpg?200| Daniel Magalhães Lima}} Doutorando no Laboratório de Epidemiologia e Bioestatística, Departamento de Medicina Veterinária Preventiva e Saúde Animal da Faculdade de Medicina Veterinária e Zootecnia da USP.\\ \\ Tem como tema da tese o estudo do impacto econômico de estratégias de controle da brucelose e tuberculose bovinas através de modelagem matemática. [[http://leb.fmvz.usp.br/pt-br|LEB - Laboratório de Epidemiologia e Bioestatística]] ===== Propostas de Trabalho Final ===== ==== Proposta 1 ==== Sumário Rápido\\ Através de um simples comando ( sumario(df) ) a função realiza um sumário geral em um banco de dados, identificando variáveis quantitativas e qualitativas e plotando gráficos e tabelas de acordo com o requerimento da variável. O sumário contará com avaliação da normalidade através de gráficos e medidas de simetria e curtose, medidas de tendência e de dispersão, uma combinação de n de gráficos básicos à escolha do usuário (histogramas com curva normal baseada, boxplot, qqplots, cleveand dotplot, correlogramas com intervalos de confiança) e tabelas de contingência.\\ sumario(data.frame = , by = NULL, graphs = c(‘histograma’, ‘boxplot’, ‘qqplot’, ‘clevelandplot’, ‘correlograma’), ...) === Proposta 2 === Medidas de risco\\ A função pode ter como entrara 3 tipos de objetos: vetores com variáveis qualitativas associadas a ocorrência de um evento, uma tabela de contingencia 2x2 ou um objeto do tipo lm/glm. A partir de um objeto lm ou glm a função seleciona os coeficientes da regressão e calcula as medidas de risco escolhidas pelo usuário, intervalo de confiança das medidas e plot destes intervalos. \\ risco(x = , y = NULL, medidas = c(OR, RR, RT, RA, RP)) =====Comentários Vitor===== Daniel, suas propostas precisam melhoram um pouco. Qual o objetivo da primeira proposta? fazer várias análises pra ver no que dá não é uma boa estratégia de análise de dados. Além disso, você implementaria as análises ou só chamaria funções pré-existentes? O mesmo vale para a proposta B. Se você for implementar os códigos, eu iria com a B, ou tentaria um plano C Vitor Rios ===== Trabalho Final ===== Segue aqui o arquivo: {{:bie5782:01_curso_atual:alunos:trabalho_final:daniel.magalhaes.lima:final_daniel.r|}} E aqui o código: # Criando a função e definindo os argumentos exploratoria <- function(df, by = NULL, to.factor = NULL, bin2factor = T){ # Carregando o pacote que faz o correlograma require(corrgram, quietly = T) # Carregando o pacote que faz os gráficos require(ggplot2, quietly = T) #Extraindo os nomes das colunas para futura indexação nomes <- colnames(df) # Conferindo o argumento bin2factor if (bin2factor == T) { # Evitando um aviso causado pela comparação de vetores de tamanhos # possivelmente diferentes. suppressWarnings( # Iniciando o for para a coerção de variaveis binárias para fatores for(i in 1:ncol(df)){ # Conferindo valores únicos no vetor check.bin <- sort(unique(df[,nomes[i]])) # Conferindo quem é binário e ... if (all(check.bin == c(0,1)) == T) { # ... se for binario mudar para fator. df[,i] <- as.factor(df[,nomes[i]]) # ... se não for... } else { # ... segue o jogo! next() } } ) } # Conferindo se o argumento 'to.factor' está preenchido e... if (!is.null(to.factor)){ # ... se estiver extraímos as posições nas quais as variáveis foram apontadas. # Este objeto servirá como contador do for logo daqui a pouco. cont.factor <- which(nomes %in% to.factor) # Abrindo o for para a coerção para fator for(i in cont.factor){ # Coercionando as variáveis selecionadas para fator. df[,i] <- as.factor(df[,i]) } } # Identificando as variáveis do tipo fator para futura indexação fatores <- colnames(df[sapply(df, is.factor)]) # Identificando as variáveis do tipo numerica para futura indexação numericas <- colnames(df[sapply(df, is.numeric)]) ################################################################### ######################## Função Multiplot ######################### ################## desenvolvida por Winston Chang ################# ################################################################### # disponível em: # http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ # Embora estafunção esteja aqui dentro da minha não fui eu quem a implementou # me dei a liberdade de não comentá-la linha a linha, pois, além de o autor # ter feito uma série de comentários, eu não domino o objetivo de cada linha # utilizada aí. multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { library(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # If layout is NULL, then use 'cols' to determine layout if (is.null(layout)) { # Make the panel # ncol: Number of columns of plots # nrow: Number of rows needed, calculated from # of cols layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), ncol = cols, nrow = ceiling(numPlots/cols)) } if (numPlots==1) { print(plots[[1]]) } else { # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) # Make each plot, in the correct location for (i in 1:numPlots) { # Get the i,j matrix positions of the regions that contain this subplot matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, layout.pos.col = matchidx$col)) } } } ################################################################### ####################### Função sumario.base ####################### #################### desenvolvida por mim mesmo ################### ################################################################### # O objetivo de fazer uma função com uma série de avaliações básicas da # análise descritiva é poder utilizá-la em diferentes cenários, ex: # utilizando como entrada um simples vetor, ou através de alguma função da # família apply ou até mesmo em conjunto com funções da família de pacotes # da filosofia do tidyverse (apesar das tentativas de utilizar este último # aqui na função não consegui dominar a aplicação da filosofia.) # Iniciando a função e definindo os argumentos sumario.base <- function(x){ # Extraindo o primeiro quartil q1 <- quantile(x, probs = 0.25, na.rm = T)[[1]] # Extraindo o terceiro quartil q3 <- quantile(x, probs = 0.75, na.rm = T)[[1]] # Construindo o data.frame de saída da função data.frame( # Calculando a média media = round(mean(x, na.rm = T),2), # Calculando a desvio padrão desvio = round(sd(x, na.rm = T),2), # Verificando o valor mínimo minimo = min(x, na.rm = T), # alocando o primeiro quartil q1 = q1, # Calculando a mediana mediana = median(x, na.rm = T), # Calculando o terceiro quartil q3 = q3, # Calculando o valor máximo maximo = max(x, na.rm = T), # Calculando o intervalo inter-quartil iiq = (q3 - q1), # Contando os NAs na.cont = sum(is.na(x)), # Relativizando os NAs na.percent = sum(is.na(x))/length(x), # Contando os zeros zero.cont = sum(x == 0, na.rm = T), # Relativizando os zeros zero.percent = sum(x == 0, na.rm = T)/length(x) ) } # Criando as listas que compõe a saída da função... # ... gráficos de variáveis numéricas... graficos.num <- list() # ... de variáveis categóricas... graficos.fac <- list() # ... e tabelas. tabelas.fac <- list() # Não vi nenhum sentido para calcular um correlograma com base em uma # variável categorica, portanto o gráfico é construído com base na totalidade # dos dados e neste momento da função. # Calculando a matrix de correlação e desenhando o correlograma corrgram(df[,numericas], type = 'data', lower.panel = 'panel.cor', upper.panel = 'panel.pts') # Salvando o gráfico correlograma <- recordPlot() # Construi a função em dois grandes blocos: Sem variáveis categóricas e com # variáveis categóricas. # Abaixo começa a mais simples: sem variável categórica ################################################################### ########################### Sem fatores ########################### ################################################################### # Saídas Gráficas --------------------------------------------------------- # Conferindo o argumento if(is.null(by)){ # iniciando o for para a construção de gráficos das variáveis numericas for(i in 1:length(numericas)){ # criando o plot, definindo o df de trabalho e o eixo y bp <- ggplot(df, aes_string(y = numericas[i]))+ #definindo o eixo x aes(x = numericas[i])+ # definindo o tipo do gráfico geom_boxplot()+ # aparando uma legenda repetitiva labs(x = NULL) # criando o plot, definindo o df e o eixo x histo <- ggplot(df, aes_string(x = numericas[i]))+ # definindo o tipo do grafico geom_histogram() # criando o plot, definindo o df de trabalho e a origem das amostras qq <- ggplot(df, aes_string(sample = numericas[i]))+ # definindo o tipo do gráfico stat_qq() # criando o plot, definindo o df de trabalho e o eixo x clev <- ggplot(df,aes_string( x = numericas[i]))+ # definindo o eixo y aes(y = row.names(df))+ # definindo o tipo de gráfico geom_point()+ # aparando legendas desnecessárias theme(axis.text.y = element_blank()) # plotando todo mundo junto multiplot(bp, qq, histo, clev, cols = 2) # salvando o gráfico plot.num <- recordPlot() # alocando o gráfico na lista graficos.num[[i]] <- plot.num # nomeando o gráfico names(graficos.num)[i] <- numericas[i] } # iniciando a construção dos gráficos das variáveis categóricas e a # construção das tabelas for(i in 1:length(fatores)){ # criando o plot, definindo o df de trabalho e o eixo x barras <- ggplot(df, aes_string(x = fatores[i], fill = fatores[i]))+ # definindo o tipo de gráfico e selecionando, por default a # contagem como eixo y geom_bar() # Aqui, apesar de plotar apenas um gráfico precisei utilizar o # multiplot pois assim foi mais fácil plotar o gráfico de dentro da # função. multiplot(barras) # Salvando o gráfico... plot.fac <- recordPlot() # ... alocando ele na lista e... graficos.fac[[i]] <- plot.fac # ... nomeando-o. names(graficos.fac)[i] <- fatores[i] # Tabelando os dados, guardando a tabela na lista e... tabelas.fac[[i]] <- table(df[fatores[i]]) # ... nomeando a lista. names(tabelas.fac)[[i]] <- fatores[i] } } # Saídas Numéricas -------------------------------------------------------- # aplicando a função sumario.base no data.frame e fazendo a transposição # para que fique mais legível. O objeto sumario.num é um dos componentes # da saída da função. sumario.num <- as.data.frame(t(sapply(df[,numericas],sumario.base))) # Por aqui termina o trabalho quando não há variável indexadora e começa # a segunda parte. ################################################################### ########################### Com Fatores ########################### ################################################################### # conferindo o argumento by. Se este existir... if(!is.null(by)){ # Saidas Graficas --------------------------------------------------------- # ... começa a construção dos gráficos. A partir das variáveis numéricas. for(i in 1:length(numericas)){ # criando o plot, definindo o df de trabalho, eixo y e agrupamento # com base no argumento by bp <- ggplot(df, aes_string(x = by, y = numericas[i]))+ # definindo o tipo do gráfico geom_boxplot() # criando o plot, definindo o df de trabalho e o eixo x... histo <- ggplot(df, aes_string(x = numericas[i]))+ # ...definindo o tipo de gráfico e... geom_histogram()+ # ... fazendo o facet com base no 'by'. # A disposição foi selecionada para possibilitar a comparação # da melhor maneira possível facet_grid(df[,by] ~ .) # criando o plot, definindo o df de trabalho, definindo as amostras... qq <- ggplot(df, aes_string(sample = numericas[i]))+ # ... definindo o tipo de gráfico e... stat_qq()+ # ... fazendo o facet. facet_grid(df[,by] ~ .) # criando o plot, definindo o df de trabalho, definindo o eixo x,... clev <- ggplot(df, aes_string( x = numericas[i]))+ # ... o eixo y... aes(y = row.names(df))+ # ... o tipo de gráfico ... geom_point()+ # retirando marcações indesejáveis e... theme(axis.text.y = element_blank())+ # fazendo o facet. facet_grid(df[,by] ~ .) # plotando todo mundo junto, ... multiplot(bp, qq, histo, clev, cols = 2) # ... salvando o gráfico,... plot.num <- recordPlot() # ... alocando na devida lista e... graficos.num[[i]] <- plot.num # nomeando. names(graficos.num)[i] <- numericas[i] } # para que não haja um gráfico 'by' vs 'by' bolei esta estratégia: # criei este contador para o for que vem a seguir e... cont.fac <- 1:length(fatores) # ... tirei do vetor a posição da variável 'by'. cont.fac <- cont.fac[c(-which(fatores == by))] # começando o for para a construção dos gráficos das categóricas for(i in cont.fac){ # criando o plot, definindo o df de trabalho, eixo x, ... barras <- ggplot(df, aes_string(x = fatores[i], # colorindo e ... fill = by, # agrupando por 'by' group = by))+ # definindo o tipo de gráfico e a posição das barras. geom_bar(position = position_dodge()) # plotando,... multiplot(barras) # ... salvando,... plot.fac <- recordPlot() # ... alocando e... graficos.fac[[i]] <- plot.fac # ... nomeando o gráfico. names(graficos.fac)[i] <- fatores[i] # Criando e alocando as tabelas de contingencia e... tabelas.fac[[i]] <- table(df[,by], df[,fatores[i]]) # ... nomeando as tabelas names(tabelas.fac)[[i]] <- paste(fatores[i], by, sep = 'VS') } ################################################################### ######################## Saídas Numéricas ######################### ################################################################### # começando a criação do df que levará o sumário numérico. sumario.num <- NULL # Abrindo um for para a confecção do sumario for(i in 1:length(numericas)){ # aplicando a função sumario.base através da indexação por 'by' # em um tapply. O objeto temporário é uma lista... tmp <- tapply(df[, numericas[i]], df[,by], sumario.base) # ... que é destrinchada em uma matriz e alocada em um df. tmp2 <- data.frame(matrix(unlist(tmp), nrow = length(tmp), byrow=T)) # O df é atualizado a cada iteração do for. sumario.num <- rbind(sumario.num, tmp2) } # Começa a arrumação do df... # ... primeiro nomeando as colunas,... colnames(sumario.num) <- colnames(tmp[[1]]) # ... depois inserindo os nomes das variáveis,... sumario.num$variavel <- rep(numericas, each = length(levels(df[,by]))) # ... e então os grupos às quais a linha pertence. sumario.num$grupo <- rep(levels(df[,by]), times = length(numericas)) # Finalizando com a facilitação da visualização. sumario.num <- sumario.num[,c(13:14, 1:12)] } ################################################################### ########################### Finalizando ########################### ################################################################### # Preparando a saída da função # Construindo a lista com os objetos que compõe a saída e... saida <- list(sumario.num, graficos.num, graficos.fac, tabelas.fac, correlograma) # nomeando-os. names(saida) <- c('sumario.num','graficos.num','graficos.fac', 'tabelas', 'correlograma') # Apresentando os resultados e fechando a função! return(saida) } ===== Help da função ===== Segue aqui o arquivo: {{:bie5782:01_curso_atual:alunos:trabalho_final:daniel.magalhaes.lima:help_exploratoria.txt|}} E aqui o texto. exploratoria() package:BIE5782 R Documentation Faz um análise exploratória básica. Description: A função recebe um banco de dados e avalia, automaticamente e através dos argumentos, quais são as variáveis categóricas e quais são as numéricas. Com base nesta relação a função plota diversos gráficos, tabelas de contingência e sumários estatísticos. Usage: exploratoria(df, by, to.factor, bin2factor) # default: # exploratoria(df, by = NULL, to.factor = NULL, bin2factor = T) Arguments: df Um data.frame. by Uma variável indexadora do seu data.frame. Passada entre "". to.factor Um vetor contendo os nomes das variáveis as quais o usário deseja coercionar para fator dentro da função. bin2factor Argumento lógico que variáveis apresentadas como binárias sejam interpretadas como fator. Details: Value: sumario.num Um data.frame que é composto de medidas de tendencia central, medidas de dispersão, contagem de zeros e de NAs para cada variável e suas possíveis categorias. graficos.num Lista de gráficos das variáveis classificadas como numéricas. graficos.fac Lista de gráficos das variáveis classificadas como categóricas tabelas Lista que contém as tabelas com as distribuições das variáveis categóricas correlograma Correlograma com coeficiente de correlação das variáveis numericas. Warning: Note: Author(s): Daniel Magalhães Lima References: # função multiplot() retirada deste livro: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ See Also: Examples: set.seed(5782) banco <- data.frame( grupo = sample(c('a', 'b'), 100, replace = T), medida1 = rnorm(100, 10, 2), medida2 = sample(c(0:5, NA), 100, replace = T), sexo = sample(0:1, 100, replace = T), repeticao = sample(1:3, 100, replace = T) ) # O basico: teste <- exploratoria(df = banco) View(teste$sumario.num) teste$tabelas # Usando os argumentos extras: teste2 <- exploratoria(df = banco, by = 'grupo', to.factor = 'repeticao') View(teste2$sumario.num) teste2$tabelas