Chapter 4 Remoteness estimates

The remoteness model adds variables to the OLS model. The general equation for this model is: \[ \begin{align} \log X_{ij,t} =& \:\beta_0 + \beta_1 DIST_{i,j} + \beta_2 CNTG_{i,j} + \beta_3 LANG_{i,j} + \beta_4 CLNY_{i,j} + \beta_5 \log Y_{i,t} +\\ \text{ }& \beta_6 \log E_{j,t} + \beta_7 \log(REM\_EXP_i,t) + \beta_8 \log(REM\_IMP_i,t) + \varepsilon_{ij,t} \end{align} \]

Where \[ \log(REM\_EXP_{i,t}) = \log \left( \sum_j \frac{DIST_{i,j}}{E_{j,t} / Y_t} \right)\\ \log(REM\_IMP_{j,t}) = \log \left( \sum_i \frac{DIST_{i,j}}{Y_{i,t} / Y_t} \right) \]

4.1 Create remoteness indexes

We can create each index in a new table and then join the results:

gravity2_rem_exp <- gravity2 %>% 
  select(exporter, year, expenditure, dist) %>% 
  group_by(exporter, year) %>% 
  summarise(rem_exp = log(weighted.mean(dist, expenditure)))

gravity2_rem_imp <- gravity2 %>% 
  select(importer, year, output, dist) %>% 
  group_by(importer, year) %>% 
  summarise(rem_imp = log(weighted.mean(dist, output)))

gravity2 <- gravity2 %>% 
  left_join(gravity2_rem_exp) %>% 
  left_join(gravity2_rem_imp)

4.2 Adjust

rem_formula <- as.formula("log_trade ~ log_dist + cntg + lang + clny + 
  log_output + log_expenditure + rem_exp + rem_imp")

model3 <- lm(rem_formula, data = gravity2)

4.3 Compute clustered standard errors

vcov_cluster3 <- vcovCL(model3, cluster = gravity2[, "pair"], 
                        df_correction = TRUE)

coef_test3 <- tidy(coeftest(model3, vcov_cluster3))

wald3 <- tidy(waldtest(model3, vcov = vcov_cluster3, test = "F"))
fs3 <- wald3$statistic[2]
fp3 <- wald3$p.value[2]

rss3 <- as.numeric(crossprod(model3$residuals))
rmse3 <- sqrt(rss3 / length(model3$residuals))

model3_results <- list(
  summary = tibble(
    n_obs = nrow(gravity2),
    f_stat = fs3,
    prob_f = fp3,
    r_sq = summary(model3)$r.squared,
    root_mse = rmse3
  ),
  coefficients = coef_test3
)

model3_results
## $summary
## # A tibble: 1 × 5
##   n_obs f_stat prob_f  r_sq root_mse
##   <int>  <dbl>  <dbl> <dbl>    <dbl>
## 1 25689  3821.      0 0.761     1.73
## 
## $coefficients
## # A tibble: 9 × 5
##   term            estimate std.error statistic   p.value
##   <chr>              <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept)      -21.8     1.18       -18.5  1.39e- 75
## 2 log_dist          -1.18    0.0304     -38.7  3.52e-319
## 3 cntg               0.283   0.132        2.15 3.18e-  2
## 4 lang               0.649   0.0689       9.43 4.40e- 21
## 5 clny               0.876   0.117        7.48 7.87e- 14
## 6 log_output         1.20    0.00936    128.   0        
## 7 log_expenditure    0.923   0.00985     93.7  0        
## 8 rem_exp            0.624   0.0869       7.18 7.09e- 13
## 9 rem_imp            0.693   0.0977       7.09 1.34e- 12

4.4 RESET test

gravity2 <- gravity2 %>% 
  mutate(fit2 = predict(model3)^2)

model4 <- lm(update(rem_formula, ~ . + fit2), data = gravity2)

vcov_cluster4 <- vcovCL(model4, cluster = gravity2[, "pair"], 
                        df_correction = TRUE)

coef_test4 <- tidy(coeftest(model4, vcov_cluster4))

coef_test4
## # A tibble: 10 × 5
##    term             estimate std.error statistic   p.value
##    <chr>               <dbl>     <dbl>     <dbl>     <dbl>
##  1 (Intercept)     -22.7       1.19       -19.0  2.85e- 80
##  2 log_dist         -1.24      0.0326     -37.9  2.74e-306
##  3 cntg              0.390     0.128        3.05 2.27e-  3
##  4 lang              0.674     0.0687       9.82 9.95e- 23
##  5 clny              0.947     0.113        8.42 4.01e- 17
##  6 log_output        1.25      0.0143      87.2  0        
##  7 log_expenditure   0.960     0.0135      71.2  0        
##  8 rem_exp           0.662     0.0866       7.65 2.10e- 14
##  9 rem_imp           0.722     0.0974       7.40 1.36e- 13
## 10 fit2             -0.00702   0.00139     -5.04 4.64e-  7