Equilibrando a dívida pública

Pessoal, liberei uma atualização do meu webapp de simulação de crescimento da dívida pública. Visitem em https://gabrielrega.shinyapps.io/divida_web/ e divirtam-se.

Anúncios

Baixando dados fiscais do site Transparência no R

Ao contrário de outros sites do governo, o Transparência Orçamentária não tem um acesso por planilhas ou base de dados muito claro. Usei então como base para aprender um pouco de como extrair dados das tabelas de uma página genérica de internet.

O código abaixo faz o serviço, você só precisa mudar a variável ano na primeira linha para qualquer um entre 2013 e 2017.

O segredo, como sempre, é descobrir o endereço web correto. Para a busca básica, que é o que fazemos aqui, é “http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=” seguido do ano. Esta busca específica só nos dá parte dos dados que são divididos em duas páginas. Acrescentamos “&Pagina=2” após o ano ao endereço para isso. Para ver alguma conta específica se deve adicionar &codFuncao=28” ao final. 28 é o código para encargos especiais, por exemplo. O resto do código é limpeza dos dados, que estão aqui em formato HTML.


ano = 2016

url = paste0("http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=",ano)

page = readLines(url)

grep("Total",page)
pattern = '
<td class=\"colunaValor\">([^<]*)</td>
'
datalines = grep(pattern,page[290:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

v1 = gsub(".","",result, fixed = TRUE)
v1 = as.numeric(gsub(",",".", v1, fixed = TRUE))

grep("Funç", page)
pattern2 = '
<td class=\"firstChild\"><a href=\"/PortalFuncoes_Detalhe.asp?([^<]*)</a></td>
'
datalines = grep(pattern2,page[1:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern2,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

t1 = substr(result,94,nchar(result))
t1 = substr(t1, 1, nchar(t1)-10+1)

url = paste0("http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=",ano,"&Pagina=2")

page = readLines(url)
grep("Total",page)

pattern = '
<td class=\"colunaValor\">([^<]*)</td>
'
datalines = grep(pattern,page[290:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

v2 = gsub(".","",result, fixed = TRUE)
v2 = as.numeric(gsub(",",".", v2, fixed = TRUE))

grep("Funç", page)
pattern2 = '
<td class=\"firstChild\"><a href=\"/PortalFuncoes_Detalhe.asp?([^<]*)</a></td>
'
datalines = grep(pattern2,page[1:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern2,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

t2 = substr(result,94,nchar(result))
t2 = substr(t2, 1, nchar(t2)-10+1)

tab1 = data.frame(cbind(append(t1,t2), append(v1,v2)))
colnames(tab1) = c("Funcao","Valor")
tab1[,2] = as.numeric(paste(tab1[,2]))

tab1

O resultado é salvo na variável “tab1”.

 

Acompanhando a Política Fiscal do Brasil

Para quem deseja acompanhar a discussão sobre política fiscal no Brasil com maior detalhamento, e conferir se esses jornalistas e economistas de opinião estão falando bobagem mas não sabe onde procurar os número, seguem os links das fontes:

Filtro de Hodrick-Prescott no Excel

Um pouco fora da minha área certamente mas estou sempre pronto a apreciar boa programação e facilidade de uso. Se você precisa tirar a tendência de uma série com o filtro HP e quer a facilidade do Excel, ou quer usar em um ambiente de trabalho onde os programas são controlados, fica a dica do site abaixo. Ele explica onde baixar o add-in e como utilizar. Testado e aprovado.

There is a how to use PDF, short, says you give it a range of cells and a number (a constant). The long version: Select a range of cells for your results, type =HP( , select the range of cells containing the data to be filtered, type in a comma, type in the constant, and close the parentheses. But don’t hit ENTER.

Instead, hold down CTRL and SHIFT and then press ENTER. That’s it. Then you can make a graph or whatever, from the results.

Holding down CTRL and SHIFT while you press ENTER is standard Excel stuff. They call it “array formulas” which sounds pretty complicated… but all you have to do is hold down CTRL and SHIFT while pressing ENTER. How complicated is that?

None of that works, though, if you don’t have the Hodrick Prescott filter installed. No problem. Among the search results is a link to Kurt Annen’s HP-Filter Excel Add-In at IDEAS. There are three separate files you can download:

1. an XLA file, an Excel add-in which adds the HP( ) function to the built-in Excel functions.

2. the Visual BASIC source code for the HP( ) function.

3. an example.

For most people the simple thing would be to install the add-in. (The PDF linked above tells how.) For me, the simple thing was to copy the Visual BASIC source code and paste it into a code module. That way I got to look the code over a bit. It looks like a very complicated (arithmetically) version of a “moving average” calculation, or something comparable. That’s a crude description; I didn’t work through all the arithmetic. But the result you get from the HP filter serves the same sort of purpose as the result you get from the moving average calc.

Anyway, after it’s installed one way or the other, it’s as easy to use as =SUM( ) or any other Excel function. I expect to explore it, and to use it.

What number do you use for the constant?… for the “Lambda” as they call it?

Rule of thumb is:

Lambda = 100*(number of periods in a year)^2

There is additional research that suggests using a power of 4 instead of 2. See Ravn and Uhlig (2002). http://ideas.repec.org/a/tpr/restat/v84 … 1-375.html

via The New Arthurian Economics: De-Trending.

Modelagem baseada em agente: primeiros passos

Aqui o Understanding Society mostra um bom guia para começar a olhar estes modelos baseados em agente que falei na semana passada e coloca algumas dúvidas sobre a viabilidade do projeto. Para ele (e concordo) quando os agentes são homogêneos podemos usar uma abordagem agregada. Mas quando é que algo é homogêneo? Me parece possível encaixar preceitos evolucionistas nessa abordagem.

Agent-based modeling is an intriguing new set of tools for computational social science. The techniques permit us to project forward the system-level effects of a set of assumptions about agent behavior and a given environment. What kinds of real social phenomena are amenable to treatment by the techniques of agent-based modeling? David O’Sullivan and his co-authors offer an assessment of this question in their contribution to a valuable recent handbook, Heppenstall et al, Agent-Based Models of Geographical Systems. (Andrew Crooks and Alison Heppenstall provide a valuable and clear introduction to ABM methodology in their contribution to the volume.)

via UnderstandingSociety: Domain of agent-based modeling methods.