1 Description

This project concerns replicating the main findings (plots and tables) from the paper

Nunn N. The Long Term Effects of Africa’s Slave Trades. Quarterly Journal of Economics. 2008; 123 (1) : 139-176

What this project does not include is questioning the author’s aurgumentations. For a detailed evidence examination please refer to the author’s paper which he made freely available on his Harvard webiste along with the dataset.

However, in the Critique section, I point out some flaws which I think weaken Nunn’s results and some improvements which I personally suggest are woth considering.

To start off, Nathan Nunn’s research question is:

Can part of Africa’s current underdevelopment be explained by its slave trades? To explore this question, I use data from shipping records and historical documents reporting slave ethnicities to construct estimates of the number of slaves exported from each country during Africa’s slave trades. I find a robust negative relationship between the number of slaves exported from a country and current economic performance. To better understand if the relationship is causal, I examine the historical evidence on selection into the slave trades and use instrumental variables. Together the evidence suggests that the slave trades had an adverse effect on economic development.

2 Replication

The Dataset is made up of 52 entries, one for each african State, and 39 variables.

slave_data <- read_dta("slave_trade_QJE.dta")
kable(slave_data[1:5,])
isocode country ln_maddison_pcgdp2000 ln_export_area ln_export_pop colony0 colony1 colony2 colony3 colony4 colony5 colony6 colony7 abs_latitude longitude rain_min humid_max low_temp ln_coastline_area island_dum islam legor_fr legor_uk region_n region_s region_w region_e region_c ln_avg_gold_pop ln_avg_oil_pop ln_avg_all_diamonds_pop ln_pop_dens_1400 atlantic_distance_minimum indian_distance_minimum saharan_distance_minimum red_sea_distance_minimum ethnic_fractionalization state_dev land_area
AGO Angola 6.670766 7.967493 14.399250 0 0 0 1 0 0 0 0 8 17.54142 0 78 14 0.2468601 0 0 1 0 0 0 0 0 1 -6.614335 0.643126 -1.701396 -0.0249170 5.668760 6.980571 4.925892 3.872354 0.7867 0.635 1.2500
BDI Burundi 6.354370 1.140843 4.451658 0 0 0 0 1 0 0 0 16 29.88722 5 82 17 -4.6051702 0 1 1 0 0 0 0 1 0 -2.633923 -9.210340 -6.907755 3.0368562 10.626214 2.570375 3.718742 2.215324 0.2951 0.995 0.0278
BEN Benin 7.187657 8.304137 13.308970 0 0 1 0 0 0 0 0 6 2.34264 13 78 18 0.0684028 0 13 1 0 0 0 1 0 0 -13.815511 -3.531555 -6.907755 1.2141958 5.120652 9.233961 2.834785 3.901736 0.7872 0.695 0.1130
BFA Burkina Faso 6.748760 6.413822 11.724286 0 0 1 0 0 0 0 0 12 -1.74292 0 67 9 -4.6051702 0 42 1 0 0 0 1 0 0 -2.164328 -9.210340 -6.907755 0.9085654 4.774938 9.299419 2.763519 4.239375 0.7377 0.338 0.2740
BWA Botswana 8.377471 -2.302585 3.912023 0 1 0 0 0 0 0 0 24 23.82042 0 74 -4 -4.6051702 0 0 0 1 0 1 0 0 0 -3.705090 -9.210340 2.186849 -2.0750294 5.686335 5.764576 5.856533 4.299600 0.4102 0.893 0.6000

2.1 Figure III: plot relationship between GDP and slave exports

ggplot(slave_data, aes(x=ln_export_area, y=ln_maddison_pcgdp2000))+
  geom_point(shape=1)+
  geom_text(label=slave_data$isocode)+
  geom_smooth(method=lm, se=FALSE)+
  ggtitle("Relationship between Slave Exports and GDP")+
  xlab("log of export / area between 1400-1900")+
  ylab("log of per capita GDP in 2000")

2.2 Table III: get OLS estimates of slaves/area over various specifications

##only colonizer effects
ols1<- lm(ln_maddison_pcgdp2000~ln_export_area+colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=slave_data)
##colonizer and geographic effects
ols2<- lm(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
            rain_min+humid_max+low_temp+ln_coastline_area+
            colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=slave_data)
##colonizer and geographic effects w/o islands and North countries
remove_isl_and_north<- c('Morocco','Algeria','Tunisia','Libya','Egypt','Seychelles',
                         'Mauritius','Comoros','Sao Tome & Principe','Cape Verde Islands')
restricted_sample<-slave_data[!slave_data$country %in% remove_isl_and_north,]
ols3<- lm(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
            rain_min+humid_max+low_temp+ln_coastline_area+
            colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=restricted_sample)
##additional controls: island fixed effect, North Africa fixed effect, French legal origin, percent islamic
ols4<- lm(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
            rain_min+humid_max+low_temp+ln_coastline_area+region_n+legor_fr+island_dum+islam+
            colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=slave_data)
##additional controls: log of the annual average per capita production of gold, oil, diamonds
ols5<- lm(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
            rain_min+humid_max+low_temp+ln_coastline_area+region_n+legor_fr+island_dum+islam+
            ln_avg_gold_pop+ln_avg_oil_pop+ln_avg_all_diamonds_pop+
            colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=slave_data)
##all control variables and drop islands and North African countries
ols6<- lm(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
            rain_min+humid_max+low_temp+ln_coastline_area+region_n+legor_fr+island_dum+islam+
            ln_avg_gold_pop+ln_avg_oil_pop+ln_avg_all_diamonds_pop+
            colony1+colony2+colony3+
            colony4+colony5+colony6+colony7, data=restricted_sample)
# generate table
stargazer(ols1,ols2,ols3,ols4,ols5,ols6,
          header = FALSE,
          digits = 3,
          title="Relationship between Slave Exports and Income",
          type = "html",
          dep.var.labels.include = FALSE,
          dep.var.caption =
            "Dependent variable is log real per capita GDP in 2000, ln y",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant'),
          add.lines=list(c('Colonizer fixed effects',"Yes","Yes","Yes","Yes","Yes","Yes")))
Relationship between Slave Exports and Income
Dependent variable is log real per capita GDP in 2000, ln y
(1) (2) (3) (4) (5) (6)
ln_export_area -0.112*** -0.076** -0.108*** -0.085** -0.103*** -0.128***
(0.024) (0.029) (0.037) (0.035) (0.034) (0.034)
abs_latitude 0.016 -0.005 0.019 0.023 0.006
(0.017) (0.020) (0.018) (0.017) (0.017)
longitude 0.0005 -0.007 -0.004 -0.004 -0.009
(0.005) (0.006) (0.006) (0.005) (0.006)
rain_min -0.001 0.008 0.0001 -0.001 -0.002
(0.007) (0.008) (0.007) (0.006) (0.008)
humid_max 0.009 0.008 0.009 0.015 0.013
(0.012) (0.012) (0.012) (0.011) (0.010)
low_temp -0.019 -0.039 -0.005 -0.015 -0.037
(0.028) (0.028) (0.027) (0.026) (0.025)
ln_coastline_area 0.085** 0.092** 0.095** 0.082** 0.083**
(0.039) (0.042) (0.042) (0.040) (0.037)
region_n 0.382 -0.304
(0.484) (0.517)
legor_fr 0.755 0.643 -0.141
(0.503) (0.470) (0.734)
island_dum -0.398 -0.150
(0.529) (0.516)
islam -0.008*** -0.006* -0.003
(0.003) (0.003) (0.003)
ln_avg_gold_pop 0.011 0.014
(0.017) (0.015)
ln_avg_oil_pop 0.078*** 0.088***
(0.027) (0.025)
ln_avg_all_diamonds_pop -0.039 -0.048
(0.043) (0.041)
Colonizer fixed effects Yes Yes Yes Yes Yes Yes
Observations 52 52 42 52 52 42
R2 0.505 0.601 0.633 0.709 0.773 0.797
Adjusted R2 0.413 0.450 0.463 0.551 0.615 0.639
Residual Std. Error 0.632 (df = 43) 0.612 (df = 37) 0.530 (df = 28) 0.553 (df = 33) 0.512 (df = 30) 0.435 (df = 23)
F Statistic 5.484*** (df = 8; 43) 3.982*** (df = 14; 37) 3.716*** (df = 13; 28) 4.473*** (df = 18; 33) 4.874*** (df = 21; 30) 5.027*** (df = 18; 23)
Note: p<0.1; p<0.05; p<0.01

2.3 Figure IV: plot relationship between Population Density (as proxy for economic prosperity) and Slave Exports

ggplot(slave_data, aes(x=ln_pop_dens_1400, y=ln_export_area))+
  geom_point(shape=1)+
  geom_text(label=slave_data$isocode)+
  geom_smooth(method=lm, se=FALSE)+
  ggtitle("Relationship between Initial Population Density and Slave Exports")+
  xlab("log population density in 1400")+
  ylab("slave exports (log of export / area)")

2.4 Table IV: get IV 2SLS estimates of slaves/area over various specifications

#SECOND STAGE

##w/o control variables
ivreg1<-ivreg(ln_maddison_pcgdp2000~ln_export_area|saharan_distance_minimum+
                atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum, data=slave_data)
##includes colonizer fixed effects
ivreg2<-ivreg(ln_maddison_pcgdp2000~ln_export_area+colony1+colony2+colony3+
                colony4+colony5+colony6+colony7|colony1+colony2+colony3+
                colony4+colony5+colony6+colony7+saharan_distance_minimum+
                atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum, data=slave_data)
##includes colonizer fixed effects and geographic controls
ivreg3<-ivreg(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
                rain_min+humid_max+low_temp+ln_coastline_area+
                colony1+colony2+colony3+
                colony4+colony5+colony6+colony7|abs_latitude+longitude+
                rain_min+humid_max+low_temp+ln_coastline_area+
                colony1+colony2+colony3+
                colony4+colony5+colony6+colony7+
                saharan_distance_minimum+
                atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum, data=slave_data)
##includes colonizer fixed effects and geographic controls, but the sample excludes islands and North African countries.
ivreg4<-ivreg(ln_maddison_pcgdp2000~ln_export_area+abs_latitude+longitude+
                rain_min+humid_max+low_temp+ln_coastline_area+
                colony1+colony2+colony3+
                colony4+colony5+colony6+colony7|abs_latitude+longitude+
                rain_min+humid_max+low_temp+ln_coastline_area+
                colony1+colony2+colony3+
                colony4+colony5+colony6+colony7+
                saharan_distance_minimum+
                atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum, data=restricted_sample)

#FIRST STAGE
stage1_1<-lm(ln_export_area~saharan_distance_minimum+
               atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum, data=slave_data)
stage1_2<-lm(ln_export_area~saharan_distance_minimum+
               atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum+colony1+colony2+colony3+
               colony4+colony5+colony6+colony7, data=slave_data)
stage1_3<-lm(ln_export_area~saharan_distance_minimum+
               atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum+colony1+colony2+colony3+
               colony4+colony5+colony6+colony7+abs_latitude+longitude+
               rain_min+humid_max+low_temp+ln_coastline_area, data=slave_data)
stage1_4<-lm(ln_export_area~saharan_distance_minimum+
               atlantic_distance_minimum+indian_distance_minimum+red_sea_distance_minimum+colony1+colony2+colony3+
               colony4+colony5+colony6+colony7+abs_latitude+longitude+
               rain_min+humid_max+low_temp+ln_coastline_area, data=restricted_sample)

pvH_1<-round(summary(ivreg1, diagnostics = TRUE)$diagnostics[2,4], digits=2)#Hausman test pvalue
pvH_2<-round(summary(ivreg2, diagnostics = TRUE)$diagnostics[2,4], digits=2)
pvH_3<-round(summary(ivreg3, diagnostics = TRUE)$diagnostics[2,4], digits=2)
pvH_4<-round(summary(ivreg4, diagnostics = TRUE)$diagnostics[2,4], digits=2)
pvS_1<-round(summary(ivreg1, diagnostics = TRUE)$diagnostics[3,4], digits=2)#Sargan test pvalue
pvS_2<-round(summary(ivreg2, diagnostics = TRUE)$diagnostics[3,4], digits=2)
pvS_3<-round(summary(ivreg3, diagnostics = TRUE)$diagnostics[3,4], digits=2)
pvS_4<-round(summary(ivreg4, diagnostics = TRUE)$diagnostics[3,4], digits=2)

#generate table - panel 1/2
stargazer(ivreg1,ivreg2,ivreg3,ivreg4,
          header = FALSE,
          digits = 3,
          omit.table.layout = "n",
          title="Estimates of the relationship between Slave Exports and Income",
          type = "html",
          dep.var.labels.include = FALSE,
          summary=TRUE,
          dep.var.caption =
            "Second Stage. Dependent variable is log income in 2000, ln y",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant','abs_latitude',
                 'longitude','rain_min','humid_max','low_temp','ln_coastline_area'),
          add.lines=list(c('Colonizer fixed effects',"No","Yes","Yes","Yes"),
                         c('Geography controls','No','No','Yes','Yes'),
                         c('Restricted sample','No','No','No','Yes')))
Estimates of the relationship between Slave Exports and Income
Second Stage. Dependent variable is log income in 2000, ln y
(1) (2) (3) (4)
ln_export_area -0.208*** -0.201*** -0.286* -0.221***
(0.053) (0.047) (0.153) (0.076)
Colonizer fixed effects No Yes Yes Yes
Geography controls No No Yes Yes
Restricted sample No No No Yes
Observations 52 52 52 42
R2 0.127 0.342 0.041 0.511
Adjusted R2 0.110 0.220 -0.322 0.284
Residual Std. Error 0.779 (df = 50) 0.729 (df = 43) 0.949 (df = 37) 0.612 (df = 28)
#generate table - panel 2/2
stargazer(stage1_1,stage1_2,stage1_3,stage1_4,
          header = FALSE,
          digits = 3,
          type = "html",
          dep.var.labels.include = FALSE,
          summary=TRUE,
          dep.var.caption =
            "First Stage. Dependent variable is slave exports, ln(exports/area)",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant','abs_latitude',
                 'longitude','rain_min','humid_max','low_temp','ln_coastline_area'),
          add.lines=list(c('Colonizer fixed effects',"No","Yes","Yes","Yes"),
                         c('Geography controls','No','No','Yes','Yes'),
                         c('Restricted sample','No','No','No','Yes'),
                         c('Hausman test (pvalue)',pvH_1,pvH_2,pvH_3,pvH_4),
                         c('Sargan test (pvalue',pvS_1,pvS_2,pvS_3,pvS_4)))
First Stage. Dependent variable is slave exports, ln(exports/area)
(1) (2) (3) (4)
saharan_distance_minimum -2.435*** -3.001*** -1.139 -4.076**
(0.823) (1.049) (1.595) (1.552)
atlantic_distance_minimum -1.314*** -1.741*** -1.316* -1.686**
(0.357) (0.425) (0.761) (0.680)
indian_distance_minimum -1.095*** -1.426** -1.081 -1.570*
(0.380) (0.531) (0.697) (0.801)
red_sea_distance_minimum -0.002 -0.152 -1.221 2.130
(0.710) (0.813) (1.820) (2.404)
Colonizer fixed effects No Yes Yes Yes
Geography controls No No Yes Yes
Restricted sample No No No Yes
Hausman test (pvalue) 0.02 0.01 0.02 0.04
Sargan test (pvalue 0.18 0.3 0.65 0.51
Observations 52 52 52 42
R2 0.279 0.396 0.477 0.720
Adjusted R2 0.218 0.230 0.216 0.540
Residual Std. Error 3.445 (df = 47) 3.418 (df = 40) 3.450 (df = 34) 2.371 (df = 25)
F Statistic 4.545*** (df = 4; 47) 2.383** (df = 11; 40) 1.824* (df = 17; 34) 4.012*** (df = 16; 25)
Note: p<0.1; p<0.05; p<0.01

Channels through which the slave trades may have affected economic development:

2.5 Figure VI: slave trades tended to weaken ties between villages

ggplot(slave_data, aes(x=ln_export_area, y=ethnic_fractionalization))+
  geom_point(shape=1)+
  geom_text(label=slave_data$isocode)+
  geom_smooth(method=lm, se=FALSE)+
  ggtitle("Relationship between Slave Exports and Current Ethnic Fractionalization")+
  xlab("log of export / area")+
  ylab("Ethnic fractionalization (Alesina, 2003)")

2.6 Figure VII: slave trades is linked to the weakening and underdevelopment of states

ggplot(slave_data, aes(x=ln_export_area, y=state_dev))+
  geom_point(shape=1)+
  geom_text(label=slave_data$isocode)+
  geom_smooth(method=lm, se=FALSE)+
  ggtitle("Relationship between Slave Exports and Nineteenth-Century State Development")+
  xlab("log of export / area")+
  ylab("19th century State development (Gennaioli & Rainer, 2006)")

3 Critique

I think there are some aspects that weaken the results, and thus leave room for imprevement. These are the following:

Let’s explore them individually.

3.1 weak instrument

Whit IV regressions there are 3 main diagnostics tests:

  1. Weak instruments: The null hypothesis is that we have weak instruments, so a rejection means our instruments are not weak, which is good;

  2. Wu-Hausman: Test for consistency. When we reject, it means OLS is not consistent, suggesting endogeneity is present;

  3. Sargan test: Used when there is more than one instrument. If the null is rejected, it means that at least one of our instruments is invalid, and possibly all of them;

In Table IV the author reports only the last two above mentioned tests, but if we compute the Weak instrument test for the model in column (3) we get a pvalue of 0.53 implying that the instruments are weak in this scenario.

round(summary(ivreg3, diagnostics = TRUE)$diagnostics[1,4], digits=2) #Weak instrument test pvalue
## [1] 0.53

In defense of the author, I would say that this is not enough to undermine his overall results.

3.2 Heteroskedasticity-Consistent standard errors

Just like in multiple regression it is important to compute heteroskedasticity-robust standard errors. However, throughout the paper the author never used robust standard errors.

Let’s rebuilt Tables III and IV this time taking into account HC standard errors:

#Modify Table III by taking into account Heteroskedasticity-Consistent standard errors using vcovHC()
se1<-coeftest(ols1, vcov = vcovHC, type = "HC1")
se2<-coeftest(ols2, vcov = vcovHC, type = "HC1")
se3<-coeftest(ols3, vcov = vcovHC, type = "HC1")
se4<-coeftest(ols4, vcov = vcovHC, type = "HC1")
se5<-coeftest(ols5, vcov = vcovHC, type = "HC1")
se6<-coeftest(ols6, vcov = vcovHC, type = "HC1")
stargazer(se1,se2,se3,se4,se5,se6,
          header = FALSE,
          digits = 3,
          title="Relationship between Slave Exports and Income - corrected for HC std.err.",
          type = "html",
          dep.var.labels.include = FALSE,
          dep.var.caption =
            "Dependent variable is log real per capita GDP in 2000, ln y",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant'),
          add.lines=list(c('Colonizer fixed effects',"Yes","Yes","Yes","Yes","Yes","Yes")))
Relationship between Slave Exports and Income - corrected for HC std.err.
Dependent variable is log real per capita GDP in 2000, ln y
(1) (2) (3) (4) (5) (6)
ln_export_area -0.112*** -0.076*** -0.108*** -0.085** -0.103*** -0.128***
(0.027) (0.027) (0.037) (0.033) (0.029) (0.031)
abs_latitude 0.016 -0.005 0.019 0.023 0.006
(0.018) (0.021) (0.015) (0.015) (0.015)
longitude 0.0005 -0.007 -0.004 -0.004 -0.009
(0.006) (0.006) (0.005) (0.006) (0.006)
rain_min -0.001 0.008 0.0001 -0.001 -0.002
(0.011) (0.007) (0.007) (0.008) (0.007)
humid_max 0.009 0.008 0.009 0.015 0.013
(0.009) (0.010) (0.011) (0.009) (0.009)
low_temp -0.019 -0.039 -0.005 -0.015 -0.037
(0.031) (0.028) (0.030) (0.027) (0.027)
ln_coastline_area 0.085** 0.092** 0.095* 0.082* 0.083**
(0.036) (0.041) (0.049) (0.044) (0.037)
region_n 0.382 -0.304
(0.379) (0.392)
legor_fr 0.755 0.643 -0.141
(0.456) (0.427) (0.483)
island_dum -0.398 -0.150
(0.497) (0.536)
islam -0.008** -0.006 -0.003
(0.003) (0.004) (0.003)
ln_avg_gold_pop 0.011 0.014
(0.014) (0.014)
ln_avg_oil_pop 0.078*** 0.088***
(0.026) (0.025)
ln_avg_all_diamonds_pop -0.039 -0.048
(0.051) (0.048)
Colonizer fixed effects Yes Yes Yes Yes Yes Yes
Note: p<0.1; p<0.05; p<0.01
#Modify Table IV by taking into account Heteroskedasticity-Consistent standard errors using vcovHC()
model.lst = list(ivreg1, ivreg2, ivreg3, ivreg4)
model.lst2 = list(stage1_1, stage1_2, stage1_3, stage1_4)
stargazer(ivreg1, ivreg2, ivreg3, ivreg4,
          header = FALSE,
          digits = 3,
          title="Estimates of the relationship between Slave Exports and Income - corrected for HC std.err.",
          type = "html",
          dep.var.labels.include = FALSE,
          summary=TRUE,
          se=lapply(model.lst, function(x) sqrt(diag(sandwich::vcovHC(x, type = "HC1")))),
          dep.var.caption =
            "Second Stage. Dependent variable is log income in 2000, ln y",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant','abs_latitude',
                 'longitude','rain_min','humid_max','low_temp','ln_coastline_area'),
          add.lines=list(c('Colonizer fixed effects',"No","Yes","Yes","Yes"),
                         c('Geography controls','No','No','Yes','Yes'),
                         c('Restricted sample','No','No','No','Yes')))
Estimates of the relationship between Slave Exports and Income - corrected for HC std.err.
Second Stage. Dependent variable is log income in 2000, ln y
(1) (2) (3) (4)
ln_export_area -0.208*** -0.201*** -0.286* -0.221**
(0.046) (0.054) (0.158) (0.094)
Colonizer fixed effects No Yes Yes Yes
Geography controls No No Yes Yes
Restricted sample No No No Yes
Observations 52 52 52 42
R2 0.127 0.342 0.041 0.511
Adjusted R2 0.110 0.220 -0.322 0.284
Residual Std. Error 0.779 (df = 50) 0.729 (df = 43) 0.949 (df = 37) 0.612 (df = 28)
Note: p<0.1; p<0.05; p<0.01
stargazer(stage1_1, stage1_2, stage1_3, stage1_4,
          header = FALSE,
          digits = 3,
          type = "html",
          dep.var.labels.include = FALSE,
          summary=TRUE,
          se=lapply(model.lst2, function(x) sqrt(diag(sandwich::vcovHC(x, type = "HC1")))),
          dep.var.caption =
            "First Stage. Dependent variable is slave exports, ln(exports/area)",
          omit=c('colony1','colony2','colony3','colony4','colony5','colony6','colony7','Constant','abs_latitude',
                 'longitude','rain_min','humid_max','low_temp','ln_coastline_area'),
          add.lines=list(c('Colonizer fixed effects',"No","Yes","Yes","Yes"),
                         c('Geography controls','No','No','Yes','Yes'),
                         c('Restricted sample','No','No','No','Yes')))
First Stage. Dependent variable is slave exports, ln(exports/area)
(1) (2) (3) (4)
saharan_distance_minimum -2.435*** -3.001*** -1.139 -4.076**
(0.814) (1.092) (1.836) (1.697)
atlantic_distance_minimum -1.314*** -1.741*** -1.316* -1.686**
(0.349) (0.436) (0.784) (0.792)
indian_distance_minimum -1.095*** -1.426*** -1.081 -1.570*
(0.379) (0.544) (0.798) (0.903)
red_sea_distance_minimum -0.002 -0.152 -1.221 2.130
(0.727) (0.910) (1.652) (1.978)
Colonizer fixed effects No Yes Yes Yes
Geography controls No No Yes Yes
Restricted sample No No No Yes
Observations 52 52 52 42
R2 0.279 0.396 0.477 0.720
Adjusted R2 0.218 0.230 0.216 0.540
Residual Std. Error 3.445 (df = 47) 3.418 (df = 40) 3.450 (df = 34) 2.371 (df = 25)
F Statistic 4.545*** (df = 4; 47) 2.383** (df = 11; 40) 1.824* (df = 17; 34) 4.012*** (df = 16; 25)
Note: p<0.1; p<0.05; p<0.01

Inevitably, standard errors increase thus lowering the significance of the models estimates. Again, this does not strongly undermine the interpretation of the author’s results, but it is worthy taking notice of that.