Sociedade, caos e complexidade

(Quinto post da série. Veja os outros: Parte 1, Parte 2, Parte 3 e Parte 4.)

 

O argumento principal aqui é bem simples: Modelos matemáticos e computacionais não serão  “a última palavra” nas ciências do comportamento humano.


Seção 1 – O Demônio de Laplace e o Relógio de Einstein

Imagine que por um segundo você soubesse exatamente onde estão todas as coisas que existem no universo, bem como a dirA-Clockwork-Orange-a-clockwork-orange-18133446-1024-768eção para onde se movem, suas velocidades e acelerações relativas — tudo. E agora? Sabendo de todas essas coisas seria possível prever os próximos estados, o futuro? O universo se comportaria como uma mesa de bilhar em que, teoricamente, é possível saber exatamente o que vai ocorrer com todas as bolas depois da primeira tacada? Noutras palavras, o universo seria um sistema determinístico, fruto de uma cadeia “mecanismística” de causas e efeitos?

Foi exatamente nisso que estava pensando Pierre Laplace quando formulou sua famosa conjectura, bastante conhecida como “Laplace’s Devil“:

“Vemos o estado presente do universo
como efeito dos estados antecedentes e
como causa dos estados que se seguem.
Uma inteligência superior que conhecesse
todas as forças atuantes na natureza em
dado instante, assim como as posições
momentâneas de todas as coisas no
universo, seria capaz de compreender numa
simples fórmula os movimentos dos grandes
corpos assim como dos simples átomos do
mundo…”

— Conjectura de Laplace. Tradução de Eleutério Prado.

Expressão máxima do materialismo determinista, sonho utópico da ciência que têm na Física Newtoniana sua matriz de inspiração. Mas o universo não pára, não sabemos onde estão todas as coisas, nem como se movem etc.

Mas suposição continua guiando, como um horizonte distante, empreendimentos diversos. “Deve haver alguma regularidade, uma lei, uma fórmula, qualquer coisa…”. Os gregos (pitagóricos) acreditavam que a regularidade estava nas formas geométricas e proporções perfeitas subjacentes a todas as coisas. Galileu inaugura uma nova fase, dizendo que a matemática é a língua pela qual Deus escreveu o universo — e Newton de fato desvela o léxico, a sintaxe e a morfologia de boa parte dessa língua. Agora não só a estática (a forma) é regular, mas também o movimento.

Sim… o universo deve mesmo ser esse grande mecanismo. Toda laranja é mecânica, todo orgânico é mecânico; tudo, no fundo, deverá um dia se reduzir à Física. Vamos mais longe: é possível que não haja “alma”, “além”, nada… Nossos processos mentais devem, no limite, se constituir apenas de uma imensa, complexa e incomensurável rede de cadeias causais puramente materiais; consequência da Seleção Natural operando por 3,5 bilhões de anos. Sim! Sim!

Mas não… ainda não sabemos de fato de todas essas coisas. Apenas supomos, temos fé. Confortados e atormentados pelo Demônio de Laplace, observamos o universo acontecendo, como quem observa um relógio fechado:

“Na tentativa de perceber a realidade, nós somos de certa forma como um homem que tenta perceber o mecanismo de um relógio fechado. Esse homem vê o mostrador, os ponteiros e até ouve o tique-taque, mas não tem meios para abrir a caixa. Se o homem for engenhoso, pode imaginar um mecanismo que poderá ser responsável por tudo que observa, mas nunca poderá ter a certeza de que o mecanismo por si imaginado é o único que pode explicar suas observações.”

A. Einsten

(Sei que é brega citar frases “profundas” do Einstein e que muitas delas são fake. Mas essa é verdadeira, eu garanto. E caiu aqui como uma luva).


Seção 2 – O mecanismo da amizade, a matemática dos amantes

Recent-Study-Suggests-Over-85-Of-Social-Media-Users-Cant-Correctly-Solve-Simple-Math-Equation.jpgNa Matemática encontramos o modelo mais simples que encarna as propriedades ansiadas pela Conjectura de Laplace: uma Progressão Aritmética (PA). Veja o exemplo abaixo:

x_{t+1} = r + x_t

Sabendo o valor da primeira realização da sequência ( x_{t} ) e da variação acrescentada em cada iteração (r), podemos deduzir todos os demais pontos. Se x_{0} = 4r = 3, então x_{10} será 34. Ou seja, se sabemos os estados iniciais e as propriedades da variação, uma sequência determinística como essa nos dá qualquer resultado.

As fórmulas da Física clássica funcionam exatamente assim: movimentos através do tempo podem ser compreendidos como sucessões de uma série matemática (às vezes discreta, como uma Progressão Aritmética ou Geométrica simples, dessas que aprendemos na escola; às vezes contínua, delineando variações infinitesimais). Se lançamos uma bola de canhão, ela seguirá uma trajetória em forma de parábola e, sabendo a posição e a velocidade iniciais, podemos saber a posição, aceleração, velocidades horizontal e vertical em todos os pontos. Vocês já notaram isso antes? Aquela famosa fórmula do movimento retilíneo uniformemente variado é parente da PA:

S_t = S_0 + V_0t + \frac{at^2}{2}

A posição em qualquer momento do tempo (S_t) pode ser conhecida se soubermos a posição inicial (S_0), a velocidade inicial (V_0) e a aceleração da gravidade (a). Será que conseguiríamos fazer o mesmo para as ciências sociais? Será que conseguiríamos obter fórmulas do tipo:

PIB_t = PIB_0 + r(t)

Ou então:

DesigualdadeDeGenero_t = DesigualdadeDeGenero_0 + r(t)

Ou mais ainda:

SituacaoDaSociedadeBrasileira_t = SituacaoDaSociedadeBrasileira_0 + r(t)

Será!? Descobrir uma fórmula como essa foi exatamente o feito de Harry Seldon, personagem de Isaac Asimov na série de livros A Fundação. Seldon inventou uma ciência preditiva do comportamento social agregado, a Psychohistory (ou Psico-história), capaz de deduzir estados futuros séculos a frente. Aqueles que acompanharam os livros se lembrarão que seu feito inicial foi justamente descobrir as relações e regras de movimento (as fórmulas, por assim dizer). Mas faltava-lhe determinar os parâmetros iniciais corretos, calibrar o seu modelo (saber o S_0, por assim dizer). Depois de descobertos esses estados iniciais, foi só tocar o play.

A Psychohistory ainda não foi inventada… Mas tentamos elaborar fórmulas daquele tipo o tempo todo. Uma das mais conhecidas, em Economia, é o modelo modelo de Mincer (1958):

log[Y(S)]= log[Y(0)] + rS

Ela diz que o logaritmo da renda de uma pessoa com S anos de estudo é igual ao logaritmo da renda de uma pessoa com zero anos de estudo adicionado do retorno (r) pelos S anos de estudo. Ou seja, é possível “prever” a renda de qualquer pessoa, se soubermos Y(0), r e S. Obviamente as coisas não funcionam bem assim… Por isso, considera-se a existência de uma variação aleatória:

log[Y_i(S)]= log[Y_i(0)] + rS_i + \epsilon_i

Posteriormente, Mincer (1974) incorporou variações devidas ao ciclo de vida e on-the-job training. Sua equação, no formato mais famoso, é:

log[Y_i(S)]= \beta_0 + \beta_1X + \beta_2X^2 + rS_i + \epsilon_i

Na Sociologia, também temos inúmeros exemplos de fórmulas como essa. Vocês encontrarão diversos exemplos no excelente artigo Cumulative Advantage as a Mechanism for Inequality, de DiPrete e Eirich (2005).

Mas os problema são sempre os mesmos:

  • Suposições fortes são feitas com respeito ao funcionamento da sociedade e ao comportamento dos indivíduos. Na primeira versão da fórmula de Mincer, assume-se que todos os indivíduos são homogêneos (idênticos em termos de recursos, oportunidades, acesso ao crédito, preferências etc.) e que a soma dos rendimentos acumulados de todo curso de vida é sempre idêntica. Um indivíduo que não vai à escola, recebe diversas “parcelas” de salários menores. Um indivíduo que vai à escola, deixa de receber vários salários (pois estudava em tempo integral); mas depois é compensado, recebendo parcelas maiores (que são o “retorno” pelo investimento). Mas ambos receberam o mesmo montante. Forçado demais né? O segundo modelo é mais flexível, mas também tem pressupostos absurdos. James Heckman revisou esses pressupostos num incrível artigo.
  • Como obter o valor dos parâmetros? Geralmente o que se faz é estimar empiricamente, através de Estatística/Econometria. O problema é que parâmetros obtidos desta forma não são necessariamente os “verdadeiros”, que estariam por traz do fenômeno. Já falei disso aqui no blog, quando discuti Variáveis Instrumentais e Causalidade (nessa e nessa ocasião).

Seção 3 – A explicação generativista

Thematrixincode99.jpgAgent-based models são uma forma de lidar com esse problema — obviamente, também insuficiente, mas muito mais flexível.

Conseguimos fazer suposições mais “realistas” (agente heterogêneos, racionalidade limitada, informação incompleta, interações locais etc.). Podemos mais facilmente estabelecer dinâmicas que entrelaçam esferas distintas (aspectos demográficos, políticos, econômicos, históricos etc). Podemos estudar a dinâmica — e não apenas os pontos de equilíbrio estáticos  — com muito mais facilidade do que através de Dinâmica Comparativa e uso de equações diferenciais.

O problema, é que, como disse Galileu, Deus escreveu a natureza utilizando a linguagem da Matemática — e não da computação. Economistas e formalistas, dados às equações, não costumam ser muito receptivos aos ABMs. Fórmulas dão elegância, altivez e “cheiro de Ciência”, com C maiúsculo. Quem nunca se encantou com e = mc^2? Três letrinhas e um número — e dentro deles jaz a chave para a bomba atômica e para a viagem interestelar. Algoritmos são atrapalhados, longos, expressos em diversos dialetos (R, Python, C, C++, Java…). E o pior de tudo: não garantem uma resposta única para um mesmo problema. Pessoas diferentes poderiam chegar a implementações completamente díspares.

Entretanto, o método das “Sociedades Artificiais” tem suas vantagens. A primeira delas é estabelecer um novo parâmetro de validação científica: para explicar um fenômeno, é preciso compreender exatamente o funcionamento dos seus mecanismos geradores; tendo compreendido-os, é possível implementá-los em um ambiente in vitro (uma simulação) e observar se os padrões emergentes são os mesmos observados empiricamente. Nas palavras de Joshua Epstein: “If you didn’t grow it, you didn’t explain it”:

Or, in the notation of first-order logic:

epstein
To explain a macroscopic regularity x is to furnish a suitable microspecification that suffices to generate it. The core request is hardly outlandish: To explain a macro-x, please show how it could arise in a plausible society. Demonstrate how a set of recognizable–heterogeneous, autonomous, boundedly rational, locally interacting–agents could actually get there in reasonable time. The agent-based computational model is a new, and especially powerful, instrument for constructing such demonstrations of generative sufficiency.

Epstein

Nesse texto referenciado, Epstein insiste ainda que mesmo nos ABMs, Equações Existem. Mas trata-se de uma outra forma de pensar a modelagem, recursiva.

Pensem nos exemplos de ABM que eu forneci nos três posts anteriores. Em todos eles, as simulações eram, na realidade, loops. Ou seja, eram passos discretos que produziam resultados que alimentavam as rodadas posteriores. Cada rodada tomava como input o resultado da rodada anterior. Podemos então pensar que os parâmetros são um vetor de inputs x e que um passo da simulação é uma função h(x). Deste modo, o resultado depois de duas iterações seria:

h(h(x)))

E assim por diante:

h(h(h(x))))h(h(h(h(x))))), …

Na realidade, o argumento de Epstein é bem mais interessante e completo. Ele mostra que a representação algorítmica de uma função em uma máquina de Turing (i.e. um computador) tem um equivalente matemático. Mas vou deixar as tecnicalidades excessivas de lado neste post.

De todo modo, a lógica é algo semelhante à de uma série, em que o input no tempo t+1 é fruto de operações ocorridas no tempo t. Um ABM é, no final das contas, uma série ou sequencia matemática, parente da PA — ainda que complicações adicionais advindas de processos estocásticos possam advir.


Seção 4 – O Caos

butterfly-effect

É claro que todo mundo já ouviu falar no tal “Efeito borboleta” (ou, no mínimo, já viu aquele filme horrível com o Ashton Kutcher). Uma borboleta bate asas na China hoje e pode provocar desastres naturais nos Estados Unidos séculos ou milênios depois. Segundo a visão de mundo subjacente a essa ideia, pequenas ações têm grandes consequências não premeditadas; o mundo seria um grande emaranhado de causas e efeitos, tão gigantesco em sua complexidade, que às vezes partes que pensamos estar completamente desconectadas, na realidade, demonstram estreita relação. É um caos.

No entanto, em Matemática a noção de Caos têm origem no estudo de séries, como a PA e a PG. Descobriu-se uma família muito peculiar de funções cujo comportamento não se assemelhava nada antes visto. Tudo começou com uma funçãozinha humilde e aparentemente simples:

x_1 = rx_0(1 - x_0)

Fácil, né? Você insere um valor para x_0 e obtém um valor para x_1. Um procedimento simples, de input e output. Mas temos que definir um valor para r antes.

O físico e blogueiro Ricardo Marino fez um fantástico post sobre esse assunto no seu Todas as Configurações Possíveis, quando o matemático brasileiro Artur Ávila recebeu a Medalha Fields, o “Nobel da Matemática”, por ter desenvolvido trabalhos justamente na área de Sistemas Dinâmicos e Teoria do Caos (ninguém melhor que um brasileiro pra falar de caos, afinal). Vou reproduzir aqui algumas citações e gráficos do post dele.

Vejamos o que acontece quando começamos no valor x0=0,e com r=1,2. Primeiro calculamos o próximo passo: x1=r.x0(1x0) =1,2.0,1(10,1)=0,108. Para calcular o próximo passo, continuamos com a regra: x2=r.x1(1x1) =1,2.0,108(10,108)=0,1156032. Não vou escrever linha por linha, mas um gráfico revela o futuro dessa conta, ela converge para um valor específico.

avila_1

[…] Veja o que acontece quando trocamos r por 3,1.

avila_2

Com esse valor de r, o sistema não converge para um valor, mas para dois valores. Esse comportamento não é lá muito normal, mas piora, veja o que acontece quando colocamos r=3,5.

avila_3

[…] Quando chegamos a r=3,7, na verdade bem antes disso, torna-se completamente impossível prever os valores desses sistema. O único jeito de obter o valor na centésima iteração é calcular todas as noventa e nove anteriores. Veja como fica nosso gráfico para r=3,7.

avila_4

Esse é o caos: um sistema determinístico, mas de comportamento imprevisível (se não sabemos as condições iniciais). Saindo da metáfora, o verdadeiro “efeito borboleta” é o seguinte: alterações mínimas no parâmetro r da equação (principalmente depois que ele ultrapassa 3,7) ou no valor inicial x_0 provocam mudanças absurdas na série. Qualquer coisa pode acontecer. Com r=4 e início em x0 = 0,6, temos:

a.png

Retirado dos slides da Aula 3 da disciplina “Economia e Complexidade”, ofertada pelo Prof. Eleutério Prado na pós-graduação em Teoria Econômica da FEA/USP (2014)

Laplace não viveu pra ver. Ele faleceu em 1827 e a Teoria do Caos só começou a ser desenvolvida de verdade depois de Poincaré, a partir de 1880. Certamente teria tomado um baque.

As implicações epistemológicas e ontológicas da existência de sistemas assim são trágicas e assustadoras. E se o universo, esse relógio fechado, for, na realidade, um sistema caótico? Agora, depois de 14 bilhões de anos, infinitas “rodadas” já aconteceram… Será que conseguiríamos de fato abstrair seus mecanismos de funcionamento e parâmetros iniciais para que fosse possível prever futuros estados?

Não precisa nem queimar a pestana com isso. A resposta é um óbvio e categórico NÃO. E esta não é apenas uma questão de (falta de) desenvolvimento da Ciência. Todo modelo científico é como um mapa. E todo mapa é uma simplificação. Para que fosse tão detalhado quanto a própria realidade, deveria ser tão grande quanto ela. Um modelo capaz de explicar todo o universo deveria ser do mesmo tamanho ou maior que o próprio universo. Esse nem é um problema de Sistemas Dinâmicos e Teoria do Caos. É uma impossibilidade lógica.

Mas se o caso é modelar e compreender partes mais circunscritas e restritas, a questão sobre o caos se coloca. Seria a sociedade um sistema caótico? Aparentemente, as Ciências Sociais enfrentam muito mais dificuldades em encontrar regularidades e padrões gerais precisos. Nossos fenômenos são tão instáveis, que não permitem a fácil matematização. A não ser que assumamos agentes homogêneos, informação completa, racionalidade perfeita etc… Mas se o caso não é esse, estamos muito longe do padrão de ciência estabelecido pela Física. Não é somente a lacuna de formação em Exatas por parte dos sociólogos e cientistas políticos: matemáticos, físicos e cientistas da computação que migraram pra cá ainda não conseguiram fazer muitas revoluções… É um caos.

ABMs são mais uma vela no meio dessa escuridão. Contudo, ainda não sabemos muito bem onde estamos.


Seção 5 – A aleatoriedade

randombitmap

O Caos é um golpe contra a vontade de desvelar os mecanismos determinísticos do mundo, essa laranja mecânica. O golpe final é a aleatoriedade ontológica. Segundo essa perspectiva, nenhum fenômeno é guiado por leis determinísticas. Eles ocorrem apenas com alguma probabilidade. A ideia é a seguinte: se você jogar uma bola para o alto, ela tem ou não a possibilidade de cair… certamente é mais provável que ela caia. Mas vai que…

Parece absurdo, mas é exatamente isso o que ocorre com as partículas sub-atômicas — e caracteriza bastante o ramo chamado Física Quântica. Não sabemos exatamente onde os elétrons estão… mas conhecemos “zonas de probabilidade”, onde é mais frequente encontrá-los; são os chamados orbitais. A Física Quântica deixou todos tão atônitos que Einstein (que inadvertidamente havia ajudado a fundá-la), declarou: “Deus não joga dados” (querendo dizer que essa concepção de um “mundo probabilístico”, ao invés de determinístico, era absurda). Deus, na verdade, desde Galileu, todos sabem, resolve equações diferenciais — que absurdo pensar diferente, oras!

A aleatoriedade quântica é, atestadamente, um componente do fenômeno em si, e não um erro de medida ou fruto da insuficiência do conhecimento. Ao menos na Física subatômica. Com isso, mesmo que tivéssemos todas as informações requeridas pela conjectura de Laplace, não seria possível prever o futuro. Choques aleatórios acumulados (um random walk) nos levariam para qualquer lugar, no longo prazo.

Mas e no resto dos fenômenos do mundo? E na sociedade? Onde reina a aleatoriedade ontológica? Durma com um barulho desses…


Seção 6 – De onde viemos e para onde vamos

Os ABM estão muito longe de serem verdadeiramente “Sociedades Artificiais” completas e num sentido lato. Não somos ainda capazes de construir uma Matrix ou algo do tipo. Falta-nos conhecimentos substantivos sobre o comportamento humano, capacidades computacionais e um monte de outras coisas. Mas o caos e a aleatoriedade lançam desafios adicionais: ainda que fossemos capazes de tamanho empreendimento, a completa previsão do comportamento humano dificilmente seria possível (não estou sequer discutindo se seria desejável).

Modelos científicos de explicação são parciais. A totalidade é incomensurável e inabarcável (ainda que alguém de matriz marxista possa discordar…). Assumo que não haverá “a” equação do comportamento humano, nem a Matrix, nem a Psychohistory. Modelos matemáticos e computacionais são úteis, porém não são  e não serão  “a última palavra”.

Quem, de três milênios, não é capaz de se dar conta, vive na ignorância, na sombra, à mercê dos dias, do tempo.

— Goethe

Anúncios

Cachorros artificiais: agentes de agent-based modeling usando R (ABM – Parte 1)

(Primeiro Post da série. Veja os outros: Parte 2, Parte 3, Parte 4 e Parte 5)


robot-dog-meets-a-real-doberman-dog

Modelos baseados em agentes (ou Agent-Based Models – ABM) já foram um tópico discutido no blog outras vezes (por exemplo, aqui e aqui). Mas julgo que esse é um assunto “quente”, que sempre vai acabar voltando.

Para aqueles que não sabem ao que estou me referindo, vou dar uma ideia simples e rápida. Trata-se de simulações de algo como “sociedades artificiais” através de modelos computacionais. O propósito NÃO É construir a Matrix ou qualquer coisa do tipo… ao, contrário, é algo bem mais “humilde” e focado. Funciona assim: o pesquisador tem hipóteses sobre como indivíduos ou grupos se comportam, cria um ambiente simples que contém apenas algumas características fundamentais e indispensáveis para a caracterização de uma situação típica e então toca o play. Com isso, pode investigar se os mecanismos interacionais supostos de fato produzem, no nível macro ou agregado, os padrões efetivamente observáveis. Trata-se de um exercício lógico, antes de qualquer outra coisa.

Economistas neoclássicos, trabalhos que envolvem modelagem formal e escolha racional fazem exercícios lógicos de natureza semelhante o tempo todo: “suponha indivíduos homogêneos (idênticos em todas as suas características), com determinado tipo de preferência e orçamento; de fronte a um mercado que se lhes apresente certas quantidades e preços, eles se comportarão desta e daquela maneira, gerando um estado de equilíbrio tal e qual…”. No entanto, nem todo tipo de modelagem deve envolver escolha racional… e nem matemática. Certos problemas são complexos o suficiente para não permitir “forma fechada” (i.e. uma equação bem definida, cuja solução informa um resultado predito). Os ABMs entram em cena exatamente aí.


Um agente é uma entidade conceitual, que pode ser representada de diversas formas e nas mais diversas linguagens de programação. Mas duas propriedades fundamentais devem estar presentes: atributos e ações. Um indivíduo, por exemplo, tem diversas características: idade, peso, altura, raça, sexo, ocupação etc… Esses são os atributos. E também é capaz de agir no mundo de diversas formas: correr, gritar, socializar, procurar emprego etc. Um “agente”, nesse sentido a que me refiro, seria a representação computacional dos aspectos analiticamente relevantes de um indivíduo para determinados fins de pesquisa. Ou seja, ele não contém todos os atributos e ações possíveis de um indivíduo, mas apenas aqueles imprescindíveis para a análise. Isso vai ficar mais claro adiante.

O exemplo que vou dar será utilizando o R, minha “linguagem nativa” (que uso no dia a dia para fazer análises estatísticas). Mas reconheço que ele não é o melhor ambiente pra isso… Existem linguagens de programação específicas para ABM (a mais conhecida é a LOGO, que se tornou bastante popular devido ao software NetLogo, que implementa uma de suas versões). Também bastante utilizada é a linguagem Python — que é uma linguagem de programação completa (não específica para ABM) e tão flexível quando o R (e muito parecida, inclusive). ABMs escritos em Python têm scripts mais simples, diretos e rodam mais rápido; de acordo com minha experiência (mas esse último ponto é controverso).

As estruturas de dados mais simples e comuns no R são vetores, matrizes, listas e data.frames. Basicamente, todos os outros tipos de objetos existentes são algum tipo de combinação ou transformação desses… Além disso, os comandos que executamos também são objetos e são chamados funções. Criar um agente é guardar seus atributos em algum desses tipos de estrutura de dados e representar suas ações por funções. Uma forma conveniente de mesclar atributos e funções num único objeto-agente é fazer uso de um tipo de estrutura de dados pouco utilizada no R, chamada Reference Class (veja mais coisas sobre isso aqui).

Dou um exemplo. Desejamos representar um cachorro como agente. Os atributos relevantes serão a idade e a raça. E as ações possíveis serão latir e nos dizer qual é a sua raça e a sua idade, se lhe perguntarmos (sim! é um cachorro falante! e daí!?). Criaremos uma Reference Class do tipo “Cachorro”

Cachorro = setRefClass("Cachorro",
             fields = c("raca",
                        "idade"),

             methods = list(
                 late = function(){
                     print("Au! Au!")
                 },

                 diz_raca = function(){
                     print(paste("Eu sou um", .self$raca))
                 },

                 diz_idade = function(){
                    print(paste("Tenho", .self$idade,
                                "anos, o que significaria",
                                 7*.self$idade,
                                 "para um humano" ))
                 }
) )

Acredito que para quem conhece um pouco de R, mesmo sem jamais ter visto uma Reference Class antes, o procedimento acima é mais ou menos inteligível. Com o comando setRefClass estamos criando esse novo tipo de objeto — tipo que será chamado “Cachorro”. Ele terá dois atributos, cujos nomes estão declarados no argumento  fields (como vetores character). Depois especificamos as ações que os Cachorros são capazes de realizar: latir, dizer a raça e dizer a idade. Observem uma coisa importante, que é específica das Reference Classes: a expressão .self. Quando .self$raca estamos dizendo que o atributo raça está contido dentro do próprio objeto Cachorro, não é preciso procurá-lo no ambiente principal do R. Essa é a principal característica das Reference Classes: a capacidade de se auto-referenciar. Qualquer pessoa familiarizada com C++,  Java ou Python logo identifica que essa é uma das principais características de qualquer “linguagem orientada a objetos“. Essa expressão simplesmente significa que os objetos criados são auto-contidos: trazem consigo informações, dados e também os métodos para acessá-los, modificá-los e utilizá-los.

Tá… e agora? Agora que definimos as propriedades de um cachorro em abstrato, o próximo passo é efetivamente criar um (é como se tivéssemos definido a “idéia” de cachorro e agora fossemos de fato criar um “cachorro empírico”).

Jimmy = Cachorro$new(raca = "Vira-latas", idade = 4)

Acredito que o código acima seja mais o menos intuitivo. Mas é bom discuti-lo. Observem que estamos utilizando o $ para acessar uma função que está “dentro” do objeto Cachorro, chamada new(). Essa não era uma das ações definidas no argumento methods (late, diz_idade, diz_raca). Trata-se de uma função presente em todo e qualquer objeto do tipo Reference Class, que significa, em termos simples, “crie pra mim uma espécie ou instancia empírica dessa classe”. Informamos as características daquele exemplar particular de cachorro (Vira-latas, com 4 anos). E pronto, fiat Jimmy. Esse é o Jimmy “por dentro”:

jimmy1

Ele é capaz de latir, dizer a idade e a sua raça:

jimmy2

Vamos agora criar novamente a classe Cachorro, mas com duas novas capacidades de ação: dar a pata e abaixá-la. Além dessas duas novas funções, que deverão ser informada dentro da lista passada para o argumento methods, temos que também definir um novo atributo, o “status” da pata (i.e., se está levantada ou abaixada). Se já estiver levantada e pedirmos mesmo assim para que ele a levante, o cachorro vai nos informar. O mesmo se já estiver abaixada e ainda assim pedirmos a ele para abaixá-la.

Cachorro = setRefClass("Cachorro",
             fields = c("raca",
                        "idade",
                        "pata"),

             methods = list(
                 initialize = function(pata = 0, ...){
                     .self$pata = pata
                     callSuper(...)
                 },
                 late = function(){
                     print("Au! Au!")
                 },

                 diz_raca = function(){
                     print(paste("Eu sou um", .self$raca))
                 },

                 diz_idade = function(){
                    print(paste("Tenho", .self$idade,
                                "anos, o que significaria",
                                 7*.self$idade,
                                 "para um humano" ))
                 },

                 da_pata = function(){
                     if( .self$pata == 0 ){
                         .self$pata = 1
                         print("Levantei a pata")
                     }else{
                         print("Já te dei a pata, oras...!")
                     }
                 },

                 abaixa_pata = function(){
                     if( .self$pata == 0 ){
                         print("Minha pata já está abaixada!")
                     }else{
                         .self$pata = 0
                         print("Abaixei a pata")
                 }
}
) )

Observem que uma outra função teve que ser definida dentro de methods, denominada initialize. Essa função simplesmente especifica valores-padrão que serão passados para todos os agentes daquela classe no momento de sua criação. Neste caso, todos os cachorros começam com pata = 0 (com a pata abaixada). Vejamos agora o que o Tobby, nosso novo cachorro, faz:

jimmy3

Tobby não é bobo. Não peça pra que ele dê a pata ou a abaixe duas vezes seguidas. E Tobby tem a capacidade de “modificar-se a si mesmo”. Quando levanta ou abaixa a pata, ele altera o atributo pata, que existe dentro de si.

O ponto aqui é que Reference Classes são adequadas para fazer uma aproximação operacional dos conceitos de atributos e ações. Poderíamos fazer isso de inúmeros outros modos, sem apelar para programação orientada a objeto. Mas há simplicidade nos códigos acima. Agentes agem (ou, nos termos de Taylor Swift, “players are gonna play”). Essa representação sugere uma analogia com a realidade. Como diria meu amigo Davoud, especialista em ABM, “it’s all about ontology”.

 

 

 

O espaço de similaridade das pesquisas centradas no ator

[Post de Daniel Little, publicado originalmente em inglês no blog Understanding Society. Tradução para o Sociais & Métodos feita por Thiago Rodrigues Oliveira]

im1

im2

Há um determinado número de abordagens no estudo do mundo social que conferem prioridades especiais aos indivíduos em contextos sociais. A Teoria da Escolha Racional (TER) e a Teoria dos Jogos (Becker, Harsanyi) buscam compreender eventos sociais como o resultado de estratégias e cálculos de atores racionais. A Sociologia Centrada no Ator (SCA) e a teoria pragmatista buscam adentrar em um conhecimento profundo dos quadros e dos modos de ação dos atores (Goffman, Gross). A Sociologia Analítica (SA) busca resolver a lógica do barco de Coleman ao mostrar como fatores sociais de nível macro influenciam o comportamento de indivíduos e como fatores de nível macro resultam de interações entre indivíduos no nível micro (Hedström, Yilikoski). E agent-based models (ABM) trazem sistemas computacionais para representar as formas complexas de interação que ocorrem entre indivíduos levando a eventos sociais (Axelrol, Manzo).

Essas quatro abordagens parecem seguir uma mesma estratégia básica: deduzir eventos sociais a partir do que sabemos sobre os modelos de ação e da composição dos indivíduos que produzem o contexto social. É tentador ver essas quatro formulações distintas como a mesma abordagem básica. Mas isso seria um erro. A distância científica entre Hedström e Goffman, ou entre Goffman e Becker, é grande. TER, SCA e SA trazem pressupostos diferentes para o estudo de atores e diferentes pressupostos sobre o que a explicação social demanda. São distintos paradigmas de pesquisa que geram tipos de produtos de pesquisa qualitativamente distintos. E ABM é uma ferramente que pode ser empregada em cada um desses quadros, mas que melhor se adequa à TER e à SA.

Essa figura quer dizer que abordagens centradas no agente tem mais coisas em comum umas com as outras do que com outras importantes estratégias de metodologias de pesquisa em ciências sociais. É possível codificar essas intuições de alguma maneira? E é possível listar as relações lógicas e pragmáticas que existem entre essas abordagens?

Segue aqui uma tabela que representa alguns dos principais pressupostos metodológicos e ontológicos de cada um desses quadros de pesquisa:

Sociologia Centrada no Ator Sociologia Analítica Teoria da Escolha Racional
Eventos sociais derivam de ações de atores socialmente constituídos em relação uns com os outros Explica eventos como o resultado agregado de ações e interações de indivíduos intencionais Indivíduos se comportam como agentes economicamente racionais. Explica eventos como o resultado agregado dessas ações
Atenção às “grandes” teorias do ator Quadro desejo-crença-oportunidade para atores Racionalidade econômica restrita: preferências consistentes e maximização das utilidades
Atores são formados por relações sociais nas quais eles desenvolvem Modelos causais; comprometimento com a abordagem de mecanismos causais Modelos de equilíbrio: comprometimento com soluções matemáticas de problemas de escolha bem definidos
Contas narrativas do desenvolvimento de eventos sociais geram ações dos atores Preferência pelo barco de Coleman: explicação acontece do micro ao macro e do macro ao micro A Teoria dos Jogos é usada para representar interações entre agentes racionais
Agnóstica sobre fundamentos micro Fortemente associada aos fundamentos micro Fortemente associada aos fundamentos micro

Como se pode pensar as relações que existem entre essas abordagens de pesquisa? Muitas possibilidades existem. O primeiro diagrama representa um espaço de abordagens de pesquisa a tópicos de sociologia em ternos de um diagrama de Venn. U é o universo de de abordagens de pesquisa. A, B, C, e D são abordagens que caem dentro de “Sociologia Analítica”, “Teoria da Escolha Racional”, “Sociologia Centrada no Ator” e “Agent-Based Models”. Cada uma dessas famílias de abordagens de pesquisa foi discutida em posts anteriores, linkados acima. A sobreposição nos conjuntos devem representar a intersecção entre os grupos selecionados: abordagens centradas no ator que usam pré-requisitos da teoria da escolha racional; abordagens da sociologia analítica que usam pré-requisitos da SCA; esforços de pesquisa nos três conjuntos que usam modelos baseados no agente; etc.

O segundo diagrama traz um esforço inicial de identificar aspectos que distinguem essas abordagens em uma estrutura dicotômica. SA e TER compartilham as características de fundamentos micro, enquanto a abordagem fenomenológica não. Esta enfatiza a necessidade por “grandes” teorias do ator, enquanto SA e TER favorecem teorias “magras”. SA distingue o pressuposto de Desejo-crença-oportunidade dos pressupostos mais restritos da racionalidade econômica. E SA está mais interessada em identificar mecanismos causais do que qualquer outra alternativa, enquanto a abordagem fenomenológica favorece narrativas e a TER favorece a criação de modelos de equilíbrio. A linha final desse diagrama traz instâncias de paradigmas explicativos das várias abordagens — notas de Goffman sobre comportamentos sociais em um restaurante, o barco de Coleman, a análise formal do dilema do prisioneiro e a tabela de Skocpol de eventos revolucionários.

Aqui segue uma outra abordagem possível, que pode ser descrito como uma visão “ecológica” das metodologias. Em um post recente eu argumentei que nós podemos pensar um quadro de pesquisa como consistindo de um pequeno conjunto de “genes” (pressupostos metodológicos e ontológicos), os quais depois geram o “fenótipo” dos produtos de pesquisa nas mãos dos grupos de pesquisadores (link).

Nesse sentido, SA e TER compartilham um número de genes e estão abertas a emprestar elementos adicionais no futuro por meio de colaboração de pesquisa (contatos inter-espécies). Cada uma compartilha alguns dos principais pressupostos da SCA, mesmo que postulem estratégias explicativas e teóricas bastante distantes daquelas praticadas pela SCA. As duas “espécies” de quadros de pesquisa estão proximamente relacionadas e prometem estar ainda mais no futuro. Mas ao mesmo tempo a SA pode se tornar um genótipo mais robusto para a pesquisa sociológica ao compartilhar componentes genéticos com seu parceiro ecológico, SCA. Finalmente, por essa medida todas essas três abordagens estão a alguma distância das outras principais abordagens na sociologia: survey, pesquisa quantitativa, pesquisa comparativa e estudos organizacionais.

Eu gostaria de argumentar que a sociologia analítica é intelectualmente ampla o suficiente para abranger entendimentos e métodos essenciais da TER e da SCA como teorias distintas do ator, e que ABM é uma metodologia formal que se adequa bem a um componente do modo de explicação da SA, o componente agregativo (o suporte crescente do barco de Coleman). AB, não é limitada a modelos econômicos do ator e pode incorporar tantos detalhes sobre o ator quando o modelador escolher; assim SCA e achados pragmatistas podem ser incorporados a modelos ABM com o possível custo de perda da determinação do evento final.

Os 7 Melhores Livros de Métodos de 2014

O ano de 2014 foi muito bom para as publicações em geral, e os livros de métodos felizmente não ficaram atrás. Não apenas vários trabalhos novos chamaram a atenção por sua qualidade, mas também diversos textos antigos ganharam versões ampliadas e revistas neste ano. Dentre os muitos livros de destaque, dois dos editores do blog (Guilherme e Danilo) escolheram os 7 volumes que mais gostaram e colocaram uma pequena justificativa para cada um deles.

Segue abaixo a lista com os nossos comentários:


Joshua D. Angrist e Jörn-Steffen Pischke – “Mastering ‘Metrics: The Path from Cause to Effect”.

mastering metrics

Danilo: De todos os livros acadêmicos que li esse ano, Mastering ‘Metrics foi o que mais me agradou. Angrist e Pischke, os conhecidos autores do Mostly Harmless Econometrics, voltaram com um novo livro de econometria direcionado para os estudantes de graduação e outros marinheiros de primeira viagem na disciplina. Leve, cheio de anedotas e com várias referências engraçadas (para um economista, claro), o livro tem uma abordagem bem diferente dos tradicionais manuais da área (Wooldridge, Greene, Cameron & Trivedi, etc). Ao invés de se trazer provas matemáticas e longas explicações teóricas, Mastering ‘Metrics toma como ponto de partida a abordagem de potential outcomes e segue direto para a explicação de cinco técnicas de inferência causal (“the furious five”, no linguajar do livro): experimentos aleatorizados, regressão com matching, variáveis instrumentais, desenho de regressão discontínua e diferenças-em-diferenças. Embora o livro não tenha exercícios, vale para todos aqueles que querem aprender mais sobre a fina arte de relacionar causa e efeito.
Guilherme: Esperei esse livro por um bom tempo. O Mostly Harmless Econometrics é um dos meus livros de cabeceira. Quando queria indicá-lo, entretanto, tinha de levar em conta que, embora “mostly harmless”, não era um livro muito acessível em termos de linguagem matemática e estatística para pessoas de humanas (sobretudo do Direito), que não possuíam um treino específico. O Mastering ‘Metrics veio preencher essa lacuna por sua simplificação.


John Kruschke – “Doing Bayesian Data Analysis, Second Edition: A Tutorial with R, JAGS, and Stan”.

jags

Danilo: Uma excelente introdução à análise bayesiana para as ciências sociais. Como Angrist e Prischke, Kruschke tomou uma posição distinta dos outros textos sobre o tópico (Gelman et al., Geweke, ou Hoff) e reduziu ao máximo o uso de matemática em seu livro. Apenas com noções básicas de probabilidade e um pouco (bem pouco!) de cálculo é possível acompanhar o texto inteiro. Kruschke apresenta com muita clareza o teorema de Bayes, mostra como realizar análises estatísticas por meio de simulações, e, no final do volume, traz uma série de exemplos práticos dos modelos mais utilizados nas humanidades (OLS, logística, etc) com scripts feitos em R, JAGS e Stan, todos softwares gratuitos e de código aberto. Se você tem curiosidade de saber um pouco mais sobre estatística bayesiana e quer comprar um único livro sobre o assunto, essa é a minha recomendação.
Guilherme: Estatística bayesiana está em moda (ainda bem). Esse livro é ideal para aprender e indica os softwares “certos” para isso (R, Stan).


Stephen L. Morgan e Christopher Winship – “Counterfactuals and Causal Inference: Methods and Principles for Social Research”.

Morgan

Danilo: Mais um volume dedicado à inferência causal. Morgan e Winship lançaram nesse ano uma versão atualizada do seu excelente manual de 2007, no qual os autores também buscam explicar, em termos acessíveis, as vantagens e dificuldades do uso de contrafactuais nas ciências sociais. Mais detalhado do que Mastering ‘Metrics, poderia fazer parte do currículo dos cursos de metodologia para pós-graduação no país, como já o faz no exterior. Pode comprar sem susto.
Guilherme: Sempre estudei inferências causais sob a perspectiva do Modelo Causal de Rubin. Quanto entrei na estatística, passei a conhecer Judea Pearl. O livro vale principalmente por promover uma discussão de causalidade nos termos da variedade de modelos e mostrar sua aplicação em ciências sociais.


Janet M. Box-Steffensmeier, John R. Freeman, Matthew P. Hitt e Jon C. W. Pevehouse – “Time Series Analysis for the Social Sciences”.

box

Danilo: Outro excelente livro da série Analytical Methods for Social Research, publicada pela Cambridge University Press. Aqui, os autores trazem uma discussão detalhada sobre séries temporais, que embora sejam muito comuns nas ciências sociais, nem sempre são tratadas como deveriam. O livro descreve várias técnicas utilizadas na área (modelos dinâmicos de regessão, processos não-estacionários, entre outros), e apresenta muitos exemplos para ilustrar os pontos do texto. Um pouco mais técnico do que os demais, mas não menos relevante.


John H. Holland – “Complexity: A Very Short Introduction”. holland

Danilo: Há pouco tempo passei a me interessar por sistemas complexos, e esse livrinho de pouco mais de 100 páginas foi minha primeira leitura sobre o assunto. Holland é um notável conhecedor de sistemas complexos e resume os pontos principais da disciplina em 8 capítulos, todos eles breves e muito bem escritos. Para quem pretende se aventurar em modelagem baseada em agentes, essa é uma boa porta de entrada.


David A. Armstrong II , Ryan Bakker , Royce Carroll , Christopher Hare , Keith T. Poole , Howard Rosenthal – “Analyzing Spatial Models of Choice and Judgment with R”.

poole

Guilherme: Para quem estuda Multidimensional Scaling e métodos de estimação de ponto ideal em ciência política e gosta de R, este livro é fundamental. É o primeiro livro que aborda os aspectos computacionais dos modelos diretamente em R e focado em ciência política. Não é um livro fácil, entretanto. Para quem está estudando por livros como Borg & Groenen e Poole, é um livro muito bom para mostrar as particularidades dos modelos .


Hadley Wickham – “Advanced R”

hadley

Guilherme: Finalmente foi publicado o livro que todos já conheciam pela versão da internet. Hadley Wickham é simplesmente um mestre, sobretudo pelo pacotes que cria para o R (ggplot2, dplyr, entre muitos outros). Agora ele publica o manual definitivo de R. Vale muito a pena, para todos que se interessam por estatística. A versão online ainda pode ser encontrada aqui.

Agent-Based Modeling para ciências sociais: simulando o dilema do prisioneiro

Agent-based model ( ABM ) é um tipo de modelo computacional que simula agentes que interagem para explicar resultados de larga escala que decorrem do sistema como um todo. Ok, você não entendeu nada, correto? Mas saiba que é um paradigma contemporâneo importante das ciências sociais e está sendo cada vez mais utilizado com resultados muito positivos. O objetivo do post de hoje é tentar explicar alguns conceitos que fundamentam essa abordagem e oferecer um teste prático, simulando o célebre “dilema dos prisioneiros”, tema famoso da teoria dos jogos.

As ciências em geral, incluindo as sociais, utilizam uma estratégia de pesquisa focada em modelos. Modelos nada mais são que simplificações da realidade. Pense num mapa, por exemplo, do Estado de São Paulo.

Esse mapa permite que você obtenha informações importantes da realidade (como chegar do lugar A ao B), deixando de lado uma série de detalhes desnecessários.

Um modelo científico é algo semelhante. Ele pretende oferecer simplificações que expliquem bem a realidade, centrando-se em determinados pressupostos. Por exemplo, imagine modelos que expliquem o comportamento judicial de juízes de Suprema Corte. Alguns modelos consideram apenas fatores ideológicos, outros, apenas fatores estratégicos. O que eles fazem é oferecer explicações das decisões com base em uma ou outra causa (mas é claro que você pode incluir mais de uma).

Os modelos científicos podem ser de vários tipos: lineares, não-lineares, estocásticos, determinísticos, entre outros. Aqui nós trataremos do modelo baseado em agentes (ABM), adequados para a análise de sistemas complexos adaptativos. Esse tipo geralmente é contraposto a um modelo reducionista Newtoniano, focado em cálculo diferencial, experimentos controlados, etc. O ABM concebe a realidade social como complexa e trata de simulações computacionais das ações (e interações) de agentes (que podem ser indivíduos, grupos, organizações) como forma de obter informações emergentes do sistema como um todo.  

Imagine que você pretende modelar várias formigas e entender como essas formigas, através da ação individual de cada uma, conseguem formar uma ponte.

Modelar esse comportamento envolve entender como a ação individual de cada uma (em um nível micro) pode derivar na formação da ponte (nível macro).  Não só de biologia estamos falando, poderíamos também tentar entender, na ciência política, como da ação, por exemplo, de juízes ou parlamentares poderiam emergir propriedades macro. Pense em Adam Smith: como da ação de indivíduos movidos por auto-interesse poderia emergir o crescimento econômico? (Caberia aqui falar mais de “sistemas complexos adaptativos” e “emergência”, mas, tendo em vista  a brevidade do post, deixarei essa discussão para posts posteriores).

Para modelar esse tipo de situação é interessante realizar simulações computacionais de agentes. Um dos pioneiros no uso dessas simulações em ciências sociais foi o cientista político Robert Axelrod, escritor de “The Evolution of Cooperation”.

Ele queria entender como a cooperação poderia emergir e persistir da ação de seus indivíduos. Para isso, ele partiu do exemplo clássico da teoria dos jogos, o “Dilema do Prisioneiro”.

“Temos dois suspeitos, Jay e Bill, que são presos pela polícia. Cada um deles é mantido isolado do outro, sem qualquer tipo de comunicação. A polícia sabe que não tem evidências suficientes para indiciar os dois no crime principal, o que acabaria restando para cada um deles 1 ano de prisão. A polícia então oferece um acordo: se um deles confessar, mas o outro não, o que confessou (não-cooperação) sairia livre e o que não confessou cumpriria 10 anos de prisão; se os dois confessarem, cada um cumpriria 5 anos.

A matriz de payoffs é a seguinte:

É amplamente conhecido que o equilíbrio de Nash para esse jogo é cada um trair. É fácil ver que, se um dos suspeitos cooperar ou não-cooperar, o outro estará numa situação bem melhor se sempre não-cooperar. Mas o que ocorreria se você repetisse esse jogo várias vezes com vários jogadores?

O que Robert Axelrod fez foi criar um torneio em que teóricos enviariam suas estratégias (em formas de algoritmos) e ele testaria uma contra a outra, em rounds diferentes. A estratégia que foi vencedora, conhecida como “TIT FOR TAT”, foi enviada por Anatol Rapoport e seu código continha poucas linhas. Ela consistia no seguinte: 1) começar cooperando; 2) repetir a jogada anterior do outro jogador. Isto é, se o outro jogador trai numa rodada, na seguinte, no TIT FOR TAT, você também trai; se cooperar, na seguinte você também coopera.

Bom, vamos às simulações. O que ocorreria se você colocasse vários jogadores com estratégias diferentes jogando simultaneamente o dilema do prisioneiro com estratégias distintas?

Um software bastante utilizado para esse tipo de simulação é o NetLogo.

É um ambiente com linguagem de programação para a criação de modelos baseados em agentes. Foi criada por Uri Wilensky, da Northwestern University, baseada na linguagem Logo (que era bastante utilizada antigamente para ensinar crianças a programar). Pode ser baixado no site http://ccl.northwestern.edu/netlogo/ .

Ele é usado para simular vários tipos de situações, desde teorias contratualistas (Hobbes e Locke) até modelos de transporte urbano.

A ideia aqui é simular o Dilema do Prisioneiro. O NetLogo tem uma boa biblioteca de modelos prontos para teste (você pode tentar brincar com algum deles). Para isso, abra o Netlogo e vá em “File >> Models Library”. Na tela de “Models Library”, vá em “Sample Models >> Social Science >> (unverified) >> PD N-Person Iterated”. Para quem não quiser fazer o download, deixei um applet neste site https://linux.ime.usp.br/~jardim/dilema, que executa a simulação no próprio navegador.

modelslibrary

Aberto o modelo, o próximo passo é ajustar quantos jogadores você vai colocar. A estratégia “random” corresponde a trair ou cooperar de maneira aleatória. “Cooperate”, a sempre cooperar. “Defect”, a sempre trair. “Tit for tat”, ao TIT FOR TAT já explicado. “Unforgiving” , a uma estratégia em que você vai sempre cooperar  até ser traído; a partir daí, passa a trair sempre. “Unknown” é uma estratégia para ser programada posteriormente, então não vamos colocar nenhum jogador para essa.

Vamos colocar 10 jogadores para cada estratégia, exceto para unknown, que vamos deixar 0. O próximo passo é clicar em “Setup”. Você obterá uma tela parecida com esta.

prisoners

A partir disso, clique em “Go”. A simulação vai começar. Verifique os resultados em “Average Payoff”. 

Veja que, após alguns “ticks” (a medida de tempo), parece que a estratégia de sempre trair é a que rende um maior valor para seus jogadores.

defectap

Porém, após 10000 ticks, repare que as estratégias de “unforgiven” e “tit for tat” parecem ser as grandes vencedoras. A situação mudou completamente!

unforgiven

 

O NetLogo permite que você teste os modelos já prontos e que crie os próprios. Em posts próximos, pretendo tratar mais dos conceitos que fundamentam o ABM, como o de “sistemas complexos adaptativos” e “emergência”. Também pretendo fornecer mais dicas para quem deseja programar no NetLogo e listar um material disponível sobre simulações.