Tag

regressão Archives - Análise Macro

Introdução à Econometria

By | Data Science

Neste post mostraremos como construir modelos de regressão linear de maneira aplicada. Se você já se perguntou em como replicar no R aqueles modelos introdutórios, comuns em disciplinas de estatística e econometria, este post é pra você!

Dessa forma, usaremos a econometria - que é um conjunto de métodos estatísticos utilizados para estimar relações econômicas, testar teorias e avaliar políticas públicas ou de negócios - para explorar um problema aplicado ao mercado de trabalho. Nada melhor do que entender como utilizar algo com um exemplo prático, certo?

Portanto, assumimos que você já possui algum conhecimento teórico sobre modelos de regressão linear, pois daremos ênfase no aspecto prático de como implementar este tipo de modelo usando o R. Você pode conferir o curso de Introdução à Econometria (em R e Python) para explorar mais a fundo os pormenores dos modelos, assim como tópicos mais avançados que fogem do escopo deste post. É uma ótima oportunidade se você acha o assunto "assustador", pois o curso traz exemplos intuitivos e práticos do dia a dia.

Ademais, nossa referência base sobre o assunto é o livro-texto do Wooldridge (2020), que é muito utilizado em disciplinas de econometria de cursos de graduação.

Pacotes

Para reproduzir os códigos deste exercício, você precisará dos seguintes pacotes de R:

O problema e os dados

Para começar a entender o assunto, e exemplificar a estimação de um modelo linear, vamos recorrer a um conjunto de dados clássico do Wooldridge, que traz informações de uma pesquisa populacional. Mais especificamente, iremos investigar um problema de economia do mercado de trabalho: suponha que você seja contratado para determinar o efeito de um programa de aperfeiçoamento profissional na produtividade de trabalhadores. Sem se aprofundar muito na teoria econômica e especializada da área, podemos dizer que fatores como escolaridade, experiência profissional e treinamentos podem afetar a produtividade do trabalhador e, portanto, seus salários. Com esse simples entendimento em mente, podemos então definir um modelo econômico como:

onde é o salário por hora, são os anos de educação formal, são os anos de experiência no mercado de trabalho e é o tempo despendido em aperfeiçoamento profissional. Outros fatores podem afetar , mas este modelo simples capta a essência do problema em questão.

Essa formulação básica que elaboramos carrega a hipótese de que esses fatores especificados estão, de alguma forma, relacionados com o dos trabalhadores. O que precisamos fazer agora é investigar esse "modelinho" de forma empírica.

Dado que estes fatores e variáveis podem ser observados - e se não fossem teríamos que levar isso em consideração -, o próximo passo é transformarmos esta especificação de modelo econômico para um modelo econométrico, como:

onde as constantes , , ..., são parâmetros do modelo que descrevem as direções (sinal) e as magnitudes (tamanho) da relação entre e as demais variáveis utilizadas para explicar no modelo; e o termo de erro contém fatores como "habilidade inata", qualidade da educação, histórico familiar e outros que podem influenciar o salário de um trabalhador, ou seja, o erro é comumente chamado de "medida do nosso desconhecimento". Se estivermos especialmente interessados no efeito do programa de aperfeiçoamento profissional, então  é o parâmetro de interesse.

Para uma análise empírica deste modelo precisamos de dados, portanto, após essa breve introdução vamos partir para a prática! No R, o conjunto de dados para usarmos nesse modelo vem do pacote {wooldridge} e pode ser carregado conforme abaixo:

Exploração dos dados

Os dados são do tipo cross-section e contém variáveis de 526 indivíduos referente ao ano de 1976. Deste conjunto de dados, usaremos apenas as variáveis wage (salário por hora), educ (anos de educação) e exper (anos de experiência). Para facilitar o entendimento, utilizaremos a transformação logarítmica na variável dependente (wage), de forma a obter uma interpretação percentual dos parâmetros do modelo.

No R, com um simples comando também é possível obter uma tabela de estatísticas descritivas das variáveis:

Com o pacote ggplot2 podemos facilmente visualizar, em um gráfico de dispersão, a relação entre as variáveis do modelo:

Estimar o modelo

Conforme dito, iremos estimar o modelo econométrico acima mas com algumas modificações: sem o fator e com transformação logarítmica na variável . Com estes ajustes, comuns em exercícios empíricos, chegamos a uma especificação como esta:

Ou seja, queremos saber a relação entre a escolaridade e experiência profissional dos trabalhares sobre os seus salários (em log). Dessa forma, devemos agora estimar os coeficientes que medem esses efeitos.

No R, estimamos este modelo de regressão com a função lm() especificando os termos por uma fórmula e o objeto com os dados:

Resultados do modelo

Para obter os resultados do modelo estimado use a função summary(), que é uma função genérica para obter resultados de diversas famílias de modelos:

A interpretação dos resultados deste modelo deve ser feita ceteris paribus e os parâmetros, neste caso, possuem uma intepretação percentual. Por exemplo, o coeficiente educ (escolaridade) com valor 0,097 significa que, mantendo exper (experiencia) constante, um ano adicional de escolaridade aumenta wage (salario) em 9,7%. É isso que os economistas querem dizer quando se referem ao “retorno a mais por um ano de educação”.

Pode ser mais fácil utilizar essa saída de resultados, especialmente para usuários do {tidyverse}, se a mesma for transformada em tabela. Para organizar dessa maneira o pacote {broom} possui excelentes funções:

Diagnóstico do modelo

Além disso, no R existem diversos pacotes focados em análise estatística. Por exemplo, com o pacote {performance} podemos facilmente investigar visualmente as hipóteses do modelo com um simples comando:

Reportando resultados

Para reportar estes resultados, seja em um artigo, em uma apresentação, etc., também existem diversas facilidades no R. Por exemplo, você pode construir a representação da equação, já em LaTeX, com base no objeto que contém o modelo estimado:

E essa expressão do LaTeX pode ser renderizada, com o R Markdown por exemplo, para:

Já com o pacote {report} é possível criar um texto (em inglês) com alguns parágrafos que já interpretam os resultados do modelo de forma automatizada:

Gerando:

We fitted a linear model (estimated using OLS) to predict wage with educ and exper (formula: log(wage) ~ educ + exper). The model explains a statistically significant and moderate proportion of variance (R2 = 0.25, F(2, 523) = 86.86, p < .001, adj. R2 = 0.25). The model's intercept, corresponding to educ = 0 and exper = 0, is at 0.22 (95% CI [3.52e-03, 0.43], t(523) = 2.00, p = 0.046). Within this model:

- The effect of educ is statistically significant and positive (beta = 0.10, 95% CI [0.08, 0.11], t(523) = 12.85, p < .001; Std. beta = 0.17, 95% CI [0.15, 0.20])
- The effect of exper is statistically significant and positive (beta = 0.01, 95% CI [7.29e-03, 0.01], t(523) = 6.65, p < .001; Std. beta = 0.09, 95% CI [0.06, 0.12])

Standardized parameters were obtained by fitting the model on a standardized version of the dataset. 95% Confidence Intervals (CIs) and p-values were computed using the Wald approximation.

Para criar um tabela de resultados, usualmente presente em papers, use a variante *_table():

Por fim, gráficos de parâmetros do modelo também podem ser gerados facilmente:

Saiba mais

Para saber mais e se aprofundar no assunto, confira o curso de Introdução à Econometria (em R e Python). Além disso, existem alguns materiais gratuitos sobre modelos disponíveis no blog:

Regressões com variáveis qualitativas

By | Hackeando o R, Python

Ao construir relações de diversas variáveis por meio dos dados, o mais comum é pensar em realizar esta tarefa com variáveis quantitativas, isto é, de forma totalmente numérica. Mas, e se tivermos apenas variáveis nominais, isto é, categóricas, como podemos incorporá-las em um modelo? Para tanto, é possível construir uma Regressão com variáveis qualitativas. No post de hoje, abordaremos duas formas de se utilizar variáveis qualitativas em regressões: o modelo que utiliza variáveis binárias (dummies) nos preditores e o modelo que utiliza variáveis de respostas qualitativas, conhecido como Regressão Logística.

Regressão com Variáveis Binárias (dummies)

Na investigação de uma variável dependente em relação as suas variáveis independente, isto é, as formas da qual as duas se relacionam, sempre pensamos que elas sejam valores numéricos, conhecidos como variáveis proporcionais ou contínuas. Porém, não é a única forma associação entre variáveis, é comum que o regressando seja influenciado não só por essas variáveis proporcionais (como preços, renda, idade, etc), mas também por variáveis especialmente qualitativa, conhecidos com variáveis nominais, tais como gênero, raça, cor, nacionalidade, etc.

Em geral, quando indicamos que as variáveis independentes são nominais, dizemos que há a presença ou "ausência" de uma "qualidade" ou atributo. É possível "quantificar" essa lógica criando variáveis binárias que assumem valores de 1 ou 0.

Variável Binária

Portanto, uma variável binária (dummy) pode representar dois estados:

  1. 0, ausência da característica de interesse
  2. 1, presença da característica de interesse

Podemos então estimar uma Regressão com variáveis independente nominais e ordinais, da mesma forma que estimamos uma Regressão Linear. Nesse caso, utilizamos uma variável categórica com dois estados, 0 e 1.  Podemos definir a equação com variáveis independentes com duas categorias como:

     $$Y_i = \alpha + \beta_1 X_i +\beta_2 D_i  + e_i$$

Em que X representa a variável independente proporcional ou numérica, e D representa a variável qualitativas ou nominal. O  $\beta_2$ indica o quanto Y seria, em média,  maior (menor) para a categoria D = 1 que a categoria D = 0, independente do valor de X, sendo a categoria de referência da análise D = 0 (podendo ser escolhido ao contrário também).

Regressão com variável binária (dummy) no R

No R, é possível criar facilmente uma Regressão com variáveis binárias, tudo o que necessitamos é ter mãos as variáveis qualitativas bem definidas e utilizar a função lm() para realizar os cálculos. Utilizaremos como exemplo o dataset wage1 contido no pacote do {wooldridge}, que traz características de diversas pessoas, sejam qualitativas ou quantitativas.

Como objetivo, iremos desvendar o que afeta o salário hora, para isso, utilizaremos as variáveis female (1 se é mulher), educ (anos de educação), exper (anos de experiência) e ternure (anos com o atual emprego).

Com efeito, vimos que a variável qualitativa escolhida realmente afeta o salário hora, no caso, como temos como referência 1 como sendo mulher, o efeito da variável female diz há uma relação negativa com o salário hora.

Regressão com variável binária (dummy) no Python

No Python, seguimos a mesma lógica que fizemos no R, porém, utilizando a função ols() da biblioteca statsmodels. Para exemplificar, utilizamos também o dataset do wooldridge, wage1, obtendo os mesmo resultado que anteriormente.

Regressões Logísticas

Diferente das regressões com variáveis binárias, que utilizam dois valores para os preditores como forma de explicar o relacionamento de duas variáveis, e se quisermos ao invés de utilizar uma variável proporcional (quantitativa) como dependente, utilizar uma variável binária como resposta? Isto é, uma forma de probabilidade de algo acontecer ou não? Nesse caso, é possível utilizar a Regressão Logística.

O recurso que temos em mãos é poder estimar a probabilidade associada a ocorrência de determinado evento, sendo útil em diversos estudos. Como a ideia é estimar uma probabilidade, os resultados estarão contidos entre 0 e 1.  Se utiliza do estimador de máxima verossimilhança, como forma de maximizar a probabilidade de ocorrência da amostra, dado os coeficientes das variáveis independentes.

Regressão Logística no R

Para implementar a regressão logística no R, utilizaremos a função glm(), com o dataset affairs  do wooldridge, que traz os dados de uma pesquisa sobre relações extraconjugais. A coluna "affair' é uma variável binária, que retorna 1, em caso de relações extraconjugal, e 0, caso contrário. Desta forma, utilizaremos a variáveis independentes de algumas colunas para estimar a variável dependente.

As coluna que iremos utilizar são: male (em que 1 é homem), age (idade) e ysrmarr (anos de casado). Vemos nos resultados que há grande significância na variável anos de casado, com um coeficiente positivo.

Regressão Logística no Python

Utilizar a Regressão logística no Python segue os mesmo princípios que no R, no código iremos apenas adicionar a api do statsmodels que permitira escolhe a família de distribuição que iremos utilizar na função glm(), que será a binomial (conhecida como logit), igual realizamos no R.

Quer saber mais sobre R e Python?

Veja nossos cursos de aplicados de R e Python para Economistas, Estatística usando R e Python, Econometria usando R e Python.

Modelo de Mercado e Regressão Móvel

By | mercado financeiro

No post de hoje iremos mostrar como criar o modelo de precificação conhecido como Market Model. O propósito do modelo segue o mesmo caminho que outros modelos de fatores, em que é escolhido uma proxy de risco para explicar a variação do retorno de um ativo. Mostraremos também como criar uma regressão móvel para o modelo.

No caso do Market Model, pode ser considerado um dos modelos mais simples dentro da literatura e do mundo real de finanças, em que é necessário somente os dados de um índice de mercado que queira ser acompanhado, diferente de outros modelos, que se estendem na utilização de proxys para portfolios de mercado ou o efeito do tamanho das empresas sobre o ativo, podendo ou não serem modelos multi-fatores.

O Market Model não pressupõe a preocupação de se utilizar o verdadeiro portfolio de mercado, apenas um índice, portanto não é necessário que seja utilizado a taxa de juros livre de risco para realizar seu cálculo. Sua equação é definida como:

(1)    \begin{equation*}R_i = \alpha + \beta r_m\end{equation*}

em que $r_i$ é o retorno do ativo, $\alpha$ é o retorno em excesso, $\beta$ é o coeficiente que mede a sensibilidade do ativo em relação ao índice e $r_m$ é o retorno do índice.

Feito a especificação do nosso modelo, podemos coletar e tratar nossos dados. Iremos coletar os preços de quatro ações para montar um Equally Weighted Portfolio. Como estamos utilizando ações que estão na B3, iremos utilizar o Índice Bovespa como índice de mercado. Iremos utilizar dados mensais (realizando a transformação de diário para mensal) começando a partir de 2013.

library(tidyverse)
library(tidyquant)
library(timetk)
library(stargazer)
library(ggrepel)
library(patchwork)

# Define os ativos que irão ser coletados

tickers <- c("PETR4.SA", "ITUB4.SA", "ABEV3.SA", "JBSS3.SA")

# Define a data de início da coleta

start <- "2012-12-01"

# Realiza a coleta dos preços diários

prices <- getSymbols(tickers,
auto.assign = TRUE,
warnings = FALSE,
from = start,
src = "yahoo") %>%
map(~Cl(get(.))) %>%
reduce(merge) %>%
`colnames<-`(tickers)

# Transfroma os preços diários em mensais

prices_monthly <- to.monthly(prices,
indexAt = "lastof",
OHLC = FALSE)

# Calcula os retornos mensais

asset_returns <- Return.calculate(prices_monthly,
method = "log") %>%
na.omit()

# Calcula o portfolio com pesos iguais

portfolio_returns <- Return.portfolio(asset_returns)

# Coleta os dados do ibovespa

getSymbols("^BVSP",
warnings = FALSE,
from = start,
src = "yahoo")

# Calcula os retornos mensais

bvsp_returns <- Ad(BVSP) %>%
to.monthly(indexAt = "lastof",
OHLC = FALSE) %>%
Return.calculate(method = "log") %>%
na.omit() %>%
`colnames<-`("ibovespa")

# Junta os dados

all_returns <- merge.xts(portfolio_returns, bvsp_returns)

Com os nossos dados em mãos, podemos realizar nossa Regressão via MQO.


# Cálcula a regressão "estática"

market_model <- lm(formula = portfolio.returns ~ ibovespa,
data = all_returns)

# Cria uma tabela com os resultados da regressão

stargazer(market_model, header = FALSE, align = TRUE)

 


Vemos que tivemos um resultado no qual nosso Beta é menor do 1, significando que nosso portfólio varia menos que o proporcional do mercado.

Por fim, sabemos que esse resultado não pode ser o  mesmo em todos os horizontes de tempo, para tanto, podemos criar uma Regressão Móvel para saber em quais período de tempo nosso Beta está acima ou abaixo que o proporcional do mercado.


# Aplica a função para criar a regressão móvel

coef <- rollapply(all_returns,
width = 24, # Janela
FUN = function(x) # Cria uma função da regressão para utilizar com a função
{
roll_reg = lm(portfolio.returns ~ ibovespa,
data = as.data.frame(x))
return(roll_reg$coef)
},
by.column = FALSE)

# Limpa e transforma o objeto em tibble

coef_tbl <- coef %>%
na.omit() %>%
tk_tbl(preserve_index = TRUE,
rename_index = "date") %>%
rename(alpha = "X.Intercept.", beta = "ibovespa")

&nbsp;

# Cria um gráfico do Alpha móvel

alpha <- ggplot(coef_tbl, aes(x = date, y = alpha))+
geom_line(size = .8, colour = "darkblue")+
theme_minimal()+
labs(title = "Alpha",
x = "",
y = "")+
geom_hline(yintercept = 0, linetype = "dashed", colour = "red")+
geom_label_repel(label = round(tail(coef_tbl$alpha, 1), 4),
nudge_y = 0.002,
nudge_x = -1,
data = tail(coef_tbl, 1),
color = 'black',
fill = 'lightblue')

# Cria um gráfico do Beta móvel

beta <- ggplot(coef_tbl, aes(x = date, y = beta))+
geom_line(size = .8, colour = "darkblue")+
theme_minimal()+
labs(title = "Beta",
x = "",
y = "")+
geom_label_repel(label = round(tail(coef_tbl$beta, 1), 3),
nudge_y = 0.2,
nudge_x = -1,
data = tail(coef_tbl, 1),
color = 'black',
fill = 'lightblue')

&nbsp;

# Junta os gráficos

alpha / beta +
plot_annotation(title = "Regressão Móvel do Modelo de Mercado",
subtitle = "Portfólio x Ibovespa",
caption = "Elaborado por analisemacro.com.br com dados do Yahoo Finance.")

 

________________________

(*) Para entender mais sobre Mercado Financeiro e medidas de risco, confira nosso curso de R para o Mercado Financeiro.
________________________

Testes de Hipóteses sobre um único parâmetro: o teste t

By | Hackeando o R

Um importante tipo de hipótese que estamos interessados é o da forma em que:

(1)   \begin{align*} H_0 : \beta_j = a_j, \end{align*}

onde a_j é um número dado [em geral, a_j = 0]. Para a maioria dos testes bicaudais, a hipótese alternativa implica em:

(2)   \begin{align*} H_1 : \beta_j \neq a_j, \end{align*}

e para testes unicaudais, ou temos:

(3)   \begin{align*} H_1 : \beta_j < a_j \quad ou \quad \beta_j > a_j. \end{align*}

Essas hipóteses podem ser testadas usando um teste t que é baseado na seguinte estatística:

(4)   \begin{align*} t = \frac{\hat{\beta_j} - a_j}{ep(\hat{\beta_j})}. \end{align*}

Se H_0 é verdadeira, essa estatística possui uma distribuição t com n-k-1 graus de liberdade. Para ilustrar, estimamos uma função para o log do salário-hora. Assim, temos os parâmetros dos retornos percentuais de cada entrada no modelo. Podemos avaliar se, por exemplo, depois de controlar por educação e titularidade, experiência ainda tem um efeito estatisticamente significante no salário-hora.


library(wooldridge)

data("wage1") # puxamos os dados

summary(lm(log(wage) ~ educ + exper + tenure, data=wage1))

E abaixo, a saída da regressão.

E de fato, a 5\% de significância existe um efeito para experiência. Mais especificamente, um ano a mais de experiência na média se traduz em 0,41\% de aumento salarial. Observe ainda que a estatística t pode ser calculada como sendo o parâmetro \beta_j estimado sobre o erro-padrão. Para o caso da experiência, temos 0.004121/0.001723, que é igual a 2,39. Em outras palavras, podemos rejeitar a hipótese nula que \beta_j = 0.

__________________________

(*) Isso e muito mais você aprende em nosso Curso de Introdução à Econometria usando o R.

Implementando regressões simples no R

By | Hackeando o R

Regredir um variável x contra uma variável y é um poderoso recurso estatístico. De modo a explicar o método, suponha que estamos interessados em estimar os parâmetros populacionais \beta_0 e \beta_1 de um modelo de regressão simples

(1)   \begin{align*} y = \beta_0 + \beta_1 x + u  \end{align*}

a partir de uma amostra aleatória de y e x. Os estimadores de Mínimos Quadrados Ordinários (MQO) serão

(2)   \begin{align*} \hat{\beta}_0 &= \hat{y} - \hat{\beta_1} \bar{x} \\ \hat{\beta_1} &= \frac{Cov(x,y)}{Var{x}}. \end{align*}

Baseado nos parâmetros estimados, a reta de regressão será

(3)   \begin{align*} \hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x. \end{align*}

Para uma dada amostra, nós precisaremos calcular as quatro estatísticas \bar{y}, \bar{x}, Cov(x,y) e Var(x) e colocá-las nessas equações. Para ilustrar, vamos considerar o exemplo 2.3 de Wooldridge (2013) sobre Salários de CEOs e Retornos sobre o patrimônio. Para isso, considere o seguinte modelo

(4)   \begin{align*} salary = \beta_0 + \beta_1 roe + u \end{align*}

onde salary é o salário anual de CEO em milhares de dólares e roe é o retorno médio sobre o patrimônio em percentual. O parâmetro \beta_1 irá medir a variação no salário anual quando o retorno médio sobre o patrimônio aumentar em um ponto percentual. Para estimar esse modelo, podemos utilizar o conjunto de dados ceosal1. Podemos dar uma olhada nas variáveis do conjunto de dados cesal1 a partir do pacote wooldridge como abaixo.


data(ceosal1, package='wooldridge')
attach(ceosal1)

Uma vez que tenhamos carregado o conjunto de dados, podemos calcular manualmente os parâmetros \beta_0 e \beta_1, como abaixo.


# Cálculo manual dos parâmetros
b1hat = cov(roe,salary)/var(roe)
b0hat = mean(salary) - b1hat*mean(roe)

Isto é, a reta de regressão será dada por

(5)   \begin{align*} \hat{salary} = 963,191 + 18,501 * roe \end{align*}

o que pode ser facilmente obtido com o código abaixo:


lm(salary ~ roe)

Implicando que para um roe = 0, teremos um salário previsto de 963,19 ou US$ 963.191, que é o intercepto. Ademais, se \Delta roe = 1, então \Delta salary = 18,5 ou US$ 18.501. Podemos, por fim, desenhar a reta de regressão com o código abaixo.


CEOregress = lm(salary ~ roe)
plot(roe, salary, ylim=c(0,4000))
abline(CEOregress, col='red')

Vamos continuar nossa revisão de modelos de regressão simples com o conjunto de dados wage1. Estamos interessados agora em estudar a relação entre educação e salários, de modo que o nosso modelo de regressão será

(6)   \begin{align*} wage = \beta_0 + \beta_1 education + u. \end{align*}

O que pode ser obtido com o código abaixo.


modelo = lm(wage ~ educ, data=wage1)
modelo

Isto é, teremos a seguinte reta de regressão

(7)   \begin{align*} \hat{wage} = -0,9 + 0,54 * education \end{align*}

de modo que um ano adicional de estudo implica em mais 54 centavos à hora de trabalho. O objeto obtido com a função lm contém todas as informações relevantes de uma regressão. Abaixo, acessamos os elementos do objeto CEOregress:


names(CEOregress)
CEOregress$coefficients

Podemos obter os valores ajustados:


plot(CEOregress$fitted.values)

E os resíduos:


plot(CEOregress$residuals)

Por fim, podemos ainda obter um sumário de todas as estatísticas relevantes da regressão com a função abaixo.


summary(CEOregress)

O que podemos gerar como tabela com o pacote stargazer como abaixo.

Dependent variable:
salary
roe 18.501*
(11.123)
Constant 963.191***
(213.240)
Observations 209
R2 0.013
Adjusted R2 0.008
Residual Std. Error 1,366.555 (df = 207)
F Statistic 2.767* (df = 1; 207)
Note: *p<0.1; **p<0.05; ***p<0.01

Gostou? Isso e muito mais você aprende em nosso Curso de Introdução à Econometria usando o R.

__________________

(*) Wooldridge, J. M. Introductory Econometrics: A Modern Approach. Editora Cengage, 2013.

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente