Carregando dados

library(AER)

data("CigarettesSW", package = "AER") 

# turn off scientific notation except for big numbers
  options(scipen = 9)


O modelo de demanda por cigarros em Stock & Watson (capítulo 12)

Taxar o uso de cigarros é importante pq tem externalidade negativa. Mas determinar o valor do tributo é algo que depende da elasticidade da demanda pelo fumo. Uma demanda mais elástica (-Inf) precisa de menos imposto para reduzir o consumo da diamba.


Vamos começar organizando a base de dados a base de dados:

library(tidyverse)

cigs <- CigarettesSW    %>%
  filter(year == 1995)  %>%
  mutate(rprice  = price/cpi,                # do preço do bagulho (deflacionado)
         rincome = (income/population)/cpi,  # a renda do usuário
         lprice  = log(rprice),              # log(preço)
         lquant  = log(packs),               # quantidade
         lincome = log(rincome),             # renda da população
         tdiff   = (taxs - tax)/cpi)    %>%  # imposto cobrado por qtde (taxa real)
  glimpse()
## Observations: 48
## Variables: 15
## $ state      <fctr> AL, AR, AZ, CA, CO, CT, DE, FL, GA, IA, ID, IL, IN...
## $ year       <fctr> 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 19...
## $ cpi        <dbl> 1.524, 1.524, 1.524, 1.524, 1.524, 1.524, 1.524, 1....
## $ population <dbl> 4262731, 2480121, 4306908, 31493524, 3738061, 32652...
## $ packs      <dbl> 101.08543, 111.04297, 71.95417, 56.85931, 82.58292,...
## $ income     <dbl> 83903280, 45995496, 88870496, 771470144, 92946544, ...
## $ tax        <dbl> 40.50000, 55.50000, 65.33333, 61.00000, 44.00000, 7...
## $ price      <dbl> 158.3713, 175.5425, 198.6075, 210.5047, 167.3500, 2...
## $ taxs       <dbl> 41.90467, 63.85917, 74.79082, 74.77133, 44.00000, 8...
## $ rprice     <dbl> 103.91821, 115.18538, 130.31989, 138.12643, 109.809...
## $ rincome    <dbl> 12.91535, 12.16907, 13.53964, 16.07359, 16.31556, 2...
## $ lprice     <dbl> 4.643604, 4.746543, 4.869992, 4.928169, 4.698749, 4...
## $ lquant     <dbl> 4.615966, 4.709917, 4.276029, 4.040580, 4.413803, 4...
## $ lincome    <dbl> 2.558416, 2.498898, 2.605622, 2.777178, 2.792119, 3...
## $ tdiff      <dbl> 0.9216975, 5.4850193, 6.2057067, 9.0363074, 0.00000...


De um modo geral, a elasticidade é calculada como:

\[elasticity = \epsilon = \frac{dQ_d/Q_d}{dP/P} = \frac{dln(Q_d)}{dln(P)}\] Mas as combinações de preços e quantidades refletem tanto os efeitos da demanda como da oferta. E normalmente a oferta e a demanda por um bem são modeladas como um sistema de equações simultaneas que relacionam separadamente a quanditade e o preço de equilíbzZZzZZZzz…. e isso resulta em uma equação reduzida e ‘logaritmizada’ que pode ser estimado através de um modelo de regressão linear, onde \(\widehat{\beta}\) é o parâmetro de estimação da eslasticidade da demanda.

\[lnQ_{d} = \alpha + \beta lnP + u\] A algebrera consegue nos dar um parâmetro razoável para estimar a elasticidade da demanda, mas ela não consegue dissociar a correlação entre \(\widehat{\beta}\) e \(u\), pois este último contém em sua estrutura os efeitos da oferta que podem refletir no preço. Vejamos a regressão por Mínimos Quadrados Ordinários, onde é esperado que o coeficiente \(\widehat{\beta}_{OLS}\) seja viesado:

ols <- lm(lquant ~ lprice, data = cigs)  

# function to calculate corrected SEs for OLS regression 
cse <- function(reg) {
  rob <- sqrt(diag(vcovHC(reg, type = "HC1")))
  return(rob)
}

library("stargazer")
stargazer(ols,  
          se    = list(cse(ols)), # os erros são robustos. A função cse() faz esse trabalho.
          title = "OLS Regression", type = "text", df = FALSE, digits = 5)
## 
## OLS Regression
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                               lquant           
## -----------------------------------------------
## lprice                      -1.21306***        
##                              (0.19459)         
##                                                
## Constant                    10.33892***        
##                              (0.93482)         
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                            0.40575          
## Adjusted R2                   0.39283          
## Residual Std. Error           0.18962          
## F Statistic                 31.40859***        
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01


O estimador MQO em 2 estágios

(a.k.a Two Stage Least Squares (TSLS))

A solução para o modelo requer o emprego de variáveis instrumentais, pois o preço (\(P\) ou lprice ou, genericamente \(X\)) é correlacionado com o o termo de erro (\(u\)). Logo, o \(\widehat{\beta}_{OLS}\) estimado é inconsistente ou viesasdo e o que precisamos é de uma variável \(Z\) que seja altamente correlacionada com \(X\) mas não correlacionada com \(u\).

Formalmente, conforme Stock & Watson (2010), o instrumento utilizado deve atender a condição de:

Uma variável instrumental que é relevante e endógena pode capturar movimentos em \(X_{i}\) que são exógenos e essa variação exógena pode ser utilizada para estimar \(\beta_{i}\).

É por isso que no primeiro estágio da estimação, partimos da relação entre \(X\) e \(Z\):

\[X_{i} = \pi_{0} + \pi_{1}Z_{i} + v_{i}\]

A variável dependente (no modelo original) \(lnP\) é regredida contra a variável instrumental \(Z_{i}\) (= tdiff). O preço é desmembrado em três componentes, um da própria demanda (\(\pi_{0}\)), outro dos impostos cobrados (\(Z_{i}\)) e mais um com os fatores não observados (\(v_{i}\)). Assumimos, portanto, que os impostos não tem relação com a demanda, já que o governo é quem o faz arbitráriamente (exogeneidade!). Adicionalmente, é razoável assumir que os estados que cobram impostos mais altos sobre o preço do paiêro tem os maiores preços (\(X_{i}\) = \(lnP_{i}\)) registrados para esse bem (relevãncia!).

### IV regression

# Let's take a look at the first-stage regression (12.9)
# Regress X on Z (and any other exogenous variables W if we had them)
# As an instrument we use tdiff 

first1 = lm(lprice ~ tdiff, data = cigs)


stargazer(first1,  
          se=list(cse(first1)),
          title="First-stage Regression", type="text", 
          df=FALSE, digits=5)
## 
## First-stage Regression
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                               lprice           
## -----------------------------------------------
## tdiff                       0.03073***         
##                              (0.00484)         
##                                                
## Constant                    4.61655***         
##                              (0.02892)         
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                            0.47100          
## Adjusted R2                   0.45950          
## Residual Std. Error           0.09394          
## F Statistic                 40.95588***        
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01


Desta forma, temos a primeira equação:

\[\widehat{ln(P^{_{i}^{cigaretets}})} = \underset{(0.030)}{4.62} - \underset{(0.005)}{0.031}SalesTax_{i}\]

Estocaremos os valores estimados \(\widehat{ln(P^{_{i}^{cigaretets}})}\) no data.frame:

cigs$p_hat <- first1$fitted.values

E utilizamos ele mesmo para fazer o cálculo do segundo estágio:

# Reduced form: Regress Y on Z (and any other exogenous variables W if we had them)
  
  reduced = lm(lquant ~ p_hat, data = cigs)
  stargazer(reduced,
            se    = list(cse(reduced)),
            title = "Reduced-form Regression", type = "text", 
            df    = FALSE, digits = 5)
## 
## Reduced-form Regression
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                               lquant           
## -----------------------------------------------
## p_hat                       -1.08359***        
##                              (0.33370)         
##                                                
## Constant                    9.71988***         
##                              (1.59712)         
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                            0.15249          
## Adjusted R2                   0.13407          
## Residual Std. Error           0.22645          
## F Statistic                 8.27665***         
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01


O que nos dá uma demanda bastante inelástica (-1,08): um aumento de 1% no preço da paranga reduz a o consumo em 1,08%

\[\widehat{ln(Q^{_{i}^{cigaretets}})} = \underset{(1.597)}{9.72} - \underset{(0.333)}{1.08}ln(P_{i}^{cigarette})\]

Facilitando as coisas com AER::ivreg()

O mesmo resultado pode ser obtido com o comando ivreg:

  iv1 = ivreg(lquant ~ lprice | tdiff , data = cigs)

  library(ivpack)
  # corrected SEs for IV regressions... slight difference from S&W method
  ivse = function(reg) {
      rob = robust.se(reg)[,2]
      return(rob)
      }
    
  # note: use the function ivse for corrected SEs in IV
  stargazer(iv1, 
            se=list(ivse(iv1)),
            title="IV Regression", type="text", 
            df=FALSE, digits=5)
## [1] "Robust Standard Errors"
## 
## IV Regression
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                               lquant           
## -----------------------------------------------
## lprice                      -1.08359***        
##                              (0.31220)         
##                                                
## Constant                    9.71988***         
##                              (1.49614)         
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                            0.40113          
## Adjusted R2                   0.38811          
## Residual Std. Error           0.19035          
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Um exercício e um exemplo com álgebra matricial:


  1. Considere o modelo de regressão linear abaixo em que \(Z\) é um vetor de observações de um regressor endógeno:

\[y = X\beta + Z\delta + \varepsilon\] O modelo precisa ser estimado por 2SLS. Escreva a função que estime o modelo com quatro argumentos: \(y\),\(X\),\(Z\); e a matriz de instrumentos \(H\):

Resposta:

Criamos a função abaixo para estimação em 2 estágios:

TSLS <- function(y, X, Z, H){
  y      <- as.matrix(y) # Variável dependente
  X      <- as.matrix(X) # Variável explicativa exógena
  Z      <- as.matrix(Z) # Variável explicativa endógena
  H      <- as.matrix(H) # Matriz de Instrumentos (inclui X e os demais)
  EXP    <- cbind(X, Z)
  betas  <- solve(t(EXP) %*% H %*% solve(t(H) %*% H) %*% t(H) %*% EXP) %*%
                  t(EXP) %*% H %*% solve(t(H) %*% H) %*% t(H) %*% y
  output <- data.frame(betas)
  colnames(output) <- "Coeficientes"
  rownames(output) <- NULL
  print(output)
  }

Um teste:

# Teste: # Dados
set.seed(44)

y <- rnorm(500)
Xa <- rnorm(500)

Int <- rep(1,500)
X <- cbind(Int, Xa)


Z <- rnorm(500)

X1 <- rnorm(500) # Instrumento 1 
X2 <- rnorm(500) # Instrumento 2

H <- cbind(Xa, X1, X2)

head(H) 
##              Xa          X1         X2
## [1,]  1.7495518  0.74350693 -0.7160694
## [2,] -0.4433087 -0.55804034  0.3438573
## [3,] -0.3431100 -0.69004880  1.2326432
## [4,]  1.2491928 -1.17804117 -0.5013019
## [5,] -0.2989443 -2.28623172 -2.6151014
## [6,] -0.6738205 -0.07962112  0.6173945
TSLS(y,X,Z,H)
##   Coeficientes
## 1   0.16282615
## 2   0.02228528
## 3  -0.34957993