Índice
- O Curso R
-
- Tutoriais
-
- Apostila
-
- 6. Testes de Hipótese (em preparação!)
- Exercícios
-
- Material de Apoio
-
- Área dos Alunos
-
- Cursos Anteriores
-
IBUSP
Outras Insitutições
Linques
Visitantes
Outras Insitutições
Possui mestrado pelo Instituto de Botânica de São Paulo e é aluna do doutorado do programa de pós da Biologia Vegetal da UNICAMP. Trabalha com ecofisiologia do uso do nitrogênio em espécies arbóreas da Mata Atlântica.
A proposta A tem como objetivo gerar uma função que pegue uma planilha com dados de resposta de alunos numa prova de alternativas e um data frame com o gabarito e a partir desses dois documentos gerasse uma lista com gráficos, dados de estatística e uma planilha com a nota e o número de acertos de cada aluno para avaliar o rendimento da classe. Os gráficos seriam um histograma com as notas da classe e outro com número de acertos e erros por questão.
Eu tive essa ideia porque ano passado dei aula numa escola que realizava uma série de simulados preparatórios para o SARESP e depois deles sempre havia uma reunião analisando o desempenho geral por turma, em que eram analisados gráficos de desempenho por matéria e desempenho geral. A parte anterior a essa reunião que era a correção e contagem de acertos e erros por questão era muito demorada e trabalhosa e talvez essa função facilitasse nessas avaliações gerais.
Essa proposta seria uma etapa anterior à proposta A, ela geraria o data frame que tem a tabela de respostas dos alunos a partir da imagem das fichas de resposta preenchidas pelos alunos. Essas fichas seriam células com o número das questões e cada alternativa, os alunos pintariam a alternativa que acham corretas. Então essa função seria capaz de reconhecer qual célula estaria preenchida e não preenchida pelo padrão claro/escuro presentes nas células. Elas poderiam comparadas com um gabarito correto da prova que seria uma imagem scaneada, gerando a resposta certo ou errado de acordo com a imagem ou sem essa imagem dando as letras correspondentes de resposta de cada questão, seria uma dessas duas opções.
Então as entradas seriam as imagens scaneadas, que estariam numa pasta ou no próprio diretório de trabalho, que gerariam um data frame com as letras correspondentes as células preenchidas. Nesse data frame também haveria uma coluna com o nome do arquivo que identificaria de que arquivo saiu cada imagem.
Ola Janaina,
Apesar de que é uma tarefa bem geral e poderia ser útil para outras pessoas, achei a proposta A pouco desafiadora. Eu procuraria um problema mais biológico relacionado com sua pesquisa em ecofisiologia. Existe algum cálculo geral ou tarefa que poderia ser resolvida com uma função no R? Se depois de esgotar as possibilidades não tiver nenhuma ideia melhor, vá em frente e tente a proposta A.
Sobre a proposta B, ela é uma função que eu nunca vi ser realizada no R, apesar de que deve ser possível. Mas não faço ideia de como e acho que foge um pouco do escopo do curso. Portanto, sugiro descartar completamente.
Eu tive essa ideia da proposta B, porque tinha visto um trabalho de uma aluna do ano passado que trabalhava com uma imagem e usava o R pra fazer a contagem do número de células de cria nos favos de mel, então achei que poderia também trabalhar com leitura de uma imagem de outra forma. Como essa foi descartada, apresento outra proposta.
Vou analisar a presença de gases NH3, NO e NO2 presentes na atmosfera na minha área de trabalho e pretendo fazer a correlação dessas medidas com as condições climáticas (temperatura, umidade e precipitação) em cada estação. Para isso, farei medidas mensais, sendo várias medidas num mesmo mês (5 dias por mês) e várias medidas por dia (4 medidas por dia), esses dados seriam organizados num data frame. A partir desses dados, gostaria que a minha função fizesse a média diária e mensal e a partir da média mensal fizesse a correlação com os dados de clima gerando os resultados de correlação por estação. Então a minha entrada seria um data frame, com os dados climáticos, mês de coleta e concentração dos gases. A saída seria uma tabela com os dados da correlação por estação de cada gás.
Opa! Acho que melhorou bastante e este pode ser um caminho interessante. Lembre-se que a função deve ter generalidade e isto deve estar explícito na sua função e no help dela. Então pense e formule melhor qual é a tarefa “geral” que a sua função irá realizar? Transformar observações diárias em médias diárias e mensais? Este é um primeiro passo. Depois ela irá gerar análises de correlação e irá sumarizar isto em uma tabela, certo?
Outro aspecto importante é a função ter algum grau de desafio. A proposta C é factível mas me parece pouco desafiadora. Talvez incluir alguma outra tarefa importante seja interessante para deixá-la mais atraente e podermos avaliar melhor o que você aprendeu durante o curso. Por exemplo, outra saída da função poderia ser um painel de diagramas de dispersão com as correlações plotadas.
Estou postando a minha função e na hora de criá-la vi que não era necessário calcular as médias para realizar o calculo de correlação, mas como tinha falado que faria isso, resolvi criar um argumento e fazer o calculo das médias a partir de um fator como um resultado separados. Coloquei a outra saída sugerida, um painel com diagramas de dispersão com as correlações plotadas.
CorPlotM package:unknown R Documentation Cálcula as correlações e gera um gráfico com os dados utilizados Description: A função calcula as correlações em um grupo de dados por subgrupos, gera uma figura com um painel de diagrama por dispersão de x por y e calcula as médias a partir de uma lista. Usage: CorPlotM(x, y, INDEX, na.rm=FALSE, plot=TRUE, save.plot=FALSE, media.fac=””) Arguments: x um vetor numérico ou um data frame nos quais se deseja comparar com cada coluna de y. y um vetor numérico ou data frame com número de linhas compatíveis com x. INDEX uma lista de fatores, do mesmo tamanho do número de linhas. na.rm lógico. Indica se NAs devem ser removidos. plot lógico. Se verdadeiro (TRUE), um painel com os diagramas de dispersão são plotados (uma janela para cada x) com as correlações plotadas. Se falso (FALSE), somente as correlações são informadas. save.plot lógico. Se verdadeiro (TRUE), os gráficos plotados são salvos no diretório de trabalho em uso em formato PNG. media.fac uma lista sobre como os elementos devem ser agrupados caso queira calcular da média dos dados por coluna. Details: x e y são subdivididos de acordo com os fatores presentes no argumento INDEX e a correlação é realizada em cada grupo de valores presentes por coluna de x com todas as colunas de y, sendo realizada a correlação por um y por vez. A função media.fac faz a média tanto de x como de y, por coluna segundo o agrupamento informado no formado lista, é necessário colocar list(vetor) para que esse calculo seja utilizado. Ao colocar na.rm igual a TRUE, todos os NAs presentes serão retirados do calculo pela deleção de Casewise. Se for FALSE, quando houver dados perdidos o resultado informado será NA. Value: Retorna uma lista com as correlações entre x e y por INDEX. Se o plot for igual a TRUE também retorna um painel com os diagramas de dispersão e as correlações plotadas. Se informada uma lista em media.fac, dentro da lista é retornada a média por agrupamento informado. Author(s): Janaina Gomes da Silva Examples: #criando um data frame Estação<-rep(c("Inverno","Verão"),each=12) Mês<-rep(c("Junho","Julho","Agosto","Dezembro","Janeiro","Fevereiro"),each=4) Dia<-rep(c(1,2), times=12) set.seed(42) Conc.NH3<-c(runif(12,1,3.8),runif(12,2,5)) set.seed(42) Conc.NO2<-c(rnorm(12,45,10),rnorm(12,15,5)) Prep<-rep(c(25,15,12,150,200,300),each=4) Temp<-c(rep(c(20,23),times=2),rep(c(25,21),times=2), rep(c(25,23),times=2), rep(c(32,30),times=2),rep(c(30,28),times=2),rep(c(33,31),times=2)) Umi<-c(rep(c(30,32),times=2),rep(c(40,50),times=2), rep(c(20,27),times=2), rep(c(50,55),times=2),rep(c(60,70),times=2),rep(c(55,60),times=2)) dados<-data.frame(Estação,Mês, Dia,Conc.NH3,Conc.NO2,Prep,Temp, Umi) #correlação e médias sem plot CorPlotM(dados[,4:5],dados[,6:8],dados$Estação, plot=FALSE, media.fac=list(dados[,2],dados[,3])) #correlação com plot e sem calculo de médias CorPlotM(dados[,4:5],dados[,6:8],dados$Estação)
CorPlotM<-function(x,y,INDEX,na.rm=FALSE,plot=TRUE,save.plot=FALSE,media.fac="") { #cria objetos para usar na função INDEX<-INDEX y.names<-y x<-x xdata<-data.frame(x,INDEX) y<-data.frame(y,INDEX) #conta número de colunas nx=length(x) ny=length(y)-1 nindex=length(unique(INDEX)) # cria uma matriz e uma lista para colocar resultados resultados.cor<-matrix(NA,nindex,ny) resultados.tudo<-list() # atribui nomes para as linhas e colunas colnames(resultados.cor)<-names(y.names) rownames(resultados.cor)<-names(x) #cria um objeto para cores e símbolos cor.p<-c(2:50) simb.p<-c(16:25,1:15) for(i in 1:nindex) { #separar por grupo de interesse xsub<-subset(xdata,subset=xdata$INDEX==unique(INDEX)[i]) ysub<-subset(y,subset=y$INDEX==unique(INDEX)[i]) for(j in 1:nx) {#seleciona a coluna de x que será feita a cor x.col<-data.frame(xsub[,j],xsub$INDEX) for(l in 1:ny)#para calcular por coluna de y { if(na.rm==FALSE)#se for falso, quando NAs presentes retorna NA como resultado { resultados.cor[j,l]<-cor(x.col[,1],ysub[,l],use="everything",method="pearson") } if(na.rm==TRUE)#se for verdadeiro, os NAs presentes são removidos do calculo { resultados.cor[j,l]<-cor(x.col[,1],ysub[,l],use="na.or.complete",method="pearson") } } } #armazenas os resultados da matriz em uma lista resultados.tudo[[i]]<-resultados.cor } media.fac<-media.fac if(class(media.fac)=="list") { #cria um data frame com as coluna de x e y juntas dataxy<-data.frame(x,y[,-(length(y))]) #conta o número de colunas e armazena num objeto ndata<-length(dataxy) if(na.rm==FALSE) { result.med<-aggregate(dataxy[,1:ndata],media.fac,mean) } if(na.rm==TRUE) { result.med<-aggregate(dataxy[,1:ndata],media.fac,mean,na.rm=TRUE) } } if(plot==TRUE)#mostras o painel de dispersão { if(save.plot==TRUE)#salva os gráficos no formato PNG { png(filename = "Plot%02d.png", bg = "transparent") #criação do gráfico for(m in 1:nx) { #definições do gráfico- geração do número de linhas e colunas a partir do número de colunas de y, #caixa do gráfico em L, tamanho das marcas de escala, proximidade da legenda xy dos eixos, #largura da área exterior ao gráfico,das margens, plotagens somente na área do gráfico, #tamanho da letra nos eixos e tamanho da legenda das legendas dos eixos par(mfrow=rev(n2mfrow(ny)),bty="l",tcl=-0.3, mgp=c(1.2,0.3,0),oma=c(0,0,2,0), mar=c(3.8,2.5,4.1,1), xpd=FALSE, cex.axis=0.8, cex.lab=0.8) #nome da coluna de x utilizada e criação do objeto X que será usado no gráfico ylab.scp<-colnames(x[m]) X<-x[,m] for(f in 1:ny) { Y<-y[,f]#criação do objeto com a coluna correspondente que será utilizada no gráfico xlab.scp<-colnames(y[f])#nome da coluna y utilizada #gráfico xy com legendas a partir dos objetos já criados, direção da legenda ao eixo, #definição de cores e do símbolo a ser utilizado plot(X~Y, xlab=xlab.scp,ylab=ylab.scp, las=1,col=cor.p[INDEX], pch=simb.p[INDEX]) #geração das linhas de regressão por INDEX for(ab in 1:nindex) { Xd<-data.frame(X,INDEX) Yd<-data.frame(Y,INDEX) #subdividindo de acordo com grupo de interesse Xlm<-subset(Xd,subset=Xd$INDEX==unique(INDEX)[ab]) Ylm<-subset(Yd,subset=Yd$INDEX==unique(INDEX)[ab]) cor.l<-1+ab abline(lm(Xlm[,1]~Ylm[,1]),col=cor.l) } } #criação da legenda, objetos para cores e pontos cor.p<-2:(1+(length(unique(INDEX)))) pnt<-15:(14+(length(unique(INDEX)))) #permite plotagem fora da área do gráfico par(xpd=NA) #legenda, com localização fora da área do gráfico e sem caixa desenhada legend("topright",inset=c(0,-0.25), legend=unique(INDEX), pch =pnt, col=cor.p, bty="n") #título fora da área do gráfico mtext("Painel com Diagramas de Dispersão", outer=TRUE) } #fecha janela dos gráficos e salva as figuras no diretório de trabalho dev.off() } #criação do gráfico, como as funções PNG e X11 apresentavam conflito, a solução foi repetir a criação do gráfico for(m in 1:nx) { X11() par(mfrow=rev(n2mfrow(ny)),bty="l",tcl=-0.3, mgp=c(1.2,0.3,0),oma=c(0,0,2,0), mar=c(3.8,2.5,4.1,1), xpd=FALSE, cex.axis=0.8, cex.lab=0.8) ylab.scp<-colnames(x[m]) X<-x[,m] for(f in 1:ny) { Y<-y[,f] xlab.scp<-colnames(y[f]) plot(X~Y, xlab=xlab.scp,ylab=ylab.scp, las=1,col=cor.p[INDEX], pch=simb.p[INDEX]) for(ab in 1:nindex) { Xd<-data.frame(X,INDEX) Yd<-data.frame(Y,INDEX) Xlm<-subset(Xd,subset=Xd$INDEX==unique(INDEX)[ab]) Ylm<-subset(Yd,subset=Yd$INDEX==unique(INDEX)[ab]) cor.l<-1+ab abline(lm(Xlm[,1]~Ylm[,1]),col=cor.l) } } cor.p<-2:(1+(length(unique(INDEX)))) pnt<-15:(14+(length(unique(INDEX)))) par(xpd=NA) legend("topright",inset=c(0,-0.25), legend=unique(INDEX), pch =pnt, col=cor.p, bty="n") mtext("Painel com Diagramas de Dispersão", outer=TRUE) } } #retorna parametros iniciais do par par(mfrow=c(1,1),bty="o",tcl=-0.5, mgp=c(3, 1, 0), mar=c(5, 4, 4, 2), xpd=FALSE, cex.axis=1, cex.lab=1) #nomeia listas com os nomes das colunas de x names(resultados.tudo)<-paste(c(unique(INDEX)[1:nindex]) ) #nomeia listas com os nomes das colunas de x lev.INDEX<-unique(INDEX) fac.INDEX<-factor(INDEX,levels=lev.INDEX) names(resultados.tudo)<-paste(c(levels(fac.INDEX)[1:nindex]) ) #acrescenta nome por dados de correlação cat("\n Dados de correlação\n") #apresenta resultados na tela, com o calculo da média ou sem ele if(class(media.fac)=="list") { list(resultados.tudo,Médias.por.fator=result.med) } else { list(resultados.tudo) } }