Séries de cursos de R no Coursera e no EdX

Ola.
Esse post é só para compartilhar duas séries de cursos que acho bem interessante, para aprender mais sobre análise de dados e R.

Primeiro, no Coursera, a John Hopkins University está oferecendo uma série de cursos, na forma de uma especialização em Data Science.

São nove cursos no total, que tem duração de uma semana cada um. Os tópico de cada curso são bem específicos, mas eles se complementam muito bem, principalmente porque eles não são apenas sobre análise de dados, mas englobam todas as partes do processo de análise de dados.

Por exemplo, a gente tem o curso “Getting data and Cleaning data“. Esse curso achei muito legal, porque ele mostra varias formas de ler dados no R, das mais variadas fontes. Na maioria dos cursos que a gente faz, que eu fiz na faculdade pelo menos, a gente acaba ficando limitado a ler dados de arquivos do tipo delimitados por tabulações, e arquivos delimitados por vírgulas, e raramente a gente ainda entra no porque existe um read.csv e um read.csv2 no R. E essas coisas a gente vê nesse curso, ainda como abrir dados diretos do excel, que é talvez o lugar mais comum aonde os dados estão guardados na biologia em geral, mas também como ler dados de banco de dados sql, arquivos xml e páginas html, além de como ajeitar os dados, com o plyr por exemplo, e ler arquivos muito grandes, onde a read.table da vida pode falhar, já que ele tem que ler os dados e dar um parse neles, então ele ocupa bastante memoria.

Outro curso muito legal dessa série é o “Exploratory Data Analysis“, que ensina a fazer gráficos bonitos, além de esclarecer bastante coisas sobre como salvar e exportar os gráficos de várias formas, e usar o gráficos do tipo lattice, que quando os dados começam a ter muitas variáveis, começa a ficar mais difícil de representar graficamente, mas o lattice é uma mão na roda. Além de ver o ggplo2, que faz gráficos muito bonitos também, tem uma série de ferramentas legais, para fazer várias coisas bacanas, e que no final a gente acaba precisando para pelo menos conseguir ler código de outras pessoas, por mais que você prefira ou não usar o sistema base para gráficos. E gráficos são essenciais, quando alguém quer me mostrar alguma coisa, ou pede ajuda, eu sempre tento fazer alguma figura primeiro, para começar a entender o problema, nós, como seres visuais, ganhamos muito fazendo gráficos, e toda habilidade para fazer eles melhores é valida.

Não vou falar de todos os cursos aqui, mas a forma de avaliação também é bem interessante, porque além dos quizzes, perguntas de múltipla escolha para avaliação, todos praticamente envolvem alguma atividade prática, que você tem que fazer algum tipo de análise e escrever um relatório, que normalmente é usando R Markdown (um exemplo meu aqui, o relatório final do curso Practical Machine Learning, que tem que ser entregue num repositório do github), ou programar alguma coisa, como gráficos dinâmicos usando Shinny (minha primeira figura do shinny nesse repositório).
Isso é muito legal porque você recebe um feedback de pessoas, vê o trabalho de outros alunos para comparar, que vária de coisas ruins e erradas até trabalhos excepcionais, que faz você se perguntar porque a pessoa está fazendo o curso se está naquele nível tão avançado de conhecimento.

Os cursos recomeçam todo mês praticamente, então da pra fazer de um em um, ou mais de um por vez, e se não conseguir acompanhar, é só começar denovo, tendo a possibilidade de pagar para receber um certificado verificado, o que não deve ser muito útil no Brasil, mas eu pagaria somente pela qualidade do material (mas minha situação financeira não anda boa hehe).

Antes desses cursos, eu fiz um monte de cursos do pessoal da John Hopkins, e eles tem melhorado cada vez mais na qualidade dos cursos, acho que de tanto oferecer disciplinas no coursera, eles estão cada vez fazendo cursos mais legais, e num formato legal para atender o público em geral.

Bem, desde o ano passado eu comecei a tentar alguns cursos no EdX também, que é uma plataforma de ensino massivo online como o Coursera, mas que começou com o MIT e Harvard, talvez para competir com a popularidade do Coursera, que foi fundado por dois professores de Standford, Andrew Ng and Daphne Koller.

Bem o EdX tem muitos cursos que envolvem matemática, por causa do MIT provavelmente, que é bem legal para quem curte, mas ele abriu uma série de curso sobre R também, que são do professor Rafael Irizarry, uma coisa legal é que esse cara era professor la no mesmo departamento do povo que da os cursos da John Hopkins no Coursera, mas ele mudou para Havard, ai foi parar no EdX.

Mas ele vai dar uma série de cursos no EdX, todos usando R para análise de dados, começando com o Statistics and R for the Life Sciences, e na descrição desse curso, você pode ver os oito cursos que fazem parte dessa série. São mais coisas de análise para bioinformática, mas pode ser um boa oportunidade de aprender mais sobre o biocondutor, que é um projeto bem grande junto com o R.
Eu estou no primeiro curso, mas está parecendo bem interessante, é bem simples até, mas vale a pena seguir, até para seguir a série e ver a linha de raciocínio dele, e praticar.

Bem já que estamos falando de EdX, outros dois cursos que fiz la, que achei muito legais são o de Introdução ao Linux, muito legal para aprender as coisas que todo mundo acha que você sabe e você não tem ideia, pelo menos nos livros, as pessoas assumente sempre um conhecimento de linux que eu pelo menos nunca aprendi formalmente. Mas esse curso é bem básico, simples, mas ao mesmo tempo legal, ensinando pequenas coisas como pipes e sistema de arquivos do linux de uma forma que da para entender bem, além do que o curso é oferecido pela Linux Foundation. Outro curso é o Quantitative Biology Workshop que é uma salada mista de tópicos, mas bem legal para ver a matemática aplicada a biologia, eu já fiz até um tópico sobre um modelinho que vi neste curso aqui, mas ele, como um monte de curso do EdX, é feito usando Matlab, mas com um pouco de paciência, da para encarar o Matlab, e ir traduzindo o código para o R para conseguir fazer outras coisas, ou mesmo só porque é legal.

Bem as vezes são raros os cursos sobre análise de dados ou R que podemos participar, seja por tempo para estar presente em aulas, seja por falta de grana para viajar para onde esses cursos são ofertados, seja por disponibilidade de professores ou cursos mesmo nas instituições, então esses cursos online do tipo MOOC são uma grande oportunidade, tenho feito cursos assim a algum tempo e eu acho bem legal, o acesso que é proporcionado por eles, por exemplo, você ter aulas de caras muito bons na área, com uma ótima didática, já que as universidades não desviar um professor ruim para montar um curso desses, até porque eles são também uma propaganda da instituição, e o fato de que você pode falhar nos cursos sem grandes problemas, enquanto se você falha num curso na pós-graduação por exemplo, você pode perder até bolsa de estudos, dependendo das normas dos cursos, num MOOC ninguém nem precisa ficar sabendo. Mas na especialização em data science do coursera por exemplo, eu desiste de vários cursos várias vezes, antes de terminar, talvez porque as vezes eu era ganancioso e queria fazer muitos cursos de uma vez, e não dava conta de acompanhar tudo, ou porque perdia prazos de entregar os exercícios, mesmo o relatório mais simples, não da para fazer em uma hora, eu não consegui! E sempre da para aprender muito nas discussões nos fóruns de mensagens desses cursos.

Mas é isso ai, só queria comentar as possibilidades de cursos legais sobre R que tem por ai, pelo menos que eu conheço. Além do que eu acho cursos assim mais dinâmicos de ler livros de cara, a informação vem mais mastigadinha. Assim quando a gente vai ler um livro sobre o assunto, ou um artigo científico, tudo começa a ficar mais fácil de digerir, com a boa base que esses cursos vão dando, mas é claro que não podemos ficar somente neles. Mas eu sempre tento acompanhar pelo menos um curso, é sempre legal.

Até o próximo post, e qualquer sugestão de curso, ou oportunidade legal de aprendizado, deixa um comentário ou mande um e-mail, que eu quero saber 🙂

Rosalind – Rabbits and Recurrence Relations – FIB

Que emoção, peguei um problema no comecinho, acho que acabou de ser criado.

Antes de começar eu decidi que vou parar de numerar os problemas, acho que numeração é pouco útil, já que problemas vem e vão.

Então começando, aqui a pergunta envolve o uso da sequência de Fibonnaci, o artigo na Wikipédia é bem legal.
O exemplo clássico é o crescimento de coelhos, onde só casais tem filhos, quem esta sozinho não aumenta a população e isso tem que ser contabilizado.

A diferença aqui é que o problema pede para a gente dizer um número n da sequência, e essa sequência ainda terá outra condição que é o número de filhotes que um casal tem não precisa ser necessariamente 1.

01

Então ela tem uma cara de crescimento exponencial, e quanto mais filhotes um casal gera, mais rápido esse crescimento.

Eu acho que a idéia do problema era introduzir o conceito de programação dinâmica pelas explicações, mas para começar eu fiz uma função com o R bem “força bruta”.

fibonacci<-function(a1=1,a2=1,t=10,k=1) {
n<-vector()
n[1]<-a1
n[2]<-a2
for(i in 3:t) {
n[i]<-n[i-1]+k*n[i-2]
}
return(n)
}

Então entramos com a1 e a2, que são os valores iniciais, como descrito no problema, quanto tempo vamos observar (o número de números na serie) e k, que é quantos filhotes cada casal tem.
Esse k na verdade eu não consegui pensar automaticamente onde ele ia, eu multipliquei o primeiro número e depois que fui ver que so funcionava se multiplicar o segundo número da soma, para nunca cair a multiplicação em alguém que não tem par.

Feito isso a solução é simples, só usar a função.

out <- fibonacci(t=5,k=3) format( out[length(out)] , scientific = F) [1] "19"

Importante desligar o formato científico da notação numérica, já que rapidinho o número fica gigante e a resposta tem que ser o número sem notação cientifica, default no R.

O código para o gráfico no R foi esse:

plot(c(fibonacci(t=10,k=1))~c(1:10),xlab="Tempo",ylab="Casais",frame.plot=F,
pch=19,type="b",main="Sequência de Fibonacci")
points(c(fibonacci(t=10,k=2))~c(1:10),col=2,pch=19,type="b")
points(c(fibonacci(t=10,k=3))~c(1:10),col=3,pch=19,type="b")
points(c(fibonacci(t=10,k=4))~c(1:10),col=4,pch=19,type="b")
legend("topleft",col=1:4,pch=19,lty=1,legend=paste("k = ",1:4))

Problema solucionado, eu ainda consegui ser o terceiro a postar minha solução.

Mas como a idéia do problema era o uso de programação dinâmica, eu fui olhar o wikipedia do que se trata o tal do Dynamic programming, até porque em outro problema eu ja não tinha conseguido resolver com o R porque não vectorizei o problema, e o R demorava mais que os 5 minutos para a resposta do problema, e acabou que o python me iluminou, junto com a solução no stack overflow.

Mas a idéia é quebrar o problema em problemas menores, mesmo que similares, mas só computar a solução uma vez. Então em python eu tentei aplicar o primeiro algoritmo geral que esta no artigo do wikipedia sobre Dynamic programming.

def fib_rek(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib_rek(n-1) + fib_rek(n-2)

É muito louco pensar que a gente ta fazendo uma função que reutiliza ela, que reutiliza ela até o mais simples possível.

Então essa chamada de função ta re-chamando ela mesmo, que como descrito no wikipedia faz uma árvore assim para n=5

1 fib(5) 2 fib(4) + fib(3) 3 (fib(3) + fib(2)) + (fib(2) + fib(1)) 4 ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 5 (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

E após apanha um pouco, eu consegui adicionar o k, que é o número de filhotes para o casal, que aqui a gente tem que usar ele e passar o k para frente na função denovo, esse “passar para frente denovo” custou um tempo para assimilar.

def fib_rek(n,k):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib_rek(n-1,k) + k*fib_rek(n-2,k)

E por último, a outra solução que consiste em memorizar o resultado uma vez computado para não fazer a mesma conta 2 vezes. Como aqui eu ja não estava mais dando conta eu peguei uma solução na internet para olhar.

# dynamic programming
def fib_mem(n):
    m = []
    for i in range(n+1):
        m.append(-1)
    m[0] = 0
    m[1] = 1
    def fib_mem_rek(n):
        if m[n] != -1:
            return m[n]
        else:
            val = fib_mem_rek(n-1) + fib_mem_rek(n-2)
            m[n] = val
            return val
    return fib_mem_rek(n)

Então criamos uma lista vazia, enchemos de -1 (acho que o caso é encher de algo para comparar depois), preenchemos o começo da lista, e ai rodamos dentro outra função que, se o valor é diferente de -1, a gente deixa ele ja que ja esta solucionado, senão a gente soluciona. Eu acho que é mais ou menos isso, eu achei bem complicado. Mas uma vez recebida a função de mão beijada assim não é dificil adicionar a variação da produção de filhotes.

def fib_mem(n,k):
    m = []
    for i in range(n+1):
        m.append(-1)
    m[0] = 0
    m[1] = 1
    def fib_mem_rek(n,k):
        if m[n] != -1:
            return m[n]
        else:
            val = fib_mem_rek(n-1,k) + k*fib_mem_rek(n-2,k)
            m[n] = val
            return val
    return fib_mem_rek(n,k)

E para fechar, se alguém chegou nesse parágrafo, o coursera abriu uma disciplina de Bioinformática, que o conhecimento básico requisito é, tharararam, os primeiros problemas do Rosalind, e mais foda que isso, ela é dada pelos caras que fundaram o Rosalind. Não sei se vai ser difícil, mas pode ser uma oportunidade legal, eu estarei por la apanhando para a bioinformática :).

Modelo de crescimento populacional

A famosa equação de crescimento populacional, ou crescimento densidade dependente, ou crescimento logístico.

  {dN\over dt} = r\cdot N\cdot (1-{N\over K})

Ela foi descrita a primeira vez por Pierre François Verhulst, mas depois redescrita pelo Lotka, que o nome normalmente está associada a ela. Mas o interessante é que o Lotka foi quem começou a expandir ela, como no modelo de predador presa dos coelhos e dos linces.

Mas antes gente devia pensar, hoje, porque ainda vale a pena perder tempo olhando para essa equação? se a gente pode fazer modelos infinitamente mais complexos.

modelo

O problema que apesar da gente ser sim capaz de por exemplo usar o computador para produzir modelos melhores com muitas constantes e uma excelente capacidade de predição, um r² alto, eles serão difíceis de nos fornecer insights, de pensar o que esta acontecendo o que vai acontecer justamente porque são complexos. O modelo de crescimento populacional pode ser “ruim”, ter uma capacidade de previsão pior, mas rapidamente a gente consegue insights de como o mundo funciona olhando para ele.

Então vamos olhar melhor para essa equação diferencial, alias chama diferencial que ela fala a diferença de uma quantidade (N, tamanho populacional) dada uma diferença de tempo (t, tempo).
Além desses dois itens temos o r que é a taxa de crescimento.

Mas olhando ela a gente pode separar ela em duas partes.

Essa:

  r\cdot N

Que nos diz o que? A população cresce numa taxa R, e quanto maior o N, mais ela cresce, como o N cresce constantemente o crescimento é exponencial, considerando so esse pedacinho. Mas ele multiplica outra parte que é…

  (1-{N\over K})

Agora olha ai, é 1- N dividido por k, k é um numero fixo, a capacidade suporte e N é o tamanho da população. Aqui a gente pode pensar em termos de 3 momentos.
Primeiro quando a população N for bem pequenininha, vamos ter um número pequenininho divido por k, um numero grande, logo algo pequeno dividido por algo grande vai ser um númerozinho bemmmm pequeno, e 1 menos um numero pequeno, quase nada, da praticamente 1, logo o crescimento é rápido, praticamente exponencial.

Com o tempo o N vai aumentando, até o N ficar grande, quando o N ficar grande, vai ser um numero grande dividido por um numero grande, que vai dar 0, logo toda a equação vai ser multiplicada por 0 e o crescimento vai dar zero, assim a população se mantém estável no valor de k.

E por ultimo e muito interessante, é que se N for um numero maior que o K, o que vai acontecer?, a divisão vai ser um numero negativo maior que 1, logo 1 menos um numero negativo maior que 1 vai dar um numero negativo, e o crescimento vai multiplicar um número negativo, então vai ser negativo, e isso até ele voltar a população voltar a k.

Magnifico não?

podemos fazer uma função simples no R para calcular o crescimento logístico e ficar brincando com ela para ver se essas predições ocorrem. Alias isso é bem legal, ficar mudando os valores para ver se todas essas coisas funcionam assim mesmo.

#Função
dlogistic <- function(K= 100, rd = 1, N0 = 2, t = 15) {
N <- c(N0, numeric(t))
for (i in 1:t) N[i + 1] <- {
N[i] + rd * N[i] * (1 -N[i]/K)
}
return(N)
}
 
#Gerando a população com os argumentos padrão
Nts <- dlogistic()
 
#Grafico
t <- 15
k <- 100
plot(0:t, Nts,xlab="Tempo",ylab="Tamanho da População")
abline(h = k, lty = 3)
text(5,k-5,"Capacidade Suporte")

E temos nosso gráfico

01

Outra coisa ainda é pensar como diabos as pessoas pensam nessas formulas, o professor Gotteli demonstra como da para chegar na equação de crescimento logístico das taxas de natalidade e mortalidade.

Começamos que o crescimento é a natalidade menos a mortalidade

 {dN\over dt} = (b\cdot N-d\cdot N)*N

A taxa de natalidade de um momento vai ser o que nasceu em um ano menos o que nasceu no outro, lembrando que a natalidade não é constante, começa a falta alimento, espaço ela diminui, ou seja como esta mudando a natalidade, a mortalidade vai ser o mesmo esquema

 bN = b_{0}-b_{1}\cdot N

Substituimos isso para a natalidade e a mortalidade

 {dN\over dt} = ((b_{0}-b_{1}\cdot N) - (d_{0}-d_{1}\cdot N))\cdot N

Com algum algebrismo mexemos agora as coisa para ca, para la. Se você como eu é pessimo de algebra, pode estudar junto comigo aqui 🙂

 {dN\over dt} = (b_{0}-d_{0})\cdot N\cdot (1-{(b_{1}-d_{1})\over (b_{0}-d_{0})}\cdot N)

E no final temos a equação de crescimento logístico, igualzinho la em cima, so trocar esses termos por r e k.

  {dN\over dt} = r\cdot N\cdot (1-{N\over K})

Bem, vamos tentar falar um pouco mais disso, principalmente porque dessa equação que a gente chega em metapopulações, que é um conjunto de populações, ou se preferir um conjunto dessas equações heheh.

Referencias:

Soetaert, K, Herman, P M. J. – 2008 – A Practical Guide to Ecological Modelling Springer

Stevens, M. H. – 2011 – A Primer of Ecology with R Srpinger

Curso gratuito básico sobre o R

StatFact é um dos milhares de twitters que o John Cook mantém.

Eu comecei a seguir ele depois que vi que várias pessoas da lista R-Br seguem ele e alguns do milhares de twitters dele.

Nesse twitter ele posta quase todo dia uma dica sobre estatística, alguns fatos, artigos interessantes, discussões que tem desdobramentos interessantes em foruns ou blogs.

Essa semana ele postou um link legal, a editora O’Reilly mantém um site chamado Code School e que agora tem um cursinho de introdução ao R.

É bem legal, bem básico, ensina a criar vetores, matrizes e dataframes, como acessar e manipular eles de forma básica, e da uma idéia de como são feitos gráficos. Para quem tem uma noção de R vale a pena dar uma olhada para rever o básico. Eu mesmo sempre encalho fazendo script em coisas básicas.

Para quem não tem noção do que diabos é o R, é bem legal também, já que tudo é feito do navegador, então você não tem que instalar nada, so olhar o site. Fazer todos os comandos de janelinhas e ficar com uma noção do que é o R e como ele é usado.

O endereço do curso é http://tryr.codeschool.com/. Vale a pena a uma horinha investida, e da para logar da sua conta do facebook, então se todo mundo reclama de aplicativos de facebook, esse é legal e ensina a usar o R.

E da para aproveitar e ver o curso sobre o github para entender melhor como ele funciona, é uma excelente forma de controle de versão.

Para fechar, existe também o coursera, que administra vários moocs de muitas universidades, e em janeiro tem um curso sobre R que deve ser muito bom, Data Analysis com Jeff Leek, deve valer muito a pena participar e podemos ser companheiros de curso 🙂