====== Ana Cristina Fazza ======
{{ :bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:cris.jpg?300 |}}
Doutoranda em Genética e Biologia Evolutiva
Laboratório de Genética e Evolução Molecular de Aves
Instituto de Biociências, USP.
==== Exercícios ====
[[.:exec]]{{ :bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:dscf4835.jpg?300|}}
========= Proposta de projeto ========
**PLANO A**
A idéia inicial é criar uma função para colorir redes de haplótipos.
Um rede de haplótipos é uma representação gráfica da diversidade genética. Por meio dessa análise podem ser feitas diversas inferências como estruturação geográfica das populações, ocorrência de expansão demográfica, haplótipos ancentrais e derivados.
Diversos programas calculam redes de haplótipos utilizando diferentes algoritmos. O programa que eu utilizo para construir as redes de haplótipos é um programa gratuito. Esse programa possui a possibilidade de inserir informações para facilitar a coloração. Porém, para usar a função de colorir a rede tem que comprar um programa (associado ao "gratuito") de US$ 135 cuja licença dura apenas 1 ano! Ou seja, quem faz essa análise sem querer gastar esse valor anual tem que colorir os haplótipos um a um!
Se inicialmente eu opto por separar as populações por munícipio de coleta o que eu faço é o seguinte:
- uma tabela com os haplótipos e quais as amostras que possuem cada haplótipo
- associo com as amostras por localidade de coleta
- faço as divisões no gráfico de pizza de cada haplótipo manualmente e então resta "apenas" colorir um por vez
Se depois você acha que ficaria mais informativo se dividisse por região geográfica, você refaz tudo novamente, clicando com o botão direito sobre cada haplótipo, redividindo e recolorindo...
Por exemplo:
^Haplotipo^Amostra da espécie^Localidade^Rede 1^Região Geográfica^Rede 2^
|C| Individuo 128 | Serra do Chuchu | amarelo | Norte | Azul |
|A| Individuo 129 | Serra do Chuchu | amarelo | Norte | Azul |
|C| Individuo 200 | Fim do mundo | preto | Sul | Vermelho |
|B| Individuo 230 | Fim do mundo | preto | Sul | Vermelho |
|D| Individuo 256 | Fim do mundo | preto | Sul | Vermelho |
|A| Individuo 375 | Vale Encantado | vermelho | Norte | Azul |
|A| Individuo 567 | Vale Encantado | vermelho | Norte | Azul |
{{:bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:presentation1.jpg?600|}}
Bom...pode parecer tranquilo...mas quando tem muitas amostras/localidades é bem cansativo verificar uma por vez e colorir. Como isso:
{{:bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:apresentacao_do_projeto_para_o_lab_25.11.11.jpg?500|}}
E nem é uma amostragem tão grande...
Além do que tem sempre que conferir várias vezes se não fez nada errado.
É isso! ;-)
**PLANO B**
Fazer uma tabela frequencia e notas dos alunos.
Não é nada muito original, mas eu vou precisar fazer esse cálculo pelo excel em breve. Então, se conseguir fazer uma rotina no R será ótimo!
A idéia é que o arquivo de entrada contenha dados como nome, data das aulas contendo a informação se o aluno estava presente ou ausente para calcular sua frequencia geral no curso, notas de trabalhos e provas.
A estrutura básica do arquivo de entrada será mais ou menos assim:
^Nome^Aula 05.03.12^Aula 12.03.12^Aula 19.03.12^Aula 26.03.12^Trab 1^Trab 2^Trab 3^Prova 1^Prova 2^
|Joãozinho|Presente|Presente|Ausente|Presente|9.0|5.0|8.5|7.0|5.0|
e eu quero obter um arquivo de saída com os dados:
^Nome^Frequencia^Nota final^
onde nota final será a aplicação de uma fórmula somando os trabalhos e provas.
Bem mais simples que o Plano A, mas espero fazer os dois pelo menos para facilitar a minha vida ;)
====== Comentários ======
Sua explicação da rede é boa, colocou até o tipo de dado e fica fácil visualizar a tarefa da função. Entretanto, como nunca fiz nenhuma figura parecida, fica difícil avaliar a dificuldade que irá enfrentar. Acho que o desafio é grande para a primeira proposta e a segunda mais tranquila...
Rode o código abaixo para ter uma idéia das possibilidades, se conseguir estudar o código e entende-lo fica meio caminho andado para a proposta A (nao se assuste com o jeito que o codigo cria os objetos de dados, é uma forma que não apresetamos em aula!).
set.seed( 1 ) # fixa a semente aleatória
install.packages("network") ## instala pacotes necessários
install.packages("sna")
install.packages("Hmisc")
## sobe os pacotes instalados (mesmo que library)
require(network) # network
require(sna) # plot.network
require(Hmisc) # largest.empty
# Cria os dados a partir de uma linha de texto
## aqui poderia ser a tabela que postou!
con <- textConnection("name,age,jobyrs,inc,saved,int,chld,addryrs
Adam,21,1,46,110,3.9,2.62,16.46
Ben,32,6,82,110,3.9,2.875,17.02
Chris,22,2,38,93,3.85,2.32,18.61
David,46,16,158,110,3.08,3.215,19.44
Elvin,58,4,110,175,3.15,3.44,17.02
Fred,18,1,25,105,2.76,3.46,20.22
Greg,23,1,60,245,3.21,3.57,15.84
Henry,44,12,46,62,3.69,3.19,20
Ivan,32,2,40,95,3.92,3.15,22.9
James,29,5,67,123,3.92,3.44,18.3
Kevin,27,10,67,123,3.92,3.44,18.9
Luke,46,18,75,180,3.07,4.07,17.4")
nodelist <-read.csv(con)
close( con )
### Aqui são os dados das conexoes entre individuos ou no seu caso dos haplótipos
con <- textConnection("from,to
Adam,Ben
Adam,Chris
Chris,David
Chris,Elvin
David,Fred
Fred,Greg
Greg,Henry
Henry,James
Henry,Ivan
James,Kevin
Ivan,Kevin
Kevin,Luke")
edgelist <- read.csv(con) ## lendo o texto anterior e colocando em um data frame
close( con )
str(edgelist)
nodes <- levels(as.factor(nodelist[[1]]))
# Uma matrix que ira representar as conexoes da rede, preenchida com zeros
m <- matrix(data = 0, nrow=length(nodes), ncol=length(nodes))
rownames(m) <- colnames(m) <- nodes
## aqui uma função para colocar 1 na matrix m onde há conexao entre os elementos
linque1<-function(x){ m[x[[1]], x[[2]]] <<- 1}
## aplicando a função para preencher o m usando os dados de edgelist
apply(edgelist, 1, linque1 )
## veja como ficou a matrix m e compare com a edgelist:
m
edgelist
### preparando o grafico
graph <- network(m, matrix.type="adjacency")
# primeiro plot as linhas de conexoes entre os individuos (haplotipos)
par(xpd=TRUE)
## aqui pega os x y do objeto montado anteriormente e plot as ligacoes
xy <- plot(graph, vertex.cex=5, vertex.col="white", vertex.border=0)
# aqui procura um espaço vazio para plotar uma legenda (pizza)
kl <- largest.empty(xy[,1], xy[,2], 2, 2)
# aqui plot os dados
stars(nodelist[-1], labels=nodelist[[1]], locations=xy, draw.segments=TRUE,
key.loc=c(kl$x, kl$y), add=TRUE)
--- //[[adalardo@usp.br|Alexandre Adalardo de Oliveira]] 2012/04/03 18:07//
====== TRABALHO FINAL - PLANO B ======
Como o Ale disse nos comentários, o Plano A realmente foi um desafio muito grande para a minha primeira função, então eu não consegui...ainda! (Porque se até o Pink ficou inteligente em um episódio, eu ainda tenho a esperança de conseguir, em alguma noite, finalmente fazer esse Plano A!)
Segue o código para o Plano B.
== Código da função ==
#funcao para gerar frequencia e medias finais dos alunos
notafinal <- function(x, n.aulas, n.notas, grafico=TRUE)
{
alunos <- x[,1]
frequencia <- x[,2:n.aulas+1]=="Presente"
freq <- rep (0, dim(x)[1])
for (i in 1:dim(frequencia) [1])
{
freq[i] <- paste(round(sum(frequencia[i,])/dim(frequencia)[2]*100, 2), "%")
}
notas <- x[,(n.aulas +2):(n.aulas + n.notas +1)]
media <- rep (0, dim(x)[1])
for(k in 1:dim(notas)[1]) #calcula média com peso 1
{
media[k] <- sum(notas[k,1:n.notas])/n.notas
}
aprovacao <- rep (0, dim(x)[1])
for(i in 1:length(media))
{
if(media[i] >= 5)
{
aprovacao[i] = "Aprovado"
}
else
{
aprovacao[i] = "Reprovado"
}
}
if (grafico==TRUE)
{
x11()
plot(alunos, media, ylab="Médias", main="Rendimento da turma", pch=19, las=3)
abline(h=mean(media), col="blue")
abline(h=6, col="red")
legend(7,4,legend=c("Média da turma", "Média para aprovação"),pch=c("_", "_"),bty="n", col=c("blue", "red"))
}
final <- data.frame(alunos, freq, media, aprovacao)
return(final)
}
== Página de ajuda ==
notafinal package:unknown R Documentation
Nota final e frequencia dos alunos
Descrição:
Função para calcular a frequencia dos alunos nas aulas e media final
calculada pela média aritmética simples dos trabalhos e provas. E mostra o
rendimento da turma, com a média de notas dos alunos e a média necessária
para a aprovação.
Uso:
notafinal(x, n.aulas, n.notas, ...)
Argumentos:
x: tabela com nome dos alunos na primeira coluna, seguida pela informação
"Presente" ou "Ausente" para cada aula, e notas de exercicios e provas.
n.aulas: valor para o número de aulas.
n.notas: valor para o número de avaliações.
grafico: argumento lógico, por padrão TRUE, retorna o rendimento da turma.
Se FALSE, não retorna gráfico.
Autora:
Ana Cristina Fazza
Exemplos:
##exemplo para rodar a funcao
baixar o arquivo "exemplo.csv"
planilha <- read.table("exemplo.csv", header=T, sep=";") #nao usar row.names=1
notafinal(planilha, 10, 7)
##exemplo para rodar a funcao sem baixar o arquivo
alunos <- c("Homer", "Marge", "Bart", "Lisa", "Maggie", "Fred", "Wilma", "Pedrita", "Barney", "Betty", "Bambam")
aula <- matrix(sample(factor(c("Presente", "Ausente"))), ncol=10, nrow=length(alunos))
notas <- matrix(sample(round(rnorm(11, 7.5, 2), 2)), ncol=7, nrow=length(alunos))
planilha <- data.frame(alunos, aula, notas)
notafinal(planilha, 10, 7)
== Arquivos ==
{{:bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:final3.2.r|Código da função}}{{:bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:help2.txt|Arquivo de ajuda}}
{{:bie5782:01_curso_atual:alunos:trabalho_final:crisfazza:exemplo.csv|Exemplo}}