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 %>%
gravity2_rem_exp select(exporter, year, expenditure, dist) %>%
group_by(exporter, year) %>%
summarise(rem_exp = log(weighted.mean(dist, expenditure)))
<- gravity2 %>%
gravity2_rem_imp 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
<- as.formula("log_trade ~ log_dist + cntg + lang + clny +
rem_formula log_output + log_expenditure + rem_exp + rem_imp")
<- lm(rem_formula, data = gravity2) model3
4.3 Compute clustered standard errors
<- vcovCL(model3, cluster = gravity2[, "pair"],
vcov_cluster3 df_correction = TRUE)
<- tidy(coeftest(model3, vcov_cluster3))
coef_test3
<- tidy(waldtest(model3, vcov = vcov_cluster3, test = "F"))
wald3 <- wald3$statistic[2]
fs3 <- wald3$p.value[2]
fp3
<- as.numeric(crossprod(model3$residuals))
rss3 <- sqrt(rss3 / length(model3$residuals))
rmse3
<- list(
model3_results 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)
<- lm(update(rem_formula, ~ . + fit2), data = gravity2)
model4
<- vcovCL(model4, cluster = gravity2[, "pair"],
vcov_cluster4 df_correction = TRUE)
<- tidy(coeftest(model4, vcov_cluster4))
coef_test4
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